UNPKG

react-data-binding

Version:
102 lines (87 loc) 3.31 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 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; }; })(); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var Store = (function () { function Store(initialData) { _classCallCheck(this, Store); this.state = initialData; this.batching = false; this.listeners = []; this.fireChange = this.fireChange.bind(this); this.batch = this.batch.bind(this); this.getState = this.getState.bind(this); this.setState = this.setState.bind(this); } _createClass(Store, [{ key: 'setState', value: function setState(state) { this.state = _extends({}, this.state, state); if (!this.batching) { this.batchFireChange(); } } }, { key: 'batch', value: function batch(callback) { var _this = this; return function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (_this.batching) { callback.apply(null, args); return; } _this.batching = true; var originalState = _this.state; callback.apply(null, args); _this.batching = false; if (originalState !== _this.state) { _this.batchFireChange(); } }; } }, { key: 'batchFireChange', value: function batchFireChange() { // TODO debounce ? _reactDom2['default'].unstable_batchedUpdates(this.fireChange); } }, { key: 'fireChange', value: function fireChange() { this.listeners.slice().forEach(function (listener) { return listener(); }); } }, { key: 'subscribe', value: function subscribe(listener) { var listeners = this.listeners; listeners.push(listener); var isSubscribed = true; return function unsubscribe() { if (!isSubscribed) { return; } isSubscribed = false; var index = listeners.indexOf(listener); listeners.splice(index, 1); }; } }, { key: 'getState', value: function getState() { return this.state; } }]); return Store; })(); exports.Store = Store;