UNPKG

vuetify-admin

Version:

SPA admin framework for Vue.js running on top of REST APIs, built on Vuetify

98 lines (84 loc) 2.22 kB
import trimEnd from "lodash/trimEnd"; const createHeadersFromOptions = (options) => { const requestHeaders = (typeof options.headers === "function" ? options.headers() : options.headers) || new Headers({ Accept: "application/json", }); if ( !requestHeaders.has("Content-Type") && !(options && (!options.method || options.method === "GET")) && !(options && options.body && options.body instanceof FormData) ) { requestHeaders.set("Content-Type", "application/json"); } if (options.user && options.user.authenticated && options.user.token) { requestHeaders.set("Authorization", options.user.token); } return requestHeaders; }; export default class FetchJson { constructor(url, options = {}) { this.url = trimEnd(url, "/"); this.options = options; } get(path, options = {}) { return this.call(path, options); } post(path, data, options = {}) { return this.call(path, { ...options, method: "POST", body: JSON.stringify(data), }); } put(path, data, options = {}) { return this.call(path, { ...options, method: "PUT", body: JSON.stringify(data), }); } patch(path, data, options = {}) { return this.call(path, { ...options, method: "PATCH", body: JSON.stringify(data), }); } delete(path, options = {}) { return this.call(path, { ...options, method: "DELETE" }); } async call(path, options = {}) { const requestHeaders = createHeadersFromOptions({ ...options, ...this.options, }); let response = await fetch(`${this.url}/${path}`, { ...options, ...this.options, headers: requestHeaders, }); let json = await response.json(); let { status, statusText, headers } = response; if (status < 200 || status >= 300) { return Promise.reject({ status, message: (json && json.message) || statusText, data: json, }); } return Promise.resolve({ status, headers: [...headers.keys()].reduce((o, key) => { return { ...o, [key]: headers.get(key), }; }, {}), data: json, }); } }