import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { entitySchemas } from '@/lib/entityValidationSchemas'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { SlugField } from '@/components/ui/slug-field'; import { Building2, Save, X } from 'lucide-react'; import { useUserRole } from '@/hooks/useUserRole'; import { HeadquartersLocationInput } from './HeadquartersLocationInput'; import { EntityMultiImageUploader } from '@/components/upload/EntityMultiImageUploader'; import { FlexibleDateInput, type DatePrecision } from '@/components/ui/flexible-date-input'; import { useAuth } from '@/hooks/useAuth'; import { toast } from 'sonner'; import { handleError } from '@/lib/errorHandler'; import { toDateOnly, parseDateOnly, toDateWithPrecision } from '@/lib/dateUtils'; import type { UploadedImage } from '@/types/company'; // Zod output type (after transformation) type ManufacturerFormData = z.infer; interface ManufacturerFormProps { onSubmit: (data: ManufacturerFormData) => void; onCancel: () => void; initialData?: Partial; } export function ManufacturerForm({ onSubmit, onCancel, initialData }: ManufacturerFormProps): React.JSX.Element { const { isModerator } = useUserRole(); const { user } = useAuth(); const [isSubmitting, setIsSubmitting] = useState(false); const { register, handleSubmit, setValue, watch, formState: { errors } } = useForm({ resolver: zodResolver(entitySchemas.manufacturer), defaultValues: { name: initialData?.name || '', slug: initialData?.slug || '', company_type: 'manufacturer' as const, description: initialData?.description || '', person_type: initialData?.person_type || ('company' as const), website_url: initialData?.website_url || '', founded_year: initialData?.founded_year ? String(initialData.founded_year) : '', founded_date: initialData?.founded_date || (initialData?.founded_year ? `${initialData.founded_year}-01-01` : undefined), founded_date_precision: initialData?.founded_date_precision || (initialData?.founded_year ? ('year' as const) : ('day' as const)), headquarters_location: initialData?.headquarters_location || '', source_url: initialData?.source_url || '', submission_notes: initialData?.submission_notes || '', images: initialData?.images || { uploaded: [] } } }); return ( {initialData ? 'Edit Manufacturer' : 'Create New Manufacturer'}
{ if (!user) { toast.error('You must be logged in to submit'); return; } setIsSubmitting(true); try { const formData = { ...data, company_type: 'manufacturer' as const, founded_year: data.founded_year ? parseInt(String(data.founded_year)) : undefined, banner_image_id: undefined, banner_image_url: undefined, card_image_id: undefined, card_image_url: undefined, }; await onSubmit(formData); // Only show success toast and close if not editing through moderation queue if (!initialData?.id) { toast.success('Manufacturer submitted for review'); onCancel(); } } catch (error: unknown) { handleError(error, { action: initialData?.id ? 'Update Manufacturer' : 'Create Manufacturer', metadata: { companyName: data.name } }); // Re-throw so parent can handle modal closing throw error; } finally { setIsSubmitting(false); } })} className="space-y-6"> {/* Basic Information */}
{errors.name && (

{errors.name.message}

)}
setValue('slug', slug)} isModerator={isModerator()} />
{/* Description */}