import Cookies from 'js-cookie'; export class HttpClient { static ACCEPT = { TEXT_HTML: 'text/html', JSON: 'application/json', }; _responseInterceptors = []; addResponseInterceptor(interceptor) { if (typeof interceptor === 'function') { this._responseInterceptors.push(interceptor); } } _baseUrl; setBaseUrl(baseUrl) { if (typeof this._baseUrl !== 'undefined') { throw new Error('HttpClient baseUrl is already set'); } this._baseUrl = baseUrl; } _defaultUrl; setDefaultUrl(defaultUrl) { if (typeof this._defaultUrl !== 'undefined') { throw new Error('HttpClient defaultUrl is already set'); } this._defaultUrl = defaultUrl; } get(args) { args.method = 'GET'; return this._fetch(args); } post(args) { args.method = 'POST'; args.headers = args.headers || {}; args.headers['X-XSRF-TOKEN'] = Cookies.get('XSRF-TOKEN'); return this._fetch(args); } _fetch(options) { options.url = (options.url && options.url.href) || options.url || this._defaultUrl; if (this._baseUrl && options.url && options.url.substring(0,1) === '/' && options.url.substring(0,2) !== '//') options.url = this._baseUrl + (this._baseUrl.substring(this._baseUrl.substring.length - 1) === '/' ? '' : '/') + options.url.substring(1,0); const requestOptions = { credentials: 'same-origin', ...options, }; return fetch(options.url || window.location.href, requestOptions) .then( (response) => { this._responseInterceptors.forEach((interceptor) => interceptor(response, options)); return Promise.resolve(response); }, Promise.reject, ).catch(console.error); } }