'use client' import React, { useMemo, useState } from 'react' import { useForm } from 'react-hook-form' import { z } from 'zod' import { zodResolver } from '@hookform/resolvers/zod' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { useContent } from '@/components/layout/content-provider' import { submitConsultation } from '@/app/consultation/actions' import type { ConsultationFormData } from '@/app/consultation/actions' export function ConsultationForm() { const content = useContent() const formContent = content.forms.consultation const schema = useMemo( () => z.object({ name: z.string().min(2, { message: formContent.validation.nameMin }), phone: z .string() .min(10, { message: formContent.validation.phoneValid }) .regex(/^[\d\s۰-۹]+$/, { message: formContent.validation.phoneNumbers }), email: z.string().email({ message: formContent.validation.emailValid }).optional().or(z.literal('')), subject: z.string().optional(), message: z.string().max(1000).optional(), }), [formContent.validation] ) type FormValues = z.infer const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle') const [errorMessage, setErrorMessage] = useState(null) const { register, handleSubmit, formState: { errors }, setValue, watch, reset, } = useForm({ resolver: zodResolver(schema), defaultValues: { name: '', phone: '', email: '', subject: '', message: '', }, }) const subjectValue = watch('subject') const onSubmit = async (data: FormValues) => { setStatus('loading') setErrorMessage(null) const subject = data.subject?.trim() const payload: ConsultationFormData = { name: data.name.trim(), phone: data.phone.replace(/\s/g, ''), email: data.email?.trim() || undefined, subject: subject && subject !== '__empty__' ? subject : undefined, message: data.message?.trim() || undefined, } const result = await submitConsultation(payload) if (result.success) { setStatus('success') reset() } else { setStatus('error') setErrorMessage(result.error ?? formContent.errorDefault) } } if (status === 'success') { return (

{formContent.success.title}

{formContent.success.description}

) } return (
{errors.name && (

{errors.name.message}

)}
{errors.phone && (

{errors.phone.message}

)}
{errors.email && (

{errors.email.message}

)}