bolt.diy/app/lib/hooks/useSettings.ts

215 lines
6.5 KiB
TypeScript
Raw Normal View History

2025-01-20 08:53:15 +00:00
import { useStore } from '@nanostores/react';
import {
isDebugMode,
isEventLogsEnabled,
promptStore,
providersStore,
latestBranchStore,
autoSelectStarterTemplate,
enableContextOptimizationStore,
tabConfigurationStore,
updateTabConfiguration as updateTabConfig,
resetTabConfiguration as resetTabConfig,
2025-01-31 11:55:52 +00:00
updateProviderSettings as updateProviderSettingsStore,
updateLatestBranch,
updateAutoSelectTemplate,
updateContextOptimization,
updateEventLogs,
updatePromptId,
2025-01-20 08:53:15 +00:00
} 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';
2025-01-20 08:53:15 +00:00
import { logStore } from '~/lib/stores/logs';
import { getLocalStorage, setLocalStorage } from '~/lib/persistence';
2025-01-20 08:53:15 +00:00
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;
// Provider settings
providers: Record<string, IProviderConfig>;
activeProviders: ProviderInfo[];
updateProviderSettings: (provider: string, config: IProviderSetting) => void;
// Debug and development settings
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;
// Tab configuration
tabConfiguration: TabWindowConfig;
updateTabConfiguration: (config: TabVisibilityConfig) => void;
resetTabConfiguration: () => void;
}
2025-01-31 11:55:52 +00:00
// Add interface to match ProviderSetting type
interface ProviderSettingWithIndex extends IProviderSetting {
[key: string]: any;
}
2025-01-20 08:53:15 +00:00
export function useSettings(): UseSettingsReturn {
2025-01-31 11:55:52 +00:00
const providers = useStore(providersStore);
2025-01-20 08:53:15 +00:00
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(() => {
2025-02-18 20:51:02 +00:00
const active = Object.entries(providers)
2025-01-20 08:53:15 +00:00
.filter(([_key, provider]) => provider.settings.enabled)
.map(([_k, p]) => p);
setActiveProviders(active);
2025-02-18 20:51:02 +00:00
}, [providers]);
2025-01-20 08:53:15 +00:00
const saveSettings = useCallback((newSettings: Partial<Settings>) => {
setSettings((prev) => {
const updated = { ...prev, ...newSettings };
setLocalStorage('settings', updated);
return updated;
});
}, []);
2025-01-31 11:55:52 +00:00
const updateProviderSettings = useCallback((provider: string, config: ProviderSettingWithIndex) => {
updateProviderSettingsStore(provider, config);
2025-01-20 08:53:15 +00:00
}, []);
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) => {
2025-01-31 11:55:52 +00:00
updateEventLogs(enabled);
2025-01-20 08:53:15 +00:00
logStore.logSystem(`Event logs ${enabled ? 'enabled' : 'disabled'}`);
}, []);
2025-01-31 11:55:52 +00:00
const setPromptId = useCallback((id: string) => {
updatePromptId(id);
logStore.logSystem(`Prompt template updated to ${id}`);
2025-01-20 08:53:15 +00:00
}, []);
const enableLatestBranch = useCallback((enabled: boolean) => {
2025-01-31 11:55:52 +00:00
updateLatestBranch(enabled);
2025-01-20 08:53:15 +00:00
logStore.logSystem(`Main branch updates ${enabled ? 'enabled' : 'disabled'}`);
}, []);
const setAutoSelectTemplate = useCallback((enabled: boolean) => {
2025-01-31 11:55:52 +00:00
updateAutoSelectTemplate(enabled);
2025-01-20 08:53:15 +00:00
logStore.logSystem(`Auto select template ${enabled ? 'enabled' : 'disabled'}`);
}, []);
const enableContextOptimization = useCallback((enabled: boolean) => {
2025-01-31 11:55:52 +00:00
updateContextOptimization(enabled);
2025-01-20 08:53:15 +00:00
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],
);
2025-01-31 11:55:52 +00:00
// Fix the providers cookie sync
useEffect(() => {
const providers = providersStore.get();
const providerSetting: Record<string, { enabled: boolean }> = {};
Object.keys(providers).forEach((provider) => {
providerSetting[provider] = {
enabled: providers[provider].settings.enabled || false, // Add fallback for undefined
};
});
Cookies.set('providers', JSON.stringify(providerSetting));
}, [providers]);
2025-01-20 08:53:15 +00:00
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,
};
}