mirador
Version:
An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate functionality, ability to display/compare simple images, and images with annotations.
50 lines (42 loc) • 1.51 kB
JavaScript
import omit from 'lodash/omit';
import set from 'lodash/fp/set';
import update from 'lodash/fp/update';
import ActionTypes from '../actions/action-types';
/** */
export function companionWindowsReducer(state = {}, action) {
switch (action.type) {
case ActionTypes.ADD_COMPANION_WINDOW:
return set([action.id], action.payload, state);
case ActionTypes.ADD_WINDOW:
return {
...state,
...(action.companionWindows || []).reduce((newState, cw) => {
// eslint-disable-next-line no-param-reassign
newState[cw.id] = {
...state[cw.id],
...cw,
windowId: action.id,
};
return newState;
}, {}),
};
case ActionTypes.REMOVE_WINDOW:
return Object.keys(state).reduce((object, key) => {
if (state[key].windowId !== action.windowId) {
// eslint-disable-next-line no-param-reassign
object[key] = state[key];
}
return object;
}, {});
case ActionTypes.UPDATE_COMPANION_WINDOW:
return update([action.id], (orig) => ({ ...(orig || {}), ...action.payload }), state);
case ActionTypes.REMOVE_COMPANION_WINDOW:
return omit(state, action.id);
case ActionTypes.IMPORT_MIRADOR_STATE:
return action.state.companionWindows || [];
case ActionTypes.TOGGLE_TOC_NODE:
return update([action.id, 'tocNodes'], (orig) => ({ ...(orig || {}), ...action.payload }), state);
default:
return state;
}
}