import { useState } from 'react'; import { Clock, RefreshCw, Trash2, CheckCircle2, XCircle, ChevronDown } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { Badge } from '@/components/ui/badge'; import { ScrollArea } from '@/components/ui/scroll-area'; import { cn } from '@/lib/utils'; import { formatDistanceToNow } from 'date-fns'; export interface QueuedSubmission { id: string; type: string; entityName: string; timestamp: Date; status: 'pending' | 'retrying' | 'failed'; retryCount?: number; error?: string; } interface SubmissionQueueIndicatorProps { queuedItems: QueuedSubmission[]; lastSyncTime?: Date; onRetryItem?: (id: string) => Promise; onRetryAll?: () => Promise; onClearQueue?: () => Promise; onRemoveItem?: (id: string) => void; } export function SubmissionQueueIndicator({ queuedItems, lastSyncTime, onRetryItem, onRetryAll, onClearQueue, onRemoveItem, }: SubmissionQueueIndicatorProps) { const [isOpen, setIsOpen] = useState(false); const [retryingIds, setRetryingIds] = useState>(new Set()); const handleRetryItem = async (id: string) => { if (!onRetryItem) return; setRetryingIds(prev => new Set(prev).add(id)); try { await onRetryItem(id); } finally { setRetryingIds(prev => { const next = new Set(prev); next.delete(id); return next; }); } }; const getStatusIcon = (status: QueuedSubmission['status']) => { switch (status) { case 'pending': return ; case 'retrying': return ; case 'failed': return ; } }; const getStatusColor = (status: QueuedSubmission['status']) => { switch (status) { case 'pending': return 'bg-secondary text-secondary-foreground'; case 'retrying': return 'bg-primary/10 text-primary'; case 'failed': return 'bg-destructive/10 text-destructive'; } }; if (queuedItems.length === 0) { return null; } return (

Submission Queue

{queuedItems.length} pending submission{queuedItems.length !== 1 ? 's' : ''}

{lastSyncTime && (

Last sync {formatDistanceToNow(lastSyncTime, { addSuffix: true })}

)}
{onRetryAll && queuedItems.length > 0 && ( )}
{queuedItems.map((item) => (
{getStatusIcon(item.status)} {item.entityName}
{item.type} {formatDistanceToNow(item.timestamp, { addSuffix: true })} {item.retryCount && item.retryCount > 0 && ( <> {item.retryCount} {item.retryCount === 1 ? 'retry' : 'retries'} )}
{item.error && (

{item.error}

)}
{onRetryItem && ( )} {onRemoveItem && ( )}
))}
{onClearQueue && queuedItems.length > 0 && (
)}
); }