import React, { useState } from 'react'; import { useHistory } from 'react-router'; import { useTranslation } from 'react-i18next'; import { Container, Row, Col, Input, Modal, ModalHeader, ModalBody, ModalFooter, Button, } from 'reactstrap'; import { useUser, userService } from '../data/user'; import AppBar from '../common/AppBar'; 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(); 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 Settings: 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={() => { userService.logout(); history.push('/'); }} /> ); default: return null; } })()}
); }; export default Settings;