| import React from "react"; | |
| import { | |
| LATEST_SETTINGS_VERSION, | |
| Settings, | |
| settingsAreUpToDate, | |
| } from "#/services/settings"; | |
| import { useSettings } from "#/hooks/query/use-settings"; | |
| import { useSaveSettings } from "#/hooks/mutation/use-save-settings"; | |
| interface SettingsContextType { | |
| isUpToDate: boolean; | |
| setIsUpToDate: (value: boolean) => void; | |
| saveUserSettings: (newSettings: Partial<Settings>) => Promise<void>; | |
| settings: Settings | undefined; | |
| } | |
| const SettingsContext = React.createContext<SettingsContextType | undefined>( | |
| undefined, | |
| ); | |
| interface SettingsProviderProps { | |
| children: React.ReactNode; | |
| } | |
| export function SettingsProvider({ children }: SettingsProviderProps) { | |
| const { data: userSettings } = useSettings(); | |
| const { mutateAsync: saveSettings } = useSaveSettings(); | |
| const [isUpToDate, setIsUpToDate] = React.useState(settingsAreUpToDate()); | |
| const saveUserSettings = async (newSettings: Partial<Settings>) => { | |
| const updatedSettings: Partial<Settings> = { | |
| ...userSettings, | |
| ...newSettings, | |
| }; | |
| if (updatedSettings.LLM_API_KEY === "SET") { | |
| delete updatedSettings.LLM_API_KEY; | |
| } | |
| await saveSettings(updatedSettings, { | |
| onSuccess: () => { | |
| if (!isUpToDate) { | |
| localStorage.setItem( | |
| "SETTINGS_VERSION", | |
| LATEST_SETTINGS_VERSION.toString(), | |
| ); | |
| setIsUpToDate(true); | |
| } | |
| }, | |
| }); | |
| }; | |
| const value = React.useMemo( | |
| () => ({ | |
| isUpToDate, | |
| setIsUpToDate, | |
| saveUserSettings, | |
| settings: userSettings, | |
| }), | |
| [isUpToDate, setIsUpToDate, saveUserSettings, userSettings], | |
| ); | |
| return <SettingsContext value={value}>{children}</SettingsContext>; | |
| } | |
| export function useCurrentSettings() { | |
| const context = React.useContext(SettingsContext); | |
| if (context === undefined) { | |
| throw new Error( | |
| "useCurrentSettings must be used within a SettingsProvider", | |
| ); | |
| } | |
| return context; | |
| } | |