import { useStore } from '@nanostores/react'; import Cookies from 'js-cookie'; import { useCallback, useState } from 'react'; import type { TabVisibilityConfig, TabWindowConfig } from '~/components/@settings/core/types'; import { getLocalStorage, setLocalStorage } from '~/lib/persistence'; import { logStore } from '~/lib/stores/logs'; import { isDebugMode, isEventLogsEnabled, latestBranchStore, promptStore, resetTabConfiguration as resetTabConfig, tabConfigurationStore, updateEventLogs, updateLatestBranch, updatePromptId, updateTabConfiguration as updateTabConfig, } from '~/lib/stores/settings'; export interface Settings { theme: 'light' | 'dark' | 'system'; language: string; notifications: boolean; eventLogs: boolean; timezone: string; tabConfiguration: TabWindowConfig; } export interface UseSettingsReturn { // Theme and UI settings setTheme: (theme: Settings['theme']) => void; setLanguage: (language: string) => void; setNotifications: (enabled: boolean) => void; setEventLogs: (enabled: boolean) => void; setTimezone: (timezone: string) => void; settings: Settings; // Debug and development settings debug: boolean; enableDebugMode: (enabled: boolean) => void; eventLogs: boolean; promptId: string; setPromptId: (promptId: string) => void; isLatestBranch: boolean; enableLatestBranch: (enabled: boolean) => void; // Tab configuration tabConfiguration: TabWindowConfig; updateTabConfiguration: (config: TabVisibilityConfig) => void; resetTabConfiguration: () => void; } export function useSettings(): UseSettingsReturn { const debug = useStore(isDebugMode); const eventLogs = useStore(isEventLogsEnabled); const promptId = useStore(promptStore); const isLatestBranch = useStore(latestBranchStore); const tabConfiguration = useStore(tabConfigurationStore); const [settings, setSettings] = useState(() => { const storedSettings = getLocalStorage('settings'); return { theme: storedSettings?.theme || 'system', language: storedSettings?.language || 'en', notifications: storedSettings?.notifications ?? true, eventLogs: storedSettings?.eventLogs ?? true, timezone: storedSettings?.timezone || Intl.DateTimeFormat().resolvedOptions().timeZone, tabConfiguration, }; }); const saveSettings = useCallback((newSettings: Partial) => { setSettings((prev) => { const updated = { ...prev, ...newSettings }; setLocalStorage('settings', updated); return updated; }); }, []); const enableDebugMode = useCallback((enabled: boolean) => { isDebugMode.set(enabled); logStore.logSystem(`Debug mode ${enabled ? 'enabled' : 'disabled'}`); Cookies.set('isDebugEnabled', String(enabled)); }, []); const setEventLogs = useCallback((enabled: boolean) => { updateEventLogs(enabled); logStore.logSystem(`Event logs ${enabled ? 'enabled' : 'disabled'}`); }, []); const setPromptId = useCallback((id: string) => { updatePromptId(id); logStore.logSystem(`Prompt template updated to ${id}`); }, []); const enableLatestBranch = useCallback((enabled: boolean) => { updateLatestBranch(enabled); logStore.logSystem(`Main branch updates ${enabled ? 'enabled' : 'disabled'}`); }, []); const setTheme = useCallback( (theme: Settings['theme']) => { saveSettings({ theme }); }, [saveSettings], ); const setLanguage = useCallback( (language: string) => { saveSettings({ language }); }, [saveSettings], ); const setNotifications = useCallback( (enabled: boolean) => { saveSettings({ notifications: enabled }); }, [saveSettings], ); const setTimezone = useCallback( (timezone: string) => { saveSettings({ timezone }); }, [saveSettings], ); return { ...settings, debug, enableDebugMode, eventLogs, setEventLogs, promptId, setPromptId, isLatestBranch, enableLatestBranch, setTheme, setLanguage, setNotifications, setTimezone, settings, tabConfiguration, updateTabConfiguration: updateTabConfig, resetTabConfiguration: resetTabConfig, }; }