'use client' import React, { useCallback, useEffect } from 'react' import ReactFlow, { Node, Controls, Background, MiniMap, useNodesState, useEdgesState, BackgroundVariant, Panel, } from 'reactflow' import 'reactflow/dist/style.css' import { ARCH_SERVICES, LAYERS, type ArchService } from '../architecture-data' import { LAYER_ORDER, type LayerFilter } from '../_layout' import { useArchGraph } from '../_hooks/useArchGraph' import DetailPanel from './DetailPanel' export default function ArchCanvas({ layerFilter, showDb, showRag, showApis, selectedService, setSelectedService, }: { layerFilter: LayerFilter showDb: boolean showRag: boolean showApis: boolean selectedService: ArchService | null setSelectedService: React.Dispatch> }) { const { nodes: initialNodes, edges: initialEdges } = useArchGraph({ layerFilter, showDb, showRag, showApis, selectedService, }) const [nodes, setNodes, onNodesChange] = useNodesState([]) const [edges, setEdges, onEdgesChange] = useEdgesState([]) useEffect(() => { setNodes(initialNodes) setEdges(initialEdges) }, [initialNodes, initialEdges, setNodes, setEdges]) const onNodeClick = useCallback((_event: React.MouseEvent, node: Node) => { const service = ARCH_SERVICES.find(s => s.id === node.id) if (service) { setSelectedService(prev => (prev?.id === service.id ? null : service)) } }, [setSelectedService]) const onPaneClick = useCallback(() => { setSelectedService(null) }, [setSelectedService]) return (
{/* Canvas */}
{ if (node.id.startsWith('db-')) return '#94a3b8' if (node.id.startsWith('rag-')) return '#22c55e' if (node.id.startsWith('api-')) return '#c4b5fd' const svc = ARCH_SERVICES.find(s => s.id === node.id) return svc ? LAYERS[svc.layer].colorBorder : '#94a3b8' }} maskColor="rgba(0,0,0,0.08)" /> {/* Legende */}
Legende
{LAYER_ORDER.map(layerId => { const layer = LAYERS[layerId] return (
{layer.name}
) })}
DB-Tabelle
RAG-Collection
API-Endpunkt
{/* Swim-Lane Labels */} {layerFilter === 'alle' && (
{LAYER_ORDER.map(layerId => { const layer = LAYERS[layerId] return (
{layer.name}
) })}
)}
{/* Detail Panel */} {selectedService && ( setSelectedService(null)} /> )}
) }