'use client' import { zodResolver } from '@hookform/resolvers/zod' import { useEffect } from 'react' import { FormProvider, useForm } from 'react-hook-form' import { texts, format } from '@/texts' import type { EventWizardEditLocks, EventWizardFormData } from '@/components/events/create/consumer/types' import AudienceRestrictionSelector from '@/components/events/create/AudienceRestrictionSelector' import TicketTypeSelector from '@/components/events/create/TicketTypeSelector' import ConsumerInput from '@/components/consumer/ConsumerInput' import InlineNotice from '@/components/feedback/InlineNotice' import { EventWizardStep3Validation, type EventWizardStep3Values } from '@/validation/eventWizard' import { showFormValidationToast } from '@/lib/formValidationToast' import { addToast } from '@/lib/toast' interface Step3PricingCapacityProps { data: EventWizardFormData locks?: EventWizardEditLocks onBindSubmit: (submit: (() => void) | null) => void onChange: (patch: Partial) => void onNext: (patch: Partial) => void } export default function Step3PricingCapacity({ data, locks, onBindSubmit, onChange, onNext }: Step3PricingCapacityProps) { const pricingLocked = Boolean(locks?.pricing) const audienceLocked = Boolean(locks?.audience) const cancellationLocked = Boolean(locks?.cancellation) const behavioralLocked = Boolean(locks?.behavioralSettings) const minCapacity = locks?.minCapacity ?? 1 const showLockNotice = Boolean(locks?.notice && (pricingLocked || audienceLocked || cancellationLocked || behavioralLocked)) const form = useForm({ resolver: zodResolver(EventWizardStep3Validation), defaultValues: { isFree: data.isFree, price: data.price, capacity: data.capacity, reservedCapacity: data.reservedCapacity, genderRestriction: data.genderRestriction, ageRestriction: data.ageRestriction, cancellationFeePercent: data.cancellationFeePercent, isDiscoverable: data.isDiscoverable, autoCreateGroup: data.autoCreateGroup, waitlistAutoOffer: data.waitlistAutoOffer, sendReviewRequestSms: data.sendReviewRequestSms, }, }) const isFree = form.watch('isFree') useEffect(() => { const subscription = form.watch((values) => { onChange({ isFree: values.isFree ?? false, price: Number(values.price ?? 0), capacity: Number(values.capacity ?? 0), reservedCapacity: Number(values.reservedCapacity ?? 0), genderRestriction: values.genderRestriction ?? 'open', ageRestriction: values.ageRestriction ?? 'open', cancellationFeePercent: Number(values.cancellationFeePercent ?? 0), isDiscoverable: values.isDiscoverable ?? false, autoCreateGroup: values.autoCreateGroup ?? true, waitlistAutoOffer: values.waitlistAutoOffer ?? true, sendReviewRequestSms: values.sendReviewRequestSms ?? false, }) }) return () => { subscription.unsubscribe() } }, [form, onChange]) const handleSubmit = form.handleSubmit((values) => { if (values.capacity < minCapacity) { addToast({ title: format(texts.events.capacityBelowOccupied, { min: minCapacity }), color: 'danger', }) return } onNext({ isFree: values.isFree, price: values.isFree ? 0 : values.price, capacity: values.capacity, reservedCapacity: values.reservedCapacity, genderRestriction: values.genderRestriction, ageRestriction: values.ageRestriction, cancellationFeePercent: values.cancellationFeePercent, isDiscoverable: values.isDiscoverable, autoCreateGroup: values.autoCreateGroup, waitlistAutoOffer: values.waitlistAutoOffer, sendReviewRequestSms: values.sendReviewRequestSms, }) }, showFormValidationToast) useEffect(() => { onBindSubmit(() => { void handleSubmit() }) return () => { onBindSubmit(null) } }, [handleSubmit, onBindSubmit]) return (
{ event.preventDefault() void handleSubmit() }} > {showLockNotice ? {locks?.notice} : null}
ایجاد بلیط نوع ثبت‌نام را انتخاب کن؛ برای رویداد پولی، مبلغ نهایی بلیط را وارد کن.
{ if (pricingLocked) return form.setValue('isFree', nextIsFree, { shouldDirty: true, shouldValidate: true }) }} /> {!isFree ? ( ) : null} 1 ? format(texts.events.capacityMinOccupiedHint, { min: minCapacity }) : undefined} generalType="numberInput" label={texts.events.capacity} minValue={minCapacity} name="capacity" />
شرکت کنندگان اگر رویداد برای همه نیست، محدودیت جنسیت یا سن را انتخاب کن. پیش‌فرض آزاد است.
{ if (audienceLocked) return form.setValue('ageRestriction', ageRestriction, { shouldDirty: true, shouldValidate: true }) }} onGenderRestrictionChange={(genderRestriction) => { if (audienceLocked) return form.setValue('genderRestriction', genderRestriction, { shouldDirty: true, shouldValidate: true }) }} />
{texts.events.moreSettings}
) }