import React, { useState } from "react"; import { useHistory } from "react-router"; import { useTranslation } from "react-i18next"; import { Form, Container, Row, Col, Button, Modal } from "react-bootstrap"; import { useUser, userService } from "@/services/user"; import OperationDialog, { OperationInputErrorInfo, } from "../common/OperationDialog"; interface ChangePasswordDialogProps { open: boolean; close: () => void; } const ChangePasswordDialog: React.FC = (props) => { const history = useHistory(); const { t } = useTranslation(); const [redirect, setRedirect] = useState(false); return ( v === "" ? "settings.dialogChangePassword.errorEmptyOldPassword" : null, }, { type: "text", label: t("settings.dialogChangePassword.inputNewPassword"), password: true, validator: (v, values) => { const error: OperationInputErrorInfo = {}; error[1] = v === "" ? "settings.dialogChangePassword.errorEmptyNewPassword" : null; if (v === values[2]) { error[2] = null; } else { if (values[2] !== "") { error[2] = "settings.dialogChangePassword.errorRetypeNotMatch"; } } return error; }, }, { type: "text", label: t("settings.dialogChangePassword.inputRetypeNewPassword"), password: true, validator: (v, values) => v !== values[1] ? "settings.dialogChangePassword.errorRetypeNotMatch" : null, }, ]} onProcess={async ([oldPassword, newPassword]) => { await userService .changePassword(oldPassword as string, newPassword as string) .toPromise(); await userService.logout(); setRedirect(true); }} close={() => { props.close(); if (redirect) { history.push("/login"); } }} /> ); }; const ConfirmLogoutDialog: React.FC<{ toggle: () => void; onConfirm: () => void; }> = ({ toggle, onConfirm }) => { const { t } = useTranslation(); return ( {t("settings.dialogConfirmLogout.title")} {t("settings.dialogConfirmLogout.prompt")} ); }; const SettingsPage: React.FC = (_) => { const { i18n, t } = useTranslation(); const user = useUser(); const history = useHistory(); const [dialog, setDialog] = useState( null ); const language = i18n.language.slice(0, 2); return ( {user ? ( <>
{ history.push(`/users/${user.username}`); }} > {t("settings.gotoSelf")}
setDialog("changepassword")} > {t("settings.changePassword")}
{ setDialog("logout"); }} > {t("settings.logout")}
) : null}
{t("settings.languagePrimary")}

{t("settings.languageSecondary")}

{ void i18n.changeLanguage(e.target.value); }} >
{(() => { switch (dialog) { case "changepassword": return ( { setDialog(null); }} /> ); case "logout": return ( setDialog(null)} onConfirm={() => { void userService.logout().then(() => { history.push("/"); }); }} /> ); default: return null; } })()}
); }; export default SettingsPage;