silverstripe-cms/client/src/state/anchorSelector/AnchorSelectorReducer.js

58 lines
1.6 KiB
JavaScript

import deepFreeze from 'deep-freeze-strict';
import ACTION_TYPES from './AnchorSelectorActionTypes';
import anchorSelectorStates from './AnchorSelectorStates';
/**
* Default state
*/
const initialState = deepFreeze({ pages: [] });
export default function anchorSelectorReducer(state = initialState, action = null) {
/**
* Update details for the page
*
* @param {String} loadingState - State flag for this page
* @param {Array} anchors - Anchors for this page
* @return {Object} Updated state
*/
const updatePage = (loadingState, anchors) => {
const id = action.payload.pageId;
return deepFreeze({
pages: [
...state.pages.filter(next => next.id !== id),
{
id,
loadingState,
anchors,
},
].sort((left, right) => (left.id - right.id)),
});
};
// Update page status
switch (action.type) {
case ACTION_TYPES.ANCHORSELECTOR_UPDATING: {
return updatePage(anchorSelectorStates.UPDATING, []);
}
case ACTION_TYPES.ANCHORSELECTOR_UPDATED: {
const { anchors, cacheResult } = action.payload;
const { SUCCESS, DIRTY } = anchorSelectorStates;
const newSelectorLoadingState = cacheResult ? SUCCESS : DIRTY;
return updatePage(newSelectorLoadingState, anchors);
}
case ACTION_TYPES.ANCHORSELECTOR_CURRENT_FIELD: {
const { anchors } = action.payload;
return updatePage(anchorSelectorStates.FIELD_ONLY, anchors);
}
case ACTION_TYPES.ANCHORSELECTOR_UPDATE_FAILED: {
return updatePage(anchorSelectorStates.FAILED, []);
}
default:
return state;
}
}