UNPKG

@tacky/store

Version:

State management framework based on react

192 lines (141 loc) 6.32 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.reactive = reactive; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var React = _interopRequireWildcard(require("react")); var _ErrorBoundary = _interopRequireDefault(require("./ErrorBoundary")); var _store = require("../core/store"); var _collector = require("../core/collector"); function _createSuper(Derived) { return function () { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } /** * Returns a high order component with auto refresh feature. */ function reactive(arg) { var decorator = function decorator(Target) { // const displayName: string = Target.displayName || Target.name || '<TACKY_COMPONENT>'; var _this; // Function component with do not have this context var ObservableTarget = function ObservableTarget(props) { _collector.depCollector.start(_this); var fn = Target; // target component don't use react.memo var result = fn(props); _collector.depCollector.end(); return result; }; if (typeof Target === 'function' && (!Target.prototype || !Target.prototype.render) && !Target.prototype.isReactClass && !React.Component.isPrototypeOf(Target)) { var Wrapper = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(Wrapper, _React$PureComponent); var _super = _createSuper(Wrapper); function Wrapper() { (0, _classCallCheck2["default"])(this, Wrapper); return _super.apply(this, arguments); } (0, _createClass2["default"])(Wrapper, [{ key: "componentDidMount", value: function componentDidMount() { var _this2 = this; this.unsubscribeHandler = _store.store.subscribe(function () { _this2.forceUpdate(); }, _this); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.unsubscribeHandler !== void 0) { this.unsubscribeHandler(); } } }, { key: "render", value: function render() { return React.createElement(_ErrorBoundary["default"], null, React.createElement(ObservableTarget, Object.assign({}, this.props))); } }]); return Wrapper; }(React.PureComponent); var _baseRender = Wrapper.prototype.render; Wrapper.prototype.render = function () { _this = this; return _baseRender.call(this); }; copyStaticProperties(Target, Wrapper); return Wrapper; } // class component var target = Target.prototype || Target; var baseRender = target.render; var callback; function refreshChildComponentView() { var _this3 = this; return function () { return React.Component.prototype.forceUpdate.call(_this3); }; } target.render = function () { _this = this; callback = refreshChildComponentView.call(this); _collector.depCollector.start(this); var result = baseRender.call(this); _collector.depCollector.end(); return result; }; var ObservableTargetComponent = /*#__PURE__*/function (_React$PureComponent2) { (0, _inherits2["default"])(ObservableTargetComponent, _React$PureComponent2); var _super2 = _createSuper(ObservableTargetComponent); function ObservableTargetComponent() { (0, _classCallCheck2["default"])(this, ObservableTargetComponent); return _super2.apply(this, arguments); } (0, _createClass2["default"])(ObservableTargetComponent, [{ key: "componentDidMount", value: function componentDidMount() { this.unsubscribeHandler = _store.store.subscribe(function () { callback(); }, _this); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.unsubscribeHandler !== void 0) { this.unsubscribeHandler(); } } }, { key: "render", value: function render() { return React.createElement(_ErrorBoundary["default"], null, React.createElement(Target, Object.assign({}, this.props))); } }]); return ObservableTargetComponent; }(React.PureComponent); copyStaticProperties(Target, ObservableTargetComponent); return ObservableTargetComponent; }; if (arg === void 0) { // @reactive() return decorator; } // @reactive return decorator.call(null, arg); } // based on https://github.com/mridgway/hoist-non-react-statics/blob/master/src/index.js var hoistBlackList = { $$typeof: true, render: true, compare: true, type: true }; function copyStaticProperties(base, target) { var keys = Object.keys(base); for (var index = 0; index < keys.length; index++) { var key = keys[index]; if (hoistBlackList[key] === void 0) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(base, key)); } } }