"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle, CardFooter } from "@/components/ui/card"; interface ClientFormData { firstName: string; lastName: string; email: string; phone: string; avatar?: string; } interface ClientFormProps { initialData?: Partial; onSubmit: (data: ClientFormData) => Promise; onCancel: () => void; isLoading?: boolean; mode?: "create" | "edit"; } export function ClientForm({ initialData, onSubmit, onCancel, isLoading = false, mode = "create", }: ClientFormProps) { const [formData, setFormData] = useState({ firstName: "", lastName: "", email: "", phone: "", avatar: "", }); const [errors, setErrors] = useState>({}); // Initialize form with initial data useEffect(() => { if (initialData) { setFormData({ firstName: initialData.firstName || "", lastName: initialData.lastName || "", email: initialData.email || "", phone: initialData.phone || "", avatar: initialData.avatar || "", }); } }, [initialData]); // Validate email format const isValidEmail = (email: string): boolean => { if (!email) return true; // Email is optional const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; // Validate form const validateForm = (): boolean => { const newErrors: Record = {}; if (!formData.firstName.trim()) { newErrors.firstName = "El nombre es requerido"; } if (!formData.lastName.trim()) { newErrors.lastName = "El apellido es requerido"; } if (formData.email && !isValidEmail(formData.email)) { newErrors.email = "Formato de email invalido"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; // Handle form submission const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } try { await onSubmit(formData); } catch (err) { // Error handling is done in parent component console.error("Error submitting form:", err); } }; // Handle input change const handleChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value, })); // Clear error when user starts typing if (errors[name]) { setErrors((prev) => { const newErrors = { ...prev }; delete newErrors[name]; return newErrors; }); } }; // Handle click outside to close const handleOverlayClick = (e: React.MouseEvent) => { if (e.target === e.currentTarget) { onCancel(); } }; return (
{mode === "create" ? "Nuevo Cliente" : "Editar Cliente"}
{/* First Name */}
{errors.firstName && (

{errors.firstName}

)}
{/* Last Name */}
{errors.lastName && (

{errors.lastName}

)}
{/* Email */}
{errors.email && (

{errors.email}

)}
{/* Phone */}
{/* Avatar URL */}

URL de una imagen para el avatar del cliente

{/* Avatar Preview */} {formData.avatar && (
Vista previa { (e.target as HTMLImageElement).style.display = "none"; }} /> Vista previa
)}
); }