import React, { useState, FormEvent } from "react"; import { Client, CreateClientPayload } from "../../types/client"; import { Input, Textarea, Button } from "../UI"; // ─── Types ──────────────────────────────────────────────────────────────────── interface ClientFormProps { /** Pre-populated when editing; omit for create */ initialValues?: Partial; onSubmit: (data: CreateClientPayload) => Promise; onCancel: () => void; submitLabel?: string; } type FormErrors = Partial>; // ─── Validation ─────────────────────────────────────────────────────────────── function validate(values: CreateClientPayload): FormErrors { const errors: FormErrors = {}; if (!values.name.trim()) errors.name = "Name is required."; if (!values.email.trim()) { errors.email = "Email is required."; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(values.email)) { errors.email = "Enter a valid email address."; } if (!values.phone.trim()) errors.phone = "Phone is required."; return errors; } // ─── Component ──────────────────────────────────────────────────────────────── export default function ClientForm({ initialValues = {}, onSubmit, onCancel, submitLabel = "Save client", }: ClientFormProps) { const [values, setValues] = useState({ name: initialValues.name ?? "", email: initialValues.email ?? "", phone: initialValues.phone ?? "", taxId: initialValues.taxId ?? "", notes: initialValues.notes ?? "", }); const [errors, setErrors] = useState({}); const [submitting, setSubmitting] = useState(false); // Generic field updater const set = (field: keyof CreateClientPayload) => (e: React.ChangeEvent) => { setValues((v) => ({ ...v, [field]: e.target.value })); if (errors[field]) setErrors((er) => ({ ...er, [field]: undefined })); }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); const errs = validate(values); if (Object.keys(errs).length > 0) { setErrors(errs); return; } setSubmitting(true); try { await onSubmit(values); } catch { // Error surfaced via parent hook's alert; keep form open } finally { setSubmitting(false); } }; return (
{/* Row 1: Name + Email */}
{/* Row 2: Phone + Tax ID */}
{/* Notes */}