123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // @flow
- /*
- autoMergeLevel2:
- - merges 2 level of substate
- - skips substate if already modified
- - this is essentially redux-perist v4 behavior
- */
- import type { PersistConfig } from '../types'
- export default function autoMergeLevel2<State: Object>(
- inboundState: State,
- originalState: State,
- reducedState: State,
- { debug }: PersistConfig
- ): State {
- let newState = { ...reducedState }
- // only rehydrate if inboundState exists and is an object
- if (inboundState && typeof inboundState === 'object') {
- Object.keys(inboundState).forEach(key => {
- // ignore _persist data
- if (key === '_persist') return
- // if reducer modifies substate, skip auto rehydration
- if (originalState[key] !== reducedState[key]) {
- if (process.env.NODE_ENV !== 'production' && debug)
- console.log(
- 'redux-persist/stateReconciler: sub state for key `%s` modified, skipping.',
- key
- )
- return
- }
- if (isPlainEnoughObject(reducedState[key])) {
- // if object is plain enough shallow merge the new values (hence "Level2")
- newState[key] = { ...newState[key], ...inboundState[key] }
- return
- }
- // otherwise hard set
- newState[key] = inboundState[key]
- })
- }
- if (
- process.env.NODE_ENV !== 'production' &&
- debug &&
- inboundState &&
- typeof inboundState === 'object'
- )
- console.log(
- `redux-persist/stateReconciler: rehydrated keys '${Object.keys(
- inboundState
- ).join(', ')}'`
- )
- return newState
- }
- function isPlainEnoughObject(o) {
- return o !== null && !Array.isArray(o) && typeof o === 'object'
- }
|