52 lines
2 KiB
JavaScript
52 lines
2 KiB
JavaScript
import { List, Map } from 'immutable';
|
|
import { createRequestReducer } from '../funcTools/request';
|
|
import { fetchListType, saveType, removeType, editType, initType, fetchType } from '../funcTools/types';
|
|
import { createItemInListUpdater } from '../funcTools/tools';
|
|
|
|
const idKey = 'siteId';
|
|
const itemInListUpdater = createItemInListUpdater(idKey);
|
|
|
|
export const createIntegrationReducer = (name, Config) => {
|
|
const FETCH_LIST = fetchListType(name);
|
|
const SAVE = saveType(name);
|
|
const REMOVE = removeType(name);
|
|
const EDIT = editType(name);
|
|
const INIT = initType(name);
|
|
const FETCH = fetchType(name);
|
|
|
|
const initialState = Map({
|
|
instance: Config(),
|
|
list: List(),
|
|
fetched: false,
|
|
issuesFetched: false,
|
|
});
|
|
const reducer = (state = initialState, action = {}) => {
|
|
switch (action.type) {
|
|
case FETCH_LIST.success:
|
|
return state
|
|
.set('list', Array.isArray(action.data) ? List(action.data).map(Config) : List([new Config(action.data)]))
|
|
.set(action.name + 'Fetched', true);
|
|
case FETCH.success:
|
|
return state.set('instance', Config(action.data || {}));
|
|
case SAVE.success:
|
|
const config = Config(action.data);
|
|
return state.update('list', itemInListUpdater(config)).set('instance', config);
|
|
case REMOVE.success:
|
|
return state.update('list', (list) => list.filter((site) => site.siteId !== action.siteId)).set('instance', Config());
|
|
case EDIT:
|
|
return state.mergeIn(['instance'], action.instance);
|
|
case INIT:
|
|
return state.set('instance', Config(action.instance));
|
|
}
|
|
return state;
|
|
};
|
|
return createRequestReducer(
|
|
{
|
|
// fetchRequest: FETCH_LIST,
|
|
fetchRequest: FETCH,
|
|
saveRequest: SAVE,
|
|
removeRequest: REMOVE,
|
|
},
|
|
reducer
|
|
);
|
|
};
|