import { isObject } from "lodash" import { ENTRYPOINT } from "../config/entrypoint" import SubmissionError from "../error/SubmissionError" import { normalize } from "./hydra" const MIME_TYPE = "application/ld+json" const makeParamArray = (key, arr) => arr.map((val) => `${key}[]=${val}`).join("&") export default function (id, options = {}) { console.log("fetch") console.log(options) if ("undefined" === typeof options.headers) { options.headers = {} } if (!options.headers.hasOwnProperty("Accept")) { options.headers = { ...options.headers, Accept: MIME_TYPE } } if ( undefined !== options.body && !(options.body instanceof FormData) && !options.headers.hasOwnProperty("Content-Type") ) { options.headers = { ...options.headers, "Content-Type": MIME_TYPE } } if (options.params) { const params = normalize(options.params) let queryString = Object.keys(params) .map((key) => (Array.isArray(params[key]) ? makeParamArray(key, params[key]) : `${key}=${params[key]}`)) .join("&") id = `${id}?${queryString}` console.log("URL", id) } const entryPoint = ENTRYPOINT + (ENTRYPOINT.endsWith("/") ? "" : "/") if ("PUT" === options.method) { const payload = options.body && JSON.parse(options.body) if (isObject(payload) && payload["@id"]) { options.body = JSON.stringify(normalize(payload)) } } /*const payload = options.body && JSON.parse(options.body); if (isObject(payload) && payload["@id"]) { options.body = JSON.stringify(normalize(payload)); }*/ /*if (useAxios) { console.log('axios'); let url = new URL(id, entryPoint); console.log(formData); return axios({ url: url.toString(), method: 'POST', //headers: options.headers, data: formData, headers: { 'Content-Type': 'multipart/form-data' }, onUploadProgress: function (progressEvent) { console.log('progress'); //console.log(progressEvent); console.log(options.body); let uploadPercentage = parseInt(Math.round((progressEvent.loaded / progressEvent.total) * 100)); options.body['__progress'] = uploadPercentage; options.body['__progressLabel'] = uploadPercentage; this.uploadPercentage = uploadPercentage; console.log(options.body); //options.body.set('__progressLabel', uploadPercentage); }.bind(this) } ).then(response => { options.body['__uploaded'] = 1; options.body['uploadFile']['__uploaded'] = 1 console.log(response); console.log('SUCCESS!!'); return response.data; }) .catch(function (response) { console.log(response); console.log('FAILURE!!'); }); }*/ console.log("ready to fetch") return global.fetch(new URL(id, entryPoint), options).then((response) => { console.log(response, "global.fetch") if (response.ok) { return response } return response.json().then( (json) => { let error = json["hydra:description"] || json["hydra:title"] || "An error occurred." if (json["code"] && 401 === json["code"]) { error = "Not allowed" } if (json["error"]) { error = json["error"] } console.log(error, "fetch error") if (!json.violations) { console.log("violations") throw Error(error) } let errors = { _error: error } json.violations.map((violation) => (errors[violation.propertyPath] = violation.message)) throw new SubmissionError(errors) }, () => { console.log("error3") throw new Error(response.statusText || "An error occurred.") }, ) }) }