openreplay/frontend/app/components/hocs/withRequest.js
Андрей Бабушкин b822b1c067 applied eslint
2025-02-26 20:31:01 +01:00

64 lines
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} />;
}
};