import { useState, useEffect, ReactNode, ComponentPropsWithoutRef, } from "react"; import { useTranslation } from "react-i18next"; // For change language. import { useNavigate } from "react-router-dom"; import classNames from "classnames"; import { useUser, userService } from "~src/services/user"; import { getHttpUserClient } from "~src/http/user"; import { pushAlert } from "~src/services/alert"; import { useC, Text } from "~src/common"; import { useDialog, DialogProvider, ConfirmDialog, } from "~src/components/dialog"; import Card from "~src/components/Card"; import Spinner from "~src/components/Spinner"; import Page from "~src/components/Page"; import ChangePasswordDialog from "./ChangePasswordDialog"; import ChangeAvatarDialog from "./ChangeAvatarDialog"; import ChangeNicknameDialog from "./ChangeNicknameDialog"; import "./index.css"; interface SettingSectionProps extends Omit, "title"> { title: Text; children?: ReactNode; } function SettingSection({ title, className, children, ...otherProps }: SettingSectionProps) { const c = useC(); return (

{c(title)}

{children}
); } interface SettingItemContainerProps extends Omit, "title"> { title: Text; description?: Text; danger?: boolean; extraClassName?: string; } function SettingItemContainer({ title, description, danger, extraClassName, className, children, ...otherProps }: SettingItemContainerProps) { const c = useC(); return (
{c(title)}
{c(description)}
{children}
); } type ButtonSettingItemProps = Omit; function ButtonSettingItem(props: ButtonSettingItemProps) { return ( ); } interface SelectSettingItemProps extends Omit { options: { value: string; label: Text; }[]; value?: string | null; onSelect: (value: string) => void; } function SelectSettingsItem({ options, value, onSelect, ...extraProps }: SelectSettingItemProps) { const c = useC(); return ( {value == null ? ( ) : ( )} ); } function RegisterCodeSettingItem() { const user = useUser(); // undefined: loading const [registerCode, setRegisterCode] = useState(); const { controller, createDialogSwitch } = useDialog({ confirm: ( { if (user == null) throw new Error(); void getHttpUserClient() .renewRegisterCode(user.username) .then(() => { setRegisterCode(undefined); }); }} /> ), }); useEffect(() => { setRegisterCode(undefined); }, [user]); useEffect(() => { if (user != null && registerCode === undefined) { void getHttpUserClient() .getRegisterCode(user.username) .then((code) => { setRegisterCode(code.registerCode ?? null); }); } }, [user, registerCode]); return ( {registerCode === undefined ? ( ) : registerCode === null ? ( Noop ) : ( { void navigator.clipboard.writeText(registerCode).then(() => { pushAlert({ type: "create", message: "settings.myRegisterCodeCopied", }); }); event.stopPropagation(); }} > {registerCode} )} ); } function LanguageChangeSettingItem() { const { i18n } = useTranslation(); const language = i18n.language.slice(0, 2); return ( { void i18n.changeLanguage(value); }} /> ); } export default function SettingPage() { const user = useUser(); const navigate = useNavigate(); const { controller, createDialogSwitch } = useDialog({ "change-nickname": , "change-avatar": , "change-password": , logout: ( { void userService.logout().then(() => { navigate("/"); }); }} /> ), }); return ( {user ? ( ) : null} ); }