import { useState, useEffect } from 'react'; import { useToast } from '../contexts/ToastContext.jsx'; import { useAuth } from '../contexts/AuthContext.jsx'; import { api } from '../utils/api.js'; export default function AddChildAliasModal({ onClose }) { const toast = useToast(); const { user: currentUser } = useAuth(); 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); // Partner state const [partner, setPartner] = useState(null); const [selectedPartnerId, setSelectedPartnerId] = useState(''); const [allUsers, setAllUsers] = useState([]); const [savingPartner, setSavingPartner] = useState(false); useEffect(() => { Promise.all([ api.getAliases(), api.getPartner(), api.searchUsers(''), ]).then(([aliasRes, partnerRes, usersRes]) => { setAliases(aliasRes.aliases || []); setPartner(partnerRes.partner || null); setSelectedPartnerId(partnerRes.partner?.id?.toString() || ''); setAllUsers((usersRes.users || []).filter(u => u.id !== currentUser?.id)); }).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 handleSavePartner = async () => { setSavingPartner(true); try { if (!selectedPartnerId) { await api.removePartner(); setPartner(null); toast('Spouse/Partner removed', 'success'); } else { const { partner: p } = await api.setPartner(parseInt(selectedPartnerId)); setPartner(p); const { aliases: fresh } = await api.getAliases(); setAliases(fresh || []); toast('Spouse/Partner saved', 'success'); } } catch (e) { toast(e.message, 'error'); } finally { setSavingPartner(false); } }; 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 (