import { handleActions } from 'redux-actions'; import { initNode, HelpKeys, HelpNode } from './initHelpNode'; import { initApi, ApiConfigs, NodeConfig } from './initApi'; interface ReducerOptions { createReducer: typeof handleActions; apiNode: NodeConfig; helpNode: HelpNode; } interface SagaOptions { apiNode: NodeConfig; helpNode: HelpNode; } interface ModelOptions { modelName: string; help?: HelpKeys; api?: ApiConfigs; reducer?: (options: ReducerOptions) => any; sagas?: (options: SagaOptions) => any[]; } export interface Model { modelName: string; help?: HelpNode; api?: NodeConfig; reducer: any; sagas: any[]; } export default function createModel(options: ModelOptions): Model { const model = { modelName: options.modelName, help: {}, api: {}, reducer: null, sagas: [], } as Model; const { modelName, help = {} as HelpKeys, api = {} as ApiConfigs } = options; if (help && Object.keys(help).length > 0) { const _helpNodes = initNode(modelName, help); model.help = _helpNodes; } if (api && Object.keys(api).length > 0) { const _apis = initApi(modelName, api); model.api = _apis.node; model.sagas = model.sagas.concat(_apis.sagas); } if (options.reducer && typeof options.reducer === 'function') { model.reducer = options.reducer({ apiNode: model.api, helpNode: model.help, createReducer: handleActions, }); } if (options.sagas && typeof options.sagas === 'function') { model.sagas = model.sagas.concat(options.sagas({ apiNode: model.api, helpNode: model.help, })); } return model; }