@mic-rexjs/usecases-react
Version:
React-based solution for use usecases of Clean Architecture
32 lines • 1.26 kB
JavaScript
import { useConstantReducers } from '../useConstantReducers';
import { useDepsKey } from '../useDepsKey';
import { useCreation, useLatest, useMemoizedFn } from 'ahooks';
import { Statuses } from '../../enums/Statuses';
import { methodUseCase } from '../../usecases/methodUseCase';
export const useContextualItem = function (contextItem, statuses, createFactory) {
let deps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
const depsKey = useDepsKey(deps);
const factoryRef = useLatest(createFactory);
const _useConstantReducers = useConstantReducers(methodUseCase),
cacheCall = _useConstantReducers.cacheCall;
const onCache = useMemoizedFn(() => {
const currentFactory = factoryRef.current;
// 防止在以下 `onCreate()` 多次调用实际 `factory`
return cacheCall(currentFactory, {
onCompare() {
return true;
}
});
});
const onCreate = useCreation(() => {
void depsKey;
return onCache();
}, [depsKey, onCache]);
return useCreation(() => {
const rootEnabled = (statuses & Statuses.RootEnabled) === Statuses.RootEnabled;
if (!rootEnabled && contextItem) {
return contextItem;
}
return onCreate();
}, [statuses, contextItem, onCreate]);
};