You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.6 KiB

2 years ago
// @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'
}