@injectable-ts/react
Version:
Purely-functional strictly-typed IoC/DI for TypeScript
32 lines (27 loc) • 1.36 kB
JavaScript
import * as React from 'react';
import { createContext, useContext, useMemo } from 'react';
import { TOKEN_ACCESSOR_KEY } from '@injectable-ts/core';
const context = /* @__PURE__ */ createContext(undefined);
/* @__NO_SIDE_EFFECTS__ */ function useInjectable(input, overrides) {
const dependencies = useContext(context);
if (dependencies === undefined) {
throw new Error('useInjectable must be called within DependenciesProvider subtree');
}
return useMemo(() =>
// eslint-disable-next-line no-restricted-syntax
input(overrides === undefined
? dependencies
: Object.assign(Object.assign({}, dependencies), overrides)), [dependencies, overrides, input]);
}
const checkedAccessor = (dependencies, name) => {
if (name in dependencies) {
return dependencies[name];
}
throw new Error(`Missing dependency: ${JSON.stringify(name)}`);
};
/* @__NO_SIDE_EFFECTS__ */ function DependenciesProvider(props) {
const previousDependencies = useContext(context);
const mergedDependencies = useMemo(() => (Object.assign(Object.assign({ [TOKEN_ACCESSOR_KEY]: checkedAccessor }, previousDependencies), props.value)), [previousDependencies, props.value]);
return (React.createElement(context.Provider, { value: mergedDependencies }, props.children));
}
export { DependenciesProvider, useInjectable };