import { bindActionCreators, combineReducers } from 'redux'; import * as entities from './entities'; import configureStore from '../create'; import * as global from './global'; import * as db from '../../../common/database'; import * as models from '../../../models'; import * as fetch from '../../../common/fetch'; export async function init() { const store = configureStore(); // Do things that must happen before initial render const { addChanges, addChangesSync } = bindActionCreators(entities, store.dispatch); const { newCommand } = bindActionCreators(global, store.dispatch); const allDocs = await getAllDocs(); // Link DB changes to entities reducer/actions const changes = allDocs.map(doc => [db.CHANGE_UPDATE, doc]); addChangesSync(changes); db.onChange(addChanges); // Bind to fetch commands fetch.onCommand(newCommand); store.dispatch(global.init()); return store; } export const reducer = combineReducers({ entities: entities.reducer, global: global.reducer, }); /** * Async function to get all docs concurrently */ async function getAllDocs() { // Restore docs in parent->child->grandchild order const allDocs = [ ...(await models.settings.all()), ...(await models.workspace.all()), ...(await models.workspaceMeta.all()), ...(await models.environment.all()), ...(await models.cookieJar.all()), ...(await models.requestGroup.all()), ...(await models.requestGroupMeta.all()), ...(await models.request.all()), ...(await models.requestMeta.all()), ...(await models.response.all()), ...(await models.oAuth2Token.all()), ...(await models.clientCertificate.all()), ]; return allDocs; }