import { yupResolver } from '@hookform/resolvers/yup'; import { Button, FileInput, Input, Link, LoaderSpinner, Select } from '@theme/components'; import { useSession } from 'next-auth/react'; import { useEffect, useState } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; import { useAppSelector } from '@akinon/next/redux/hooks'; import { useGetContactSubjectsQuery, useGetOrdersQuery, useSendContactMutation } from '@akinon/next/data/client/account'; import { ContactFormType } from '@akinon/next/types'; import * as yup from 'yup'; import { useLocalization } from '@akinon/next/hooks'; const contactFormSchema = (t) => yup.object().shape({ full_name: yup.string().required(t('account.contact.form.error.required')), email: yup .string() .email(t('account.contact.form.error.email_valid')) .required(t('account.contact.form.error.required')), phone: yup .string() .transform((value: string) => value.replace(/_/g, '').replace(/ /g, '')) .length(11, t('account.contact.form.error.phone_length')) .required(t('account.contact.form.error.required')), subject: yup.string().required(t('account.contact.form.error.required')), message: yup .string() .required(t('account.contact.form.error.required')) .min(10, t('account.contact.form.error.message_length')) .label('message'), order: yup .string() .nullable() .notRequired() .when('subject', { is: (value) => value === '2', then: yup.string().required(t('account.contact.form.error.required')) }), file: yup.mixed() }); const ContactForm = () => { const { t } = useLocalization(); const { data: session, status } = useSession(); const filteredOrders = [ { label: t('account.contact.form.order.placeholder'), value: '' } ]; const filteredSubjects = [ { label: t('account.contact.form.subject.placeholder'), value: '' } ]; const [selectedSubject, setSelectedSubject] = useState(null); const { user_phone_format } = useAppSelector((state) => state.config); const { data: contactSubject, isLoading: subjectLoading, isSuccess: subjectSuccess } = useGetContactSubjectsQuery(); const { data: orders, isLoading: ordersLoading, isSuccess: ordersSuccess } = useGetOrdersQuery( {}, { skip: status === 'unauthenticated' || status === 'loading' } ); const [ sendContact, { isSuccess: formSuccess, isLoading: isSubmitting, error: submitError } ] = useSendContactMutation(); if (ordersSuccess) { orders?.results?.map((item) => { filteredOrders.push({ label: item.number, value: item.id.toString() }); }); } if (subjectSuccess) { contactSubject ?.filter((item) => { if (status === 'unauthenticated') { return !item.is_order_needed; } return item; }) .forEach((item) => { filteredSubjects.push({ label: item.text, value: item.id }); }); } const { register, reset, handleSubmit, control, formState: { errors } } = useForm({ resolver: yupResolver(contactFormSchema(t)) }); const onSubmit: SubmitHandler = (data) => { const formData = new FormData(); Object.keys(data ?? {}).forEach((key) => { if (key === 'file' && data[key]) { formData.append(key, data[key][0]); } else if (data[key] && key !== 'file') { formData.append(key, data[key]); } }); formData.append('subject', 'tdsadasdsa'); formData.append('order', '2222'); sendContact(formData); }; const handleChange = (e) => { setSelectedSubject(e.target.value); }; useEffect(() => { reset({ full_name: session?.user?.firstName && session?.user?.lastName ? `${session?.user?.firstName} ${session?.user?.lastName}` : '', email: session?.user?.email, phone: session?.user?.phone }); }, [session, reset]); return (
{formSuccess ? (

{t('account.contact.form.success.title')}

{t('account.contact.form.success.description')}

{t('account.contact.form.success.button')}
) : ( <>

{' '} {t('account.contact.header.title')}

{t('account.contact.hours')}

Monday – Friday: 10:00am – 7:30pm

Saturday: 10:00am – 6:00pm

Sunday: 11:00am – 6:00pm

{subjectLoading && } {subjectSuccess && ( <> )}
)}