import React, { useCallback, useEffect, useState } from "react"; import { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandList, CommandSeparator, } from "../../ui"; import { ImportableEditorNode, NodeLibraryGroup } from "@flyde/core"; import { cn } from "../../ui"; import { usePorts } from "../../flow-editor/ports"; import { NodeItem, CustomNodeButton } from "./CommandMenuNodeItem"; import { useCommandMenuData } from "./useCommandMenuData"; export interface CommandMenuProps { open: boolean; onOpenChange: (open: boolean) => void; onAddNode: (node: ImportableEditorNode) => void; onClickCustomNode: () => void; } export const CommandMenu: React.FC = ({ open, onOpenChange, onAddNode, onClickCustomNode, }) => { const [query, setQuery] = useState(""); const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(false); const { getLibraryData } = usePorts(); useEffect(() => { setLoading(true); getLibraryData() .then((data) => { setGroups(data.groups); }) .finally(() => { setLoading(false); }); }, [getLibraryData]); const { nodeMap, filteredGroups, updateRecentlyUsed, } = useCommandMenuData({ groups, query }); // Handler for selecting a node const onSelect = useCallback( (value: string) => { if (value === "custom") { onClickCustomNode(); setQuery(""); onOpenChange(false); return; } // Format is now "category:nodeId" but we only need the nodeId part const nodeId = value.split(":").pop() as string; const node = nodeMap[nodeId]; if (node) { // Update recently used nodes updateRecentlyUsed(nodeId); onAddNode(node); } setQuery(""); onOpenChange(false); }, [nodeMap, onAddNode, onClickCustomNode, onOpenChange, updateRecentlyUsed, setQuery] ); return ( {loading ? (
Loading...
) : ( <> {(filteredGroups.length === 0 || filteredGroups.every(g => g.nodes.length === 0)) && No results found.} {filteredGroups.map((group) => { return (
{group.title === "Essentials" && (!query || "Custom Node" .toLowerCase() .includes(query.toLowerCase())) && ( )} {group.nodes.map((node) => { return ( ) })}
) })} )}
); };