import * as React from 'react'; import { __ } from '@wordpress/i18n'; import type { BookingApi } from '../booking-ui/api'; interface Request { account_closure_requested: boolean; requires_email: boolean; id: number; type: 'export' | 'erase'; state: string; created_at: string; } interface Overview { policy_url: string; requests: Request[]; } const states = () => ({ awaiting_email: __('Waiting for email confirmation', 'abece-booking'), awaiting_processing: __('Waiting for processing', 'abece-booking'), completed: __('Completed', 'abece-booking'), review_required: __('Further verification or review required', 'abece-booking') }); export function PersonalData({ api }: { api: BookingApi; }) { const [data, setData] = React.useState(null), [error, setError] = React.useState(''), [message, setMessage] = React.useState(''), [busy, setBusy] = React.useState(false), [confirm, setConfirm] = React.useState(false); const load = React.useCallback(() => api.request('privacy/requests').then(setData), [api]); React.useEffect(() => { let alive = true; api.request('privacy/requests').then(v => { if (alive) setData(v); }).catch(e => { if (alive) setError(e.message); }); return () => { alive = false; }; }, [api]); async function send(type: 'export' | 'erase') { setBusy(true); setError(''); setMessage(''); try { const result = await api.request<{ request: Request; duplicate: boolean; }>('privacy/requests', 'POST', { type, ...(type === 'erase' ? { confirmed: true } : {}) }); setMessage(result.duplicate ? __('An open request already exists. No additional confirmation email was sent.', 'abece-booking') : !result.request.requires_email && result.request.state === 'review_required' ? __('Request received. Contact the operator if further verification or email delivery assistance is needed.', 'abece-booking') : __('Request received. Confirm the link sent to your account email address.', 'abece-booking')); setConfirm(false); await load(); } catch (e) { setError((e as Error).message); } finally { setBusy(false); } } return

{__('My personal data', 'abece-booking')}

{__('Requests use your signed-in WordPress account and its current email address. Confirm the email link; the operator processes the request using WordPress privacy tools.', 'abece-booking')}

{__('An erasure request is not a withdrawal of all processing permissions and does not immediately delete your WordPress account.', 'abece-booking')}

{data?.policy_url &&

{__('Privacy policy', 'abece-booking')}

}{error &&

{error}

}{message &&

{message}

}
{confirm && } {data && <>

{__('Your privacy requests', 'abece-booking')}

{!data.requests.length ?

{__('No privacy requests yet.', 'abece-booking')}

:
    {data.requests.map(r =>
  • {r.type === 'export' ? __('Personal data export', 'abece-booking') : r.account_closure_requested ? __('Account closure and erasure review', 'abece-booking') : __('Erase personal data', 'abece-booking')} — {states()[r.state as keyof ReturnType] ?? states().review_required}
  • )}
}}
; }