firestudio
Version:
CLI for developing apps with NextJS and Firebase
79 lines (66 loc) • 2 kB
JavaScript
import axios from 'axios';
import cookies from 'browser-cookies';
import { Container } from '@store';
//
import * as routes from './routes';
class Api extends Container {
static send = async (config) => {
const response = await axios(config);
return response;
}
static ROUTES = routes
state = {}
update = (key, updates) => {
this.setState((state) => {
// eslint-disable-next-line no-param-reassign
state[key] = {
...state[key],
...updates,
};
});
}
request = async (config, key, take) => {
const requestKey = key || config.url;
const currentApiRequest = this.state[requestKey] || {};
const csrfToken = cookies.get('XSRF-TOKEN');
const count = currentApiRequest + 1 || 1;
try {
let axiosConfig = {
...config,
xsrfHeaderName: 'X-XSRF-Token',
headers: {
...csrfToken ? { 'X-XSRF-Token': csrfToken } : {},
},
};
let call = null;
if (take === 'first' && currentApiRequest.status === 'pending') {
throw new Error('Please wait - request still pending...');
}
if (take === 'last') {
if (currentApiRequest.call) {
currentApiRequest.call.cancel();
}
call = axios.CancelToken.source();
axiosConfig = {
...axiosConfig,
cancelToken: call.token,
};
}
await this.update(requestKey, { status: 'pending', count, call });
const response = await Api.send(axiosConfig);
await this.update(requestKey, { status: null, count: null, call: null });
return response;
} catch (thrown) {
if (axios.isCancel(thrown)) {
/* tslint:disable-next-line */
console.log('Request canceled', thrown.message);
} else {
await this.update(requestKey, { status: null, count: null, call: null });
/* tslint:disable-next-line */
console.log(thrown);
}
return thrown;
}
}
}
export default Api;