import React, { useCallback, useMemo } from 'react'; import { ReactFlow, Background, Controls, MiniMap, useNodesState, useEdgesState, Node, Edge, ConnectionMode, } from '@xyflow/react'; import '@xyflow/react/dist/style.css'; import { SystemModuleNode } from './nodes/SystemModuleNode'; import { DataEntityNode } from './nodes/DataEntityNode'; import { ProcessFlowNode } from './nodes/ProcessFlowNode'; import { useSystemMapData } from './hooks/useSystemMapData'; import { SystemMapFilters } from './SystemMapFilters'; import { SystemMapLegend } from './SystemMapLegend'; import { SystemMapTour } from './SystemMapTour'; const nodeTypes = { module: SystemModuleNode, entity: DataEntityNode, process: ProcessFlowNode, }; export function MapaInterativoFlow() { const { nodes: initialNodes, edges: initialEdges } = useSystemMapData(); const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes); const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges); const [filteredView, setFilteredView] = React.useState('all'); const [showTour, setShowTour] = React.useState(false); const onNodeClick = useCallback((event: React.MouseEvent, node: Node) => { if (node.data.url) { window.open(node.data.url as string, '_blank'); } }, []); const filteredNodes = useMemo(() => { if (filteredView === 'all') return nodes; return nodes.filter(node => { if (filteredView === 'permissions') { return node.data.hasAccess !== false; } if (filteredView === 'main-flow') { return node.data.isMainFlow; } if (filteredView === 'recent') { return node.data.recentlyUsed; } return true; }); }, [nodes, filteredView]); const filteredEdges = useMemo(() => { const nodeIds = new Set(filteredNodes.map(n => n.id)); return edges.filter(edge => nodeIds.has(edge.source) && nodeIds.has(edge.target) ); }, [edges, filteredNodes]); return (
{/* Controles superiores */}
{/* Legenda */}
{/* React Flow */} {/* Tour Modal */} {showTour && ( setShowTour(false)} /> )}
); }