'use client' import { useState } from 'react' import { X, Check } from 'lucide-react' interface CardPaymentFormData { description: string amount: number date: string installments?: { current: number total: number } } interface CardPaymentFormProps { cardId: string onSubmit: (data: CardPaymentFormData) => void onCancel: () => void } export function CardPaymentForm({ cardId, onSubmit, onCancel }: CardPaymentFormProps) { const today = new Date().toISOString().split('T')[0] const [formData, setFormData] = useState({ description: '', amount: 0, date: today, installments: undefined, }) const [hasInstallments, setHasInstallments] = useState(false) const [errors, setErrors] = useState>({}) const validateForm = (): boolean => { const newErrors: Record = {} if (!formData.description.trim()) { newErrors.description = 'La descripción es requerida' } if (formData.amount <= 0) { newErrors.amount = 'El monto debe ser mayor a 0' } if (!formData.date) { newErrors.date = 'La fecha es requerida' } if (hasInstallments && formData.installments) { if (formData.installments.current < 1) { newErrors.installmentCurrent = 'La cuota actual debe ser al menos 1' } if (formData.installments.total < 2) { newErrors.installmentTotal = 'El total de cuotas debe ser al menos 2' } if (formData.installments.current > formData.installments.total) { newErrors.installments = 'La cuota actual no puede ser mayor al total' } } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (validateForm()) { onSubmit({ ...formData, installments: hasInstallments ? formData.installments : undefined, }) } } const updateField = (field: keyof CardPaymentFormData, value: string | number) => { setFormData((prev) => ({ ...prev, [field]: value })) if (errors[field]) { setErrors((prev) => { const newErrors = { ...prev } delete newErrors[field] return newErrors }) } } const updateInstallmentField = (field: 'current' | 'total', value: number) => { setFormData((prev) => ({ ...prev, installments: { current: field === 'current' ? value : (prev.installments?.current ?? 1), total: field === 'total' ? value : (prev.installments?.total ?? 1), }, })) // Clear related errors setErrors((prev) => { const newErrors = { ...prev } delete newErrors[`installment${field.charAt(0).toUpperCase() + field.slice(1)}`] delete newErrors.installments return newErrors }) } return (

Registrar Pago

{/* Description */}
updateField('description', e.target.value)} placeholder="Ej: Supermercado Coto" className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white placeholder-slate-400 focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.description && (

{errors.description}

)}
{/* Amount */}
updateField('amount', parseFloat(e.target.value) || 0)} placeholder="0.00" className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white placeholder-slate-400 focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.amount && (

{errors.amount}

)}
{/* Date */}
updateField('date', e.target.value)} className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.date &&

{errors.date}

}
{/* Installments Toggle */}
{ setHasInstallments(e.target.checked) if (!e.target.checked) { setFormData((prev) => ({ ...prev, installments: undefined })) } else { setFormData((prev) => ({ ...prev, installments: { current: 1, total: 1 } })) } }} className="h-4 w-4 rounded border-slate-500 bg-slate-600 text-indigo-600 focus:ring-indigo-500" />
{/* Installments Fields */} {hasInstallments && (
updateInstallmentField('current', parseInt(e.target.value) || 1) } className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.installmentCurrent && (

{errors.installmentCurrent}

)}
updateInstallmentField('total', parseInt(e.target.value) || 2) } className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.installmentTotal && (

{errors.installmentTotal}

)}
)} {errors.installments && (

{errors.installments}

)}
{/* Actions */}
) }