Skip to main content
Glama
piece-tool.tsx4.23 kB
import { t } from 'i18next'; import { Plus, Puzzle, X } from 'lucide-react'; import { useMemo } from 'react'; import { AccordionContent, AccordionItem, AccordionTrigger, } from '@/components/ui/accordion'; import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip'; import { stepsHooks } from '@/features/pieces/lib/steps-hooks'; import { PieceStepMetadataWithSuggestions } from '@/lib/types'; import { AgentPieceTool } from '@activepieces/shared'; import { useAgentToolsStore } from '../store'; type AgentPieceToolProps = { disabled?: boolean; tools: AgentPieceTool[]; removeTool: (toolName: string) => void; }; export const AgentPieceToolComponent = ({ disabled, tools, removeTool, }: AgentPieceToolProps) => { const { openPieceDialog } = useAgentToolsStore(); const { metadata } = stepsHooks.useAllStepsMetadata({ searchQuery: '', type: 'action', }); const piecesMetadata = useMemo(() => { return metadata?.filter( (m): m is PieceStepMetadataWithSuggestions => 'suggestedActions' in m && 'suggestedTriggers' in m, ); }, [metadata]); const pieceMetadata = piecesMetadata?.find( (p) => p.pieceName === tools[0].pieceMetadata.pieceName, ); if (!pieceMetadata) return null; const handleEditTool = (tool: AgentPieceTool) => { openPieceDialog({ defaultPage: 'action-selected', tool }); }; return ( <AccordionItem value={pieceMetadata.pieceName} className="border-b last:border-0" > <AccordionTrigger className="px-4 py-3 hover:no-underline hover:bg-accent transition-all"> <div className="flex items-center gap-3"> <div className="h-8 w-8 rounded-md bg-muted flex items-center justify-center"> {pieceMetadata.logoUrl ? ( <img src={pieceMetadata.logoUrl} alt={pieceMetadata.displayName} className="h-5 w-5 object-contain" /> ) : ( <Puzzle className="h-5 w-5 text-muted-foreground" /> )} </div> <span className="text-sm font-medium"> {pieceMetadata.displayName} </span> </div> </AccordionTrigger> <AccordionContent className="px-4 py-2"> <div className="flex flex-wrap gap-2"> {tools.map((tool) => ( <div key={tool.toolName} onClick={() => handleEditTool(tool)} className={` group flex items-center gap-2 px-3 py-1 cursor-pointer rounded-full border bg-muted/50 ${disabled ? 'opacity-50 pointer-events-none' : ''} `} > <span className="text-xs font-medium">{tool.toolName}</span> <div className="flex items-center gap-1"> <Tooltip> <TooltipTrigger asChild> <Button disabled={disabled} onClick={(e) => { e.stopPropagation(); removeTool(tool.toolName); }} variant="ghost" size="icon" className=" size-5 p-0.5 text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition " > <X className="h-3 w-3" /> </Button> </TooltipTrigger> <TooltipContent>Remove tool</TooltipContent> </Tooltip> </div> </div> ))} </div> <Button variant="link" className="mt-4" size="xs" onClick={() => openPieceDialog({ defaultPage: 'piece-selected', piece: pieceMetadata, }) } > <Plus className="size-3 mr-1" /> {t('Add Action')} </Button> </AccordionContent> </AccordionItem> ); };

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