import { memo, useState } from "react"; import { AudioLines, Clock3, FileText, Image, Layers, Pencil, Search, X } from "lucide-react"; import { CanvasVideoPreviewImage } from "@/components/canvas/canvas-video-preview-image"; import { WorkspaceState } from "@/components/layout/workspace-state"; import { canvasNodeMaterialSummary, canvasNodeSearchContext, canvasNodeSearchTimes } from "@/lib/canvas/canvas-node-search"; import type { AiConfig } from "@/stores/use-config-store"; import { getNodeListLabel } from "@/lib/canvas/node-registry"; import { CanvasNodeType, type CanvasNodeData } from "@/types/canvas"; import { Video as CanvasVideoIcon } from "lucide-react"; export function CanvasWorkspaceNodeListPanel({ nodes, config, results, query, deferredQuery, selectedNodeIds, onQueryChange, onFocus, }: { nodes: CanvasNodeData[]; config: AiConfig; results: CanvasNodeData[]; query: string; deferredQuery: string; selectedNodeIds: Set; onQueryChange: (value: string) => void; onFocus: (nodeId: string) => void; }) { return ( <>
画布节点 {nodes.length.toLocaleString("zh-CN")}
{deferredQuery ?
找到 {results.length.toLocaleString("zh-CN")} 个节点
: null}
{results.length ? ( results.map((node) => onFocus(node.id)} />) ) : ( )}
); } const CanvasNodeListItem = memo(function CanvasNodeListItem({ node, config, active, onSelect }: { node: CanvasNodeData; config: AiConfig; active: boolean; onSelect: () => void }) { const times = canvasNodeSearchTimes(node); const materialSummary = canvasNodeMaterialSummary(node, config); const context = canvasNodeSearchContext(node); return ( ); }); function CanvasNodeListThumbnail({ node }: { node: CanvasNodeData }) { const [failed, setFailed] = useState(false); const mediaSource = node.metadata?.drawingPreviewUrl || node.metadata?.characterCoverUrl || node.metadata?.folder?.themeCover || (node.type === CanvasNodeType.Image || node.type === CanvasNodeType.Panorama || node.type === CanvasNodeType.ColorGrade ? node.metadata?.content : undefined); const commonClass = "h-9 w-11 rounded-[var(--r-sm)] border object-cover"; const commonStyle = { borderColor: "color-mix(in srgb, var(--foreground) 9%, transparent)", background: "color-mix(in srgb, var(--foreground) 5%, transparent)" }; if (node.type === CanvasNodeType.Video) { const fallback = ; return ; } if (mediaSource && !failed) { return setFailed(true)} />; } const textPreview = node.metadata?.previewContent || node.metadata?.composerContent || node.metadata?.prompt || node.metadata?.content; if (textPreview && (node.type === CanvasNodeType.Text || node.type === CanvasNodeType.Markdown || node.type === CanvasNodeType.Script)) { return ( ); } return ( ); } function fullTime(value?: string) { if (!value) return "时间未记录"; return new Date(value).toLocaleString("zh-CN", { hour12: false }); }