@turbox3d/reactivity
Version:
Large-scale reactive state management library
127 lines • 4.42 kB
JavaScript
import { bind, convert2UniqueString, isPromise, invariant, fail, quacksLikeADecorator } from '@turbox3d/shared';
import { store } from '../core/store';
import { EMPTY_ACTION_NAME, MATERIAL_TYPE } from '../const/symbol';
import { Domain } from '../core/domain';
import { EMaterialType } from '../const/enums';
function createMutation(target, name, original, config) {
var stringMethodName = convert2UniqueString(name);
var mutationWp = function mutationWp() {
// eslint-disable-next-line @typescript-eslint/no-this-alias
var _this = this;
if (!target) {
_this = new Domain();
}
if (!store) {
fail('store is not ready, please init first.');
}
for (var _len = arguments.length, payload = new Array(_len), _key = 0; _key < _len; _key++) {
payload[_key] = arguments[_key];
}
var result = store.dispatch({
name: stringMethodName,
displayName: config.displayName || EMPTY_ACTION_NAME,
payload: payload,
type: EMaterialType.MUTATION,
domain: _this,
original: bind(original, _this),
immediately: !!config.immediately,
forceSaveHistory: !!config.forceSaveHistory,
isNeedRecord: !!config.isNeedRecord
});
if (isPromise(result)) {
return new Promise(function (resolve, reject) {
result.then(function (res) {
resolve(res);
}, function (err) {
reject(err);
});
});
}
if (result && result instanceof Error) {
throw result;
}
return result;
};
mutationWp[MATERIAL_TYPE] = EMaterialType.MUTATION;
return mutationWp;
}
/**
* decorator @mutation, update state by mutation styling.
*/
export function mutation() {
var config = {
immediately: false,
displayName: '',
forceSaveHistory: false,
isNeedRecord: true
};
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.immediately = args[2].immediately;
config.forceSaveHistory = !!args[2].forceSaveHistory;
config.isNeedRecord = !!args[2].isNeedRecord;
}
var name = args[0];
var original = args[1];
if (original[MATERIAL_TYPE] === EMaterialType.MUTATION) {
return original;
}
return createMutation(undefined, name, original, config);
}
var decorator = function decorator(target, name, descriptor) {
// typescript only: @mutation method = () => {}
if (descriptor === void 0) {
var mutationFunc;
return Object.defineProperty(target, name, {
enumerable: true,
configurable: true,
get: function get() {
return mutationFunc;
},
set: function set(original) {
if (original[MATERIAL_TYPE] === EMaterialType.MUTATION) {
mutationFunc = original;
} else {
mutationFunc = createMutation(target, name, original, config);
}
}
});
}
// babel/typescript: @mutation method() {}
if (descriptor.value !== void 0) {
var _original = descriptor.value;
if (_original[MATERIAL_TYPE] === EMaterialType.MUTATION) {
descriptor.value = _original;
} else {
descriptor.value = createMutation(target, name, _original, config);
}
return descriptor;
}
// babel only: @mutation method = () => {}
var initializer = descriptor.initializer;
descriptor.initializer = function () {
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[MATERIAL_TYPE] === EMaterialType.MUTATION) {
return original;
}
return createMutation(target, name, original, config);
};
return descriptor;
};
if (quacksLikeADecorator(args)) {
// @mutation
// eslint-disable-next-line prefer-spread
return decorator.apply(null, args);
}
// @mutation(args)
config.displayName = args[0] || '';
config.immediately = args[1] !== void 0 ? args[1] : false;
config.forceSaveHistory = args[2] !== void 0 ? args[2] : false;
config.isNeedRecord = args[3] !== void 0 ? args[3] : true;
return decorator;
}