openreplay/frontend/app/duck/customField.js
2022-09-03 04:38:08 +05:30

121 lines
3.9 KiB
JavaScript

import { List, Map } from 'immutable';
import CustomField from 'Types/customField';
import { fetchListType, saveType, editType, initType, removeType } from './funcTools/crud/types';
import { createItemInListUpdater, mergeReducers, success, array } from './funcTools/tools';
import { createEdit, createInit } from './funcTools/crud';
import { createRequestReducer } from './funcTools/request';
import { addElementToFiltersMap, addElementToLiveFiltersMap, clearMetaFilters } from 'Types/filter/newFilter';
import { FilterCategory } from '../types/filter/filterType';
import { refreshFilterOptions } from './search';
const name = 'integration/variable';
const idKey = 'index';
const itemInListUpdater = createItemInListUpdater(idKey);
const FETCH_LIST = fetchListType(name);
const FETCH_LIST_ACTIVE = fetchListType(name + '_ACTIVE');
const SAVE = saveType(name);
const UPDATE = saveType(name);
const EDIT = editType(name);
const REMOVE = removeType(name);
const INIT = initType(name);
const FETCH_SOURCES = fetchListType('integration/sources');
const FETCH_SUCCESS = success(FETCH_LIST);
const FETCH_LIST_ACTIVE_SUCCESS = success(FETCH_LIST_ACTIVE);
const SAVE_SUCCESS = success(SAVE);
const UPDATE_SUCCESS = success(UPDATE);
const REMOVE_SUCCESS = success(REMOVE);
const FETCH_SOURCES_SUCCESS = success(FETCH_SOURCES);
// const defaultMeta = [{key: 'user_id', index: 0}, {key: 'user_anonymous_id', index: 0}];
const initialState = Map({
list: List(),
instance: CustomField(),
sources: List(),
optionsReady: false,
});
const reducer = (state = initialState, action = {}) => {
switch (action.type) {
case FETCH_SUCCESS:
return state.set('list', List(action.data).map(CustomField))
case FETCH_LIST_ACTIVE_SUCCESS:
clearMetaFilters();
action.data.forEach((item) => {
addElementToFiltersMap(FilterCategory.METADATA, item.key);
addElementToLiveFiltersMap(FilterCategory.METADATA, item.key);
});
return state.set('list', List(action.data).map(CustomField))
case FETCH_SOURCES_SUCCESS:
return state.set(
'sources',
List(action.data.map(({ value, ...item }) => ({ label: value, key: value, ...item }))).map(
CustomField
)
);
case SAVE_SUCCESS:
case UPDATE_SUCCESS:
return state.update('list', itemInListUpdater(CustomField(action.data)));
case REMOVE_SUCCESS:
return state.update('list', (list) => list.filter((item) => item.index !== action.index));
case INIT:
return state.set('instance', CustomField(action.instance));
case EDIT:
return state.mergeIn(['instance'], action.instance);
default:
return state;
}
};
export const edit = createEdit(name);
export const init = createInit(name);
export const fetchList = (siteId) => (dispatch, getState) => {
return dispatch({
types: array(FETCH_LIST),
call: (client) => client.get(siteId ? `/${siteId}/metadata` : '/metadata'),
})
};
export const fetchListActive = (siteId) => (dispatch, getState) => {
return dispatch({
types: array(FETCH_LIST_ACTIVE),
call: (client) => client.get(siteId ? `/${siteId}/metadata` : '/metadata'),
}).then(() => {
dispatch(refreshFilterOptions());
});
};
export const fetchSources = () => {
return {
types: array(FETCH_SOURCES),
call: (client) => client.get('/integration/sources'),
};
};
export const save = (siteId, instance) => {
const url = instance.exists() ? `/${siteId}/metadata/${instance.index}` : `/${siteId}/metadata`;
return {
types: array(instance.exists() ? SAVE : UPDATE),
call: (client) => client.post(url, instance.toData()),
};
};
export const remove = (siteId, index) => {
return {
types: array(REMOVE),
call: (client) => client.delete(`/${siteId}/metadata/${index}`),
index,
};
};
export default mergeReducers(
reducer,
createRequestReducer({
fetchRequest: FETCH_LIST,
fetchRequestActive: FETCH_LIST_ACTIVE,
saveRequest: SAVE,
})
);