From 9b302583c41715489a9a0db4911fff9c5e88b1a7 Mon Sep 17 00:00:00 2001 From: antdev <237216263+yumesha@users.noreply.github.com> Date: Thu, 8 Jan 2026 09:23:57 +0800 Subject: [PATCH] fix background image part 2 --- .../src/hooks/use-project-settings-loader.ts | 70 ++++++++----------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/apps/ui/src/hooks/use-project-settings-loader.ts b/apps/ui/src/hooks/use-project-settings-loader.ts index a677f324..ee7a9d8c 100644 --- a/apps/ui/src/hooks/use-project-settings-loader.ts +++ b/apps/ui/src/hooks/use-project-settings-loader.ts @@ -19,8 +19,11 @@ export function useProjectSettingsLoader() { const setHideScrollbar = useAppStore((state) => state.setHideScrollbar); const loadingRef = useRef(null); + const currentProjectRef = useRef(null); useEffect(() => { + currentProjectRef.current = currentProject?.path ?? null; + if (!currentProject?.path) { return; } @@ -31,44 +34,43 @@ export function useProjectSettingsLoader() { } loadingRef.current = currentProject.path; + const requestedProjectPath = currentProject.path; const loadProjectSettings = async () => { try { const httpClient = getHttpApiClient(); - const result = await httpClient.settings.getProject(currentProject.path); + const result = await httpClient.settings.getProject(requestedProjectPath); - if (result.success && result.settings?.boardBackground) { + // Race condition protection: ignore stale results if project changed + if (currentProjectRef.current !== requestedProjectPath) { + return; + } + + if (result.success && result.settings) { const bg = result.settings.boardBackground; - // Update store with loaded settings (without triggering server save) - setBoardBackground(currentProject.path, bg.imagePath); - - if (bg.cardOpacity !== undefined) { - setCardOpacity(currentProject.path, bg.cardOpacity); + // Apply boardBackground if present + if (bg?.imagePath) { + setBoardBackground(requestedProjectPath, bg.imagePath); } - if (bg.columnOpacity !== undefined) { - setColumnOpacity(currentProject.path, bg.columnOpacity); - } + // Settings map for cleaner iteration + const settingsMap = { + cardOpacity: setCardOpacity, + columnOpacity: setColumnOpacity, + columnBorderEnabled: setColumnBorderEnabled, + cardGlassmorphism: setCardGlassmorphism, + cardBorderEnabled: setCardBorderEnabled, + cardBorderOpacity: setCardBorderOpacity, + hideScrollbar: setHideScrollbar, + } as const; - if (bg.columnBorderEnabled !== undefined) { - setColumnBorderEnabled(currentProject.path, bg.columnBorderEnabled); - } - - if (bg.cardGlassmorphism !== undefined) { - setCardGlassmorphism(currentProject.path, bg.cardGlassmorphism); - } - - if (bg.cardBorderEnabled !== undefined) { - setCardBorderEnabled(currentProject.path, bg.cardBorderEnabled); - } - - if (bg.cardBorderOpacity !== undefined) { - setCardBorderOpacity(currentProject.path, bg.cardBorderOpacity); - } - - if (bg.hideScrollbar !== undefined) { - setHideScrollbar(currentProject.path, bg.hideScrollbar); + // Apply all settings that are defined + for (const [key, setter] of Object.entries(settingsMap)) { + const value = bg?.[key as keyof typeof bg]; + if (value !== undefined) { + (setter as (path: string, val: typeof value) => void)(requestedProjectPath, value); + } } } } catch (error) { @@ -78,15 +80,5 @@ export function useProjectSettingsLoader() { }; loadProjectSettings(); - }, [ - currentProject?.path, - setBoardBackground, - setCardOpacity, - setColumnOpacity, - setColumnBorderEnabled, - setCardGlassmorphism, - setCardBorderEnabled, - setCardBorderOpacity, - setHideScrollbar, - ]); + }, [currentProject?.path]); }