4-26 树rust-2

This commit is contained in:
lix-2026
2026-04-26 04:29:23 +08:00
parent 94631f3636
commit 338bb2e20f
58 changed files with 11718 additions and 1256 deletions
@@ -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>
</>
)}