import type { FC } from '../../lib/teact/teact'; import React, { memo, useCallback, useEffect, useState, } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; import type { GlobalState } from '../../global/types'; import { decryptSession, UnrecoverablePasscodeError } from '../../util/passcode'; import { LOCAL_TGS_URLS } from '../common/helpers/animatedAssets'; import useTimeout from '../../hooks/schedulers/useTimeout'; import useFlag from '../../hooks/useFlag'; import useOldLang from '../../hooks/useOldLang'; import useShowTransitionDeprecated from '../../hooks/useShowTransitionDeprecated'; import AnimatedIconWithPreview from '../common/AnimatedIconWithPreview'; import PasswordForm from '../common/PasswordForm'; import Button from '../ui/Button'; import ConfirmDialog from '../ui/ConfirmDialog'; import Link from '../ui/Link'; import styles from './LockScreen.module.scss'; import lockPreviewUrl from '../../assets/lock.png'; export type OwnProps = { isLocked?: boolean; }; type StateProps = { passcodeSettings: GlobalState['passcode']; }; const ICON_SIZE = 160; const LockScreen: FC = ({ isLocked, passcodeSettings, }) => { const { unlockScreen, signOut, logInvalidUnlockAttempt, resetInvalidUnlockAttempts, } = getActions(); const { invalidAttemptsCount, timeoutUntil, isLoading, } = passcodeSettings; const lang = useOldLang(); const [validationError, setValidationError] = useState(''); const [shouldShowPasscode, setShouldShowPasscode] = useState(false); const [isSignOutDialogOpen, openSignOutConfirmation, closeSignOutConfirmation] = useFlag(false); const { shouldRender } = useShowTransitionDeprecated(isLocked); useTimeout(resetInvalidUnlockAttempts, timeoutUntil ? timeoutUntil - Date.now() : undefined); const handleClearError = useCallback(() => { setValidationError(''); }, []); const handleSubmit = useCallback((passcode: string) => { if (timeoutUntil !== undefined) { setValidationError(lang('FloodWait')); return; } setValidationError(''); decryptSession(passcode).then(unlockScreen, (err) => { if (err instanceof UnrecoverablePasscodeError) { signOut({ forceInitApi: true }); } logInvalidUnlockAttempt(); setValidationError(lang('lng_passcode_wrong')); }); }, [lang, timeoutUntil]); useEffect(() => { if (timeoutUntil !== undefined) { setValidationError(lang('FloodWait')); } else if (invalidAttemptsCount === 0) { setValidationError(''); } }, [timeoutUntil, lang, invalidAttemptsCount]); const handleSignOutMessage = useCallback(() => { closeSignOutConfirmation(); signOut({ forceInitApi: true }); }, [closeSignOutConfirmation, signOut]); if (!shouldRender) { return undefined; } function renderLogoutPrompt() { return (

Log out{' '} if you don't remember your passcode.

); } return (
{renderLogoutPrompt()}
); }; export default memo(withGlobal( (global): StateProps => { return { passcodeSettings: global.passcode, }; }, )(LockScreen));