@sigi/react
Version:
React bindings for sigi framework
31 lines • 1.31 kB
JavaScript
import { useDebugValue } from 'react';
import { identity, skip } from 'rxjs';
import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector';
import { useInstance } from './injectable-context';
import { shallowEqual } from './shallow-equal';
export function useDispatchers(A) {
const effectModule = useInstance(A);
return effectModule.dispatchers;
}
function _useModuleState(store, selector = identity, equalFn = shallowEqual) {
const state = useSyncExternalStoreWithSelector((onStoreChange) => {
const sub = store.state$.pipe(skip(1)).subscribe(onStoreChange);
return () => sub.unsubscribe();
}, () => store.state, () => store.state, selector, equalFn);
useDebugValue(state);
return state;
}
export function useModuleState(A, config) {
const { store } = useInstance(A);
return _useModuleState(store, config?.selector, config?.equalFn);
}
export function useModule(A, config) {
const effectModule = useInstance(A);
const { store } = effectModule;
const appState = _useModuleState(store, config?.selector);
const appDispatcher = effectModule.dispatchers;
return [appState, appDispatcher];
}
export { SSRContext } from './ssr-context';
export * from './injectable-context';
//# sourceMappingURL=index.browser.js.map