import CustomError from “./custom-error” import qs from “qs”
export default class {
static get(path, data = null) { return this.requestLocal({"path": path, "pathParams": data, "method": "GET"}) } static delete(path, data = null) { return this.requestLocal({"path": path, "pathParams": data, "method": "DELETE"}) } static patch(path, data = {}) { return this.requestLocal({"path": path, "data": data, "method": "PATCH"}) } static post(path, data = {}) { return this.requestLocal({"path": path, "data": data, "method": "POST"}) } static request(args) { var path = args.path if (args.pathParams) { var pathParamsString = qs.stringify(args.pathParams, {"arrayFormat": "brackets"}) path += `?${pathParamsString}` } return new Promise((resolve, reject) => { var xhr = new XMLHttpRequest() xhr.open(args.method, path, true) if (args.headers) { for(var headerName in args.headers) { xhr.setRequestHeader(headerName, args.headers[headerName]) } } xhr.onload = () => { var response = this._parseResponse(xhr) if (xhr.status == 200) { resolve(response) } else { reject(new CustomError(`Request failed with code: ${xhr.status}`, {response: response})) } } xhr.send(args.data) }) } static requestLocal(args) { if (!args.headers) args["headers"] = {} var token = this._token() if (token) args["headers"]["X-CSRF-Token"] = token if (args.data) { args["headers"]["Content-Type"] = "application/json" args["data"] = JSON.stringify(args.data) } if (args.rawData) args["data"] = args.rawData return this.request(args) } static put(path, data = {}) { return this.requestLocal({"path": path, "data": data, "method": "PUT"}) } static _token() { var tokenElement = document.querySelector("meta[name='csrf-token']") if (tokenElement) return tokenElement.getAttribute("content") } static _parseResponse(xhr) { var responseType = xhr.getResponseHeader("content-type") if (responseType && responseType.startsWith("application/json")) { return JSON.parse(xhr.responseText) } else { return xhr.responseText } }
}