import {IS_CLIENT} from "@gongt/ts-stl-library/check-environment"; import {GlobalVariable} from "@gongt/ts-stl-library/pattern/global-page-data"; import {Singleton} from "@gongt/ts-stl-library/pattern/singleton-class"; import {ArrayOrSingle} from "../global"; import {IState} from "./preload-state"; import {AppStore, LogicFunction, REDUX_PRELOAD_NAME, ReduxStore} from "./store"; export type EmptyPreloadHandler = (state: any) => void; declare const __REDUX_DEVTOOLS_EXTENSION_COMPOSE__: any; export interface IClientStateCreator { (store: StateInterface, req: GlobalVariable): StateInterface } @Singleton(true) export class ReduxStoreWindow extends ReduxStore { protected readonly composeEnhancers; public readonly singleton: AppStore; constructor(logicRegister?: ArrayOrSingle>) { super(logicRegister); if (IS_CLIENT && '__REDUX_DEVTOOLS_EXTENSION_COMPOSE__' in window) { console.info('using redux dev-tools.'); this.composeEnhancers = __REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ // TODO, Specify here name, actionsBlacklist, actionsCreators and other options }); } } private emptyPlHandlers: EmptyPreloadHandler[] = []; pushEmptyPreloadHandler(fn: EmptyPreloadHandler) { this.emptyPlHandlers.push(fn); } createStore(): AppStore { const global = new GlobalVariable(); if (!global.has(REDUX_PRELOAD_NAME)) { const pl = {}; this.emptyPlHandlers.forEach((fn) => { fn(pl); }); global.set(REDUX_PRELOAD_NAME, pl); } return super.createStore(global); }; }