From cd5f73b459848c97f2396d1275d7e386c76d1c9d Mon Sep 17 00:00:00 2001 From: mebtte Date: Tue, 13 Aug 2024 22:45:08 +0800 Subject: [PATCH] refactor setting --- .../commands/start_server/middlewares/i18n.ts | 2 +- apps/pwa/src/global_states/server.ts | 6 +- apps/pwa/src/global_states/setting.ts | 21 +++---- apps/pwa/src/i18n/index.ts | 6 +- .../src/pages/login/first_step/language.tsx | 9 ++- .../pages/player/pages/setting/language.tsx | 9 ++- .../src/pages/player/pages/setting/volume.tsx | 9 ++- .../src/pages/player/use_audio/use_volume.ts | 4 +- apps/pwa/src/server/index.ts | 4 +- apps/pwa/src/utils/x_state.tsx | 56 ------------------- 10 files changed, 34 insertions(+), 92 deletions(-) delete mode 100644 apps/pwa/src/utils/x_state.tsx diff --git a/apps/cli/src/commands/start_server/middlewares/i18n.ts b/apps/cli/src/commands/start_server/middlewares/i18n.ts index d05ebffd..f81133db 100644 --- a/apps/cli/src/commands/start_server/middlewares/i18n.ts +++ b/apps/cli/src/commands/start_server/middlewares/i18n.ts @@ -14,7 +14,7 @@ export default (ctx: Context & I18nMiddleware, next: Next) => { let lang: Language | null = null; const getLang = () => { if (!lang) { - // @ts-expect-error + // @ts-expect-error: known types ({ __lang: lang } = ctx.query as { [CommonQuery.LANGUAGE]: unknown }); if (!lang || !ACCEPT_LANGUAGES.includes(lang)) { const negotiator = new Negotiator(ctx.request); diff --git a/apps/pwa/src/global_states/server.ts b/apps/pwa/src/global_states/server.ts index 4da8cae6..ed4f20df 100644 --- a/apps/pwa/src/global_states/server.ts +++ b/apps/pwa/src/global_states/server.ts @@ -25,7 +25,11 @@ export const useServer = create( }, ); -useServer.subscribe((server) => storage.setItem(Key.SERVER, server)); +useServer.subscribe((server) => + storage + .setItem(Key.SERVER, server) + .catch((error) => logger.error(error, 'Failed to store server')), +); window.setInterval(() => { const selectedServer = getSelectedServer(useServer.getState()); diff --git a/apps/pwa/src/global_states/setting.ts b/apps/pwa/src/global_states/setting.ts index eee3b7d4..9b41784d 100644 --- a/apps/pwa/src/global_states/setting.ts +++ b/apps/pwa/src/global_states/setting.ts @@ -1,4 +1,4 @@ -import XState from '@/utils/x_state'; +import { create } from 'zustand'; import storage, { Key } from '@/storage'; import { Setting } from '@/constants/setting'; import logger from '@/utils/logger'; @@ -26,26 +26,23 @@ const DEFAULT_SETTING: Setting = { language: getInitialLanguage(), }; const initialSetting = await storage.getItem(Key.SETTING); -const setting = new XState({ +export const useSetting = create(() => ({ ...DEFAULT_SETTING, ...initialSetting, -}); +})); /** * correct language * @author mebtte */ -if (!LANGUAGES.includes(setting.get().language)) { - setting.set((s) => ({ - ...s, +if (!LANGUAGES.includes(useSetting.getState().language)) { + useSetting.setState({ language: DEFAULT_LANGUAGE, - })); + }); } -setting.onChange((s) => +useSetting.subscribe((setting) => storage - .setItem(Key.SETTING, s) - .catch((error) => logger.error(error, 'Failed to save setting')), + .setItem(Key.SETTING, setting) + .catch((error) => logger.error(error, 'Failed to store setting')), ); - -export default setting; diff --git a/apps/pwa/src/i18n/index.ts b/apps/pwa/src/i18n/index.ts index cf5280ae..409ebf73 100644 --- a/apps/pwa/src/i18n/index.ts +++ b/apps/pwa/src/i18n/index.ts @@ -1,9 +1,9 @@ import { Language } from '#/constants'; -import setting from '../global_states/setting'; +import { useSetting } from '@/global_states/setting'; import type { Key } from './constants'; let translation: { [key in Key]: string }; -switch (setting.get().language) { +switch (useSetting.getState().language) { case Language.ZH_HANS: { ({ default: translation } = await import('./zh_hans')); break; @@ -40,4 +40,4 @@ export const LANGUAGE_MAP: Record< [Language.JA]: { label: '日本語' }, }; -export { Key }; +export type { Key }; diff --git a/apps/pwa/src/pages/login/first_step/language.tsx b/apps/pwa/src/pages/login/first_step/language.tsx index f46a91c9..5d4a03f7 100644 --- a/apps/pwa/src/pages/login/first_step/language.tsx +++ b/apps/pwa/src/pages/login/first_step/language.tsx @@ -1,7 +1,7 @@ import { LANGUAGES, Language } from '#/constants'; import Label from '@/components/label'; import { Select, Option } from '@/components/select'; -import setting from '@/global_states/setting'; +import { useSetting } from '@/global_states/setting'; import { LANGUAGE_MAP, t } from '@/i18n'; const languageOptions: Option[] = LANGUAGES.map((l) => ({ @@ -11,7 +11,7 @@ const languageOptions: Option[] = LANGUAGES.map((l) => ({ })); function Wrapper({ disabled }: { disabled: boolean }) { - const { language } = setting.useState(); + const { language } = useSetting(); return (