accounts-frontend/src/pages/profile/MultiFactorAuthPage.js

95 lines
2.0 KiB
JavaScript
Raw Normal View History

// @flow
import type { RouterHistory, Match } from 'react-router-dom';
import React, { Component } from 'react';
import PropTypes from 'prop-types';
2017-09-09 19:52:19 +05:30
import { connect } from 'react-redux';
2017-07-22 21:27:38 +05:30
2017-09-09 19:52:19 +05:30
import MultiFactorAuth from 'components/profile/multiFactorAuth';
import type { MfaStep } from 'components/profile/multiFactorAuth';
import type { FormModel } from 'components/ui/form';
2017-09-09 19:52:19 +05:30
import type { User } from 'components/user';
2017-07-22 21:27:38 +05:30
type OwnProps = {|
history: RouterHistory,
match: {
...Match,
params: {
step?: '1' | '2' | '3',
},
},
|};
type Props = {
...OwnProps,
user: User,
};
class MultiFactorAuthPage extends Component<Props> {
static contextTypes = {
onSubmit: PropTypes.func.isRequired,
goToProfile: PropTypes.func.isRequired,
};
componentWillMount() {
const { step } = this.props.match.params;
const { user } = this.props;
if (step) {
if (!/^[1-3]$/.test(step)) {
// wrong param value
this.props.history.push('/404');
return;
}
if (user.isOtpEnabled) {
this.props.history.push('/mfa');
}
2017-07-22 21:27:38 +05:30
}
}
render() {
const { user } = this.props;
return (
<MultiFactorAuth
isMfaEnabled={user.isOtpEnabled}
onSubmit={this.onSubmit}
step={this.getStep()}
onChangeStep={this.onChangeStep}
onComplete={this.onComplete}
/>
);
}
getStep(): MfaStep {
const step = (parseInt(this.props.match.params.step, 10) || 1) - 1;
if (step !== 0 && step !== 1 && step !== 2) {
// NOTE: flow does not understand Array.includes()
return 1;
2017-07-22 21:27:38 +05:30
}
return step;
}
onChangeStep = (step: MfaStep) => {
this.props.history.push(`/profile/mfa/step${step + 1}`);
};
2017-07-22 21:27:38 +05:30
onSubmit = (form: FormModel, sendData: () => Promise<*>) => {
return this.context.onSubmit({
form,
sendData,
});
};
2017-07-22 21:27:38 +05:30
onComplete = () => {
this.context.goToProfile();
};
2017-07-22 21:27:38 +05:30
}
export default connect<Props, OwnProps, _, _, _, _>(({ user }) => ({ user }))(
MultiFactorAuthPage,
);