UNPKG

@mic-rexjs/usecases-react

Version:

React-based solution for use usecases of Clean Architecture

107 lines (106 loc) 3.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useEntity = void 0; var _useConstantEntityReducers = require("../useConstantEntityReducers"); var _useExec = require("../useExec"); var _ahooks = require("ahooks"); var _react = require("react"); var _Statuses = require("../../enums/Statuses"); var _triggerWatchers = require("../../methods/triggerWatchers"); var _valueUseCase = require("../../usecases/valueUseCase"); var useEntity = exports.useEntity = function useEntity(entityArg, store, reducers, statuses, options) { var update = (0, _ahooks.useUpdate)(); var isFunction = typeof entityArg === 'function'; var entity = store.value; var isFirstRef = (0, _react.useRef)(true); var optionsRef = (0, _ahooks.useLatest)(options); var prevEntityRef = (0, _react.useRef)(entity); var entityEnabled = (statuses & _Statuses.Statuses.EntityEnabled) === _Statuses.Statuses.EntityEnabled; var entityRootEnabled = (statuses & _Statuses.Statuses.EntityRootEnabled) === _Statuses.Statuses.EntityRootEnabled; var bindEntity = reducers.bindEntity, unbindEntity = reducers.unbindEntity; var _useConstantEntityRed = (0, _useConstantEntityReducers.useConstantEntityReducers)(entityArg, _valueUseCase.valueUseCase), isValueChanged = _useConstantEntityRed.isValueChanged, recordValue = _useConstantEntityRed.recordValue; var onTriggerWatchers = (0, _ahooks.useMemoizedFn)(function (newEntity, oldEntity) { var watch = optionsRef.current.watch; if (!watch) { return; } (0, _triggerWatchers.triggerWatchers)(watch, newEntity, oldEntity); }); var onEntityChange = (0, _ahooks.useMemoizedFn)(function (newEntity, oldEntity) { var onChange = optionsRef.current.onChange; prevEntityRef.current = newEntity; onTriggerWatchers(newEntity, oldEntity); onChange === null || onChange === void 0 || onChange(newEntity, oldEntity); if (!entityRootEnabled) { return; } update(); }); var onValueChange = (0, _ahooks.useMemoizedFn)(function () { if (!entityEnabled) { return; } var prevEntity = prevEntityRef.current; if (entity === prevEntity) { return; } prevEntityRef.current = entity; onTriggerWatchers(entity, prevEntity); }); (0, _useExec.useExec)(function () { var isFirst = isFirstRef.current; isFirstRef.current = false; if (!entityRootEnabled) { return; } if (isFirst) { // 这里不要修改 `entity`,因为 `useUseCase` 有初始化 `entity` 的逻辑 bindEntity === null || bindEntity === void 0 || bindEntity(); } if (isFunction) { return; } var isChanged = isValueChanged(entityArg); if (!isChanged) { return; } recordValue(entityArg); store.disableWatchers(); // 执行同步操作 store.setValue(entityArg); store.enableWatchers(); }); /** * 需要马上 `watch`,因为 `useEffect` 在子组件内优先执行, * 如果使用了 `setEntity` 则无法监控到变化 */ (0, _useExec.useExec)(function () { if (!entityEnabled) { return; } store.watch(onEntityChange); }, [entityEnabled, store, onEntityChange]); /** * 在变化时候,组件更新前,使用 `unwatch` */ (0, _react.useEffect)(function () { return function () { store.unwatch(onEntityChange); }; }, [entityEnabled, store, onEntityChange]); (0, _ahooks.useUnmount)(function () { if (!entityRootEnabled) { return; } unbindEntity === null || unbindEntity === void 0 || unbindEntity(); }); (0, _ahooks.useUpdateEffect)(function () { onValueChange(); }, [entity, onValueChange]); return store.value; };