import React, { memo } from 'react'; import { RiCloseLine, RiMessage2Line } from '@remixicon/react'; import { useMessageQueueStore, type QueuedMessage } from '@/stores/messageQueueStore'; import { useSessionStore } from '@/stores/useSessionStore'; import { useFileStore } from '@/stores/fileStore'; interface QueuedMessageChipProps { message: QueuedMessage; sessionId: string; onEdit: (message: QueuedMessage) => void; } const QueuedMessageChip = memo(({ message, sessionId, onEdit }: QueuedMessageChipProps) => { const removeFromQueue = useMessageQueueStore((state) => state.removeFromQueue); // Get first line of message, truncated const firstLine = React.useMemo(() => { const lines = message.content.split('\n'); const first = lines[0] || ''; const maxLength = 50; if (first.length > maxLength) { return first.substring(0, maxLength) + '...'; } return first + (lines.length > 1 ? '...' : ''); }, [message.content]); const attachmentCount = message.attachments?.length ?? 0; return (
); }); QueuedMessageChip.displayName = 'QueuedMessageChip'; interface QueuedMessageChipsProps { onEditMessage: (content: string, attachments?: QueuedMessage['attachments']) => void; } const EMPTY_QUEUE: QueuedMessage[] = []; export const QueuedMessageChips = memo(({ onEditMessage }: QueuedMessageChipsProps) => { const currentSessionId = useSessionStore((state) => state.currentSessionId); const queuedMessages = useMessageQueueStore( React.useCallback( (state) => { if (!currentSessionId) return EMPTY_QUEUE; return state.queuedMessages[currentSessionId] ?? EMPTY_QUEUE; }, [currentSessionId] ) ); const popToInput = useMessageQueueStore((state) => state.popToInput); const handleEdit = React.useCallback((message: QueuedMessage) => { if (!currentSessionId) return; const popped = popToInput(currentSessionId, message.id); if (popped) { // Restore attachments to file store if any if (popped.attachments && popped.attachments.length > 0) { const currentAttachments = useFileStore.getState().attachedFiles; useFileStore.setState({ attachedFiles: [...currentAttachments, ...popped.attachments] }); } onEditMessage(popped.content, popped.attachments); } }, [currentSessionId, popToInput, onEditMessage]); if (queuedMessages.length === 0 || !currentSessionId) { return null; } return (
Queued: {queuedMessages.map((message) => ( ))}
); }); QueuedMessageChips.displayName = 'QueuedMessageChips';