4-26 树rust-2
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { ChevronRight, FileText, Folder, Paperclip, Plus } from "lucide-react";
|
||||
import { AudioLines, BookOpen, ChevronRight, FileImage, FileText, FileVideo, Folder, Paperclip, Plus } from "lucide-react";
|
||||
import { useMemo, useState } from "react";
|
||||
import { cn } from "@/lib/utils";
|
||||
import type { FileTreeRow } from "@/lib/file-tree/types";
|
||||
@@ -26,6 +26,47 @@ interface FileTreeProps {
|
||||
|
||||
const INDENT = 16;
|
||||
|
||||
function resolveAssetIconKind(row: Extract<FileTreeRow, { kind: "asset" | "asset-folder" }>) {
|
||||
const assetType = String(row.asset.asset_type ?? "").trim().toLowerCase();
|
||||
if (assetType === "mindmap") return "mindmap";
|
||||
if (assetType === "luckysheet") return "table";
|
||||
|
||||
const mimeType = String(row.asset.mime_type ?? "").trim().toLowerCase();
|
||||
const fileName = String(row.asset.file_name ?? "").trim().toLowerCase();
|
||||
const ext = fileName.includes(".") ? fileName.split(".").pop() ?? "" : "";
|
||||
|
||||
if (ext === "pdf" || mimeType.includes("pdf")) return "pdf";
|
||||
if (ext === "epub" || mimeType.includes("epub")) return "book";
|
||||
if (mimeType.startsWith("image/")) return "image";
|
||||
if (mimeType.startsWith("video/")) return "video";
|
||||
if (mimeType.startsWith("audio/")) return "audio";
|
||||
return "file";
|
||||
}
|
||||
|
||||
function renderAssetIcon(row: Extract<FileTreeRow, { kind: "asset" | "asset-folder" }>) {
|
||||
const iconKind = resolveAssetIconKind(row);
|
||||
const baseClass = "w-4 h-4 shrink-0";
|
||||
|
||||
switch (iconKind) {
|
||||
case "mindmap":
|
||||
return <Folder className={`${baseClass} text-[#7c3aed]`} />;
|
||||
case "table":
|
||||
return <FileText className={`${baseClass} text-[#b45309]`} />;
|
||||
case "pdf":
|
||||
return <FileText className={`${baseClass} text-[#dc2626]`} />;
|
||||
case "book":
|
||||
return <BookOpen className={`${baseClass} text-[#0f766e]`} />;
|
||||
case "image":
|
||||
return <FileImage className={`${baseClass} text-[#0891b2]`} />;
|
||||
case "video":
|
||||
return <FileVideo className={`${baseClass} text-[#ea580c]`} />;
|
||||
case "audio":
|
||||
return <AudioLines className={`${baseClass} text-[#16a34a]`} />;
|
||||
default:
|
||||
return <Paperclip className={`${baseClass} text-wolai-text-secondary`} />;
|
||||
}
|
||||
}
|
||||
|
||||
export function FileTree({
|
||||
rows,
|
||||
activeId,
|
||||
@@ -300,13 +341,13 @@ export function FileTree({
|
||||
) : (
|
||||
<span className="w-5 h-5 shrink-0" />
|
||||
)}
|
||||
<Folder className="w-4 h-4 text-[#2563eb] shrink-0" />
|
||||
{renderAssetIcon(row)}
|
||||
<span className="min-w-0 flex-1 truncate text-left">{label}</span>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<span className="w-4 h-4 shrink-0" />
|
||||
<Paperclip className="w-4 h-4 text-wolai-text-secondary shrink-0" />
|
||||
{renderAssetIcon(row)}
|
||||
<span className="min-w-0 flex-1 truncate text-left">{label}</span>
|
||||
</>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user