@turbox3d/reactivity
Version:
Large-scale reactive state management library
187 lines (186 loc) • 6.19 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.actionPool = exports.Action = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _shared = require("@turbox3d/shared");
var _symbol = require("../const/symbol");
var _store = require("./store");
var _enums = require("../const/enums");
var _timeTravel = require("./time-travel");
var _collector = require("./collector");
var _mutation = require("../decorators/mutation");
var actionPool = exports.actionPool = [];
var Action = exports.Action = /*#__PURE__*/function () {
function Action() {
(0, _classCallCheck2["default"])(this, Action);
this.displayName = _symbol.EMPTY_ACTION_NAME;
this.status = _enums.ActionStatus.WORKING;
this.historyNode = {
actionChain: [],
history: new Map()
};
}
return (0, _createClass2["default"])(Action, [{
key: "execute",
value: function execute(runner) {
var payload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var isWrapMutation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var options = arguments.length > 3 ? arguments[3] : undefined;
if (this.status === _enums.ActionStatus.ABORT) {
return;
}
Action.context = this;
var wp;
if (isWrapMutation) {
wp = (0, _mutation.mutation)(this.name, runner, options);
} else {
wp = runner;
}
var result = wp.apply(void 0, (0, _toConsumableArray2["default"])(payload));
if ((0, _shared.isPromise)(result)) {
return result.then(function () {
Action.context = void 0;
}, function () {
Action.context = void 0;
});
}
Action.context = void 0;
}
}, {
key: "complete",
value: function complete() {
if (this.status === _enums.ActionStatus.ABORT) {
return;
}
this.status = _enums.ActionStatus.COMPLETED;
_collector.triggerCollector.save(this);
_collector.triggerCollector.endBatch(true, this);
(0, _shared.remove)(actionPool, this);
}
}, {
key: "undo",
value: function undo() {
var _this = this;
var keepHistory = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var original = function original() {
_timeTravel.TimeTravel.undoHandler(_this.historyNode.history);
};
if (!_store.store) {
(0, _shared.fail)('store is not ready, please init first.');
}
var action = this.historyNode.actionChain[0] || {
name: '',
displayName: ''
};
_store.store.dispatch({
name: "".concat(_symbol.TURBOX_PREFIX, "UNDO_").concat(action.name),
displayName: "UNDO_".concat(action.displayName),
payload: [],
original: original,
type: _enums.EMaterialType.UNDO,
isInner: true
});
if (keepHistory) {
return;
}
this.historyNode = {
actionChain: [],
history: new Map()
};
(0, _shared.nextTick)(function () {
var ctt = _timeTravel.TimeTravel.currentTimeTravel;
ctt && ctt.onChange(ctt.undoable, ctt.redoable, 'undo', _this);
});
}
}, {
key: "redo",
value: function redo() {
var _this2 = this;
var keepHistory = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var original = function original() {
_timeTravel.TimeTravel.redoHandler(_this2.historyNode.history);
};
if (!_store.store) {
(0, _shared.fail)('store is not ready, please init first.');
}
var action = this.historyNode.actionChain[0] || {
name: '',
displayName: ''
};
_store.store.dispatch({
name: "".concat(_symbol.TURBOX_PREFIX, "REDO_").concat(action.name),
displayName: "REDO_".concat(action.displayName),
payload: [],
original: original,
type: _enums.EMaterialType.REDO,
isInner: true
});
if (keepHistory) {
return;
}
this.historyNode = {
actionChain: [],
history: new Map()
};
(0, _shared.nextTick)(function () {
var ctt = _timeTravel.TimeTravel.currentTimeTravel;
ctt && ctt.onChange(ctt.undoable, ctt.redoable, 'redo', _this2);
});
}
}, {
key: "abort",
value: function abort() {
var revert = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
if (revert) {
this.undo();
}
this.status = _enums.ActionStatus.ABORT;
_collector.triggerCollector.endBatch(true, this);
(0, _shared.remove)(actionPool, this);
}
}], [{
key: "create",
value: function create(name, displayName) {
var action = new Action();
action.name = name;
displayName && (action.displayName = displayName);
action.historyNode.actionChain.push({
name: name,
displayName: action.displayName
});
actionPool.push(action);
return action;
}
}, {
key: "abortAll",
value: function abortAll() {
var revert = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
actionPool.forEach(function (action) {
action.abort(revert);
});
}
}, {
key: "get",
value: function get() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (!args.length) {
return actionPool;
}
if (args.length === 1) {
return actionPool.filter(function (action) {
return action.name === args[0];
});
}
return actionPool.filter(function (action) {
return (0, _shared.includes)(args, action.name);
});
}
}]);
}();