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: Key, value: ModelSettings[Key]) => void; updateLangauge: (language: Language) => Promise; }; export function useSettings(): SettingsModel { const [_modelSettings, set_ModelSettings] = useState(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 => { 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, }; }