refactor: repartition server-side and client-side code
This commit is contained in:
148
app/.client/hooks/useSettings.ts
Normal file
148
app/.client/hooks/useSettings.ts
Normal file
@@ -0,0 +1,148 @@
|
||||
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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user