import {validateModel} from './validation'
import {mergerReducers} from './reducers'
import {getSagas} from './effects'
import {globalCancelSagas, plusCount} from './action'
import teeMoCore from './model/teeMoCore'
import {createStore, combineReducers, compose, applyMiddleware} from "redux"
import createSagaMiddleware from "redux-saga";
import invariant from 'invariant'
import enhance from './enhance'
function createTeeMoStore() {
const teeMoStore = {
reduxStore: undefined,
reduxSaga: undefined,
defaultModelList: [teeMoCore],
normalModelList: [],
middlewares: [],
addModel, delModel, clearModel,
start, restart
}
return teeMoStore;
function addModel(model) {
const {
defaultModelList,
normalModelList,
} = teeMoStore
const modelList = [
...defaultModelList,
...normalModelList,
]
validateModel(model, modelList)
const enhanceModel = enhance(model)
teeMoStore.normalModelList.push(enhanceModel)
return teeMoStore
}
function delModel(namespace) {
const _ = m => m.namespace === namespace
//不能删除系统默认的model
invariant(
!teeMoStore.defaultModelList.some(_),
`[teeMo.delModel] 不可以删除一个系统默认的model , 当前传入期望删除的model的namespace为 [${namespace}]`
)
const index = teeMoStore.normalModelList.findIndex(m => m.namespace === namespace)
//namespace不存在
invariant(index !== -1, 'model不存在,无法进行删除操作')
teeMoStore.normalModelList.splice(index, 1)
return teeMoStore
}
function clearModel() {
invariant(teeMoStore.reduxStore, `[teeMo.Store] 数据仓库尚未启动!`)
teeMoStore.normalModelList = []
return teeMoStore;
}
function start() {
const {
defaultModelList,
normalModelList,
} = teeMoStore
const modelList = [
...defaultModelList,
...normalModelList,
]
invariant(!teeMoStore.reduxStore, `[teeMo.Store] 数据仓库已经启动!`)
const composeEnhancers = window["__REDUX_DEVTOOLS_EXTENSION_COMPOSE__"] || compose;
teeMoStore.reduxSaga = createSagaMiddleware();
const defaultMiddlewares = [teeMoStore.reduxSaga]
teeMoStore.reduxStore = createStore(
combineReducers(mergerReducers(modelList)),
composeEnhancers(applyMiddleware(...defaultMiddlewares, ...teeMoStore.middlewares))
)
teeMoStore.reduxSaga.run(getSagas(modelList))
return teeMoStore
}
function restart() {
invariant(teeMoStore.reduxStore, `[teeMo.Store] 数据仓库尚未启动!`)
const {
defaultModelList,
normalModelList,
reduxStore
} = teeMoStore
const modelList = [
...defaultModelList,
...normalModelList,
]
reduxStore.replaceReducer(combineReducers(mergerReducers(modelList)))
reduxStore.dispatch(plusCount())
reduxStore.dispatch(globalCancelSagas())
teeMoStore.reduxSaga.run(getSagas(modelList))
return teeMoStore
}
}
export default createTeeMoStore |