import React, { useEffect, useState, useRef } from 'react'; import { Loader2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { cn } from '@/lib/utils'; /** API/CSV may return numbers; coerce before trim/compare so Inputs never throw. */ function strField(v) { return String(v ?? '').trim(); } function baselineFromProps(firstName, lastName, email, title) { return { firstName: String(firstName ?? ''), lastName: String(lastName ?? ''), email: String(email ?? ''), title: String(title ?? ''), }; } function formsEqual(a, b) { return ( strField(a.firstName) === strField(b.firstName) && strField(a.lastName) === strField(b.lastName) && strField(a.email) === strField(b.email) && strField(a.title) === strField(b.title) ); } /** * Editable person fields (first / last name, email, title). * `autoSave`: debounced PATCH after typing pauses (no Save button). * Otherwise: Save button commits all fields. */ export default function ContactIdentityEditor({ firstName = '', lastName = '', email = '', title = '', onSave, disabled = false, className, heading = 'Contact details', autoSave = false, }) { const [form, setForm] = useState(() => baselineFromProps(firstName, lastName, email, title)); const [saving, setSaving] = useState(false); const baselineRef = useRef(baselineFromProps(firstName, lastName, email, title)); useEffect(() => { const b = baselineFromProps(firstName, lastName, email, title); baselineRef.current = b; setForm(b); }, [firstName, lastName, email, title]); const setField = (key, value) => setForm((f) => ({ ...f, [key]: value })); const handleSave = async () => { if (!onSave || disabled) return; setSaving(true); try { await onSave({ first_name: form.firstName, last_name: form.lastName, email: form.email, title: form.title, }); } finally { setSaving(false); } }; useEffect(() => { if (!autoSave || !onSave || disabled) return; const baseline = baselineRef.current; if (formsEqual(form, baseline)) return; const t = setTimeout(async () => { setSaving(true); try { await onSave({ first_name: form.firstName, last_name: form.lastName, email: form.email, title: form.title, }); baselineRef.current = { firstName: form.firstName, lastName: form.lastName, email: form.email, title: form.title, }; } finally { setSaving(false); } }, 650); return () => clearTimeout(t); }, [form, autoSave, disabled, onSave, firstName, lastName, email, title]); return (