import {IState} from "@gongt/ts-stl-client/redux/preload-state"; import {REDUX_PRELOAD_NAME, ReduxStore} from "@gongt/ts-stl-client/redux/store"; import {IVirtualStoreConstructor} from "@gongt/ts-stl-client/redux/virtual-store"; import {createLogger} from "@gongt/ts-stl-library/debug/create-logger"; import {LOG_LEVEL} from "@gongt/ts-stl-library/debug/levels"; import {GlobalVariable} from "@gongt/ts-stl-library/pattern/global-page-data"; import {Request} from "express-serve-static-core"; import {HtmlContainer, IContainerPlugin} from "../middlewares/html-render"; const debug = createLogger(LOG_LEVEL.SILLY, 'redux-express'); export interface IPreloadStateLoader { (request: ER, global: GlobalVariable, preload: State): void; } export interface IReduxSubStateLoader { (request: ER, global: GlobalVariable): State[keyof /**/State]; } export class ReduxStoreExpress extends ReduxStore implements IContainerPlugin<{}> { protected loader: IPreloadStateLoader[] = []; protected logic: ReduxStore; __modify_html(html: HtmlContainer) { html.dynamic('ReduxStoreExpress', (context) => { const pl: State = {}; this.loader.forEach((fn) => { fn(context.request, context.global, pl); }); context.global.set(REDUX_PRELOAD_NAME, pl); debug('createStore()'); this.createStore(context.global); }); } addPreloadState(loader: IPreloadStateLoader) { this.loader.push(loader); } registerPreload(Constructor: IVirtualStoreConstructor, loader: IReduxSubStateLoader) { this.loader.push((state, global, preload) => { preload[Constructor.name] = loader(state, global); }); } register(Constructor: IVirtualStoreConstructor, loader?: IReduxSubStateLoader): void { super.register(Constructor); if (loader) { this.registerPreload(Constructor, loader); } } } export interface ReduxContextModifier { (req: Request&any): VI; }