* fix(tracker): fix assist typings * fix(tracker): fix assist typings * change(ui) - preferences - removed old * change(ui) - preferences - wip * change(ui) - preferences - list * change(ui) - right box mardings * change(ui) - preferences - integration item paddings * change(ui) - preferences - integration icons * change(ui) - preferences - integration icons * change(ui) - preferences - integration - check status * change(ui) - preferences - integration - check status * change(ui) - preferences - metadata - move the delete button inside the modal * change(ui) - preferences - webhooks - modal and delete btn changes * change(ui) - preferences - modalContext updates * change(ui) - input field forward refs * change(ui) - metadata - modal * change(ui) - metadata - set deleting item to null * change(ui) - integrations * change(ui) - hoc withcopy * change(ui) - projects * change(ui) - users list modal * change(ui) - projects remove border for the last * change(ui) - integrations new api changes * change(ui) - github and jira changes * change(ui) - github and jira changes Co-authored-by: sylenien <nikita@openreplay.com>
67 lines
2.4 KiB
JavaScript
67 lines
2.4 KiB
JavaScript
import React from 'react';
|
|
import APIClient from 'App/api_client';
|
|
|
|
export default ({
|
|
initialData = null,
|
|
endpoint = '',
|
|
method = 'GET',
|
|
requestName = 'request',
|
|
loadingName = 'loading',
|
|
errorName = 'requestError',
|
|
dataName = 'data',
|
|
dataWrapper = (data) => data,
|
|
loadOnInitialize = false,
|
|
resetBeforeRequest = false, // Probably use handler?
|
|
}) =>
|
|
(BaseComponent) =>
|
|
class extends React.PureComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
data: typeof initialData === 'function' ? initialData(props) : initialData,
|
|
loading: loadOnInitialize,
|
|
error: false,
|
|
};
|
|
if (loadOnInitialize) {
|
|
this.request();
|
|
}
|
|
}
|
|
|
|
request = (params, edpParams) => {
|
|
this.setState({
|
|
loading: true,
|
|
error: false,
|
|
data: resetBeforeRequest ? (typeof initialData === 'function' ? initialData(this.props) : initialData) : this.state.data,
|
|
});
|
|
const edp = typeof endpoint === 'function' ? endpoint(this.props, edpParams) : endpoint;
|
|
return new APIClient()
|
|
[method.toLowerCase()](edp, params)
|
|
.then((response) => response.json())
|
|
.then(({ errors, data }) => {
|
|
if (errors) {
|
|
return this.setError();
|
|
}
|
|
this.setState({
|
|
data: dataWrapper(data, this.state.data),
|
|
loading: false,
|
|
});
|
|
})
|
|
.catch(this.setError);
|
|
};
|
|
|
|
setError = () =>
|
|
this.setState({
|
|
loading: false,
|
|
error: true,
|
|
});
|
|
|
|
render() {
|
|
const ownProps = {
|
|
[requestName]: this.request,
|
|
[loadingName]: this.state.loading,
|
|
[dataName]: this.state.data,
|
|
[errorName]: this.state.error,
|
|
};
|
|
return <BaseComponent {...this.props} {...ownProps} />;
|
|
}
|
|
};
|