1import * as React from 'react'
2import * as Container from '../../util/container'
3import * as SettingsGen from '../../actions/settings-gen'
4import * as SettingsConstants from '../../constants/settings'
5import * as SignupGen from '../../actions/signup-gen'
6import * as SignupConstants from '../../constants/signup'
7import * as RouteTreeGen from '../../actions/route-tree-gen'
8import * as Platform from '../../constants/platform'
9import {anyWaiting} from '../../constants/waiting'
10import EnterEmail, {Props} from '.'
11
12type OwnProps = {}
13
14type WatcherProps = Props & {
15  addedEmail?: string
16  onSuccess: (email: string) => void
17}
18const WatchForSuccess = (props: WatcherProps) => {
19  const [addEmailInProgress, setAddEmailInProgress] = React.useState('')
20  React.useEffect(() => {
21    if (props.addedEmail === addEmailInProgress) {
22      props.onSuccess(addEmailInProgress)
23    }
24  }, [props.addedEmail, addEmailInProgress, props])
25
26  const onCreate = (email: string, searchable: boolean) => {
27    props.onCreate(email, searchable)
28    setAddEmailInProgress(email)
29  }
30
31  return (
32    <EnterEmail
33      error={props.error}
34      initialEmail={props.initialEmail}
35      onCreate={onCreate}
36      onSkip={props.onSkip}
37      waiting={props.waiting}
38    />
39  )
40}
41
42const ConnectedEnterEmail = Container.connect(
43  (state: Container.TypedState) => ({
44    _showPushPrompt: Platform.isMobile && !state.push.hasPermissions && state.push.showPushPrompt,
45    addedEmail: state.settings.email.addedEmail,
46    error: state.settings.email.error || '',
47    initialEmail: state.signup.email,
48    waiting: anyWaiting(state, SettingsConstants.addEmailWaitingKey),
49  }),
50  (dispatch: Container.TypedDispatch) => ({
51    _navClearModals: () => dispatch(RouteTreeGen.createClearModals()),
52    _navToPushPrompt: () =>
53      dispatch(
54        RouteTreeGen.createNavigateAppend({
55          path: ['settingsPushPrompt'],
56          replace: true,
57        })
58      ),
59    _onSkip: () => dispatch(SignupGen.createSetJustSignedUpEmail({email: SignupConstants.noEmail})),
60    _onSuccess: (email: string) => dispatch(SignupGen.createSetJustSignedUpEmail({email})),
61    onCreate: (email: string, searchable: boolean) => {
62      dispatch(SettingsGen.createAddEmail({email, searchable}))
63    },
64  }),
65  (s, d, o: OwnProps) => ({
66    addedEmail: s.addedEmail,
67    error: s.error,
68    initialEmail: s.initialEmail,
69    onCreate: d.onCreate,
70    onSkip: () => {
71      d._onSkip()
72      s._showPushPrompt ? d._navToPushPrompt() : d._navClearModals()
73    },
74    onSuccess: (email: string) => {
75      d._onSuccess(email)
76      s._showPushPrompt ? d._navToPushPrompt() : d._navClearModals()
77    },
78    waiting: s.waiting,
79    ...o,
80  })
81)(WatchForSuccess)
82
83export default ConnectedEnterEmail
84