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)} />
) : (
),
)}
);
}