import { formatDateTime } from '../booking-ui/dateTime'; import * as React from 'react'; import { __ } from '@wordpress/i18n'; import { BookingApi } from '../booking-ui/api'; interface Contact { id: number; display_name: string; phone: string | null; email: string | null; note: string | null; is_active: boolean; usage_count: number; last_used_at: string | null; } const empty = { display_name: '', phone: '', email: '', note: '', is_active: true }; export function ExternalContactsApp({ api }: { api: BookingApi; }) { const [query, setQuery] = React.useState(''), [rows, setRows] = React.useState([]), [page, setPage] = React.useState(1), [editor, setEditor] = React.useState(null), [form, setForm] = React.useState(empty), [revision, setRevision] = React.useState(0), [busy, setBusy] = React.useState(false), [error, setError] = React.useState(''), [message, setMessage] = React.useState(''); React.useEffect(() => { let alive = true; setBusy(true); const timer = setTimeout(() => api.request('external-contacts', 'GET', undefined, { search: query, page: String(page), per_page: '20' }).then(value => { if (alive) setRows(value); }).catch(e => { if (alive) setError(e.message); }).finally(() => { if (alive) setBusy(false); }), 200); return () => { alive = false; clearTimeout(timer); }; }, [api, query, page, revision]); async function edit(id: number) { setError(''); try { const contact = await api.request(`external-contacts/${id}`); setForm({ display_name: contact.display_name, phone: contact.phone || '', email: contact.email || '', note: contact.note || '', is_active: contact.is_active }); setEditor(id); } catch (e) { setError((e as Error).message); } } async function save(e: React.FormEvent) { e.preventDefault(); setBusy(true); setError(''); try { await api.request(editor ? `external-contacts/${editor}` : 'external-contacts', editor ? 'PATCH' : 'POST', { ...form, phone: form.phone || null, email: form.email || null, note: form.note || null }); setEditor(null); setRevision(n => n + 1); setMessage(__('Changes saved.', 'abece-booking')); } catch (e) { setError((e as Error).message); } finally { setBusy(false); } } async function deactivate(contact: Contact) { setBusy(true); setError(''); try { await api.request(`external-contacts/${contact.id}`, 'PATCH', { is_active: !contact.is_active }); setRevision(n => n + 1); } catch (e) { setError((e as Error).message); } finally { setBusy(false); } } return

{__('External contacts', 'abece-booking')}

{__('Reservations', 'abece-booking')}

{__('Internal contacts for repeat phone bookings. Contacts do not have an account or membership.', 'abece-booking')}

{error &&

{error}

}{message &&

{message}

} {editor !== null ?

{editor ? __('Edit contact', 'abece-booking') : __('Add contact', 'abece-booking')}

{([['display_name', __('Name', 'abece-booking')], ['phone', __('Phone', 'abece-booking')], ['email', __('Email', 'abece-booking')]] as const).map(([key, label]) => )}