"use client"; import React, { forwardRef, useEffect, useImperativeHandle, useState, } from "react"; import { useForm } from "react-hook-form"; import { yupResolver } from "@hookform/resolvers/yup"; import { signUpValidationSchema } from "@/utils/form"; import { login, signup, createCheckoutSession, mailchimp, } from "@/app/(auth)/actions"; import { CheckoutSession, ModalStatus, SignUpForm, TextOnUse } from "@/types"; import { toast } from "react-toastify"; import { useRouter } from "next/navigation"; import { FormRefMethods } from "../ModalSignIn/ModalSignInForm"; interface ModalSignUpFormProps { generateCheckoutSession: boolean; textOnUse: TextOnUse; companySizeList: string[]; setStatus: React.Dispatch>; getPriceId: () => string | undefined; } const ModalSignUpForm = forwardRef( ( { generateCheckoutSession, companySizeList, textOnUse, setStatus, getPriceId, }: ModalSignUpFormProps, ref ) => { const router = useRouter(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [organisation, setOrganisation] = useState(""); const { register, handleSubmit, reset, formState: { errors }, } = useForm({ resolver: yupResolver(signUpValidationSchema), }); const submitForm = async (data: SignUpForm) => { setEmail(data.email); setPassword(data.password!); setOrganisation(data.organisation); setStatus(ModalStatus.Loading); try { await sendMailchimpRequest(data); await sendSignUpRequest(data); await sendSignInRequest(data); const price_id = getPriceId(); console.log("price_id", price_id); const checkoutSession = await checkoutSessionRequest(price_id); setEmail(""); setPassword(""); setOrganisation(""); reset(); setStatus(ModalStatus.Success); if (!!checkoutSession) { router.push(checkoutSession.url); } } catch (error) { if (error instanceof Error) { toast.error(error.message, { position: "bottom-left", autoClose: 5000, hideProgressBar: false, closeOnClick: true, pauseOnHover: true, draggable: true, progress: undefined, theme: "colored", }); } setStatus(ModalStatus.Default); } }; const sendMailchimpRequest = async (data: SignUpForm) => { console.log("sendMailchimpRequest call initiated"); await mailchimp({ email: data.email, first_name: data.first_name, last_name: data.last_name, phone_number: !data.phone_number ? "" : data.phone_number, company_size: data.company_size, source: textOnUse.source, }); console.log("sendMailchimpRequest call success"); }; const checkoutSessionRequest = async (price_id?: string) => { if (!price_id) { return; } console.log("createCheckoutSession call initiated"); const checkoutSession = await createCheckoutSession(price_id); console.log("createCheckoutSession successful"); return checkoutSession; }; const sendSignUpRequest = async (data: SignUpForm) => { try { console.log("Signup call initiated"); await signup(data); console.log("Signup successful"); } catch (error) { if (error instanceof Error) { console.error( "Error during the signup or email process:", error.message ); } throw error; // This will allow .catch block outside this function to capture the error } }; const sendSignInRequest = async (data: SignUpForm) => { try { console.log("SignIn call initiated"); await login({ email: data.email, password: data.password! }); console.log("SignIn successful"); } catch (error) { if (error instanceof Error) { console.error( "Error during the SignIn or email process:", error.message ); } throw error; // This will allow .catch block outside this function to capture the error } }; useImperativeHandle(ref, () => ({ resetForm: () => { reset(); setEmail(""); setPassword(""); setOrganisation(""); }, })); return (
); } ); ModalSignUpForm.displayName = "ModalSignUpForm"; export default ModalSignUpForm;