v1/UI/src/reducers/role-editor.js

69 lines
2 KiB
JavaScript

import { Map, OrderedMap } from 'immutable'
const initialState = Map({
viewMap: OrderedMap({}),
originalSnapshot: OrderedMap({}),
hasAvailableRoles: true,
})
const reducer = (state = initialState, { type, data }) => {
switch (type) {
case Symbol.for('re: setup'):
const { viewMap, originalSnapshot, ...rest } = data
return state.merge({
viewMap: OrderedMap(viewMap),
originalSnapshot: OrderedMap(originalSnapshot),
...rest,
})
case Symbol.for('re: replace viewmap'):
return state.set('viewMap', data)
case Symbol.for('re: set category'):
return state.setIn(['viewMap', data.id], Map(data))
case Symbol.for('re: edit category'):
return state.setIn(['viewMap', data.id, data.key], data.value)
case Symbol.for('re: delete category'):
return state.deleteIn(['viewMap', data])
case Symbol.for('re: switch category mode'):
return state.setIn(['viewMap', data.id, 'mode'], data.mode)
case Symbol.for('re: add role to category'):
const category = state.getIn(['viewMap', data.id])
return state.setIn(
['viewMap', data.id],
category
.set('roles', category.get('roles').add(data.role.get('id')))
.set('roles_map', category.get('roles_map').add(data.role))
)
case Symbol.for('re: remove role from category'):
const rmCat = state.getIn(['viewMap', data.id])
return state.setIn(
['viewMap', data.id],
rmCat
.set(
'roles',
rmCat.get('roles').filterNot((r) => r === data.role.get('id'))
)
.set(
'roles_map',
rmCat.get('roles_map').filterNot((r) => r.get('id') === data.role.get('id'))
)
)
case Symbol.for('re: reset'):
return state.set('viewMap', state.get('originalSnapshot'))
case Symbol.for('re: swap original state'):
return state.set('originalSnapshot', state.get('viewMap'))
default:
return state
}
}
export default reducer