@mic-rexjs/usecases-react
Version:
React-based solution for use usecases of Clean Architecture
57 lines (56 loc) • 2.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useEntity = void 0;
var _react = require("react");
var _usecases = require("@mic-rexjs/usecases");
var _Statuses = require("../../enums/Statuses");
var _useContextualItem = require("../useContextualItem");
var _ahooks = require("ahooks");
var _triggerWatchers = require("../../methods/triggerWatchers");
var _useRuntimeEntity = require("../useRuntimeEntity");
var useEntity = exports.useEntity = function useEntity(statuses, entityArg, contextStore, options) {
var update = (0, _ahooks.useUpdate)();
var optionsRef = (0, _ahooks.useLatest)(options);
var contextEntity = contextStore ? contextStore.value : null;
var entityEnabled = (statuses & _Statuses.Statuses.EntityEnabled) === _Statuses.Statuses.EntityEnabled;
var entityRootEnabled = (statuses & _Statuses.Statuses.EntityRootEnabled) === _Statuses.Statuses.EntityRootEnabled;
var store = (0, _useContextualItem.useContextualItem)(contextStore, statuses, function () {
if (!entityRootEnabled) {
return new _usecases.EntityStore(null);
}
var isFunction = typeof entityArg === 'function';
return new _usecases.EntityStore(isFunction ? entityArg() : entityArg);
});
var runtimeEntity = (0, _useRuntimeEntity.useRuntimeEntity)(store, entityArg, contextEntity, statuses);
var onEntityChange = (0, _ahooks.useMemoizedFn)(function (newEntity, oldEntity) {
var _optionsRef$current = optionsRef.current,
onChange = _optionsRef$current.onChange,
watch = _optionsRef$current.watch;
if (watch) {
(0, _triggerWatchers.triggerWatchers)(watch, newEntity, oldEntity);
}
onChange === null || onChange === void 0 || onChange(newEntity, oldEntity);
if (!entityRootEnabled) {
return;
}
update();
});
if (entityRootEnabled) {
// 执行同步操作
store.value = runtimeEntity;
}
(0, _react.useEffect)(function () {
if (!entityEnabled) {
return;
}
store.watch(onEntityChange);
return function () {
store.unwatch(onEntityChange);
};
}, [entityEnabled, store, onEntityChange]);
return (0, _ahooks.useCreation)(function () {
return [runtimeEntity, store];
}, [runtimeEntity, store]);
};