UNPKG

@gongt/ts-stl-client

Version:
144 lines 4.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const PropTypes = require("prop-types"); const react_redux_1 = require("react-redux"); function tDispatchMapper(disp) { const ret = {}; Object.defineProperty(ret, '_dispatch', { value: disp, configurable: false, enumerable: true, writable: false, }); return ret; } exports.tDispatchMapper = tDispatchMapper; // MapperObject<Props, State>; class ReactReduxConnector { constructor() { this.mps = []; this.advOpts = { renderCountProp: 'renderCounts', shouldHandleStateChanges: true, withRef: false, pure: true, }; this.connect = this.connect.bind(this); } addMapper(obj) { this.mps.push(obj); } isComponentUseContext(notPure = true) { this.advOpts.pure = !notPure; } isComponentUseDOM(storeRef = true) { this.advOpts.withRef = storeRef; } connect(reactClass) { if (reactClass['_redux_connect']) { throw new TypeError(`duplicate @ReduxConnector() on ${reactClass.displayName || reactClass.name}`); } prepareReactClass(reactClass); let mapper; if (this.mps.length === 0) { this.advOpts.shouldHandleStateChanges = false; mapper = undefined; } else { this.advOpts.shouldHandleStateChanges = true; mapper = createMapper(this.mps); } this.advOpts.getDisplayName = (name) => { return `RRConnector(${name}) [pure=${this.advOpts.pure},withRef=${this.advOpts.withRef},handle=${this.advOpts.shouldHandleStateChanges}]`; }; const c = react_redux_1.connect(mapper, tDispatchMapper, // TODO undefined, // TODO this.advOpts); const RetClass = c(reactClass); Object.defineProperty(RetClass, '_redux_connect', { enumerable: false, configurable: false, writable: false, value: true, }); // RetClass.displayName = `ReactReduxConnector(${reactClass.displayName || reactClass.name})`; return RetClass; } } exports.ReactReduxConnector = ReactReduxConnector; function prepareReactClass(reactClass) { if (!reactClass.propTypes) { reactClass.propTypes = {}; } reactClass.propTypes.renderCounts = PropTypes.number; } /** @deprecated */ function connectToStore(...mappers) { const conn = new ReactReduxConnector(); for (const mapper of mappers) { conn.addMapper(mapper); } return conn.connect.bind(conn); } exports.connectToStore = connectToStore; function createMapper(mappers) { if (mappers.length === 1 && typeof mappers[0] === 'function') { return mappers[0]; } // let mapper: MapStateToPropsParam<Props, void>; const fns = mappers.filter((mapObject) => { return typeof mapObject === 'function'; }); const objects = Object.assign({}, ...mappers.filter((mapObject) => { return typeof mapObject !== 'function'; })); const keys = Object.keys(objects); if (keys.length) { fns.push((state) => { const props = {}; for (const i of keys) { props[i] = objects[i](state); } return props; }); } return (data) => { const ret = {}; for (const fn of fns) { Object.assign(ret, fn(data)); } return ret; }; } function ActionDispatcher(Act, Sto) { return function (name) { if (this[name]) { throw new Error('can not use @ActionDispatch with property with value'); } this[name] = function (value) { this.props._dispatch(new Act(value, Sto).toJSON()); }; }; } exports.ActionDispatcher = ActionDispatcher; exports.CANCEL_TRIGGER = null; function ActionTrigger(Act, Sto) { return (target, name, descriptor) => { if (!descriptor || !descriptor.value || typeof descriptor.value !== 'function') { throw new TypeError('ActionTrigger: only allow decorate method.'); } const original = descriptor.value; function trigger(...args) { const ret = original.apply(this, args); if (ret !== undefined && ret !== exports.CANCEL_TRIGGER) { this.props._dispatch(new Act(ret, Sto).toJSON()); } return ret; } return { value: trigger, }; }; } exports.ActionTrigger = ActionTrigger; //# sourceMappingURL=react-connect.js.map