import { useMemo, useState } from "react"; import { Input, Popover } from "antd"; import { LayoutTemplate, Search, WandSparkles } from "lucide-react"; import { canvasThemes } from "@/lib/canvas-theme"; import { CANVAS_BUILTIN_PRESETS, type CanvasPromptPreset } from "@/lib/prompts"; import { useThemeStore } from "@/stores/use-theme-store"; import type { CanvasGenerationMode } from "@/types/canvas"; import type { CanvasResourceReference } from "@/lib/canvas/canvas-resource-references"; export type { CanvasPromptPreset }; export function CanvasPresetPicker({ mode, skillReferences = [], open, onOpenChange, onSelect, compact = false, dense = false, appearance = "default", }: { mode: CanvasGenerationMode; skillReferences?: CanvasResourceReference[]; open?: boolean; onOpenChange?: (open: boolean) => void; onSelect: (preset: CanvasPromptPreset) => void; compact?: boolean; dense?: boolean; appearance?: "default" | "quiet"; }) { const theme = canvasThemes[useThemeStore((state) => state.theme)]; const [internalOpen, setInternalOpen] = useState(false); const [query, setQuery] = useState(""); const actualOpen = open ?? internalOpen; const setOpen = (next: boolean) => { if (!next) setQuery(""); setInternalOpen(next); onOpenChange?.(next); }; const presets = useMemo(() => { const skills = skillReferences.flatMap((reference): CanvasPromptPreset[] => { if (!reference.skill) return []; return [ { id: `skill:${reference.skill.skillId}`, name: reference.skill.skillName, description: reference.skill.description || reference.skill.instruction || "已加入技能", prompt: `@${reference.skill.skillName} `, modes: ["text", "image", "video", "audio"], source: "skill", }, ]; }); const normalized = query.trim().toLowerCase(); return [...CANVAS_BUILTIN_PRESETS.filter((preset) => preset.modes.includes(mode)), ...skills].filter((preset) => !normalized || `${preset.name} ${preset.description}`.toLowerCase().includes(normalized)); }, [mode, query, skillReferences]); const content = (
event.stopPropagation()} onPointerDown={(event) => event.stopPropagation()}> } placeholder="搜索预设或已加入技能" value={query} onChange={(event) => setQuery(event.target.value)} />
{presets.length ? ( presets.map((preset) => ( )) ) : (
没有匹配的预设
)}
); return ( ); }