1import * as React from 'react'
2import * as Container from '../../util/container'
3import * as RouteTreeGen from '../../actions/route-tree-gen'
4import * as SettingsGen from '../../actions/settings-gen'
5import * as SettingsConstants from '../../constants/settings'
6import {anyWaiting} from '../../constants/waiting'
7import VerifyPhoneNumber, {Props} from './verify'
8
9type OwnProps = {}
10
11type WatcherProps = Props & {
12  onCleanup: () => void
13  onSuccess: () => void
14  verificationStatus?: 'success' | 'error'
15}
16// Watches for verification to succeed and exits
17export class WatchForSuccess extends React.Component<WatcherProps> {
18  componentDidUpdate() {
19    if (this.props.verificationStatus === 'success') {
20      this.props.onSuccess()
21    }
22  }
23  componentWillUnmount() {
24    this.props.onCleanup()
25  }
26  render() {
27    return (
28      <VerifyPhoneNumber
29        error={this.props.error}
30        onBack={this.props.onBack}
31        onContinue={this.props.onContinue}
32        onResend={this.props.onResend}
33        phoneNumber={this.props.phoneNumber}
34        resendWaiting={this.props.resendWaiting}
35        verifyWaiting={this.props.verifyWaiting}
36      />
37    )
38  }
39}
40
41export default Container.namedConnect(
42  state => ({
43    error: state.settings.phoneNumbers.verificationState === 'error' ? state.settings.phoneNumbers.error : '',
44    phoneNumber: state.settings.phoneNumbers.pendingVerification,
45    resendWaiting: anyWaiting(
46      state,
47      SettingsConstants.resendVerificationForPhoneWaitingKey,
48      SettingsConstants.addPhoneNumberWaitingKey
49    ),
50    verificationStatus: state.settings.phoneNumbers.verificationState,
51    verifyWaiting: anyWaiting(state, SettingsConstants.verifyPhoneNumberWaitingKey),
52  }),
53  dispatch => ({
54    _onContinue: (phoneNumber: string, code: string) =>
55      dispatch(SettingsGen.createVerifyPhoneNumber({code, phoneNumber})),
56    _onResend: (phoneNumber: string) =>
57      dispatch(SettingsGen.createResendVerificationForPhoneNumber({phoneNumber})),
58    onBack: () => dispatch(RouteTreeGen.createNavigateUp()),
59    onCleanup: () => dispatch(SettingsGen.createClearPhoneNumberAdd()),
60    onSuccess: () => dispatch(RouteTreeGen.createClearModals()),
61  }),
62  (stateProps, dispatchProps, _: OwnProps) => ({
63    error: stateProps.error,
64    onBack: dispatchProps.onBack,
65    onCleanup: dispatchProps.onCleanup,
66    onContinue: (code: string) => dispatchProps._onContinue(stateProps.phoneNumber, code),
67    onResend: () => dispatchProps._onResend(stateProps.phoneNumber),
68    onSuccess: dispatchProps.onSuccess,
69    phoneNumber: stateProps.phoneNumber,
70    resendWaiting: stateProps.resendWaiting,
71    verificationStatus: stateProps.verificationStatus,
72    verifyWaiting: stateProps.verifyWaiting,
73  }),
74  'ConnectedVerifyPhoneNumber'
75)(WatchForSuccess)
76