UNPKG

@turbox3d/reactivity

Version:

Large-scale reactive state management library

220 lines (219 loc) 6.75 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.TimeTravel = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _shared = require("@turbox3d/shared"); var _store = require("./store"); var _config = require("../const/config"); var _enums = require("../const/enums"); var _symbol = require("../const/symbol"); /** * collect prop diff history record */ var TimeTravel = exports.TimeTravel = /*#__PURE__*/function () { function TimeTravel() { (0, _classCallCheck2["default"])(this, TimeTravel); this.currentHistory = new Map(); this.transactionHistories = []; this.cursor = -1; } return (0, _createClass2["default"])(TimeTravel, [{ key: "undoable", get: function get() { return this.cursor >= 0; } }, { key: "redoable", get: function get() { return this.cursor < this.transactionHistories.length - 1; } }, { key: "onChange", value: function onChange(undoable, redoable, type, action) { // } /** * @todo support multiple steps * revert to the previous history status */ }, { key: "undo", value: function undo() { var _this = this; if (!this.undoable) { return; } var currentHistory = this.transactionHistories[this.cursor]; var original = function original() { TimeTravel.undoHandler(currentHistory.history); }; if (!_store.store) { (0, _shared.fail)('store is not ready, please init first.'); } var action = currentHistory.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 }); this.cursor -= 1; (0, _shared.nextTick)(function () { _this.onChange(_this.undoable, _this.redoable, 'undo'); }); } /** * @todo support multiple steps * apply the next history status */ }, { key: "redo", value: function redo() { var _this2 = this; if (!this.redoable) { return; } this.cursor += 1; var currentHistory = this.transactionHistories[this.cursor]; var original = function original() { TimeTravel.redoHandler(currentHistory.history); }; if (!_store.store) { (0, _shared.fail)('store is not ready, please init first.'); } var action = currentHistory.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 }); (0, _shared.nextTick)(function () { _this2.onChange(_this2.undoable, _this2.redoable, 'redo'); }); } }, { key: "clear", value: function clear() { var _this3 = this; this.currentHistory = new Map(); this.transactionHistories.length = 0; this.cursor = -1; (0, _shared.nextTick)(function () { _this3.onChange(_this3.undoable, _this3.redoable, 'clear'); }); } }], [{ key: "undoable", get: function get() { return TimeTravel.currentTimeTravel && TimeTravel.currentTimeTravel.undoable; } }, { key: "redoable", get: function get() { return TimeTravel.currentTimeTravel && TimeTravel.currentTimeTravel.redoable; } }, { key: "undoHandler", value: function undoHandler(history) { history.forEach(function (keyToDiffObj, target) { if (!keyToDiffObj) { return; } keyToDiffObj.forEach(function (value, key) { if (!value) { return; } if (value.beforeUpdate === value.didUpdate) { return; } if (value.type === _enums.ECollectType.MAP_SET || value.type === _enums.ECollectType.MAP_DELETE) { if (value.beforeUpdate === void 0) { target["delete"](key); } else { target.set(key, value.beforeUpdate); } } else if (value.type === _enums.ECollectType.SET_ADD) { target["delete"](key); } else if (value.type === _enums.ECollectType.SET_DELETE) { target.add(key); } else if (Array.isArray(target) && value.beforeUpdate === void 0) { delete target[key]; } else { target[key] = value.beforeUpdate; } }); }); } }, { key: "redoHandler", value: function redoHandler(history) { history.forEach(function (keyToDiffObj, target) { if (!keyToDiffObj) { return; } keyToDiffObj.forEach(function (value, key) { if (!value) { return; } if (value.beforeUpdate === value.didUpdate) { return; } if (value.type === _enums.ECollectType.MAP_SET) { target.set(key, value.didUpdate); } else if (value.type === _enums.ECollectType.SET_ADD) { target.add(key); } else if (value.type === _enums.ECollectType.SET_DELETE) { target["delete"](key); } else if (value.type === _enums.ECollectType.MAP_DELETE) { target["delete"](key); } else { target[key] = value.didUpdate; } }); }); } }]); }(); TimeTravel.timeTravels = {}; TimeTravel.processing = false; TimeTravel["switch"] = function (name) { TimeTravel.currentTimeTravel = TimeTravel.get(name); }; TimeTravel.create = function (name) { var tt = new TimeTravel(); TimeTravel.timeTravels[name] = tt; return tt; }; TimeTravel.get = function (name) { return TimeTravel.timeTravels[name]; }; TimeTravel.pause = function () { _config.ctx.timeTravel.isActive = false; }; TimeTravel.resume = function () { _config.ctx.timeTravel.isActive = true; }; TimeTravel.undo = function () { TimeTravel.currentTimeTravel && TimeTravel.currentTimeTravel.undo(); }; TimeTravel.redo = function () { TimeTravel.currentTimeTravel && TimeTravel.currentTimeTravel.redo(); }; TimeTravel.clear = function () { TimeTravel.currentTimeTravel && TimeTravel.currentTimeTravel.clear(); };