import { Dynadux, IDynaduxConfig, TDynaduxReducerDispatch, IDynaduxReducerDic, } from "../Dynadux/Dynadux"; import {EventEmitter} from "../tools/EventEmitter"; import {createSection} from "./createSection"; export interface ICreateStoreConfig extends IDynaduxConfig { } export interface ICreateStoreAPI { state: TState; dispatch: TDynaduxReducerDispatch; createSection: (createSectionConfig: ICreateSectionConfig) => ICreateSectionAPI; addChangeEventListener: (cb: (sectionState: TState, action: string, payload?: any) => void) => void; removeChangeEventListener: (cb: (sectionState: TState, action: string, payload?: any) => void) => void; provider: IStoreProviderAPI; } export interface IStoreProviderAPI { store: ICreateStoreAPI; addChangeEventListener: (cb: (storeState: TState, action: string, payload?: any) => void) => void; removeChangeEventListener: (cb: (storeState: TState, action: string, payload?: any) => void) => void; } export interface ICreateSectionConfig { section: string; initialState: TSectionState; reducers: IDynaduxReducerDic; onChange?: (sectionState: TSectionState, action: string, payload?: any) => void; } export interface ICreateSectionAPI { storeState: TState; state: TSectionState; dispatch: TDynaduxReducerDispatch; addChangeEventListener: (cb: (sectionState: TSectionState, action: string, payload?: any) => void) => void; removeChangeEventListener: (cb: (sectionState: TSectionState, action: string, payload?: any) => void) => void; } export const createStore = (config?: ICreateStoreConfig): ICreateStoreAPI => { const dynadux = new Dynadux(config); const storeChangeEventEmitter = new EventEmitter(); const dynaduxOnChange = dynadux._onChange; dynadux._onChange = ((state: TState, action: string, payload?: any) => { storeChangeEventEmitter.trigger(state, action, payload); dynaduxOnChange(state, action, payload); }); const store: ICreateStoreAPI = { get state() { return dynadux.state; }, dispatch: dynadux.dispatch, addChangeEventListener: (cb) => storeChangeEventEmitter.addEventListener(cb), removeChangeEventListener: (cb) => storeChangeEventEmitter.removeEventListener(cb), provider: { get store() { return store; }, addChangeEventListener: (cb) => storeChangeEventEmitter.addEventListener(cb), removeChangeEventListener: (cb) => storeChangeEventEmitter.removeEventListener(cb), }, createSection: (createSectionConfig: ICreateSectionConfig): ICreateSectionAPI => { return createSection({ dynadux, createSectionConfig, }); }, }; return store; };