react-obsidian
Version:
Dependency injection framework for React and React Native applications
25 lines (22 loc) • 782 B
text/typescript
import { 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 <P>(
keyOrGraph: string | Constructable<ObjectGraph>,
target: any,
props?: Partial<P>,
injectionToken?: string,
) => {
const [graph] = useState(() => {
const resolvedGraph = graphRegistry.resolve(keyOrGraph, 'lifecycleOwner', props, injectionToken);
resolvedGraph.onBind(target);
return resolvedGraph;
});
useEffect(() => {
referenceCounter.retain(graph);
return () => referenceCounter.release(graph, (g) => graphRegistry.clear(g));
}, [graph]);
return graph;
};