ayanami
Version:
A better way to react with state
35 lines (34 loc) • 1.48 kB
JavaScript
import { __assign } from "tslib";
import { skip } from 'rxjs/operators';
import { SSRSymbol } from './constants';
import { isSSREnabled } from './flag';
import { Effect } from '../core/decorators';
export var SKIP_SYMBOL = Symbol('skip');
export var reqMap = new Map();
function addDecorator(target, method, middleware) {
var existedMetas = Reflect.getMetadata(SSRSymbol, target);
var meta = { action: method, middleware: middleware };
if (existedMetas) {
existedMetas.push(meta);
}
else {
Reflect.defineMetadata(SSRSymbol, [meta], target);
}
}
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export function SSREffect(options) {
var _a = __assign({ payloadGetter: undefined, skipFirstClientDispatch: true }, options), payloadGetter = _a.payloadGetter, skipFirstClientDispatch = _a.skipFirstClientDispatch;
return function (target, method, descriptor) {
addDecorator(target, method, payloadGetter);
if (!isSSREnabled() && skipFirstClientDispatch) {
var originalValue_1 = descriptor.value;
descriptor.value = function (action$, state$) {
if (Reflect.getMetadata(this.ssrLoadKey, this)) {
return originalValue_1.call(this, action$.pipe(skip(1)), state$);
}
return originalValue_1.call(this, action$, state$);
};
}
return Effect()(target, method, descriptor);
};
}