149 lines
4.1 KiB
TypeScript
149 lines
4.1 KiB
TypeScript
import { useStore } from '@nanostores/react';
|
|
import Cookies from 'js-cookie';
|
|
import { useCallback, useState } from 'react';
|
|
import type { TabVisibilityConfig, TabWindowConfig } from '~/.client/components/@settings/core/types';
|
|
import { getLocalStorage, setLocalStorage } from '~/.client/persistence';
|
|
import {
|
|
isDebugMode,
|
|
isEventLogsEnabled,
|
|
latestBranchStore,
|
|
promptStore,
|
|
resetTabConfiguration as resetTabConfig,
|
|
tabConfigurationStore,
|
|
updateEventLogs,
|
|
updateLatestBranch,
|
|
updatePromptId,
|
|
updateTabConfiguration as updateTabConfig,
|
|
} from '~/.client/stores/settings';
|
|
import { logStore } from '~/stores/logs';
|
|
|
|
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<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,
|
|
};
|
|
});
|
|
|
|
const saveSettings = useCallback((newSettings: Partial<Settings>) => {
|
|
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,
|
|
};
|
|
}
|