import type { FC } from '../../../../lib/teact/teact'; import React, { memo, useCallback, useEffect } from '../../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../../global'; import type { GlobalState } from '../../../../global/types'; import { SettingsScreens } from '../../../../types'; import type { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer'; import useLang from '../../../../hooks/useLang'; import SettingsTwoFaEnabled from './SettingsTwoFaEnabled'; import SettingsTwoFaPassword from '../SettingsPasswordForm'; import SettingsTwoFaStart from './SettingsTwoFaStart'; import SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm'; import SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations'; import SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode'; export type OwnProps = { state: TwoFaState; currentScreen: SettingsScreens; shownScreen: SettingsScreens; dispatch: TwoFaDispatch; isActive?: boolean; onScreenSelect: (screen: SettingsScreens) => void; onReset: () => void; }; type StateProps = GlobalState['twoFaSettings']; const SettingsTwoFa: FC = ({ currentScreen, shownScreen, state, hint, isLoading, error, waitingEmailCodeLength, dispatch, isActive, onScreenSelect, onReset, }) => { const { updatePassword, checkPassword, clearTwoFaError, updateRecoveryEmail, provideTwoFaEmailCode, clearPassword, } = getActions(); useEffect(() => { if (waitingEmailCodeLength) { if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) { onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode); } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) { onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode); } } }, [currentScreen, onScreenSelect, waitingEmailCodeLength]); const handleStartWizard = useCallback(() => { dispatch({ type: 'reset' }); onScreenSelect(SettingsScreens.TwoFaNewPassword); }, [dispatch, onScreenSelect]); const handleNewPassword = useCallback((value: string) => { dispatch({ type: 'setPassword', payload: value }); onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm); }, [dispatch, onScreenSelect]); const handleNewPasswordConfirm = useCallback(() => { onScreenSelect(SettingsScreens.TwoFaNewPasswordHint); }, [onScreenSelect]); const handleNewPasswordHint = useCallback((value?: string) => { dispatch({ type: 'setHint', payload: value }); onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail); }, [dispatch, onScreenSelect]); const handleNewPasswordEmail = useCallback((value?: string) => { dispatch({ type: 'setEmail', payload: value }); updatePassword({ ...state, email: value, onSuccess: () => { onScreenSelect(SettingsScreens.TwoFaCongratulations); }, }); }, [dispatch, onScreenSelect, state, updatePassword]); const handleChangePasswordCurrent = useCallback((value: string) => { dispatch({ type: 'setCurrentPassword', payload: value }); checkPassword({ currentPassword: value, onSuccess: () => { onScreenSelect(SettingsScreens.TwoFaChangePasswordNew); }, }); }, [checkPassword, dispatch, onScreenSelect]); const handleChangePasswordNew = useCallback((value: string) => { dispatch({ type: 'setPassword', payload: value }); onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm); }, [dispatch, onScreenSelect]); const handleChangePasswordConfirm = useCallback(() => { onScreenSelect(SettingsScreens.TwoFaChangePasswordHint); }, [onScreenSelect]); const handleChangePasswordHint = useCallback((value?: string) => { dispatch({ type: 'setHint', payload: value }); updatePassword({ ...state, hint: value, onSuccess: () => { onScreenSelect(SettingsScreens.TwoFaCongratulations); }, }); }, [dispatch, onScreenSelect, state, updatePassword]); const handleTurnOff = useCallback((value: string) => { clearPassword({ currentPassword: value, onSuccess: () => { onScreenSelect(SettingsScreens.Privacy); }, }); }, [clearPassword, onScreenSelect]); const handleRecoveryEmailCurrentPassword = useCallback((value: string) => { dispatch({ type: 'setCurrentPassword', payload: value }); checkPassword({ currentPassword: value, onSuccess: () => { onScreenSelect(SettingsScreens.TwoFaRecoveryEmail); }, }); }, [checkPassword, dispatch, onScreenSelect]); const handleRecoveryEmail = useCallback((value?: string) => { dispatch({ type: 'setEmail', payload: value }); updateRecoveryEmail({ ...state, email: value!, onSuccess: () => { onScreenSelect(SettingsScreens.TwoFaCongratulations); }, }); }, [dispatch, onScreenSelect, state, updateRecoveryEmail]); const handleEmailCode = useCallback((code: string) => { provideTwoFaEmailCode({ code }); }, [provideTwoFaEmailCode]); const lang = useLang(); switch (currentScreen) { case SettingsScreens.TwoFaDisabled: return ( ); case SettingsScreens.TwoFaNewPassword: return ( ); case SettingsScreens.TwoFaNewPasswordConfirm: return ( ); case SettingsScreens.TwoFaNewPasswordHint: return ( ); case SettingsScreens.TwoFaNewPasswordEmail: return ( ); case SettingsScreens.TwoFaNewPasswordEmailCode: return ( ); case SettingsScreens.TwoFaCongratulations: return ( ); case SettingsScreens.TwoFaEnabled: return ( ); case SettingsScreens.TwoFaChangePasswordCurrent: return ( ); case SettingsScreens.TwoFaChangePasswordNew: return ( ); case SettingsScreens.TwoFaChangePasswordConfirm: return ( ); case SettingsScreens.TwoFaChangePasswordHint: return ( ); case SettingsScreens.TwoFaTurnOff: return ( ); case SettingsScreens.TwoFaRecoveryEmailCurrentPassword: return ( ); case SettingsScreens.TwoFaRecoveryEmail: return ( ); case SettingsScreens.TwoFaRecoveryEmailCode: return ( ); default: return undefined; } }; export default memo(withGlobal( (global): StateProps => ({ ...global.twoFaSettings }), )(SettingsTwoFa));