import { ChangeEvent, useMemo, useEffect, useRef, useState } from 'react'; import { useMutation } from 'react-query'; import { useRegisterStore } from '../stores/useRegisterStore'; import { RegisterProps } from '~/types/auth'; import { registerUser } from '~/services/auth'; import TermCondition from './TermCondition'; import FormCaptcha from './FormCaptcha'; import { useRouter } from 'next/router'; import { UseToastOptions, useToast } from '@chakra-ui/react'; import Link from 'next/link'; interface FormProps { type: string; required: boolean; isBisnisRegist: boolean; chekValid: boolean; buttonSubmitClick: boolean; } const Form: React.FC = ({ type, required, isBisnisRegist = false, chekValid, buttonSubmitClick, }) => { const { form, isCheckedTNC, isValidCaptcha, errors, updateForm, validate } = useRegisterStore(); const isFormValid = useMemo(() => Object.keys(errors).length === 0, [errors]); const router = useRouter(); const toast = useToast(); const emailRef = useRef(null); const nameRef = useRef(null); const passwordRef = useRef(null); const teleponRef = useRef(null); const handleInputChange = (event: ChangeEvent) => { const { name, value } = event.target; updateForm(name, value); validate(); }; const mutation = useMutation({ mutationFn: (data: RegisterProps) => registerUser(data), }); useEffect(() => { const loadIndustries = async () => { const response = await mutation.mutateAsync(form); if (!response?.register) { // Logic to focus on first invalid input if (errors.email_partner && emailRef.current) { emailRef.current.focus(); return; } if (errors.name && nameRef.current) { nameRef.current.focus(); return; } if (errors.password && passwordRef.current) { passwordRef.current.focus(); return; } if (errors.phone && teleponRef.current) { teleponRef.current.scrollIntoView(); return; } } }; loadIndustries(); }, [buttonSubmitClick]); const handleSubmit = async (e: ChangeEvent) => { e.preventDefault(); const response = await mutation.mutateAsync(form); if (response?.register === true) { const urlParams = new URLSearchParams({ activation: 'otp', email: form.email, redirect: (router.query?.next || '/') as string, }); router.push(`${router.route}?${urlParams}`); } const toastProps: UseToastOptions = { duration: 5000, isClosable: true, position: 'top', }; switch (response?.reason) { case 'EMAIL_USED': toast({ ...toastProps, title: 'Email sudah digunakan', status: 'warning', }); break; case 'NOT_ACTIVE': const activationUrl = `${router.route}?activation=email`; toast({ ...toastProps, title: 'Akun belum aktif', description: ( <> Akun sudah terdaftar namun belum aktif.{' '} Klik untuk aktivasi akun ), status: 'warning', }); break; } }; return (
{chekValid && !!errors.name && ( {errors.name} )}
{chekValid && !!errors.email && ( {errors.email} )}
{chekValid && !!errors.password && ( {errors.password} )}
{chekValid && !!errors.phone && ( {errors.phone} )}
); }; export default Form;