import { useState, useEffect } from 'react'; import { useToast } from '../contexts/ToastContext.jsx'; import { api } from '../utils/api.js'; export default function AddChildAliasModal({ onClose }) { const toast = useToast(); const [aliases, setAliases] = useState([]); const [editingAlias, setEditingAlias] = useState(null); // null = new entry const [form, setForm] = useState({ firstName: '', lastName: '', dob: '', phone: '', email: '' }); const [avatarFile, setAvatarFile] = useState(null); const [saving, setSaving] = useState(false); useEffect(() => { api.getAliases().then(({ aliases }) => setAliases(aliases || [])).catch(() => {}); }, []); const set = k => e => setForm(p => ({ ...p, [k]: e.target.value })); const resetForm = () => { setEditingAlias(null); setForm({ firstName: '', lastName: '', dob: '', phone: '', email: '' }); setAvatarFile(null); }; const handleSelectAlias = (a) => { if (editingAlias?.id === a.id) { resetForm(); return; } setEditingAlias(a); setForm({ firstName: a.first_name || '', lastName: a.last_name || '', dob: a.date_of_birth ? a.date_of_birth.slice(0, 10) : '', phone: a.phone || '', email: a.email || '', }); setAvatarFile(null); }; const handleSave = async () => { if (!form.firstName.trim() || !form.lastName.trim()) return toast('First and last name required', 'error'); setSaving(true); try { if (editingAlias) { await api.updateAlias(editingAlias.id, { firstName: form.firstName.trim(), lastName: form.lastName.trim(), dateOfBirth: form.dob || null, phone: form.phone || null, email: form.email || null, }); if (avatarFile) await api.uploadAliasAvatar(editingAlias.id, avatarFile); toast('Child alias updated', 'success'); } else { const { alias } = await api.createAlias({ firstName: form.firstName.trim(), lastName: form.lastName.trim(), dateOfBirth: form.dob || null, phone: form.phone || null, email: form.email || null, }); if (avatarFile) await api.uploadAliasAvatar(alias.id, avatarFile); toast('Child alias added', 'success'); } const { aliases: fresh } = await api.getAliases(); setAliases(fresh || []); resetForm(); } catch (e) { toast(e.message, 'error'); } finally { setSaving(false); } }; const handleDelete = async (e, aliasId) => { e.stopPropagation(); try { await api.deleteAlias(aliasId); setAliases(prev => prev.filter(a => a.id !== aliasId)); if (editingAlias?.id === aliasId) resetForm(); toast('Child alias removed', 'success'); } catch (err) { toast(err.message, 'error'); } }; const lbl = (text, required) => ( ); return (
e.target === e.currentTarget && onClose()}>
{/* Header */}

Add Child Alias

{/* Existing aliases list */} {aliases.length > 0 && (
Your Children — click to edit
{aliases.map((a, i) => (
handleSelectAlias(a)} style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '9px 12px', cursor: 'pointer', borderBottom: i < aliases.length - 1 ? '1px solid var(--border)' : 'none', background: editingAlias?.id === a.id ? 'var(--primary-light)' : 'transparent', }} > {a.first_name} {a.last_name} {a.date_of_birth && ( {a.date_of_birth.slice(0, 10)} )}
))}
)} {/* Form section label */}
{editingAlias ? `Editing: ${editingAlias.first_name} ${editingAlias.last_name}` : 'New Child Alias'}
{/* Form */}
{lbl('First Name', true)}
{lbl('Last Name', true)}
{lbl('Date of Birth')}
{lbl('Phone')}
{lbl('Email (optional)')}
{lbl('Avatar (optional)')} setAvatarFile(e.target.files?.[0] || null)} />
{editingAlias && ( )}
); }