import { Graph } from '@antv/g6';
import { useEffect, useRef, useState } from 'react';
import type { GraphinProps } from '../types';
/**
* Hook for creating and managing a G6 graph instance.
* @param props The props for the Graphin component.
* @returns An object containing the graph instance, the container ref, and a boolean indicating whether the graph is ready.
*/
export default function useGraph
(props: P) {
const { onInit, onReady, onDestroy, options } = props;
const [isReady, setIsReady] = useState(false);
const graphRef: React.MutableRefObject = useRef(null);
const containerRef: React.MutableRefObject = useRef(null);
useEffect(() => {
if (graphRef.current || !containerRef.current) return;
const graph = new Graph({ container: containerRef.current!, ...options });
graphRef.current = graph;
setIsReady(true);
onInit?.(graphRef.current!);
return () => {
const graph = graphRef.current;
if (graph) {
graph.destroy();
onDestroy?.();
graphRef.current = null;
}
};
}, []);
useEffect(() => {
const container = containerRef.current;
const graph = graphRef.current;
if (!options || !container || !graph || graph.destroyed) return;
graph.setOptions(options);
graph.render().then(() => onReady?.(graph));
}, [options]);
return {
graph: graphRef.current,
containerRef,
isReady,
};
}