rsnext/examples/with-redux-persist/store.js
2020-05-18 15:24:37 -04:00

98 lines
2.4 KiB
JavaScript

import { createStore, applyMiddleware } from 'redux'
import { composeWithDevTools } from 'redux-devtools-extension'
import { persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage'
const exampleInitialState = {
lastUpdate: 0,
light: false,
count: 0,
exampleData: [],
error: null,
}
export const actionTypes = {
TICK: 'TICK',
INCREMENT: 'INCREMENT',
DECREMENT: 'DECREMENT',
RESET: 'RESET',
LOAD_EXAMPLE_DATA: 'LOAD_EXAMPLE_DATA',
LOADING_DATA_FAILURE: 'LOADING_DATA_FAILURE',
}
// REDUCERS
export const reducer = (state = exampleInitialState, action) => {
switch (action.type) {
case actionTypes.TICK:
return Object.assign({}, state, {
lastUpdate: action.ts,
light: !!action.light,
})
case actionTypes.INCREMENT:
return Object.assign({}, state, {
count: state.count + 1,
})
case actionTypes.DECREMENT:
return Object.assign({}, state, {
count: state.count - 1,
})
case actionTypes.RESET:
return Object.assign({}, state, {
count: exampleInitialState.count,
})
case actionTypes.LOAD_EXAMPLE_DATA:
return Object.assign({}, state, {
exampleData: action.data,
})
case actionTypes.LOADING_DATA_FAILURE:
return Object.assign({}, state, {
error: true,
})
default:
return state
}
}
// ACTIONS
export const serverRenderClock = () => {
return { type: actionTypes.TICK, light: false, ts: Date.now() }
}
export const startClock = () => {
return { type: actionTypes.TICK, light: true, ts: Date.now() }
}
export const incrementCount = () => {
return { type: actionTypes.INCREMENT }
}
export const decrementCount = () => {
return { type: actionTypes.DECREMENT }
}
export const resetCount = () => {
return { type: actionTypes.RESET }
}
export const loadExampleData = (data) => {
return { type: actionTypes.LOAD_EXAMPLE_DATA, data }
}
export const loadingExampleDataFailure = () => {
return { type: actionTypes.LOADING_DATA_FAILURE }
}
const persistConfig = {
key: 'primary',
storage,
whitelist: ['exampleData'], // place to select which state you want to persist
}
const persistedReducer = persistReducer(persistConfig, reducer)
export function initializeStore(initialState = exampleInitialState) {
return createStore(
persistedReducer,
initialState,
composeWithDevTools(applyMiddleware())
)
}