import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Button } from '@components/atoms/Button'; import { FormField } from '@components/molecules/FormField'; import { Select } from '@components/organisms/Select'; import type { Partner, CreatePartnerDto, UpdatePartnerDto, PartnerType } from '../types'; const partnerSchema = z.object({ name: z.string().min(2, 'Mínimo 2 caracteres'), legalName: z.string().optional(), partnerType: z.enum(['person', 'company'] as const), isCustomer: z.boolean(), isSupplier: z.boolean(), isEmployee: z.boolean(), email: z.string().email('Email inválido').optional().or(z.literal('')), phone: z.string().optional(), mobile: z.string().optional(), website: z.string().optional(), taxId: z.string().optional(), language: z.string().optional(), notes: z.string().optional(), internalNotes: z.string().optional(), }); type FormData = z.infer; interface PartnerFormProps { partner?: Partner; onSubmit: (data: CreatePartnerDto | UpdatePartnerDto) => Promise; onCancel: () => void; isLoading?: boolean; } const partnerTypeOptions = [ { value: 'person', label: 'Persona física' }, { value: 'company', label: 'Empresa' }, ]; const languageOptions = [ { value: 'es', label: 'Español' }, { value: 'en', label: 'English' }, ]; export function PartnerForm({ partner, onSubmit, onCancel, isLoading }: PartnerFormProps) { const isEditing = !!partner; const { register, handleSubmit, setValue, watch, formState: { errors }, } = useForm({ resolver: zodResolver(partnerSchema), defaultValues: partner ? { name: partner.name, legalName: partner.legalName || '', partnerType: partner.partnerType, isCustomer: partner.isCustomer, isSupplier: partner.isSupplier, isEmployee: partner.isEmployee, email: partner.email || '', phone: partner.phone || '', mobile: partner.mobile || '', website: partner.website || '', taxId: partner.taxId || '', language: partner.language || 'es', notes: partner.notes || '', internalNotes: partner.internalNotes || '', } : { name: '', legalName: '', partnerType: 'company' as PartnerType, isCustomer: true, isSupplier: false, isEmployee: false, email: '', phone: '', mobile: '', website: '', taxId: '', language: 'es', notes: '', internalNotes: '', }, }); const selectedType = watch('partnerType'); const selectedLanguage = watch('language'); const handleFormSubmit = async (data: FormData) => { const cleanData: CreatePartnerDto | UpdatePartnerDto = { name: data.name, partnerType: data.partnerType, isCustomer: data.isCustomer, isSupplier: data.isSupplier, isEmployee: data.isEmployee, isCompany: data.partnerType === 'company', ...(data.legalName && { legalName: data.legalName }), ...(data.email && { email: data.email }), ...(data.phone && { phone: data.phone }), ...(data.mobile && { mobile: data.mobile }), ...(data.website && { website: data.website }), ...(data.taxId && { taxId: data.taxId }), ...(data.language && { language: data.language }), ...(data.notes && { notes: data.notes }), ...(data.internalNotes && { internalNotes: data.internalNotes }), }; await onSubmit(cleanData); }; return (
{/* Basic Info */}

Información básica

{/* Partner Roles */}
{/* Contact Info */}

Información de contacto

{/* Fiscal Info */}

Información fiscal