diff --git a/__tests__/src/reducers/config.test.js b/__tests__/src/reducers/config.test.js index c7c2a8345b..66271ebe73 100644 --- a/__tests__/src/reducers/config.test.js +++ b/__tests__/src/reducers/config.test.js @@ -1,6 +1,7 @@ import { configReducer } from '../../../src/state/reducers/config'; import ActionTypes from '../../../src/state/actions/action-types'; import configFixture from '../../fixtures/config/export.example.json'; +import settings from '../../../src/config/settings'; describe('config reducer', () => { describe('SET_CONFIG', () => { @@ -55,6 +56,14 @@ describe('config reducer', () => { expect(configReducer({}, { state: { config: { new: 'stuff' } }, type: ActionTypes.IMPORT_MIRADOR_STATE, - })).toEqual({ new: 'stuff' }); + })).toMatchObject({ new: 'stuff' }); + }); + it('handles pre-existing functions in IMPORT_MIRADOR_STATE by deep merging those stems', () => { + const actual = configReducer(settings, { + state: { config: { new: 'stuff', theme: { palette: { mode: 'dark' } } } }, + type: ActionTypes.IMPORT_MIRADOR_STATE, + }); + + expect(actual).toMatchObject({ theme: { ...settings.theme, palette: { ...settings.theme.palette, mode: 'dark' } } }); }); }); diff --git a/src/state/reducers/config.js b/src/state/reducers/config.js index 090183b19f..d9ed49ad37 100644 --- a/src/state/reducers/config.js +++ b/src/state/reducers/config.js @@ -18,7 +18,13 @@ export const configReducer = (state = initialState, action) => { case ActionTypes.SET_CONFIG: return action.config; case ActionTypes.IMPORT_MIRADOR_STATE: - return action.state.config || {}; + return { + ...(action.state.config || {}), + export: deepmerge(state.export || {}, action.state.config?.export || {}, { arrayMerge: overwriteMerge }), + requests: deepmerge(state.requests || {}, action.state.config?.requests || {}, { arrayMerge: overwriteMerge }), + theme: deepmerge(state.theme || {}, action.state.config?.theme || {}, { arrayMerge: overwriteMerge }), + themes: deepmerge(state.themes || {}, action.state.config?.themes || {}, { arrayMerge: overwriteMerge }), + }; default: return state; }