'use client'; import React from 'react'; import { Zap, GripVertical, Plus, ServerIcon } from 'lucide-react'; import type { CatalogResource, CatalogItemData } from './types'; interface DraggableCatalogItemProps { resource: CatalogResource; isHovered: boolean; onItemDragStart: (event: React.DragEvent, nodeType: string, label: string, data: CatalogItemData) => void; onItemMouseEnter: () => void; onItemMouseLeave: () => void; onItemAdd: (nodeType: string, label: string, data: CatalogItemData) => void; } const DraggableCatalogItem = React.memo(({ resource, isHovered, onItemDragStart, onItemMouseEnter, onItemMouseLeave, onItemAdd }) => { const isEvent = resource.collection === 'events'; const isService = resource.collection === 'services'; const isCommand = resource.collection === 'commands'; const isQuery = resource.collection === 'queries'; const itemData: CatalogItemData = { label: resource.data.name, resourceId: resource.data.id, collection: resource.collection, mode: 'full', ...((isEvent || isCommand || isQuery) && { message: { version: resource.data.version, name: resource.data.name, summary: resource.data.summary || '', owners: [], producers: [], consumers: [] } }), ...(isService && { service: { version: resource.data.version, name: resource.data.name, summary: resource.data.summary || '', owners: [], sends: [], receives: [] } }) }; const Icon = isEvent ? Zap : ServerIcon; const colorClass = isEvent ? 'text-orange-600' : isCommand ? 'text-blue-600' : isQuery ? 'text-green-600' : 'text-pink-600'; const nodeType = isEvent ? 'event' : isCommand ? 'command' : isQuery ? 'query' : 'service'; return (
onItemDragStart(event, nodeType, resource.data.name, itemData)} onMouseEnter={onItemMouseEnter} onMouseLeave={onItemMouseLeave} >
{resource.data.name}
); }); DraggableCatalogItem.displayName = 'DraggableCatalogItem'; export default DraggableCatalogItem;