'use client'; import { formatDistanceToNow } from 'date-fns'; import { Bell, BellRing, LoaderCircle } from 'lucide-react'; import type { TaskNotificationEntry } from '@/lib/types'; import { StatusPill } from '@/components/ui/status-pill'; import { cn } from '@/lib/utils'; type TaskNotificationsTriggerProps = { unreadCount: number; isPopoverOpen: boolean; setIsPopoverOpen: (value: boolean) => void; isLoading: boolean; activeEntries: TaskNotificationEntry[]; visibleFinishedEntries: TaskNotificationEntry[]; awaitingReviewEntries: TaskNotificationEntry[]; showReadFinished: boolean; setShowReadFinished: (value: boolean) => void; openTaskDetails: (taskId: string) => void; openTaskAction: (entry: TaskNotificationEntry, actionId?: string | null) => void; silenceEntry: (entry: TaskNotificationEntry, silenced?: boolean) => Promise; markEntryRead: (entry: TaskNotificationEntry, read?: boolean) => Promise; className?: string; }; function ProgressBar({ entry }: { entry: TaskNotificationEntry }) { const progress = entry.progress; if (!progress) { return null; } return (
{progress.current}/{progress.total} {progress.unit} {progress.percent ?? 0}%
); } function StatChips({ entry }: { entry: TaskNotificationEntry }) { if (entry.stats.length === 0) { return null; } return (
{entry.stats.map((stat) => ( {stat.label}: {stat.value} ))}
); } function NotificationCard({ entry, openTaskDetails, openTaskAction, silenceEntry, markEntryRead }: { entry: TaskNotificationEntry; openTaskDetails: (taskId: string) => void; openTaskAction: (entry: TaskNotificationEntry, actionId?: string | null) => void; silenceEntry: (entry: TaskNotificationEntry, silenced?: boolean) => Promise; markEntryRead: (entry: TaskNotificationEntry, read?: boolean) => Promise; }) { const isRead = entry.notificationReadAt !== null; return (

{entry.title}

{entry.statusLine}

{entry.detailLine ? (

{entry.detailLine}

) : null}

{formatDistanceToNow(new Date(entry.updatedAt), { addSuffix: true })}

{entry.actions .filter((action) => action.primary && action.id !== 'open_details') .slice(0, 1) .map((action) => ( ))} {entry.status === 'queued' || entry.status === 'running' ? ( ) : ( )}
); } export function TaskNotificationsTrigger({ unreadCount, isPopoverOpen, setIsPopoverOpen, isLoading, activeEntries, visibleFinishedEntries, awaitingReviewEntries, showReadFinished, setShowReadFinished, openTaskDetails, openTaskAction, silenceEntry, markEntryRead, className }: TaskNotificationsTriggerProps) { const button = ( ); return (
{button} {isPopoverOpen ? ( <>