import { useMemo } from 'react'; import { useData } from '@/providers/data-provider'; import { scoreAndRankItems } from '@/lib/scoring'; import type { PriorityConfig, ScoreResult } from '@/lib/scoring'; import { cx } from '@/utils/cx'; interface WorklistPreviewProps { config: PriorityConfig; } const slaColors: Record = { low: 'bg-success-solid', medium: 'bg-warning-solid', high: 'bg-error-solid', critical: 'bg-error-solid animate-pulse', }; const slaTextColor: Record = { low: 'text-success-primary', medium: 'text-warning-primary', high: 'text-error-primary', critical: 'text-error-primary', }; const shortType: Record = { missed_call: 'Missed', follow_up: 'Follow-up', campaign_lead: 'Campaign', attempt_2: '2nd Att.', attempt_3: '3rd Att.', }; export const WorklistPreview = ({ config }: WorklistPreviewProps) => { const { calls, leads, followUps } = useData(); const previewItems = useMemo(() => { const items: any[] = []; if (calls) { calls .filter((c: any) => c.callStatus === 'MISSED') .slice(0, 5) .forEach((c: any) => items.push({ ...c, type: 'missed', _label: c.callerNumber?.primaryPhoneNumber ?? c.name ?? 'Unknown' })); } if (followUps) { followUps .slice(0, 5) .forEach((f: any) => items.push({ ...f, type: 'follow-up', _label: f.name ?? 'Follow-up' })); } if (leads) { leads .filter((l: any) => l.campaignId) .slice(0, 5) .forEach((l: any) => items.push({ ...l, type: 'lead', _label: l.contactName ? `${l.contactName.firstName ?? ''} ${l.contactName.lastName ?? ''}`.trim() : l.contactPhone?.primaryPhoneNumber ?? 'Unknown', })); } return items; }, [calls, leads, followUps]); const scored = useMemo(() => scoreAndRankItems(previewItems, config), [previewItems, config]); return (

Live Preview

{scored.length} items
{/* Header */}
Name Score
{/* Rows */}
{scored.map((item: any & ScoreResult, index: number) => (
{item._label ?? item.name ?? 'Item'}
{shortType[item.taskType] ?? item.taskType} · {item.slaElapsedPercent}% SLA
{item.score.toFixed(1)}
))} {scored.length === 0 && (
No worklist items to preview
)}
); };