import { useState } from 'react' import { Link } from 'react-router-dom' import { Badge, DataTable, EmptyState, ErrorState, FilterChips, Notice, PageHeader, Skeleton, Toolbar } from '@sims/ui' import { getReminders, isManagerial, staffId, type ReminderStatus } from '../api' import { QueueActions, RULE_LABEL, reminderTone } from '../components/ReminderQueue' import { useData } from './Clients' const PAGE_SIZE = 50 const STATUS_CHIPS: { key: ReminderStatus; label: string }[] = [ { key: 'queued', label: 'Queued' }, { key: 'sent', label: 'Sent' }, { key: 'failed', label: 'Failed' }, { key: 'dismissed', label: 'Dismissed' }, ] /** * Reminders page (go-live cluster WS-C): the full queue the dashboard card is a * slice of. Status chips map onto `?status=`; the Mine/All toggle (`?owner=`) only * renders for owner/manager — staff are server-forced to their own rows anyway. * Server-paginated with an honest total (rule 8). */ export function Reminders() { const [status, setStatus] = useState('queued') const [scope, setScope] = useState<'all' | 'mine'>('all') const [page, setPage] = useState(1) const [err, setErr] = useState('') const me = staffId() // Mine narrows via ?owner=; hidden for pre-existing sessions that never stored the id. const showScope = isManagerial() && me !== '' const list = useData( () => getReminders({ status, ...(showScope && scope === 'mine' ? { owner: me } : {}), page, pageSize: PAGE_SIZE, }), [status, scope, page], ) const data = list.data const rows = data?.reminders const totalPages = data !== undefined ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1 const from = data !== undefined && data.total > 0 ? (data.page - 1) * data.pageSize + 1 : 0 const to = data !== undefined ? Math.min(data.page * data.pageSize, data.total) : 0 return (
{ setStatus(k as ReminderStatus); setPage(1) }} /> {showScope && ( { setScope(k as 'all' | 'mine'); setPage(1) }} /> )} {data !== undefined && {data.total} total} {err !== '' && {err}} {list.error !== undefined && } {list.error !== undefined ? null : rows === undefined ? : rows.length === 0 ? No {status} reminders{scope === 'mine' ? ' of yours' : ''}. : ( <> (rows[i]!.status === 'failed' ? 'err' : undefined)} rows={rows.map((rem) => ({ kind: rem.label !== '' ? rem.label : RULE_LABEL[rem.ruleKind] ?? rem.ruleKind, client: {rem.clientName}, doc: rem.docId !== null ? {rem.docNo ?? '— draft —'} : '—', due: rem.duePeriod, status: {rem.status}, error: rem.error ?? '—', // Sent/dismissed rows are history — actions only while there is work to do. act: rem.status === 'queued' || rem.status === 'failed' ? : null, }))} /> Showing {from}–{to} of {data!.total} Page {data!.page} / {totalPages} )}
) }