/**
* External dependencies
*/
import { get, omit, isEmpty } from 'lodash';
/**
* Internal dependencies
*/
import {
EDIT_GROUP,
START_SAVE_GROUP,
FAILED_SAVE_GROUP,
FINISH_SAVE_GROUP,
EDIT_GROUP_SETTING,
FINISH_SAVE_GROUP_SETTINGS,
RESET_EDITS,
BULK_EDIT_GROUP_SETTING,
RESET_BULK_GROUP_SETTING_EDIT,
RESET_BULK_GROUP_SETTING_EDITS,
CREATE_LOCAL_GROUP,
DELETE_LOCAL_GROUP,
RESET_ALL_EDITS,
DELETE_LOCAL_GROUPS,
FAILED_SAVE_GROUP_SETTINGS,
SET_GROUP_ERROR,
SET_BULK_ERRORS,
RESET_GROUP_SETTING,
MARK_GROUP_FOR_DELETION,
CREATED_DEFAULT_GROUPS,
} from './actions';
const DEFAULT_STATE = {
edits: {},
settingEdits: {},
bulkSettingEdits: {},
localGroupIds: [],
saving: [],
errors: {},
bulkErrors: [],
markedForDelete: [],
createdDefaultGroups: false,
};
export default function userGroupsEditor( state = DEFAULT_STATE, action ) {
switch ( action.type ) {
case EDIT_GROUP:
return {
...state,
edits: {
...state.edits,
[ action.id ]: action.edit,
},
};
case CREATE_LOCAL_GROUP:
return {
...state,
localGroupIds: [ ...state.localGroupIds, action.id ],
};
case DELETE_LOCAL_GROUP:
return {
...state,
localGroupIds: state.localGroupIds.filter(
( groupId ) => groupId !== action.id
),
};
case DELETE_LOCAL_GROUPS:
return {
...state,
localGroupIds: [],
};
case START_SAVE_GROUP:
return {
...state,
saving: [ ...state.saving, action.id ],
};
case FAILED_SAVE_GROUP:
return {
...state,
saving: state.saving.filter( ( id ) => id !== action.id ),
errors: {
...state.errors,
[ action.id ]: action.error,
},
};
case FINISH_SAVE_GROUP:
return {
...state,
edits: omit( state.edits, [ action.id ] ),
localGroupIds: state.localGroupIds.filter(
( groupId ) => groupId !== action.id
),
saving: state.saving.filter( ( id ) => id !== action.id ),
errors: omit( state.errors, [ action.id ] ),
};
case EDIT_GROUP_SETTING:
return {
...state,
settingEdits: {
...state.settingEdits,
[ action.id ]: {
...get( state, [ 'settingEdits', action.id ], {} ),
[ action.module ]: {
...get(
state,
[ 'settingEdits', action.id, action.module ],
{}
),
[ action.setting ]: action.value,
},
},
},
};
case RESET_GROUP_SETTING:
const next = {
...state,
settingEdits: {
...state.settingEdits,
[ action.id ]: {
...get( state, [ 'settingEdits', action.id ], {} ),
[ action.module ]: omit(
get(
state,
[ 'settingEdits', action.id, action.module ],
{}
),
[ action.setting ]
),
},
},
};
if ( isEmpty( next.settingEdits[ action.id ][ action.module ] ) ) {
delete next.settingEdits[ action.id ][ action.module ];
}
if ( isEmpty( next.settingEdits[ action.id ] ) ) {
delete next.settingEdits[ action.id ];
}
return next;
case FINISH_SAVE_GROUP_SETTINGS:
return {
...state,
settingEdits: omit( state.settingEdits, [ action.id ] ),
errors: omit( state.errors, [ action.id ] ),
};
case FAILED_SAVE_GROUP_SETTINGS:
return {
...state,
errors: {
...state.errors,
[ action.id ]: action.error,
},
};
case RESET_EDITS:
return {
...state,
edits: omit( state.edits, [ action.id ] ),
settingEdits: omit( state.settingEdits, [ action.id ] ),
markedForDelete: state.markedForDelete.filter(
( id ) => id !== action.id
),
localGroupIds: state.localGroupIds.filter(
( id ) => id !== action.id
),
};
case RESET_ALL_EDITS:
return {
...state,
edits: {},
settingEdits: {},
bulkSettingEdits: {},
markedForDelete: [],
localGroupIds: [],
};
case BULK_EDIT_GROUP_SETTING:
return {
...state,
bulkSettingEdits: {
...state.bulkSettingEdits,
[ action.module ]: {
...( state.bulkSettingEdits[ action.module ] || {} ),
[ action.setting ]: action.value,
},
},
};
case RESET_BULK_GROUP_SETTING_EDIT:
return {
...state,
bulkSettingEdits: omit(
state.bulkSettingEdits,
`${ action.module }.${ action.setting }`
),
};
case RESET_BULK_GROUP_SETTING_EDITS:
return {
...state,
bulkSettingEdits: {},
bulkErrors: [],
};
case MARK_GROUP_FOR_DELETION:
return {
...state,
markedForDelete: [ ...state.markedForDelete, action.id ],
};
case SET_GROUP_ERROR:
return {
...state,
errors: action.error
? {
...state.errors,
[ action.id ]: action.error,
}
: omit( state.errors, [ action.id ] ),
};
case SET_BULK_ERRORS:
return {
...state,
bulkErrors: action.errors,
};
case CREATED_DEFAULT_GROUPS:
return {
...state,
createdDefaultGroups: true,
};
default:
return state;
}
}