import React, { useMemo, useState } from 'react'; import { Formik, FormikHelpers, FormikState } from 'formik'; import * as Yup from 'yup'; import SubmitButton from './SubmitButton'; import TextField from '@mui/material/TextField'; import ShowHidePassword from '@ente/shared/components/Form/ShowHidePassword'; import { FlexWrapper } from '@ente/shared/components/Container'; import { Button, FormHelperText } from '@mui/material'; import { t } from 'i18next'; interface formValues { inputValue: string; } export interface SingleInputFormProps { callback: ( inputValue: string, setFieldError: (errorMessage: string) => void, resetForm: (nextState?: Partial>) => void ) => Promise; fieldType: 'text' | 'email' | 'password'; placeholder: string; buttonText: string; submitButtonProps?: any; initialValue?: string; secondaryButtonAction?: () => void; disableAutoFocus?: boolean; hiddenPreInput?: any; caption?: any; hiddenPostInput?: any; autoComplete?: string; blockButton?: boolean; hiddenLabel?: boolean; disableAutoComplete?: boolean; } export default function SingleInputForm(props: SingleInputFormProps) { const { submitButtonProps } = props; const { sx: buttonSx, ...restSubmitButtonProps } = submitButtonProps ?? {}; const [loading, SetLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); const submitForm = async ( values: formValues, { setFieldError, resetForm }: FormikHelpers ) => { SetLoading(true); await props.callback( values.inputValue, (message) => setFieldError('inputValue', message), resetForm ); SetLoading(false); }; const handleClickShowPassword = () => { setShowPassword(!showPassword); }; const handleMouseDownPassword = ( event: React.MouseEvent ) => { event.preventDefault(); }; const validationSchema = useMemo(() => { switch (props.fieldType) { case 'text': return Yup.object().shape({ inputValue: Yup.string().required(t('REQUIRED')), }); case 'password': return Yup.object().shape({ inputValue: Yup.string().required(t('REQUIRED')), }); case 'email': return Yup.object().shape({ inputValue: Yup.string() .email(t('EMAIL_ERROR')) .required(t('REQUIRED')), }); } }, [props.fieldType]); return ( initialValues={{ inputValue: props.initialValue ?? '' }} onSubmit={submitForm} validationSchema={validationSchema} validateOnChange={false} validateOnBlur={false}> {({ values, errors, handleChange, handleSubmit }) => (
{props.hiddenPreInput} ), }} /> {props.caption} {props.hiddenPostInput} {props.secondaryButtonAction && ( )} )} ); }