import React, { useRef, useEffect, useState } from "react"; import type { GraphData, GraphNode, GraphLink, ContextMenuState, } from "./types"; import { useGraphStore } from "./store/useGraphStore"; import { ForceGraph, GraphControls, GraphContextMenu, GraphStatusBar, GraphStats, } from "./components"; interface GraphProps { initialData?: GraphData; onExport?: () => void; onDataChange?: (data: GraphData) => void; } export const Graph: React.FC = ({ initialData, onExport, onDataChange, }) => { const fgRef = useRef(null); const [contextMenu, setContextMenu] = useState(null); const data = useGraphStore((s) => s.data); const isLinkMode = useGraphStore((s) => s.isLinkMode); const selectedNode = useGraphStore((s) => s.selectedNode); const setData = useGraphStore((s) => s.setData); // Инициализация данных useEffect(() => { if (initialData) setData(initialData); }, [initialData, setData]); // Закрыть контекстное меню по клику вне useEffect(() => { const handleClickOutside = () => setContextMenu(null); document.addEventListener("click", handleClickOutside); return () => document.removeEventListener("click", handleClickOutside); }, []); const handleNodeRightClick = (node: GraphNode, event: MouseEvent) => { event.preventDefault(); event.stopPropagation(); setContextMenu({ x: event.clientX, y: event.clientY, node, link: null }); }; const handleLinkRightClick = (link: GraphLink, event: MouseEvent) => { event.preventDefault(); event.stopPropagation(); setContextMenu({ x: event.clientX, y: event.clientY, node: null, link }); }; if (!data || data.nodes.length === 0) { return (

Нет данных для отображения

); } return (
{/* Статистика сверху */} {/* Граф */}
setContextMenu(null)} />
{/* Кнопки снизу */}
); }; export default Graph;