* applied eslint * add locales and lint the project * removed error boundary * updated locales * fix min files * fix locales
77 lines
2 KiB
JavaScript
77 lines
2 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} />;
|
|
}
|
|
};
|