import { isEqual } from "lodash"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useAppSelector } from "../store"; import { userService } from "../services"; import Icon from "./Icon"; import { generateDialog } from "./Dialog"; import toastHelper from "./Toast"; type Props = DialogProps; interface State { username: string; nickname: string; email: string; } const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { const { t } = useTranslation(); const user = useAppSelector((state) => state.user.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; } try { const user = userService.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 userService.patchUser(userPatch); toastHelper.info("Update succeed"); handleCloseBtnClick(); } catch (error: any) { console.error(error); toastHelper.error(error.response.data.error); } }; return ( <>

Update information

Nickname(Display in the banner)

Username (Using to sign in)

Email(Optional)

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