cspace-ui
Version:
CollectionSpace user interface for browsers
96 lines (79 loc) • 2.59 kB
JavaScript
import Immutable from 'immutable';
import get from 'lodash/get';
import { getRecordTypeConfigByServicePath } from '../helpers/configHelpers';
import {
PERMS_READ_STARTED,
PERMS_READ_FULFILLED,
PERMS_READ_REJECTED,
ROLES_READ_STARTED,
ROLES_READ_FULFILLED,
ROLES_READ_REJECTED,
RECORD_CREATED,
RECORD_DELETE_FULFILLED,
} from '../constants/actionCodes';
const handlePermsReadFulfilled = (state, action) => {
const {
config,
} = action.meta;
let perms = get(action.payload.data, ['ns2:permissions_list', 'permission']);
if (perms && !Array.isArray(perms)) {
perms = [perms];
}
const resourceNames = perms
.filter((perm) => getRecordTypeConfigByServicePath(config, perm.resourceName))
.map((perm) => perm.resourceName);
return (
state
.set('resourceNames', Immutable.List(resourceNames))
.delete('isPermsReadPending')
);
};
const handleRolesReadFulfilled = (state, action) => {
let roles = get(action.payload.data, ['ns2:roles_list', 'role']);
if (roles && !Array.isArray(roles)) {
roles = [roles];
}
return (
state
.set('roles', Immutable.fromJS(roles))
.delete('isRolesReadPending')
);
};
const handleRecordCreated = (state, action) => {
if (action.meta.recordTypeConfig.name === 'authrole') {
return state.delete('roles');
}
return state;
};
const handleRecordDeleteFulfilled = (state, action) => {
if (action.meta.recordTypeConfig.name === 'authrole') {
return state.delete('roles');
}
return state;
};
export default (state = Immutable.Map(), action) => {
switch (action.type) {
case PERMS_READ_STARTED:
return state.set('isPermsReadPending', true);
case PERMS_READ_FULFILLED:
return handlePermsReadFulfilled(state, action);
case PERMS_READ_REJECTED:
return state.delete('isPermsReadPending');
case ROLES_READ_STARTED:
return state.set('isRolesReadPending', true);
case ROLES_READ_FULFILLED:
return handleRolesReadFulfilled(state, action);
case ROLES_READ_REJECTED:
return state.delete('isRolesReadPending');
case RECORD_CREATED:
return handleRecordCreated(state, action);
case RECORD_DELETE_FULFILLED:
return handleRecordDeleteFulfilled(state, action);
default:
return state;
}
};
export const isPermsReadPending = (state) => state.get('isPermsReadPending');
export const getResourceNames = (state) => state.get('resourceNames');
export const isRolesReadPending = (state) => state.get('isRolesReadPending');
export const getRoles = (state) => state.get('roles');