2019-08-09 15:46:23 +02:00

69 lines
1.9 KiB
JavaScript

import { fromJS } from 'immutable';
const initialState = fromJS({ collapses: [], collapsesToOpen: [] });
function reducer(state, action) {
switch (action.type) {
case 'ADD_NEW_FIELD':
return state.update('collapses', list => {
return list
.map(obj => obj.update('isOpen', () => false))
.push(fromJS({ isOpen: true }));
});
case 'COLLAPSE_ALL':
return state
.update('collapsesToOpen', () => fromJS([]))
.update('collapses', list =>
list.map(obj => obj.update('isOpen', () => false))
);
case 'OPEN_COLLAPSES_THAT_HAVE_ERRORS':
return state
.update('collapsesToOpen', () => fromJS(action.collapsesToOpen))
.update('collapses', list => {
return list.map((obj, index) => {
if (action.collapsesToOpen.indexOf(index.toString()) !== -1) {
return obj.update('isOpen', () => true);
}
return obj.update('isOpen', () => false);
});
});
case 'TOGGLE_COLLAPSE':
return state.update('collapses', list => {
return list.map((obj, index) => {
if (index === action.index) {
return obj.update('isOpen', v => !v);
}
if (
state
.get('collapsesToOpen')
.toJS()
.indexOf(index.toString()) !== -1
) {
return obj;
}
return obj.update('isOpen', () => false);
});
});
case 'REMOVE_COLLAPSE':
return state
.removeIn(['collapses', action.index])
.update('collapses', list => list.map(obj => obj.set('isOpen', false)))
.update('collapses', list => {
if (action.shouldAddEmptyField) {
return list.push(fromJS({ isOpen: true }));
}
return list;
});
default:
return state;
}
}
export default reducer;
export { initialState };