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