feat(fs-watcher): add 300ms delayed scanning toast for large project dirs

This commit is contained in:
Hibryda 2026-03-11 01:11:39 +01:00
parent 9d9cc75b28
commit 64ad4d2e58
2 changed files with 17 additions and 5 deletions

View file

@ -15,7 +15,7 @@
import { getProjectHealth } from '../../stores/health.svelte';
import { fsWatchProject, fsUnwatchProject, onFsWriteDetected, fsWatcherStatus } from '../../adapters/fs-watcher-bridge';
import { recordExternalWrite } from '../../stores/conflicts.svelte';
import { notify } from '../../stores/notifications.svelte';
import { notify, dismissNotification } from '../../stores/notifications.svelte';
interface Props {
project: ProjectConfig;
@ -59,16 +59,26 @@
if (!cwd) return;
// Start watching, then check inotify capacity
// Show scanning toast only if status check takes >300ms
let scanToastId: string | null = null;
const scanTimer = setTimeout(() => {
scanToastId = notify('info', 'Scanning project directories…');
}, 300);
fsWatchProject(projectId, cwd)
.then(() => fsWatcherStatus())
.then((status) => {
clearTimeout(scanTimer);
if (scanToastId) dismissNotification(scanToastId);
if (status.warning) {
notify('warning', status.warning);
}
})
.catch(e =>
console.warn(`Failed to start fs watcher for ${projectId}:`, e)
);
.catch(e => {
clearTimeout(scanTimer);
if (scanToastId) dismissNotification(scanToastId);
console.warn(`Failed to start fs watcher for ${projectId}:`, e);
});
// Listen for fs write events (filter to this project)
let unlisten: (() => void) | null = null;

View file

@ -18,7 +18,7 @@ export function getNotifications(): Notification[] {
return notifications;
}
export function notify(type: NotificationType, message: string): void {
export function notify(type: NotificationType, message: string): string {
const id = crypto.randomUUID();
notifications.push({ id, type, message, timestamp: Date.now() });
@ -29,6 +29,8 @@ export function notify(type: NotificationType, message: string): void {
// Auto-dismiss
setTimeout(() => dismissNotification(id), TOAST_DURATION_MS);
return id;
}
export function dismissNotification(id: string): void {