import React from "react"; import Link from "next/link"; // react hook form import { useForm } from "react-hook-form"; // services import authenticationService from "services/authentication.service"; // hooks import useToast from "hooks/use-toast"; // ui import { Input, SecondaryButton } from "components/ui"; // types type EmailPasswordFormValues = { email: string; password?: string; medium?: string; }; export const EmailPasswordForm = ({ onSuccess }: any) => { const { setToastAlert } = useToast(); const { register, handleSubmit, setError, formState: { errors, isSubmitting, isValid, isDirty }, } = useForm<EmailPasswordFormValues>({ defaultValues: { email: "", password: "", medium: "email", }, mode: "onChange", reValidateMode: "onChange", }); const onSubmit = (formData: EmailPasswordFormValues) => { authenticationService .emailLogin(formData) .then((response) => { onSuccess(response); }) .catch((error) => { console.log(error); setToastAlert({ title: "Oops!", type: "error", message: "Enter the correct email address and password to sign in", }); if (!error?.response?.data) return; Object.keys(error.response.data).forEach((key) => { const err = error.response.data[key]; console.log(err); setError(key as keyof EmailPasswordFormValues, { type: "manual", message: Array.isArray(err) ? err.join(", ") : err, }); }); }); }; return ( <> <form className="mt-5 py-5 px-5" onSubmit={handleSubmit(onSubmit)}> <div> <Input id="email" type="email" name="email" register={register} validations={{ required: "Email ID is required", validate: (value) => /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test( value ) || "Email ID is not valid", }} error={errors.email} placeholder="Enter your Email ID" /> </div> <div className="mt-5"> <Input id="password" type="password" name="password" register={register} validations={{ required: "Password is required", }} error={errors.password} placeholder="Enter your password" /> </div> <div className="mt-2 flex items-center justify-between"> <div className="ml-auto text-sm"> <Link href={"/forgot-password"}> <a className="font-medium text-brand-accent hover:text-brand-accent"> Forgot your password? </a> </Link> </div> </div> <div className="mt-5"> <SecondaryButton type="submit" className="w-full text-center" disabled={!isValid && isDirty} loading={isSubmitting} > {isSubmitting ? "Signing in..." : "Sign In"} </SecondaryButton> </div> </form> </> ); };