mirror of
https://gitee.com/wanwujie/deer-flow
synced 2026-04-20 04:44:46 +08:00
72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import { DownloadIcon } from "lucide-react";
|
|
import { useCallback } from "react";
|
|
|
|
import { Button } from "@/components/ui/button";
|
|
import {
|
|
Card,
|
|
CardAction,
|
|
CardDescription,
|
|
CardHeader,
|
|
CardTitle,
|
|
} from "@/components/ui/card";
|
|
import { urlOfArtifact } from "@/core/artifacts/utils";
|
|
import { useI18n } from "@/core/i18n/hooks";
|
|
import { getFileExtensionDisplayName, getFileName } from "@/core/utils/files";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
import { useArtifacts } from "./context";
|
|
|
|
export function ArtifactFileList({
|
|
className,
|
|
files,
|
|
threadId,
|
|
}: {
|
|
className?: string;
|
|
files: string[];
|
|
threadId: string;
|
|
}) {
|
|
const { t } = useI18n();
|
|
const { select: selectArtifact, setOpen } = useArtifacts();
|
|
const handleClick = useCallback(
|
|
(filepath: string) => {
|
|
selectArtifact(filepath);
|
|
setOpen(true);
|
|
},
|
|
[selectArtifact, setOpen],
|
|
);
|
|
return (
|
|
<ul className={cn("flex w-full flex-col gap-4", className)}>
|
|
{files.map((file) => (
|
|
<Card
|
|
key={file}
|
|
className="cursor-pointer p-3"
|
|
onClick={() => handleClick(file)}
|
|
>
|
|
<CardHeader className="pr-2 pl-1">
|
|
<CardTitle>{getFileName(file)}</CardTitle>
|
|
<CardDescription className="text-xs">
|
|
{getFileExtensionDisplayName(file)} file
|
|
</CardDescription>
|
|
<CardAction>
|
|
<a
|
|
href={urlOfArtifact({
|
|
filepath: file,
|
|
threadId: threadId,
|
|
download: true,
|
|
})}
|
|
target="_blank"
|
|
onClick={(e) => e.stopPropagation()}
|
|
>
|
|
<Button variant="ghost">
|
|
<DownloadIcon className="size-4" />
|
|
{t.common.download}
|
|
</Button>
|
|
</a>
|
|
</CardAction>
|
|
</CardHeader>
|
|
</Card>
|
|
))}
|
|
</ul>
|
|
);
|
|
}
|