@gongt/ts-stl-client
Version:
144 lines • 4.64 kB
JavaScript
;
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