UNPKG

fluxtuate

Version:

a javascript ES7 library for handling complex data transactions

159 lines (127 loc) 5.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _internals = require("./_internals"); var _dateMethods = require("./date-methods"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var innerDate = Symbol("fluxtuateArrayWrapper_innerDate"); var listeners = Symbol("fluxtuateArrayWrapper_listeners"); var destroyed = Symbol("fluxtuateArrayWrapper_destroyed"); var checkDestroyed = Symbol("fluxtuateArrayWrapper_checkDestroyed"); var dispatchUpdate = Symbol("fluxtuateArrayWrapper_dispatchUpdate"); var updateTimer = Symbol("fluxtuateArrayWrapper_updateTimer"); var dateGetterMethods = _dateMethods.dateGetterMethods.concat(["compare"]); var dateSetterMethods = _dateMethods.dateSetterMethods.concat(["setValue", "clear"]); var DateWrapper = function () { function DateWrapper(wrappedDate, holderContext) { var _this = this; _classCallCheck(this, DateWrapper); this[innerDate] = wrappedDate; this[listeners] = []; this[_internals.context] = holderContext; this[_internals.updateable] = false; this[destroyed] = false; this[checkDestroyed] = function () { if (_this[destroyed]) { throw new Error("You are trying to access a destroyed date."); } }; this[dispatchUpdate] = function (callback, payload) { if (_this[updateTimer]) { clearTimeout(_this[updateTimer]); _this[updateTimer] = undefined; } if (_this[destroyed]) return; _this[updateTimer] = setTimeout(function () { callback({ model: _this, data: payload.data, name: payload.name }); }, 0); }; this[_internals.updateInnerObject] = function (wrappedDate) { _this[innerDate] = wrappedDate; var oldListeners = _this[listeners]; _this[listeners] = []; while (oldListeners.length > 0) { var listener = oldListeners.pop(); listener.originalRemove(); _this.onUpdate(listener.callback); } }; dateSetterMethods.forEach(function (methodName) { Object.defineProperty(_this, methodName, { value: function value() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this[checkDestroyed](); if (!_this[_internals.updateable]) { throw new Error("You are trying to alter a array that is not editable, you must do all data alteration from a command!"); } return _this[innerDate][methodName].apply(_this[innerDate], [_this].concat(args)); }, configurable: false }); }); dateGetterMethods.forEach(function (methodName) { Object.defineProperty(_this, methodName, { value: function value() { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } _this[checkDestroyed](); return _this[innerDate][methodName].apply(_this[innerDate], args); }, configurable: false }); }); } _createClass(DateWrapper, [{ key: "onUpdate", value: function onUpdate(callback) { var _this2 = this; this[checkDestroyed](); var listener = this[innerDate].onUpdate(this[dispatchUpdate].bind(this, callback)); var removeFunction = listener.remove; var index = this[listeners].length; this[listeners].push(listener); listener.callback = callback; listener.originalRemove = removeFunction; listener.remove = function () { _this2[listeners].splice(index, 1); removeFunction(); }; return listener; } }, { key: "destroy", value: function destroy() { if (this[destroyed]) return; this[listeners].forEach(function (listener) { listener.remove(); }); this[destroyed] = true; } }, { key: "modelName", get: function get() { this[checkDestroyed](); return this[innerDate].modelName; } }, { key: "modelData", get: function get() { this[checkDestroyed](); return this[innerDate].modelData; } }, { key: "cleanData", get: function get() { this[checkDestroyed](); return this[innerDate].cleanData; } }]); return DateWrapper; }(); exports.default = DateWrapper;