import { FlexWrapper } from "@ente/shared/components/Container"; import ShowHidePassword from "@ente/shared/components/Form/ShowHidePassword"; import { Button, FormHelperText } from "@mui/material"; import TextField from "@mui/material/TextField"; import { Formik, FormikHelpers, FormikState } from "formik"; import { t } from "i18next"; import React, { useMemo, useState } from "react"; import * as Yup from "yup"; import SubmitButton from "./SubmitButton"; 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 && ( )} )} ); }