'use client'; import React, { useMemo } from 'react'; import * as Accordion from '@radix-ui/react-accordion'; import { ChevronDown } from 'lucide-react'; import DraggableCatalogItem from './DraggableCatalogItem'; import type { CatalogResource, CatalogItemData } from './types'; interface ResourcesTabContentProps { searchTerm: string; resources: CatalogResource[]; hoveredItemId: string | null; onDragStart: (event: React.DragEvent, nodeType: string, label: string, data: CatalogItemData) => void; onItemMouseEnter: (itemId: string) => void; onItemMouseLeave: () => void; onItemAdd: (nodeType: string, label: string, data: CatalogItemData) => void; } const ResourcesTabContent = React.memo(({ searchTerm, resources, hoveredItemId, onDragStart, onItemMouseEnter, onItemMouseLeave, onItemAdd }) => { const groupedResources = useMemo(() => { if (!resources || !Array.isArray(resources)) { return { events: [], services: [], commands: [], queries: [] }; } const filtered = resources.filter((resource: CatalogResource) => resource.data.name.toLowerCase().includes(searchTerm.toLowerCase()) || (resource.data.summary && resource.data.summary.toLowerCase().includes(searchTerm.toLowerCase())) ); return { events: filtered.filter((resource: CatalogResource) => resource.collection === 'events'), services: filtered.filter((resource: CatalogResource) => resource.collection === 'services'), commands: filtered.filter((resource: CatalogResource) => resource.collection === 'commands'), queries: filtered.filter((resource: CatalogResource) => resource.collection === 'queries') }; }, [resources, searchTerm]); if (!resources || resources.length === 0) { return (

Users can use resources documented from EventCatalog in their diagrams.

Open and run the Studio within your catalog directory and Studio will automatically pull these resources in for your diagrams.

); } return ( {groupedResources.services.length > 0 && ( Services
{groupedResources.services.map((resource: CatalogResource, index: number) => { const uniqueKey = `service-${resource.id}-${resource.collection}-${resource.filePath?.split('/').pop() || index}-${index}`; return ( onItemMouseEnter(uniqueKey)} onItemMouseLeave={onItemMouseLeave} onItemAdd={onItemAdd} /> ); })}
)} {groupedResources.events.length > 0 && ( Events
{groupedResources.events.map((resource: CatalogResource, index: number) => { const uniqueKey = `event-${resource.id}-${resource.collection}-${resource.filePath?.split('/').pop() || index}-${index}`; return ( onItemMouseEnter(uniqueKey)} onItemMouseLeave={onItemMouseLeave} onItemAdd={onItemAdd} /> ); })}
)} {groupedResources.commands.length > 0 && ( Commands
{groupedResources.commands.map((resource: CatalogResource, index: number) => { const uniqueKey = `command-${resource.id}-${resource.collection}-${resource.filePath?.split('/').pop() || index}-${index}`; return ( onItemMouseEnter(uniqueKey)} onItemMouseLeave={onItemMouseLeave} onItemAdd={onItemAdd} /> ); })}
)} {groupedResources.queries.length > 0 && ( Queries
{groupedResources.queries.map((resource: CatalogResource, index: number) => { const uniqueKey = `query-${resource.id}-${resource.collection}-${resource.filePath?.split('/').pop() || index}-${index}`; return ( onItemMouseEnter(uniqueKey)} onItemMouseLeave={onItemMouseLeave} onItemAdd={onItemAdd} /> ); })}
)} {groupedResources.events.length === 0 && groupedResources.services.length === 0 && searchTerm.trim() !== '' && (

No results found.

)}
); }); ResourcesTabContent.displayName = 'ResourcesTabContent'; export default ResourcesTabContent;