'use client' import { zodResolver } from '@hookform/resolvers/zod' import { useEffect, useRef, useState } from 'react' import { FormProvider, useForm, useWatch } from 'react-hook-form' import { texts } from '@/texts' import type { EventWizardFormData } from '@/components/events/create/types' import Input from '@/components/formElements/Input' import MapLocationPicker from '@/components/events/create/MapLocationPicker' import { WizardFormFullWidth, WizardFormGrid, WizardSectionTitle, WizardStepFooter } from '@/components/events/create/WizardFormLayout' import { INITIAL_WIZARD_DATA } from '@/components/events/create/types' import { useEventScheduleConstraints } from '@/components/events/schedule/eventScheduleConstraints' import { addToast } from '@/lib/toast' import { fetchAllCities, type City } from '@/services/geography' import { EventWizardStep2Validation, type EventWizardStep2Values } from '@/validation/eventWizard' import { showFormValidationToast } from '@/lib/formValidationToast' const ADDRESS_VISIBILITY_OPTIONS = [ { name: texts.events.addressVisibilityPublic, selectKey: 'public' }, { name: texts.events.addressVisibilityAttendeesOnly, selectKey: 'attendees_only' }, ] interface Step2ScheduleLocationProps { data: EventWizardFormData onBack: () => void onChange: (patch: Partial) => void onNext: (patch: Partial) => void } export default function Step2ScheduleLocation({ data, onBack, onChange, onNext }: Step2ScheduleLocationProps) { const [cities, setCities] = useState([]) const form = useForm({ resolver: zodResolver(EventWizardStep2Validation), defaultValues: { startDate: data.startDate, startTime: data.startTime, endDate: data.endDate, endTime: data.endTime, provinceId: data.provinceId, cityId: data.cityId, address: data.address, addressVisibility: data.addressVisibility, generalArea: data.generalArea, }, }) const addressVisibility = form.watch('addressVisibility') const addressValue = useWatch({ control: form.control, name: 'address' }) // اگر کاربر قبلاً موقعیت را روی نقشه دستی مشخص کرده (مثلاً هنگام کپی یا ویرایش رویداد)، // با تغییر شهر نباید آن پین بازنویسی شود. const hasManualLocationRef = useRef(data.lat !== INITIAL_WIZARD_DATA.lat || data.lng !== INITIAL_WIZARD_DATA.lng) const selectedCityId = useWatch({ control: form.control, name: 'cityId' }) const startDate = useWatch({ control: form.control, name: 'startDate' }) const startTime = useWatch({ control: form.control, name: 'startTime' }) const endDate = useWatch({ control: form.control, name: 'endDate' }) const { todayIso, startMinimumTime, endMinimumTime } = useEventScheduleConstraints(startDate, startTime, endDate) useEffect(() => { fetchAllCities() .then(setCities) .catch(() => addToast({ title: texts.events.citiesLoadFailed, color: 'danger' })) }, []) useEffect(() => { if (hasManualLocationRef.current) return const selectedCity = cities.find((city) => String(city.id) === selectedCityId) if (selectedCity?.lat != null && selectedCity?.lng != null) { onChange({ lat: selectedCity.lat, lng: selectedCity.lng }) } }, [cities, onChange, selectedCityId]) useEffect(() => { const subscription = form.watch((values) => { onChange({ startDate: values.startDate ?? '', startTime: values.startTime ?? data.startTime, endDate: values.endDate ?? '', endTime: values.endTime ?? data.endTime, provinceId: values.provinceId ?? '', cityId: values.cityId ?? '', address: values.address ?? '', addressVisibility: values.addressVisibility ?? 'public', generalArea: values.generalArea ?? '', }) }) return () => { subscription.unsubscribe() } }, [data.endTime, data.startTime, form, onChange]) const handleSubmit = form.handleSubmit((values) => { const selectedCity = cities.find((city) => String(city.id) === values.cityId) if (!selectedCity) { form.setError('cityId', { message: texts.validation.cityRequired }) addToast({ title: texts.common.formIncomplete, description: texts.validation.cityRequired, color: 'danger' }) return } onNext({ startDate: values.startDate, startTime: values.startTime, endDate: values.endDate, endTime: values.endTime, provinceId: String(selectedCity.provinceId), cityId: values.cityId, address: values.address, lat: data.lat, lng: data.lng, addressVisibility: values.addressVisibility, generalArea: values.addressVisibility === 'attendees_only' ? (values.generalArea?.trim() ?? '') : '', }) }, showFormValidationToast) return (
{texts.events.scheduleSectionTitle} {texts.events.venueSectionTitle} {/* انتخاب استان فعلاً غیرفعال است؛ استان از روی شهر تعیین می‌شود. */}

{texts.events.addressHostContactHint}

{ form.setValue('address', address, { shouldDirty: true, shouldTouch: true }) onChange({ address }) }} onChange={({ lat, lng }) => { hasManualLocationRef.current = true onChange({ lat, lng }) }} /> {texts.events.addressVisibilitySectionTitle} {addressVisibility === 'attendees_only' && ( )}
) }