JAVASCRIPT   32

State

Guest on 29th April 2022 01:21:44 AM

  1. (function (global, factory) {
  2.   if (typeof define === "function" && define.amd) {
  3.     define('/State', ['exports', 'jquery'], factory);
  4.   } else if (typeof exports !== "undefined") {
  5.     factory(exports, require('jquery'));
  6.   } else {
  7.     var mod = {
  8.       exports: {}
  9.     };
  10.     factory(mod.exports, global.jQuery);
  11.     global.State = mod.exports;
  12.   }
  13. })(this, function (exports, _jquery) {
  14.   'use strict';
  15.  
  16.   Object.defineProperty(exports, "__esModule", {
  17.     value: true
  18.   });
  19.  
  20.   var _jquery2 = babelHelpers.interopRequireDefault(_jquery);
  21.  
  22.   var _class = function () {
  23.     function _class(states) {
  24.       babelHelpers.classCallCheck(this, _class);
  25.  
  26.       this._states = Object.assign({}, states);
  27.       this._values = {};
  28.       this._relations = {};
  29.       this._callbacks = {};
  30.       this._define();
  31.     }
  32.  
  33.     babelHelpers.createClass(_class, [{
  34.       key: '_define',
  35.       value: function _define() {
  36.         var _this = this;
  37.  
  38.         var self = this,
  39.             keys = Object.keys(this._states),
  40.             obj = {},
  41.             tmpRelations = [],
  42.             composites = [];
  43.  
  44.         var _loop = function _loop(i, l) {
  45.           var key = keys[i],
  46.               value = _this._states[key];
  47.           if (typeof value !== 'function') {
  48.             Object.defineProperty(obj, key, {
  49.               set: function set() {
  50.                 return false;
  51.               },
  52.               get: function get() {
  53.                 tmpRelations.push(key);
  54.                 return self._states[key];
  55.               },
  56.  
  57.               enumerable: true,
  58.               configurable: true
  59.             });
  60.             _this._values[key] = _this._states[key];
  61.             _this._relations[key] = [];
  62.           } else {
  63.             composites.push(key);
  64.           }
  65.         };
  66.  
  67.         for (var i = 0, l = keys.length; i < l; i++) {
  68.           _loop(i, l);
  69.         }
  70.  
  71.         var _loop2 = function _loop2(_i, _l) {
  72.           var key = composites[_i];
  73.           Object.defineProperty(obj, key, {
  74.             set: function set() {
  75.               return false;
  76.             },
  77.             get: function get() {
  78.               var value = self._states[key].call(obj);
  79.               self._addRelation(key, tmpRelations);
  80.               tmpRelations = [];
  81.               self._values[key] = value;
  82.               return value;
  83.             },
  84.  
  85.             enumerable: true,
  86.             configurable: true
  87.           });
  88.  
  89.           // use get function to create the relationship
  90.           obj[key];
  91.         };
  92.  
  93.         for (var _i = 0, _l = composites.length; _i < _l; _i++) {
  94.           _loop2(_i, _l);
  95.         }
  96.       }
  97.     }, {
  98.       key: '_compare',
  99.       value: function _compare(state) {
  100.         if (this._states[state] !== this._values[state]) {
  101.           var value = this._values[state];
  102.           this._values[state] = this._states[state];
  103.           this._dispatch(state, value, this._states[state]);
  104.           this._compareComposite(state);
  105.         }
  106.       }
  107.     }, {
  108.       key: '_compareComposite',
  109.       value: function _compareComposite(state) {
  110.         var relations = this.getRelation(state);
  111.  
  112.         if (relations && relations.length > 0) {
  113.           for (var i = 0, l = relations.length; i < l; i++) {
  114.             var _state = relations[i],
  115.                 value = this._states[_state]();
  116.  
  117.             if (value !== this._values[_state]) {
  118.               this._dispatch(_state, this._values[_state], value);
  119.               this._values[_state] = value;
  120.             }
  121.           }
  122.         }
  123.       }
  124.     }, {
  125.       key: '_addRelation',
  126.       value: function _addRelation(state, relations) {
  127.         for (var i = 0, l = relations.length; i < l; i++) {
  128.           var pros = relations[i];
  129.           this._relations[pros].push(state);
  130.         }
  131.       }
  132.     }, {
  133.       key: '_dispatch',
  134.       value: function _dispatch(state, origValue, newValue) {
  135.         if (this._callbacks[state]) {
  136.           this._callbacks[state].fire([newValue, origValue]);
  137.         }
  138.       }
  139.     }, {
  140.       key: 'getRelation',
  141.       value: function getRelation(state) {
  142.         return this._relations[state].length > 0 ? this._relations[state] : null;
  143.       }
  144.     }, {
  145.       key: 'on',
  146.       value: function on(state, callback) {
  147.         if (typeof state === 'function') {
  148.           callback = state;
  149.           state = 'all';
  150.         }
  151.  
  152.         if (!this._callbacks[state]) {
  153.           this._callbacks[state] = _jquery2.default.Callbacks();
  154.         }
  155.         this._callbacks[state].add(callback);
  156.       }
  157.     }, {
  158.       key: 'off',
  159.       value: function off(state, callback) {
  160.         if (this._callbacks[state]) {
  161.           this._callbacks[state].remove(callback);
  162.         }
  163.       }
  164.     }, {
  165.       key: 'set',
  166.       value: function set(state, value) {
  167.         var isDeep = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  168.  
  169.         if (typeof state === 'string' && typeof value !== 'undefined' && typeof this._states[state] !== 'function') {
  170.           this._states[state] = value;
  171.           if (!isDeep) this._compare(state);
  172.         } else if ((typeof state === 'undefined' ? 'undefined' : babelHelpers.typeof(state)) === 'object') {
  173.           for (var _key in state) {
  174.             if (typeof state[_key] !== 'function') {
  175.               this.set(_key, state[_key], true);
  176.             }
  177.           }
  178.           for (var _key2 in state) {
  179.             if (typeof state[_key2] !== 'function') {
  180.               this._compare(_key2);
  181.             }
  182.           }
  183.         }
  184.  
  185.         return this._states[state];
  186.       }
  187.     }, {
  188.       key: 'get',
  189.       value: function get(state) {
  190.         if (state) {
  191.           return this._values[state];
  192.         } else {
  193.           return this._values;
  194.         }
  195.       }
  196.     }]);
  197.     return _class;
  198.   }();
  199.  
  200.   exports.default = _class;
  201. });

Raw Paste


Login or Register to edit or fork this paste. It's free.