mirror of
https://github.com/kingomarnajjar/flex-template-web.git
synced 2026-07-26 06:47:17 +10:00
235 lines
6.7 KiB
JavaScript
235 lines
6.7 KiB
JavaScript
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { compose } from 'redux';
|
|
import { connect } from 'react-redux';
|
|
import { FormattedMessage, injectIntl, intlShape } from 'react-intl';
|
|
import { propTypes } from '../../util/types';
|
|
import {
|
|
isPasswordRecoveryEmailNotFoundError,
|
|
isPasswordRecoveryEmailNotVerifiedError,
|
|
} from '../../util/errors';
|
|
import { isScrollingDisabled } from '../../ducks/UI.duck';
|
|
import {
|
|
Page,
|
|
InlineTextButton,
|
|
IconKeys,
|
|
LayoutSingleColumn,
|
|
LayoutWrapperMain,
|
|
LayoutWrapperTopbar,
|
|
LayoutWrapperFooter,
|
|
Footer,
|
|
} from '../../components';
|
|
import { PasswordRecoveryForm } from '../../forms';
|
|
import { TopbarContainer } from '../../containers';
|
|
|
|
import {
|
|
recoverPassword,
|
|
retypePasswordRecoveryEmail,
|
|
clearPasswordRecoveryError,
|
|
} from './PasswordRecoveryPage.duck';
|
|
import DoorIcon from './DoorIcon';
|
|
import css from './PasswordRecoveryPage.css';
|
|
|
|
export const PasswordRecoveryPageComponent = props => {
|
|
const {
|
|
scrollingDisabled,
|
|
initialEmail,
|
|
submittedEmail,
|
|
recoveryError,
|
|
recoveryInProgress,
|
|
passwordRequested,
|
|
onChange,
|
|
onSubmitEmail,
|
|
onRetypeEmail,
|
|
intl,
|
|
} = props;
|
|
|
|
const title = intl.formatMessage({
|
|
id: 'PasswordRecoveryPage.title',
|
|
});
|
|
|
|
const resendEmailLink = (
|
|
<InlineTextButton className={css.helperLink} onClick={() => onSubmitEmail(submittedEmail)}>
|
|
<FormattedMessage id="PasswordRecoveryPage.resendEmailLinkText" />
|
|
</InlineTextButton>
|
|
);
|
|
|
|
const fixEmailLink = (
|
|
<InlineTextButton className={css.helperLink} onClick={onRetypeEmail}>
|
|
<FormattedMessage id="PasswordRecoveryPage.fixEmailLinkText" />
|
|
</InlineTextButton>
|
|
);
|
|
|
|
const submitEmailContent = (
|
|
<div className={css.submitEmailContent}>
|
|
<IconKeys className={css.modalIcon} />
|
|
<h1 className={css.modalTitle}>
|
|
<FormattedMessage id="PasswordRecoveryPage.forgotPasswordTitle" />
|
|
</h1>
|
|
<p className={css.modalMessage}>
|
|
<FormattedMessage id="PasswordRecoveryPage.forgotPasswordMessage" />
|
|
</p>
|
|
<PasswordRecoveryForm
|
|
inProgress={recoveryInProgress}
|
|
onChange={onChange}
|
|
onSubmit={values => onSubmitEmail(values.email)}
|
|
initialValues={{ email: initialEmail }}
|
|
recoveryError={recoveryError}
|
|
/>
|
|
</div>
|
|
);
|
|
|
|
const submittedEmailText = passwordRequested ? (
|
|
<span className={css.email}>{initialEmail}</span>
|
|
) : (
|
|
<span className={css.email}>{submittedEmail}</span>
|
|
);
|
|
|
|
const emailSubmittedContent = (
|
|
<div className={css.emailSubmittedContent}>
|
|
<IconKeys className={css.modalIcon} />
|
|
<h1 className={css.modalTitle}>
|
|
<FormattedMessage id="PasswordRecoveryPage.emailSubmittedTitle" />
|
|
</h1>
|
|
<p className={css.modalMessage}>
|
|
<FormattedMessage
|
|
id="PasswordRecoveryPage.emailSubmittedMessage"
|
|
values={{ submittedEmailText }}
|
|
/>
|
|
</p>
|
|
<div className={css.bottomWrapper}>
|
|
<p className={css.helperText}>
|
|
{recoveryInProgress ? (
|
|
<FormattedMessage id="PasswordRecoveryPage.resendingEmailInfo" />
|
|
) : (
|
|
<FormattedMessage
|
|
id="PasswordRecoveryPage.resendEmailInfo"
|
|
values={{ resendEmailLink }}
|
|
/>
|
|
)}
|
|
</p>
|
|
<p className={css.helperText}>
|
|
<FormattedMessage id="PasswordRecoveryPage.fixEmailInfo" values={{ fixEmailLink }} />
|
|
</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
|
|
const initialEmailText = <span className={css.email}>{initialEmail}</span>;
|
|
const emailNotVerifiedContent = (
|
|
<div className={css.emailNotVerifiedContent}>
|
|
<DoorIcon className={css.modalIcon} />
|
|
<h1 className={css.modalTitle}>
|
|
<FormattedMessage id="PasswordRecoveryPage.emailNotVerifiedTitle" />
|
|
</h1>
|
|
<p className={css.modalMessage}>
|
|
<FormattedMessage
|
|
id="PasswordRecoveryPage.emailNotVerifiedMessage"
|
|
values={{ initialEmailText }}
|
|
/>
|
|
</p>
|
|
<p className={css.modalMessage}>
|
|
<FormattedMessage id="PasswordRecoveryPage.emailNotVerifiedContactAdmin" />
|
|
</p>
|
|
</div>
|
|
);
|
|
|
|
const genericErrorContent = (
|
|
<div className={css.genericErrorContent}>
|
|
<IconKeys className={css.modalIcon} />
|
|
<h1 className={css.modalTitle}>
|
|
<FormattedMessage id="PasswordRecoveryPage.actionFailedTitle" />
|
|
</h1>
|
|
<p className={css.modalMessage}>
|
|
<FormattedMessage id="PasswordRecoveryPage.actionFailedMessage" />
|
|
</p>
|
|
</div>
|
|
);
|
|
|
|
let content;
|
|
if (isPasswordRecoveryEmailNotVerifiedError(recoveryError)) {
|
|
content = emailNotVerifiedContent;
|
|
} else if (isPasswordRecoveryEmailNotFoundError(recoveryError)) {
|
|
content = submitEmailContent;
|
|
} else if (recoveryError) {
|
|
content = genericErrorContent;
|
|
} else if (submittedEmail || passwordRequested) {
|
|
content = emailSubmittedContent;
|
|
} else {
|
|
content = submitEmailContent;
|
|
}
|
|
|
|
return (
|
|
<Page title={title} scrollingDisabled={scrollingDisabled}>
|
|
<LayoutSingleColumn>
|
|
<LayoutWrapperTopbar>
|
|
<TopbarContainer />
|
|
</LayoutWrapperTopbar>
|
|
<LayoutWrapperMain className={css.layoutWrapperMain}>
|
|
<div className={css.root}>{content}</div>
|
|
</LayoutWrapperMain>
|
|
<LayoutWrapperFooter>
|
|
<Footer />
|
|
</LayoutWrapperFooter>
|
|
</LayoutSingleColumn>
|
|
</Page>
|
|
);
|
|
};
|
|
|
|
PasswordRecoveryPageComponent.defaultProps = {
|
|
sendVerificationEmailError: null,
|
|
initialEmail: null,
|
|
submittedEmail: null,
|
|
recoveryError: null,
|
|
};
|
|
|
|
const { bool, func, string } = PropTypes;
|
|
|
|
PasswordRecoveryPageComponent.propTypes = {
|
|
scrollingDisabled: bool.isRequired,
|
|
initialEmail: string,
|
|
submittedEmail: string,
|
|
recoveryError: propTypes.error,
|
|
recoveryInProgress: bool.isRequired,
|
|
passwordRequested: bool.isRequired,
|
|
onChange: func.isRequired,
|
|
onSubmitEmail: func.isRequired,
|
|
onRetypeEmail: func.isRequired,
|
|
|
|
// from injectIntl
|
|
intl: intlShape.isRequired,
|
|
};
|
|
|
|
const mapStateToProps = state => {
|
|
const {
|
|
initialEmail,
|
|
submittedEmail,
|
|
recoveryError,
|
|
recoveryInProgress,
|
|
passwordRequested,
|
|
} = state.PasswordRecoveryPage;
|
|
return {
|
|
scrollingDisabled: isScrollingDisabled(state),
|
|
initialEmail,
|
|
submittedEmail,
|
|
recoveryError,
|
|
recoveryInProgress,
|
|
passwordRequested,
|
|
};
|
|
};
|
|
|
|
const mapDispatchToProps = dispatch => ({
|
|
onChange: () => dispatch(clearPasswordRecoveryError()),
|
|
onSubmitEmail: email => dispatch(recoverPassword(email)),
|
|
onRetypeEmail: () => dispatch(retypePasswordRecoveryEmail()),
|
|
});
|
|
|
|
const PasswordRecoveryPage = compose(
|
|
connect(
|
|
mapStateToProps,
|
|
mapDispatchToProps
|
|
),
|
|
injectIntl
|
|
)(PasswordRecoveryPageComponent);
|
|
|
|
export default PasswordRecoveryPage;
|