@mic-rexjs/usecases-react
Version:
React-based solution for use usecases of Clean Architecture
107 lines (106 loc) • 3.72 kB
JavaScript
;
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;
};