import { useState } from "react"; import { IconTrash, IconArrowUp, IconPencil, IconCheck, IconX, IconBolt } from "@tabler/icons-react"; import { Button } from "@/components/ui/button"; import { useChatStore } from "@/stores"; import { bridge } from "@/services"; import { Content } from "@/lib/content"; import type { ContentPart } from "shared/legacy-sdk"; function QueueItem({ id, content, isStreaming, onEdit }: { id: string; content: string | ContentPart[]; isStreaming: boolean; onEdit: (id: string) => void }) { const { removeFromQueue, moveQueueItemUp, queue } = useChatStore(); const text = Content.getText(content); const hasMedia = Content.hasMedia(content); const isFirst = queue[0]?.id === id; const handleSteer = async () => { const result = await bridge.steerChat(content); if (result.ok) { removeFromQueue(id); } }; return (

{text || (hasMedia ? "(media)" : "")}

{hasMedia && text && + media}
{isStreaming && ( )} {!isFirst && ( )}
); } function EditingItem({ id, initialContent, onDone }: { id: string; initialContent: string; onDone: () => void }) { const [text, setText] = useState(initialContent); const { editQueueItem } = useChatStore(); const handleSave = () => { if (text.trim()) { editQueueItem(id, text); } onDone(); }; return (
setText(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") handleSave(); if (e.key === "Escape") onDone(); }} className="flex-1 min-w-0 text-xs bg-transparent border-b border-border outline-none py-0.5" />
); } export function QueuedMessagesPanel() { const { queue, isStreaming } = useChatStore(); const [editingId, setEditingId] = useState(null); if (queue.length === 0) return null; return (
{queue.map((item) => editingId === item.id ? ( setEditingId(null)} /> ) : ( ), )}
); }