import React, { useState } from 'react'; import { X, Clock, Send, GripVertical, Zap, Sparkles, ChevronDown, ChevronUp } from 'lucide-react'; import { Button } from './ui/button'; interface QueuedMessage { id: string; content: string; timestamp: number; } interface MessageQueueProps { queuedMessages: QueuedMessage[]; onRemoveMessage: (id: string) => void; onClearQueue: () => void; onStopAndSend?: (messageId: string) => void; onEditMessage?: (messageId: string, newContent: string) => void; onTriggerQueueProcessing?: () => void; editingMessageIdRef?: React.MutableRefObject; onReorderMessages?: (reorderedMessages: QueuedMessage[]) => void; className?: string; isPaused?: boolean; } export const MessageQueue: React.FC = ({ queuedMessages, onRemoveMessage, onClearQueue, onStopAndSend, onEditMessage, onTriggerQueueProcessing, editingMessageIdRef, onReorderMessages, className = '', isPaused = false, }) => { const [isExpanded, setIsExpanded] = useState(true); const [draggedItem, setDraggedItem] = useState(null); const [dragOverItem, setDragOverItem] = useState(null); const [hoveredMessage, setHoveredMessage] = useState(null); const [editingMessage, setEditingMessage] = useState(null); const [editContent, setEditContent] = useState(''); if (queuedMessages.length === 0) { return null; } const handleDragStart = (e: React.DragEvent, messageId: string) => { setDraggedItem(messageId); e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('text/html', messageId); }; const handleDragOver = (e: React.DragEvent, messageId: string) => { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; setDragOverItem(messageId); }; const handleDragLeave = () => { setDragOverItem(null); }; const handleDrop = (e: React.DragEvent, targetMessageId: string) => { e.preventDefault(); if (!draggedItem || !onReorderMessages) return; const draggedIndex = queuedMessages.findIndex((msg) => msg.id === draggedItem); const targetIndex = queuedMessages.findIndex((msg) => msg.id === targetMessageId); if (draggedIndex === -1 || targetIndex === -1 || draggedIndex === targetIndex) { setDraggedItem(null); setDragOverItem(null); return; } const newMessages = [...queuedMessages]; const [removed] = newMessages.splice(draggedIndex, 1); newMessages.splice(targetIndex, 0, removed); onReorderMessages(newMessages); setDraggedItem(null); setDragOverItem(null); }; const handleDragEnd = () => { setDraggedItem(null); setDragOverItem(null); }; const formatTimestamp = (timestamp: number) => { const now = Date.now(); const diff = now - timestamp; if (diff < 60000) return 'now'; if (diff < 3600000) return `${Math.floor(diff / 60000)}m`; return `${Math.floor(diff / 3600000)}h`; }; const nextMessage = queuedMessages[0]; const remainingCount = queuedMessages.length - 1; // Compact View if (!isExpanded) { return (
{/* Compact Header */}
setIsExpanded(true)} >
{isPaused ? (
) : (
)} {isPaused ? 'Paused' : 'Next'}
{/* Next message preview */}

{nextMessage.content.length > 40 ? `${nextMessage.content.substring(0, 40)}...` : nextMessage.content}

{/* Queue count */} {remainingCount > 0 && (
+{remainingCount}
)}
{/* Quick Send Now button */} {onStopAndSend && ( )} {/* Expand button */}
{/* Paused state indicator */} {isPaused && (
Queue paused - click "Send" or add new message to resume
)}
); } // Expanded View return (
{/* Expanded Header */}
{isPaused ? (
) : (
)}
{isPaused ? 'Queue Paused' : 'Message Queue'} {queuedMessages.length} message{queuedMessages.length !== 1 ? 's' : ''} {isPaused ? ' waiting' : ' queued'}
{queuedMessages.length > 1 && ( )} {/* Collapse button */}
{/* Status Banner for Paused State */} {isPaused && (
Queue paused by interruption. Use "Send Now" or add a new message to resume.
)} {/* Message Bubbles */}
{queuedMessages.map((message, index) => (
handleDragStart(e, message.id)} onDragOver={(e) => handleDragOver(e, message.id)} onDragLeave={handleDragLeave} onDrop={(e) => handleDrop(e, message.id)} onDragEnd={handleDragEnd} onMouseEnter={() => setHoveredMessage(message.id)} onMouseLeave={() => setHoveredMessage(null)} > {/* Main message bubble */}
{/* Priority indicator */}
{index + 1}
{/* Drag handle */} {onReorderMessages && (
)}
{/* Message content */}
{editingMessage === message.id ? (