import { Link } from "react-router"; import { CanvasWorkspaceAssetPanel } from "./canvas-workspace-asset-panel"; import { CanvasWorkspaceHistoryPanel } from "./canvas-workspace-history-panel"; import type { InsertAssetPayload } from "./asset-picker-modal"; import { useDeferredValue, useState, type CSSProperties, type KeyboardEvent, type PointerEvent } from "react"; import { Button, Grid } from "antd"; import { Home, PanelLeftClose, PanelLeftOpen, Layers3, Images, ListChecks, History, X } from "lucide-react"; import { AppDrawer } from "@/components/ui/product/app-drawer"; import { searchCanvasNodes } from "@/lib/canvas/canvas-node-search"; import { useEffectiveConfig } from "@/stores/use-config-store"; import { canvasDockStyle } from "@/lib/canvas/canvas-aceternity-style"; import { canvasThemes } from "@/lib/canvas-theme"; import { useActiveTheme } from "@/stores/canvas/use-canvas-theme-store"; import type { CanvasNodeData } from "@/types/canvas"; import type { GenerationTask } from "@/services/api/task-center"; import { useCanvasWorkspaceTasks } from "@/pages/canvas/use-canvas-workspace-tasks"; import { CanvasWorkspaceNodeListPanel } from "./canvas-workspace-node-list-panel"; import { CanvasWorkspaceTaskPanel } from "./canvas-workspace-task-panel"; import "./canvas-workspace-panel.css"; export function CanvasWorkspacePanel({ projectId, nodes, selectedNodeIds, onClose, open, onOpen, onInsertAssets, onFocus, onAssets, onProjectAssets, onCancelTask, }: { projectId: string; nodes: CanvasNodeData[]; selectedNodeIds: Set; onClose: () => void; open: boolean; onOpen: () => void; onInsertAssets: (payloads: InsertAssetPayload[]) => Promise; onFocus: (id: string) => void; onAssets: () => void; onProjectAssets?: () => void; onCancelTask: (task: GenerationTask) => void; }) { const [tab, setTab] = useState("nodes"); const theme = canvasThemes[useActiveTheme()]; const [query, setQuery] = useState(""); const history = tab === "history"; const deferredQuery = useDeferredValue(query); const config = useEffectiveConfig(); const screens = Grid.useBreakpoint(); const markPointer = (event: PointerEvent) => { event.currentTarget.dataset.inputModality = "pointer"; }; const markKeyboard = (event: KeyboardEvent) => { if (event.key === "Tab" || event.key === "Enter" || event.key === " ") event.currentTarget.dataset.inputModality = "keyboard"; }; const tasks = useCanvasWorkspaceTasks(projectId, open && (tab === "tasks" || history)); const content = (
e.stopPropagation()} onPointerDown={(e) => e.stopPropagation()}> {tab === "nodes" && ( )} {tab === "assets" && } {(tab === "tasks" || history) && ( <> {tasks.error ? (
任务加载失败。
) : tasks.loading ? (

正在加载任务…

) : history ? ( void tasks.refetch()} onCancelTask={onCancelTask} /> ) : ( t.status === "queued" || t.status === "running")} refreshing={tasks.refreshing} onRefresh={() => void tasks.refetch()} onCancelTask={onCancelTask} /> )} )}
); const entries = [ { id: "nodes", label: "节点", icon: Layers3 }, { id: "assets", label: "资产", icon: Images }, { id: "tasks", label: "任务", icon: ListChecks }, { id: "history", label: "历史", icon: History }, ]; return ( <>
{open && screens.lg ? ( ) : null}
{open && !screens.lg ? ( {content} ) : null} ); }