import { isEqual } from "lodash-es"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useUserStore } from "../store/module"; import { validate, ValidatorConfig } from "../helpers/validator"; import Icon from "./Icon"; import { generateDialog } from "./Dialog"; import toastHelper from "./Toast"; const validateConfig: ValidatorConfig = { minLength: 4, maxLength: 320, noSpace: true, noChinese: true, }; type Props = DialogProps; interface State { username: string; nickname: string; email: string; } const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { const { t } = useTranslation(); const userStore = useUserStore(); const user = userStore.state.user as User; const [state, setState] = useState({ username: user.username, nickname: user.nickname, email: user.email, }); useEffect(() => { // do nth }, []); const handleCloseBtnClick = () => { destroy(); }; const handleNicknameChanged = (e: React.ChangeEvent) => { setState((state) => { return { ...state, nickname: e.target.value as string, }; }); }; const handleUsernameChanged = (e: React.ChangeEvent) => { setState((state) => { return { ...state, username: e.target.value as string, }; }); }; const handleEmailChanged = (e: React.ChangeEvent) => { setState((state) => { return { ...state, email: e.target.value as string, }; }); }; const handleSaveBtnClick = async () => { if (state.username === "") { toastHelper.error(t("message.fill-all")); return; } const usernameValidResult = validate(state.username, validateConfig); if (!usernameValidResult.result) { toastHelper.error(t("common.username") + ": " + t(usernameValidResult.reason as string)); return; } try { const user = userStore.getState().user as User; const userPatch: UserPatch = { id: user.id, }; if (!isEqual(user.nickname, state.nickname)) { userPatch.nickname = state.nickname; } if (!isEqual(user.username, state.username)) { userPatch.username = state.username; } if (!isEqual(user.email, state.email)) { userPatch.email = state.email; } await userStore.patchUser(userPatch); toastHelper.info(t("message.update-succeed")); handleCloseBtnClick(); } catch (error: any) { console.error(error); toastHelper.error(error.response.data.error); } }; return ( <>

{t("setting.account-section.update-information")}

{t("common.nickname")} (Display in the banner)

{t("common.username")} (Using to sign in)

{t("common.email")} (Optional)

{t("common.cancel")} {t("common.save")}
); }; function showUpdateAccountDialog() { generateDialog( { className: "update-account-dialog", dialogName: "update-account-dialog", }, UpdateAccountDialog ); } export default showUpdateAccountDialog;