import React, { useEffect, useState } from 'react';
import { Constructable } from '../../types';
import { ObjectGraph } from '../../graph/ObjectGraph';
import graphRegistry from '../../graph/registry/GraphRegistry';
import referenceCounter from '../../ReferenceCounter';
export default
(
keyOrGraph: string | Constructable,
target: any,
props?: Partial,
injectionToken?: string,
containerRef?: React.RefObject,
) => {
const [graph] = useState(() => {
const resolvedGraph = graphRegistry.resolve(keyOrGraph, 'lifecycleOwner', props, injectionToken);
resolvedGraph.onBind(target);
return resolvedGraph;
});
useEffect(() => {
const sentinel = containerRef?.current;
referenceCounter.retain(graph);
return () => {
const isCleanupCalledDueToActivityPause = graph.inactiveBehavior === 'retain' && sentinel?.isConnected;
referenceCounter.release(graph, (g) => {
if (!isCleanupCalledDueToActivityPause) {
graphRegistry.clear(g);
}
});
};
}, [graph]);
return graph;
};