client/src/store/configureStore.js
author Alexandre Segura <mex.zktk@gmail.com>
Wed, 31 May 2017 17:51:54 +0200
changeset 12 48ddaa42b810
parent 3 3b5d37d84cfe
child 14 df6780e48eb5
permissions -rw-r--r--
Draft implementation of sessions. - Introduce react-router & add some pages. - Add login page (does nothing). - Allow creating a new session. - Allow adding notes into a session.

import rootReducer from '../reducers';
import { createStore, applyMiddleware } from 'redux';
import { routerMiddleware } from 'react-router-redux';
import Immutable from 'immutable';

const loadState = () => {
  try {
    const serializedState = localStorage.getItem('state');
    if (!serializedState) {
      return {};
    }
    return JSON.parse(serializedState);
  } catch (err) {}
}

const saveState = (state) => {
  try {
    localStorage.setItem('state', JSON.stringify(state));
  } catch (err) {}
}

const savedState = loadState();

const defaultState = {
  currentSession: null,
  sessions: Immutable.List(savedState.sessions || []),
  notes: Immutable.List(savedState.notes || []),
  isAuthenticated: false,
};

const storeInitialState = Immutable.Map(defaultState);

export default (history, initialState = storeInitialState) => {

  const middleware = routerMiddleware(history);
  const store = createStore(rootReducer, initialState, applyMiddleware(middleware));

  store.subscribe(() => {
    const state = store.getState().toJSON();
    const stateToPersist = {
      sessions: state.sessions,
      notes: state.notes,
    };

    saveState(stateToPersist);
  });

  return store;
};