Skip to main content
Glama
flow-dialog-content.tsx3.43 kB
import { t } from 'i18next'; import { Workflow } from 'lucide-react'; import { useMemo } from 'react'; import { useDebounce } from 'use-debounce'; import { Checkbox } from '@/components/ui/checkbox'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip'; import { PopulatedFlow } from '@activepieces/shared'; import { CreateMcpFlowButton } from './create-mcp-flow-button'; import { flowDialogUtils } from './flow-dialog-utils'; interface FlowDialogContentProps { flows: PopulatedFlow[]; selectedFlows: string[]; setSelectedFlows: (value: string[] | ((prev: string[]) => string[])) => void; searchQuery: string; } export const FlowDialogContent = ({ flows, selectedFlows, setSelectedFlows, searchQuery, }: FlowDialogContentProps) => { const [debouncedQuery] = useDebounce(searchQuery, 300); const filteredFlows = useMemo(() => { if (!debouncedQuery) return flows; const query = debouncedQuery.toLowerCase(); return flows.filter((flow) => flow.version.displayName.toLowerCase().includes(query), ); }, [flows, debouncedQuery]); const handleSelectFlow = (flowId: string) => { setSelectedFlows((prev: string[]) => { const newSelected = prev.includes(flowId) ? prev.filter((id: string) => id !== flowId) : [...prev, flowId]; return newSelected; }); }; return ( <ScrollArea className="flex-grow overflow-y-auto rounded-md"> <div className="grid grid-cols-4 gap-4"> <CreateMcpFlowButton /> {filteredFlows.map((flow) => { const tooltip = flowDialogUtils.getFlowTooltip(flow); const isSelectable = flowDialogUtils.isFlowSelectable(flow); return ( <Tooltip key={flow.id}> <TooltipTrigger asChild> <div className={`border p-2 h-[150px] w-[150px] flex flex-col items-center justify-center hover:bg-accent hover:text-accent-foreground cursor-pointer rounded-lg relative ${ !isSelectable ? 'opacity-50' : '' } ${selectedFlows.includes(flow.id) ? 'bg-accent' : ''}`} onClick={() => isSelectable && handleSelectFlow(flow.id)} > <Checkbox checked={selectedFlows.includes(flow.id)} onCheckedChange={() => isSelectable && handleSelectFlow(flow.id) } className="absolute top-2 left-2" onClick={(e) => e.stopPropagation()} disabled={!isSelectable} /> <Workflow className="w-[40px] h-[40px] text-muted-foreground" /> <div className="w-full mt-2 text-center text-md px-2 text-ellipsis overflow-hidden"> {flow.version.displayName} </div> </div> </TooltipTrigger> {tooltip && ( <TooltipContent> <p>{tooltip}</p> </TooltipContent> )} </Tooltip> ); })} </div> {filteredFlows.length === 0 && ( <div className="text-center text-muted-foreground py-8"> {searchQuery ? t('No flows found') : t('No flows available')} </div> )} </ScrollArea> ); };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/activepieces/activepieces'

If you have feedback or need assistance with the MCP directory API, please join our Discord server