Spaces:
Runtime error
Runtime error
import { useRouter } from "next/router"; | |
import { useTranslation } from "next-i18next"; | |
import { useEffect, useState } from "react"; | |
import { useModelSettingsStore } from "../stores"; | |
import type { ModelSettings } from "../types"; | |
import { getDefaultModelSettings } from "../utils/constants"; | |
import type { Language } from "../utils/languages"; | |
import { findLanguage } from "../utils/languages"; | |
export type SettingsModel = { | |
settings: ModelSettings; | |
updateSettings: <Key extends keyof ModelSettings>(key: Key, value: ModelSettings[Key]) => void; | |
updateLangauge: (language: Language) => Promise<void>; | |
}; | |
export function useSettings(): SettingsModel { | |
const [_modelSettings, set_ModelSettings] = useState<ModelSettings>(getDefaultModelSettings()); | |
const modelSettings = useModelSettingsStore.use.modelSettings(); | |
const updateSettings = useModelSettingsStore.use.updateSettings(); | |
const router = useRouter(); | |
const { i18n } = useTranslation(); | |
// The server doesn't have access to local storage so rendering Zustand directly will lead to a hydration error | |
useEffect(() => { | |
set_ModelSettings(modelSettings); | |
}, [modelSettings]); | |
// We must handle language setting changes uniquely as the router must be the source of truth for the language | |
useEffect(() => { | |
if (router.locale !== modelSettings.language.code) { | |
updateSettings("language", findLanguage(router.locale || "en")); | |
} | |
}, [router, modelSettings.language, updateSettings]); | |
const updateLangauge = async (language: Language): Promise<void> => { | |
await i18n.changeLanguage(language.code); | |
const { pathname, asPath, query } = router; | |
await router.push({ pathname, query }, asPath, { | |
locale: language.code, | |
}); | |
}; | |
return { | |
settings: _modelSettings, | |
updateSettings: updateSettings, | |
updateLangauge: updateLangauge, | |
}; | |
} | |