feat: support basic file presenting

This commit is contained in:
Henry Li
2026-01-16 22:35:20 +08:00
parent 4b69aed47b
commit f9853f037c
4 changed files with 102 additions and 4 deletions

View File

@@ -4,7 +4,12 @@ import {
Conversation,
ConversationContent,
} from "@/components/ai-elements/conversation";
import { groupMessages, hasContent } from "@/core/messages/utils";
import {
extractPresentFilesFromMessage,
groupMessages,
hasContent,
hasPresentFiles,
} from "@/core/messages/utils";
import type { AgentThreadState } from "@/core/threads";
import { cn } from "@/lib/utils";
@@ -12,6 +17,7 @@ import { StreamingIndicator } from "../streaming-indicator";
import { MessageGroup } from "./message-group";
import { MessageListItem } from "./message-list-item";
import { PresentFileList } from "./present-file-list";
import { MessageListSkeleton } from "./skeleton";
export function MessageList({
@@ -43,6 +49,17 @@ export function MessageList({
/>
);
}
if (groupedMessages[0] && hasPresentFiles(groupedMessages[0])) {
const files = [];
for (const message of groupedMessages) {
if (hasPresentFiles(message)) {
files.push(...extractPresentFilesFromMessage(message));
}
}
return (
<PresentFileList key={groupedMessages[0].id} files={files} />
);
}
return (
<MessageGroup
key={groupedMessages[0]!.id}

View File

@@ -0,0 +1,32 @@
import { DownloadIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Card,
CardAction,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { getFileExtension, getFileName } from "@/core/utils/files";
export function PresentFileList({ files }: { files: string[] }) {
return (
<ul className="w-full">
{files.map((file) => (
<Card key={file}>
<CardHeader>
<CardTitle>{getFileName(file)}</CardTitle>
<CardDescription>{getFileExtension(file)} file</CardDescription>
<CardAction>
<Button variant="ghost">
<DownloadIcon className="size-4" />
Download
</Button>
</CardAction>
</CardHeader>
</Card>
))}
</ul>
);
}