import { ErrorContent, FallbackComponent } from 'components/ErrorContent'; import { Loading } from 'components/Loading'; import React, { Suspense, useState } from 'react' import { useTranslation } from 'react-i18next'; import { Config, Profile } from 'services/config'; import clsx from 'clsx'; import { useLogin } from 'services/s3si'; import { STAT_INK } from 'constant'; import { Header } from 'components/Header'; import { useSubField } from 'hooks/useSubField'; import { useNavigate } from 'react-router-dom'; import useSWRMutation from 'swr/mutation' import { useService, useServiceMutation } from 'services/useService'; import { ErrorBoundary } from 'react-error-boundary'; const STAT_INK_KEY_LENGTH = 43; const Page: React.FC<{ children?: React.ReactNode }> = ({ children }) => { const { t } = useTranslation(); return
{children}
} type FormData = { config: Config, profile: Profile, } const SPLATNET3_LANGS = { "de-DE": "German", "en-GB": "English (UK/Australia)", "en-US": "English (US)", "es-ES": "Spanish (Spain)", "es-MX": "Spanish (Latin America)", "fr-CA": "French (Canada)", "fr-FR": "French (France)", "it-IT": "Italian", "ja-JP": "Japanese", "ko-KR": "Korean", "nl-NL": "Dutch", "ru-RU": "Russian", "zh-CN": "Chinese (China)", "zh-TW": "Chinese (Taiwan)" } const UI_LANGS = { "en": "English", "zh-CN": "简体中文", "ja": "日本語", }; const Form: React.FC<{ oldValue: FormData, onSaved?: () => void, }> = ({ oldValue, onSaved }) => { const { login } = useLogin(); const { t, i18n } = useTranslation(); const [value, setValue] = useState(oldValue); const { subField } = useSubField({ value, onChange: setValue }); const { trigger: setProfile } = useServiceMutation('profile', 0) const { trigger: setConfig } = useServiceMutation('config') const changed = JSON.stringify(value) !== JSON.stringify(oldValue); const sessionToken = subField('profile.state.loginState.sessionToken') const statInkApiKey = subField('profile.state.statInkApiKey') const splatnet3Lang = subField('profile.state.userLang') const { trigger: onSave, isMutating: loading, error } = useSWRMutation('saveSettings', async () => { await setProfile(value.profile); await setConfig(value.config); onSaved?.(); }) const loginState = useSWRMutation('login', async () => { const result = await login(); if (!result) { return; } sessionToken.onChange(result.sessionToken); }) const statInkKeyError = (statInkApiKey.value?.length ?? STAT_INK_KEY_LENGTH) !== STAT_INK_KEY_LENGTH; return <>
sessionToken.onChange(e.target.value)} />
statInkApiKey.onChange(e.target.value)} />
} const SettingsLoader: React.FC = () => { const navigate = useNavigate(); const { data: config } = useService('config') const { data: profile } = useService('profile', 0) if (!config || !profile) { return <> Error } return <>
navigate(-1)} /> } export const Settings: React.FC = () => { return }> }