'use client' import { zodResolver } from '@hookform/resolvers/zod' import { useEffect, useRef } from 'react' import dynamic from 'next/dynamic' import { FormProvider, useForm } from 'react-hook-form' import { texts, format } from '@/texts' import type { EventWizardFormData } from '@/components/events/create/types' import { hasRequiredPosters } from '@/components/events/create/types' import { addToast } from '@/lib/toast' import Input from '@/components/formElements/Input' import EventMediaGalleryUploader from '@/components/events/create/EventMediaGalleryUploader' import CategoryTreeSelect from '@/components/events/create/CategoryTreeSelect' import { WizardFormFullWidth, WizardFormGrid, WizardSectionTitle, WizardStepFooter } from '@/components/events/create/WizardFormLayout' import { EventWizardStep1Validation, type EventWizardStep1Values } from '@/validation/eventWizard' import { shouldAutogenerateEventSlug, slugifyEventTitle } from '@/features/events/eventSlug' import { usePublicCategoriesQuery } from '@/queries/consumer/usePublicCategoriesQuery' import { showFormValidationToast } from '@/lib/formValidationToast' const TextEditor = dynamic(() => import('@/components/formElements/TextEditor'), { ssr: false }) interface Step1BasicInfoProps { data: EventWizardFormData onChange: (patch: Partial) => void onNext: (patch: Partial) => void } export default function Step1BasicInfo({ data, onChange, onNext }: Step1BasicInfoProps) { const categoriesQuery = usePublicCategoriesQuery() const categories = categoriesQuery.data?.items ?? [] const form = useForm({ resolver: zodResolver(EventWizardStep1Validation), defaultValues: { title: data.title, slug: data.slug, categoryId: data.categoryId, shortDescription: data.shortDescription, description: data.description, }, }) const followTitleRef = useRef(shouldAutogenerateEventSlug(data.slug, data.title)) const lastAutoSlugRef = useRef(data.slug || slugifyEventTitle(data.title)) const title = form.watch('title') const slug = form.watch('slug') useEffect(() => { if (categoriesQuery.isError) { addToast({ title: texts.events.categoriesLoadFailed, color: 'danger' }) } }, [categoriesQuery.isError]) useEffect(() => { if (!followTitleRef.current) return const next = slugifyEventTitle(title ?? '') lastAutoSlugRef.current = next if (form.getValues('slug') !== next) { form.setValue('slug', next) } }, [form, title]) useEffect(() => { const subscription = form.watch((values, info) => { if (info.name === 'slug' && (values.slug ?? '') !== lastAutoSlugRef.current) { followTitleRef.current = false } onChange({ title: values.title ?? '', slug: values.slug ?? '', categoryId: values.categoryId ?? '', shortDescription: values.shortDescription ?? '', description: values.description ?? '', }) }) return () => { subscription.unsubscribe() } }, [form, onChange]) const handleSubmit = form.handleSubmit((values) => { if (!hasRequiredPosters(data.media)) { addToast({ title: texts.events.postersRequiredTitle, description: texts.events.postersRequiredShort, color: 'danger', }) return } onNext({ title: values.title, slug: values.slug, categoryId: values.categoryId, shortDescription: values.shortDescription ?? '', description: values.description ?? '', media: data.media, }) }, showFormValidationToast) return (
پوستر و تصاویر { onChange({ media }) }} /> معرفی رویداد

{texts.events.fullDescriptionLabel}

{ form.setValue('description', value) }} />
{texts.events.configureEventLink} {texts.events.advanced}
) }