'use client'; import { useState } from 'react'; import type { CustomerAddress, CreateAddressDto } from 'brainerce'; import { getClient } from '@/core/lib/brainerce'; import { useTranslations } from '@/core/lib/translations'; import { cn } from '@/core/lib/utils'; interface AddressBookProps { addresses: CustomerAddress[]; onUpdate: (addresses: CustomerAddress[]) => void; className?: string; } interface AddressFormState { label: string; firstName: string; lastName: string; line1: string; line2: string; city: string; region: string; postalCode: string; country: string; phone: string; isDefault: boolean; } const emptyForm: AddressFormState = { label: '', firstName: '', lastName: '', line1: '', line2: '', city: '', region: '', postalCode: '', country: '', phone: '', isDefault: false, }; function addressToForm(a: CustomerAddress): AddressFormState { return { label: a.label || '', firstName: a.firstName, lastName: a.lastName, line1: a.line1, line2: a.line2 || '', city: a.city, region: a.region || '', postalCode: a.postalCode, country: a.country, phone: a.phone || '', isDefault: a.isDefault, }; } interface AddressFormProps { initial: AddressFormState; onSave: (data: AddressFormState) => Promise; onCancel: () => void; saving: boolean; t: (key: string) => string; tc: (key: string) => string; } function AddressForm({ initial, onSave, onCancel, saving, t, tc }: AddressFormProps) { const [form, setForm] = useState(initial); const set = (field: keyof AddressFormState, value: string | boolean) => setForm((f) => ({ ...f, [field]: value })); const inputClass = 'border-border bg-background text-foreground focus:border-primary w-full rounded-md border px-3 py-1.5 text-sm outline-none'; return (
{ e.preventDefault(); onSave(form); }} className="space-y-3" >
set('label', e.target.value)} className={inputClass} placeholder="Home, Work..." />
set('firstName', e.target.value)} className={inputClass} required />
set('lastName', e.target.value)} className={inputClass} required />
set('line1', e.target.value)} className={inputClass} required />
set('line2', e.target.value)} className={inputClass} />
set('city', e.target.value)} className={inputClass} required />
set('postalCode', e.target.value)} className={inputClass} required />
set('region', e.target.value)} className={inputClass} />
set('country', e.target.value)} className={inputClass} required />
set('phone', e.target.value)} className={inputClass} />
); } export function AddressBook({ addresses, onUpdate, className }: AddressBookProps) { const t = useTranslations('account'); const tc = useTranslations('common'); const [editingId, setEditingId] = useState(null); const [adding, setAdding] = useState(false); const [saving, setSaving] = useState(false); const [deletingId, setDeletingId] = useState(null); async function handleAdd(data: AddressFormState) { setSaving(true); try { const client = getClient(); const dto: CreateAddressDto = { label: data.label || undefined, firstName: data.firstName, lastName: data.lastName, line1: data.line1, line2: data.line2 || undefined, city: data.city, region: data.region || undefined, postalCode: data.postalCode, country: data.country, phone: data.phone || undefined, isDefault: data.isDefault, }; await client.addMyAddress(dto); const updated = await client.getMyAddresses(); onUpdate(updated); setAdding(false); } catch { // ignore — could show error } finally { setSaving(false); } } async function handleEdit(id: string, data: AddressFormState) { setSaving(true); try { const client = getClient(); await client.updateMyAddress(id, { label: data.label || undefined, firstName: data.firstName, lastName: data.lastName, line1: data.line1, line2: data.line2 || undefined, city: data.city, region: data.region || undefined, postalCode: data.postalCode, country: data.country, phone: data.phone || undefined, isDefault: data.isDefault, }); const updated = await client.getMyAddresses(); onUpdate(updated); setEditingId(null); } catch { // ignore } finally { setSaving(false); } } async function handleDelete(id: string) { setDeletingId(id); try { const client = getClient(); await client.deleteMyAddress(id); onUpdate(addresses.filter((a) => a.id !== id)); } catch { // ignore } finally { setDeletingId(null); } } async function handleSetDefault(id: string) { try { const client = getClient(); await client.updateMyAddress(id, { isDefault: true }); const updated = await client.getMyAddresses(); onUpdate(updated); } catch { // ignore } } return (

{t('addressBook')}

{!adding && ( )}
{/* Add form */} {adding && (

{t('addAddress')}

setAdding(false)} saving={saving} t={t} tc={tc} />
)} {/* Address list */} {addresses.length === 0 && !adding ? (

{t('noAddresses')}

) : (
{addresses.map((address) => (
{editingId === address.id ? ( <>

{t('editAddress')}

handleEdit(address.id, data)} onCancel={() => setEditingId(null)} saving={saving} t={t} tc={tc} /> ) : (
{address.label && (

{address.label}

)}

{address.firstName} {address.lastName}

{address.line1} {address.line2 ? `, ${address.line2}` : ''}

{address.city} {address.region ? `, ${address.region}` : ''} {address.postalCode}

{address.country}

{address.phone &&

{address.phone}

} {address.isDefault && ( {t('defaultAddress')} )}
{!address.isDefault && ( )}
)}
))}
)}
); }