import { useCallback } from 'react'; import { useAppStore } from '@/store/app-store'; import { getHttpApiClient } from '@/lib/http-api-client'; import { toast } from 'sonner'; /** * Hook for managing board background settings with automatic persistence to server */ export function useBoardBackgroundSettings() { const store = useAppStore(); const httpClient = getHttpApiClient(); // Helper to persist settings to server const persistSettings = useCallback( async (projectPath: string, settingsToUpdate: Record) => { try { const result = await httpClient.settings.updateProject(projectPath, { boardBackground: settingsToUpdate, }); if (!result.success) { console.error('Failed to persist settings:', result.error); toast.error('Failed to save settings'); } } catch (error) { console.error('Failed to persist settings:', error); toast.error('Failed to save settings'); } }, [httpClient] ); // Get current background settings for a project const getCurrentSettings = useCallback( (projectPath: string) => { const current = store.boardBackgroundByProject[projectPath]; return ( current || { imagePath: null, cardOpacity: 100, columnOpacity: 100, columnBorderEnabled: true, cardGlassmorphism: true, cardBorderEnabled: true, cardBorderOpacity: 100, hideScrollbar: false, } ); }, [store.boardBackgroundByProject] ); // Persisting wrappers for store actions const setBoardBackground = useCallback( async (projectPath: string, imagePath: string | null) => { // Get current settings first const current = getCurrentSettings(projectPath); // Prepare the updated settings const toUpdate = { ...current, imagePath, imageVersion: imagePath ? Date.now() : undefined, }; // Update local store store.setBoardBackground(projectPath, imagePath); // Persist to server await persistSettings(projectPath, toUpdate); }, [store, persistSettings, getCurrentSettings] ); const setCardOpacity = useCallback( async (projectPath: string, opacity: number) => { const current = getCurrentSettings(projectPath); store.setCardOpacity(projectPath, opacity); await persistSettings(projectPath, { ...current, cardOpacity: opacity }); }, [store, persistSettings, getCurrentSettings] ); const setColumnOpacity = useCallback( async (projectPath: string, opacity: number) => { const current = getCurrentSettings(projectPath); store.setColumnOpacity(projectPath, opacity); await persistSettings(projectPath, { ...current, columnOpacity: opacity }); }, [store, persistSettings, getCurrentSettings] ); const setColumnBorderEnabled = useCallback( async (projectPath: string, enabled: boolean) => { const current = getCurrentSettings(projectPath); store.setColumnBorderEnabled(projectPath, enabled); await persistSettings(projectPath, { ...current, columnBorderEnabled: enabled, }); }, [store, persistSettings, getCurrentSettings] ); const setCardGlassmorphism = useCallback( async (projectPath: string, enabled: boolean) => { const current = getCurrentSettings(projectPath); store.setCardGlassmorphism(projectPath, enabled); await persistSettings(projectPath, { ...current, cardGlassmorphism: enabled, }); }, [store, persistSettings, getCurrentSettings] ); const setCardBorderEnabled = useCallback( async (projectPath: string, enabled: boolean) => { const current = getCurrentSettings(projectPath); store.setCardBorderEnabled(projectPath, enabled); await persistSettings(projectPath, { ...current, cardBorderEnabled: enabled, }); }, [store, persistSettings, getCurrentSettings] ); const setCardBorderOpacity = useCallback( async (projectPath: string, opacity: number) => { const current = getCurrentSettings(projectPath); store.setCardBorderOpacity(projectPath, opacity); await persistSettings(projectPath, { ...current, cardBorderOpacity: opacity, }); }, [store, persistSettings, getCurrentSettings] ); const setHideScrollbar = useCallback( async (projectPath: string, hide: boolean) => { const current = getCurrentSettings(projectPath); store.setHideScrollbar(projectPath, hide); await persistSettings(projectPath, { ...current, hideScrollbar: hide }); }, [store, persistSettings, getCurrentSettings] ); const clearBoardBackground = useCallback( async (projectPath: string) => { store.clearBoardBackground(projectPath); // Clear the boardBackground settings await persistSettings(projectPath, { imagePath: null, imageVersion: undefined, cardOpacity: 100, columnOpacity: 100, columnBorderEnabled: true, cardGlassmorphism: true, cardBorderEnabled: true, cardBorderOpacity: 100, hideScrollbar: false, }); }, [store, persistSettings] ); return { setBoardBackground, setCardOpacity, setColumnOpacity, setColumnBorderEnabled, setCardGlassmorphism, setCardBorderEnabled, setCardBorderOpacity, setHideScrollbar, clearBoardBackground, getCurrentSettings, }; }