Files
AutoMetabuilder/frontend/autometabuilder/hooks/usePluginSearch.ts
copilot-swe-agent[bot] 6e9ff896e7 Phase 9: Implement atomic hooks-based workflow canvas components
- Created custom hooks: useWorkflowGraph, useWorkflowPlugins, usePluginSearch, useTabNavigation
- Decomposed canvas logic into: useCanvasNodes, useCanvasEdges, useCanvasDragDrop
- Built atomic node components: NodeHeader, NodeBody, NodePorts
- Created canvas UI components: CanvasInfoPanel, CanvasHintPanel
- Split builder into: LoadingState, ErrorState, WorkflowBuilderHeader, WorkflowBuilderTabs, WorkflowBuilderContent
- Added React Flow for n8n-style visual canvas with drag-and-drop
- All components now under 100 LOC following PROMPT.md guidelines

Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
2026-01-10 12:25:36 +00:00

20 lines
772 B
TypeScript

import { useMemo, useState } from "react";
import { WorkflowPluginMap } from "../lib/types";
export function usePluginSearch(plugins: WorkflowPluginMap, t: (key: string, fallback?: string) => string) {
const [search, setSearch] = useState("");
const filteredPlugins = useMemo(() => {
const query = search.trim().toLowerCase();
return Object.entries(plugins).filter(([id, plugin]) => {
const label = plugin.label ? t(plugin.label, id) : id;
const category = plugin.category || "";
const tags = (plugin.tags || []).join(" ");
const searchText = `${id} ${label} ${category} ${tags}`.toLowerCase();
return !query || searchText.includes(query);
});
}, [plugins, search, t]);
return { search, setSearch, filteredPlugins };
}