@turbox3d/reactivity
Version:
Large-scale reactive state management library
120 lines (119 loc) • 4.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.action = action;
var _shared = require("@turbox3d/shared");
var _action = require("../core/action");
var _enums = require("../const/enums");
var _symbol = require("../const/symbol");
var _mutation = require("./mutation");
function createAction(target, name, original, config) {
var stringMethodName = (0, _shared.convert2UniqueString)(name);
var actionWp = function actionWp() {
var currentAction = _action.Action.create(stringMethodName, config.displayName);
var bindOriginal = (0, _shared.bind)(original, this);
var wp;
if (config.isWrapMutation) {
wp = (0, _mutation.mutation)(name, bindOriginal, config.mutationConfig);
} else {
wp = bindOriginal;
}
for (var _len = arguments.length, payload = new Array(_len), _key = 0; _key < _len; _key++) {
payload[_key] = arguments[_key];
}
var result = currentAction.execute(wp, payload);
if ((0, _shared.isPromise)(result)) {
return new Promise(function (resolve, reject) {
result.then(function (res) {
currentAction.complete();
resolve(res);
}, function (err) {
currentAction.abort();
reject(err);
});
});
}
currentAction.complete();
return result;
};
actionWp[_symbol.MATERIAL_TYPE] = _enums.EMaterialType.ACTION;
return actionWp;
}
/**
* decorator @action, handle undo/redo action.
*/
function action() {
var config = {
displayName: '',
isWrapMutation: true,
mutationConfig: undefined
};
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
if (typeof args[0] === 'string' && typeof args[1] === 'function') {
if (args[2] !== void 0) {
config.displayName = args[2].displayName;
config.isWrapMutation = args[2].isWrapMutation;
config.mutationConfig = args[2].mutationConfig;
}
var name = args[0];
var original = args[1];
if (original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.ACTION) {
return original;
}
return createAction(undefined, name, original, config);
}
var decorator = function decorator(target, name, descriptor) {
// typescript only: @action method = async () => {}
if (descriptor === void 0) {
var actionFunc;
return Object.defineProperty(target, name, {
enumerable: true,
configurable: true,
get: function get() {
return actionFunc;
},
set: function set(original) {
if (original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.ACTION) {
actionFunc = original;
} else {
actionFunc = createAction(target, name, original, config);
}
}
});
}
// babel/typescript: @action method() {}
if (descriptor.value !== void 0) {
var _original = descriptor.value;
if (_original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.ACTION) {
descriptor.value = _original;
} else {
descriptor.value = createAction(target, name, _original, config);
}
return descriptor;
}
// babel only: @action method = () => {}
var initializer = descriptor.initializer;
descriptor.initializer = function () {
(0, _shared.invariant)(!!initializer, 'The initializer of the descriptor doesn\'t exist, please compile it by using babel and correspond decorator plugin.');
var original = initializer && initializer.call(this);
if (original[_symbol.MATERIAL_TYPE] === _enums.EMaterialType.ACTION) {
return original;
}
return createAction(target, name, original, config);
};
return descriptor;
};
if ((0, _shared.quacksLikeADecorator)(args)) {
// @action
// eslint-disable-next-line prefer-spread
return decorator.apply(null, args);
}
// @action(args)
config.displayName = args[0] || '';
config.isWrapMutation = args[1] !== void 0 ? args[1] : true;
config.mutationConfig = args[2] !== void 0 ? args[2] : undefined;
return decorator;
}