import useGlobalStore from '@/config/use-global'; import { zodResolver } from '@hookform/resolvers/zod'; import { Icon } from '@iconify/react/dist/iconify.js'; import { Button } from '@workspace/ui/components/button'; import { Form, FormControl, FormField, FormItem, FormMessage } from '@workspace/ui/components/form'; import { Input } from '@workspace/ui/components/input'; import { useTranslations } from 'next-intl'; import { useEffect, useRef, useState } from 'react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; export default function UserCheckForm({ loading, onSubmit, initialValues, }: { loading?: boolean; onSubmit: (data: any) => void; initialValues: any; }) { const t = useTranslations('auth.check'); const { common } = useGlobalStore(); const { register } = common; const formSchema = z.object({ email: z .string() .email(t('email')) .refine( (email) => { if (!register.enable_email_domain_suffix) return true; const domain = email.split('@')[1]; return register.email_domain_suffix_list.split('\n').includes(domain || ''); }, { message: t('whitelist'), }, ), }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: initialValues, }); const [isSubmitting, setIsSubmitting] = useState(false); const typingTimeoutRef = useRef(null); const handleEmailChange = (value: string) => { form.setValue('email', value); if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); } typingTimeoutRef.current = setTimeout(async () => { const isValid = await form.trigger('email'); if (isValid) { setIsSubmitting(true); form.handleSubmit(onSubmit)(); } else { setIsSubmitting(false); } }, 500); }; useEffect(() => { if (initialValues && initialValues.email) { handleEmailChange(initialValues.email); } return () => { if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); } }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return (
( handleEmailChange(e.target.value)} /> )} /> ); }