import { createStore, combineReducers, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import { createReducer } from 'redux-su'; import { composeWithDevTools } from 'redux-devtools-extension'; import { Portal, Link, Field } from '../Api/types'; const reducers = { 'auth': createReducer({ 'authSet': (store: any, action: { v: string, csrf: string, user: any }) => ({ v: action.v, csrf: action.csrf, user: action.user, loading: false }), 'authLoad': (store: any, action: { loading: boolean }) => ({ ...store, loading: action.loading }) }, { v: "", csrf: "", user: null, loading: false }), 'entities': createReducer({ 'portalSet': (store: any, action: { guid: string, portal: Portal }) => ({ ...store, portals: { ...store.portals, [action.guid]: { ...action.portal } } }), 'linkSet': (store: any, action: { guid: string, link: Link }) => ({ ...store, links: { ...store.links, [action.guid]: action.link } }), 'fieldSet': (store: any, action: { guid: string, field: Field }) => ({ ...store, fields: { ...store.fields, [action.guid]: action.field } }), 'portalsSet': (store: any, action: { portals: Portal }) => { const portals = store.portals Object.keys(action.portals).forEach(guid => { const portal: Portal = portals[guid] const newPortal: Portal = action.portals[guid] if (!portal) { portals[guid] = newPortal return } portals[guid] = extend(portal, newPortal) }) return { ...store, portals } }, 'linksSet': (store: any, action: { links: { [guid: string]: Link } }) => ({ ...store, links: { ...store.links, ...action.links } }), 'fieldsSet': (store: any, action: { fields: { [guid: string]: Field } }) => ({ ...store, fields: { ...store.fields, ...action.fields } }), 'setLoad': (store: any, action: { queue: string[][] }) => ({ ...store, loadQueue: [...action.queue] }), }, { portals: {}, fields: {}, links: {}, loadQueue: [] }) } function extend(obj: any, src: any) { for (var key in src) { if (src.hasOwnProperty(key) && !!src[key]) { obj[key] = src[key]; } } return obj; } const store = createStore( combineReducers(reducers), composeWithDevTools(applyMiddleware(thunk)) ) export default store