import React from 'react'; import { useTranslation } from 'next-i18next'; import PropTypes from 'prop-types'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import { Modal, ModalHeader, ModalBody, ModalFooter, Tooltip, } from 'reactstrap'; import AdminUsersContainer from '~/client/services/AdminUsersContainer'; import { apiv3Put } from '~/client/util/apiv3-client'; import { toastError } from '~/client/util/toastr'; import { useIsMailerSetup } from '~/stores/context'; class PasswordResetModal extends React.Component { constructor(props) { super(props); this.state = { temporaryPassword: '', isPasswordResetDone: false, isEmailSent: false, isEmailSending: false, showTooltip: false, }; this.resetPassword = this.resetPassword.bind(this); this.onClickSendNewPasswordButton = this.onClickSendNewPasswordButton.bind(this); } async resetPassword() { const { t, userForPasswordResetModal } = this.props; try { const res = await apiv3Put('/users/reset-password', { id: userForPasswordResetModal._id }); const { newPassword } = res.data; this.setState({ temporaryPassword: newPassword, isPasswordResetDone: true }); } catch (err) { toastError(err); } } renderButtons() { const { t, isMailerSetup } = this.props; const { isEmailSent, isEmailSending } = this.state; return ( <> ); } renderAddress() { const { t, isMailerSetup, userForPasswordResetModal } = this.props; return (
{!isMailerSetup ? (
); } renderModalBodyBeforeReset() { const { t, userForPasswordResetModal } = this.props; return ( <>

{t('user_management.reset_password_modal.password_never_seen')}
{t('user_management.reset_password_modal.send_new_password')}

{t('user_management.reset_password_modal.target_user')}: {userForPasswordResetModal.email}

); } returnModalBodyAfterReset() { const { t, userForPasswordResetModal } = this.props; const { temporaryPassword, showPassword, showTooltip } = this.state; const maskedPassword = showPassword ? temporaryPassword : '•'.repeat(temporaryPassword.length); return ( <>

{t('user_management.reset_password_modal.password_reset_message')}

{t('user_management.reset_password_modal.target_user')}: {userForPasswordResetModal.email}

{t('user_management.reset_password_modal.new_password')}:{' '} this.setState({ showPassword: true })} onMouseLeave={() => this.setState({ showPassword: false })} > {showPassword ? temporaryPassword : maskedPassword} this.setState({ showTooltip: true })}> this.setState({ showTooltip: false })} > {t('Copied!')}

); } returnModalFooterBeforeReset() { const { t } = this.props; return ( ); } returnModalFooterAfterReset() { return ( <> {this.renderAddress()} {this.renderButtons()} ); } async onClickSendNewPasswordButton() { const { userForPasswordResetModal, } = this.props; this.setState({ isEmailSending: true }); try { await apiv3Put('/users/reset-password-email', { id: userForPasswordResetModal._id, newPassword: this.state.temporaryPassword }); this.setState({ isEmailSent: true }); } catch (err) { this.setState({ isEmailSent: false }); toastError(err); } finally { this.setState({ isEmailSending: false }); } } render() { const { t } = this.props; return ( {t('user_management.reset_password') } {this.state.isPasswordResetDone ? this.returnModalBodyAfterReset() : this.renderModalBodyBeforeReset()} {this.state.isPasswordResetDone ? this.returnModalFooterAfterReset() : this.returnModalFooterBeforeReset()} ); } } const PasswordResetModalWrapperFC = (props) => { const { t } = useTranslation('admin'); const { data: isMailerSetup } = useIsMailerSetup(); return ; }; /** * Wrapper component for using unstated */ PasswordResetModal.propTypes = { t: PropTypes.func.isRequired, // i18next isOpen: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, userForPasswordResetModal: PropTypes.object, onSuccessfullySentNewPasswordEmail: PropTypes.func.isRequired, adminUsersContainer: PropTypes.instanceOf(AdminUsersContainer).isRequired, }; export default PasswordResetModalWrapperFC;