import { ChangeEvent } from 'react'; import React, { FC, memo, useEffect, useRef, useState, } from '../../lib/teact/teact'; import { MIN_PASSWORD_LENGTH } from '../../config'; import { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment'; import buildClassName from '../../util/buildClassName'; import Button from '../ui/Button'; type OwnProps = { submitLabel?: string; error?: string; hint?: string; placeholder?: string; isLoading?: boolean; isPasswordVisible?: boolean; clearError: NoneToVoidFunction; onChangePasswordVisibility: (state: boolean) => void; onInputChange?: (password: string) => void; onSubmit: (password: string) => void; }; const FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400; const PasswordForm: FC = ({ isLoading = false, isPasswordVisible, error, hint, placeholder = 'Password', submitLabel = 'Next', clearError, onChangePasswordVisibility, onInputChange, onSubmit, }) => { // eslint-disable-next-line no-null/no-null const inputRef = useRef(null); const [password, setPassword] = useState(''); const [canSubmit, setCanSubmit] = useState(false); useEffect(() => { if (!IS_TOUCH_ENV) { setTimeout(() => { inputRef.current!.focus(); }, FOCUS_DELAY_TIMEOUT_MS); } }, []); function onPasswordChange(e: ChangeEvent) { if (error) { clearError(); } const { target } = e; setPassword(target.value); setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH); if (onInputChange) { onInputChange(target.value); } } function togglePasswordVisibility() { onChangePasswordVisibility(!isPasswordVisible); } function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (isLoading) { return; } if (canSubmit) { onSubmit(password); } } return (
{canSubmit && ( )} ); }; export default memo(PasswordForm);