openreplay/frontend/app/duck/funcTools/crud/actions.js
2021-05-01 15:12:01 +05:30

77 lines
No EOL
2 KiB
JavaScript

import {
initType,
editType,
fetchType,
fetchToListType,
fetchListType,
saveType,
removeType,
} from './types';
import {
array
} from '../tools';
const pluralise = name => `${ name }s`;
export const createInit = name => instance => ({
type: initType(name),
instance,
});
export const createFetch = (name, endpoint = id => `/${ pluralise(name) }/${ id }` ) => {
const fetchTypeArray = array(fetchType(name));
const fetchToListTypeArray = array(fetchToListType(name));
return (id, options = { thenInit: true }) => (dispatch, getState) => {
const itemInList = getState().getIn([ name, 'list' ]).find(item => item[ idKey ] === id);
if (!itemInList || !itemInList.isComplete()) { // name of func?
return dispatch({
types: options.thenInit ? fetchTypeArray : fetchToListTypeArray,
call: client => client.get(endpoint(id)),
});
}
if (options.thenInit) dispatch(createInit(name)(itemInList));
return Promise.resolve();
};
};
export const createFetchList = (name, endpoint = `/${ pluralise(name) }`) => {
const types = array(fetchListType(name));
return params => ({
types,
call: client => client.get(endpoint, params),
});
};
export const createEdit = (name) => {
const type = editType(name);
return instance => ({
type,
instance,
});
};
export const createSave = (name, endpoint = `/${ pluralise(name) }`) => {
const types = array(saveType(name));
return instance => ({
types,
call: client => client.put(endpoint, instance.toData()),
});
};
export const createUpdate = (name, endpoint = id => `/${ pluralise(name) }/${id}`) => {
const types = array(saveType(name));
return instance => ({
types,
call: client => client.put(endpoint(instance.id), instance.toData()),
id: instance.id,
});
};
export const createRemove = (name, endpoint = id => `/${ pluralise(name) }/${ id }`) => {
const types = array(removeType(name));
return id => ({
types,
call: client => client.delete(endpoint(id)),
id,
});
};