openreplay/frontend/app/components/hocs/withRequest.js
Shekar Siri 2ed5cac986
Webpack upgrade and dependency cleanup (#523)
* change(ui) - webpack update
* change(ui) - api optimize and other fixes
2022-06-03 16:47:38 +02:00

67 lines
No EOL
1.7 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 } />
}
}