mirror of
https://dev.azure.com/globalhealthx/EMR/_git/helix-engage
synced 2026-04-12 02:38:15 +00:00
65 lines
2.5 KiB
TypeScript
65 lines
2.5 KiB
TypeScript
import { Button } from '@/components/base/buttons/button';
|
|
import { cx } from '@/utils/cx';
|
|
import { formatShortDate } from '@/lib/format';
|
|
import type { FollowUp } from '@/types/entities';
|
|
|
|
interface FollowupWidgetProps {
|
|
overdue: FollowUp[];
|
|
upcoming: FollowUp[];
|
|
}
|
|
|
|
export const FollowupWidget = ({ overdue, upcoming }: FollowupWidgetProps) => {
|
|
const items = [...overdue, ...upcoming].slice(0, 4);
|
|
|
|
if (items.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
<h3 className="mb-3 text-sm font-bold text-primary">Upcoming Follow-ups</h3>
|
|
<div className="space-y-2">
|
|
{items.map((item) => {
|
|
const isOverdue = overdue.some((o) => o.id === item.id);
|
|
|
|
return (
|
|
<div
|
|
key={item.id}
|
|
className={cx(
|
|
'rounded-lg border-l-2 p-3',
|
|
isOverdue
|
|
? 'border-l-error-solid bg-error-primary'
|
|
: 'border-l-brand-solid bg-secondary',
|
|
)}
|
|
>
|
|
<p
|
|
className={cx(
|
|
'text-xs font-semibold',
|
|
isOverdue ? 'text-error-primary' : 'text-brand-secondary',
|
|
)}
|
|
>
|
|
{item.scheduledAt
|
|
? formatShortDate(item.scheduledAt)
|
|
: 'No date'}
|
|
{isOverdue && ' — Overdue'}
|
|
</p>
|
|
<p className="mt-0.5 text-xs font-medium text-primary">
|
|
{item.description ?? item.followUpType ?? 'Follow-up'}
|
|
</p>
|
|
{(item.patientName || item.patientPhone) && (
|
|
<p className="mt-0.5 text-xs text-tertiary">
|
|
{item.patientName}
|
|
{item.patientPhone && ` · ${item.patientPhone}`}
|
|
</p>
|
|
)}
|
|
</div>
|
|
);
|
|
})}
|
|
</div>
|
|
<Button className="mt-3 w-full" size="sm" color="secondary">
|
|
Open Full Schedule
|
|
</Button>
|
|
</div>
|
|
);
|
|
};
|