| import { useStore } from '@nanostores/react'; |
| import { |
| isDebugMode, |
| isEventLogsEnabled, |
| promptStore, |
| providersStore, |
| latestBranchStore, |
| autoSelectStarterTemplate, |
| enableContextOptimizationStore, |
| tabConfigurationStore, |
| updateTabConfiguration as updateTabConfig, |
| resetTabConfiguration as resetTabConfig, |
| updateProviderSettings as updateProviderSettingsStore, |
| updateLatestBranch, |
| updateAutoSelectTemplate, |
| updateContextOptimization, |
| updateEventLogs, |
| updatePromptId, |
| } from '~/lib/stores/settings'; |
| import { useCallback, useEffect, useState } from 'react'; |
| import Cookies from 'js-cookie'; |
| import type { IProviderSetting, ProviderInfo, IProviderConfig } from '~/types/model'; |
| import type { TabWindowConfig, TabVisibilityConfig } from '~/components/@settings/core/types'; |
| import { logStore } from '~/lib/stores/logs'; |
| import { getLocalStorage, setLocalStorage } from '~/lib/persistence'; |
|
|
| export interface Settings { |
| theme: 'light' | 'dark' | 'system'; |
| language: string; |
| notifications: boolean; |
| eventLogs: boolean; |
| timezone: string; |
| tabConfiguration: TabWindowConfig; |
| } |
|
|
| export interface UseSettingsReturn { |
| |
| setTheme: (theme: Settings['theme']) => void; |
| setLanguage: (language: string) => void; |
| setNotifications: (enabled: boolean) => void; |
| setEventLogs: (enabled: boolean) => void; |
| setTimezone: (timezone: string) => void; |
| settings: Settings; |
|
|
| |
| providers: Record<string, IProviderConfig>; |
| activeProviders: ProviderInfo[]; |
| updateProviderSettings: (provider: string, config: IProviderSetting) => void; |
|
|
| |
| debug: boolean; |
| enableDebugMode: (enabled: boolean) => void; |
| eventLogs: boolean; |
| promptId: string; |
| setPromptId: (promptId: string) => void; |
| isLatestBranch: boolean; |
| enableLatestBranch: (enabled: boolean) => void; |
| autoSelectTemplate: boolean; |
| setAutoSelectTemplate: (enabled: boolean) => void; |
| contextOptimizationEnabled: boolean; |
| enableContextOptimization: (enabled: boolean) => void; |
|
|
| |
| tabConfiguration: TabWindowConfig; |
| updateTabConfiguration: (config: TabVisibilityConfig) => void; |
| resetTabConfiguration: () => void; |
| } |
|
|
| |
| interface ProviderSettingWithIndex extends IProviderSetting { |
| [key: string]: any; |
| } |
|
|
| export function useSettings(): UseSettingsReturn { |
| const providers = useStore(providersStore); |
| const debug = useStore(isDebugMode); |
| const eventLogs = useStore(isEventLogsEnabled); |
| const promptId = useStore(promptStore); |
| const isLatestBranch = useStore(latestBranchStore); |
| const autoSelectTemplate = useStore(autoSelectStarterTemplate); |
| const [activeProviders, setActiveProviders] = useState<ProviderInfo[]>([]); |
| const contextOptimizationEnabled = useStore(enableContextOptimizationStore); |
| const tabConfiguration = useStore(tabConfigurationStore); |
| const [settings, setSettings] = useState<Settings>(() => { |
| 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, |
| }; |
| }); |
|
|
| useEffect(() => { |
| const active = Object.entries(providers) |
| .filter(([_key, provider]) => provider.settings.enabled) |
| .map(([_k, p]) => p); |
|
|
| setActiveProviders(active); |
| }, [providers]); |
|
|
| const saveSettings = useCallback((newSettings: Partial<Settings>) => { |
| setSettings((prev) => { |
| const updated = { ...prev, ...newSettings }; |
| setLocalStorage('settings', updated); |
|
|
| return updated; |
| }); |
| }, []); |
|
|
| const updateProviderSettings = useCallback((provider: string, config: ProviderSettingWithIndex) => { |
| updateProviderSettingsStore(provider, config); |
| }, []); |
|
|
| 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 setAutoSelectTemplate = useCallback((enabled: boolean) => { |
| updateAutoSelectTemplate(enabled); |
| logStore.logSystem(`Auto select template ${enabled ? 'enabled' : 'disabled'}`); |
| }, []); |
|
|
| const enableContextOptimization = useCallback((enabled: boolean) => { |
| updateContextOptimization(enabled); |
| logStore.logSystem(`Context optimization ${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], |
| ); |
|
|
| useEffect(() => { |
| const providers = providersStore.get(); |
| const providerSetting: Record<string, IProviderSetting> = {}; |
| Object.keys(providers).forEach((provider) => { |
| providerSetting[provider] = providers[provider].settings; |
| }); |
| Cookies.set('providers', JSON.stringify(providerSetting)); |
| }, [providers]); |
|
|
| return { |
| ...settings, |
| providers, |
| activeProviders, |
| updateProviderSettings, |
| debug, |
| enableDebugMode, |
| eventLogs, |
| setEventLogs, |
| promptId, |
| setPromptId, |
| isLatestBranch, |
| enableLatestBranch, |
| autoSelectTemplate, |
| setAutoSelectTemplate, |
| contextOptimizationEnabled, |
| enableContextOptimization, |
| setTheme, |
| setLanguage, |
| setNotifications, |
| setTimezone, |
| settings, |
| tabConfiguration, |
| updateTabConfiguration: updateTabConfig, |
| resetTabConfiguration: resetTabConfig, |
| }; |
| } |
|
|