From c565d2282d7dc3efcde79c2554d0462119ef75ac Mon Sep 17 00:00:00 2001 From: David Pickart Date: Tue, 11 Jun 2019 16:13:38 -0500 Subject: [PATCH] Load latest state from local storage on reset (#7) * Load latest state from local storage on reset * lint * v2.0.1 --- package.json | 2 +- src/reducer.js | 26 ++++++++++++++++---------- test/reducer.test.js | 17 +++++++++++++++++ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 368c0a8..7d02111 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redux-sessions", - "version": "2.0.0", + "version": "2.0.1", "description": "Redux action creators for storing session state", "main": "lib/index.js", "scripts": { diff --git a/src/reducer.js b/src/reducer.js index 53422c9..36f5d05 100644 --- a/src/reducer.js +++ b/src/reducer.js @@ -1,4 +1,3 @@ -import { handleActions } from 'redux-actions' import { set, get } from 'lodash/fp' import * as actions from './actions' import { loadSessionState } from './persistenceHelpers' @@ -12,17 +11,24 @@ const DEFAULT_USER_TYPE = 'user' // [userType]: { token, persist }, // [otherUserType]: { token, persist }, // } -const initialState = loadSessionState() +function getInitialState () { + return loadSessionState() +} // Reducer -const reducer = handleActions({ - [actions.setToken]: (state, { payload: { token, userType=DEFAULT_USER_TYPE, persist=true } }) => { - return set(userType, { token, persist }, state) - }, - [actions.clearToken]: (state, { payload: { userType=DEFAULT_USER_TYPE }={}}) => { - return set(userType, { token: null, persist: false }, state) - }, -}, initialState) +function reducer (state, action) { + if (state === undefined) return getInitialState() + const handlers = { + [actions.setToken]: (state, { payload: { token, userType=DEFAULT_USER_TYPE, persist=true } }) => { + return set(userType, { token, persist }, state) + }, + [actions.clearToken]: (state, { payload: { userType=DEFAULT_USER_TYPE }={}}) => { + return set(userType, { token: null, persist: false }, state) + } + } + const handler = handlers[action.type] + return handler ? handler(state, action) : state +} // Selectors const selectors = {} diff --git a/test/reducer.test.js b/test/reducer.test.js index 6a96583..fafa7d9 100644 --- a/test/reducer.test.js +++ b/test/reducer.test.js @@ -1,4 +1,21 @@ import { reducer, actions, selectors } from '../src' +import { saveSessionState } from '../src/persistenceHelpers' + +describe('reducer', () => { + beforeEach(() => { + localStorage.clear() + sessionStorage.clear() + }) + it('loads latest state from local storage when reset', () => { + const initialState = { user: { token: 'first token', persist: true }} + saveSessionState(initialState) + // Passing `undefined` for state resets the reducer + expect(reducer(undefined, {})).toEqual(initialState) + const newInitialState = { user: { token: 'other token', persist: true }} + saveSessionState(newInitialState) + expect(reducer(undefined, {})).toEqual(newInitialState) + }) +}) // Tests for actions and selectors