'use client' import { zodResolver } from '@hookform/resolvers/zod' import { useEffect } from 'react' import { FormProvider, useForm } from 'react-hook-form' import { texts } from '@/texts' import type { EventWizardFormData } from '@/components/events/create/types' import AudienceRestrictionSelector from '@/components/events/create/AudienceRestrictionSelector' import CancellationPolicyEditor from '@/components/events/create/CancellationPolicyEditor' import TicketTypeSelector from '@/components/events/create/TicketTypeSelector' import Input from '@/components/formElements/Input' import { WizardFormFullWidth, WizardFormGrid, WizardSectionTitle, WizardStepFooter } from '@/components/events/create/WizardFormLayout' import { EventWizardStep3Validation, type EventWizardStep3Values } from '@/validation/eventWizard' import { showFormValidationToast } from '@/lib/formValidationToast' interface Step3PricingCapacityProps { data: EventWizardFormData onBack: () => void onChange: (patch: Partial) => void onNext: (patch: Partial) => void } export default function Step3PricingCapacity({ data, onBack, onChange, onNext }: Step3PricingCapacityProps) { 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) => { 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) return (
{texts.events.ticketTypeSectionTitle} { form.setValue('isFree', nextIsFree, { shouldDirty: true, shouldValidate: true }) }} /> {!isFree ? ( ) : null}

{texts.events.reservedCapacityWizardHint}

{texts.events.audienceSectionTitle} { form.setValue('ageRestriction', ageRestriction, { shouldDirty: true, shouldValidate: true }) }} onGenderRestrictionChange={(genderRestriction) => { form.setValue('genderRestriction', genderRestriction, { shouldDirty: true, shouldValidate: true }) }} /> {texts.events.cancellationSectionTitle} { form.setValue('cancellationFeePercent', cancellationFeePercent, { shouldDirty: true, shouldValidate: true }) }} />
{texts.events.moreSettings} {texts.events.advancedSettingsHint}
) }