From 64ad4d2e583fbf7326de855ae9e2947016851f2b Mon Sep 17 00:00:00 2001 From: Hibryda Date: Wed, 11 Mar 2026 01:11:39 +0100 Subject: [PATCH] feat(fs-watcher): add 300ms delayed scanning toast for large project dirs --- .../lib/components/Workspace/ProjectBox.svelte | 18 ++++++++++++++---- v2/src/lib/stores/notifications.svelte.ts | 4 +++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/v2/src/lib/components/Workspace/ProjectBox.svelte b/v2/src/lib/components/Workspace/ProjectBox.svelte index dc51e91..209a70b 100644 --- a/v2/src/lib/components/Workspace/ProjectBox.svelte +++ b/v2/src/lib/components/Workspace/ProjectBox.svelte @@ -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; diff --git a/v2/src/lib/stores/notifications.svelte.ts b/v2/src/lib/stores/notifications.svelte.ts index 6ed0b13..e8c9364 100644 --- a/v2/src/lib/stores/notifications.svelte.ts +++ b/v2/src/lib/stores/notifications.svelte.ts @@ -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 {