UNPKG

@mic-rexjs/usecases-react

Version:

React-based solution for use usecases of Clean Architecture

32 lines 1.26 kB
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]); };