import { ErrorContent } from 'components/ErrorContent'; import { Loading } from 'components/Loading'; import { usePromise, usePromiseLazy } from 'hooks/usePromise'; import React, { useState } from 'react' import { useTranslation } from 'react-i18next'; import { Config, getConfig, getProfile, Profile, setConfig, setProfile } from 'services/config'; import { composeLoadable } from 'utils/composeLoadable'; import classNames from 'classnames'; 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'; 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 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 [onSave, { loading, error }] = usePromiseLazy(async () => { await setProfile(0, value.profile); await setConfig(value.config); onSaved?.(); }) const [onLogin, loginState] = usePromiseLazy(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)} />
} export const Settings: React.FC = () => { const navigate = useNavigate(); let { loading, error, retry, result } = composeLoadable({ config: usePromise(getConfig), profile: usePromise(() => getProfile(0)), }); if (loading) { return
} if (error) { return } return {result &&
navigate(-1)} />} }