UNPKG

sws-frontend

Version:

sws frontend project

149 lines 6.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var fetch = require("isomorphic-fetch"); var helpers_1 = require("../commons/helpers"); exports.baseopts = { credentials: 'same-origin', 'Access-Control-Allow-Origin': "https\://caf.fao.org/" }; var errormodal_1 = require("../components/errormodal"); var dialogmodal_1 = require("../components/dialogmodal"); /* options common to PUT and POST. */ exports.writeopts = function (body) { var json = { headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }; return body ? helpers_1.merge(json, { body: JSON.stringify(body) }) : json; }; /* gorups all call types for export. */ exports.baseapi = function (basePath) { /* PUT call factory. */ var putopts = function (body) { return helpers_1.merge(exports.writeopts(body), { method: 'PUT' }); }; var put = function (url, body, opts) { return call(url, helpers_1.merge(putopts(body), opts)); }; /* POST call factory. */ var postopts = function (body) { return helpers_1.merge(exports.writeopts(body), { method: 'POST' }); }; var post = function (url, body, opts) { return call(url, helpers_1.merge(postopts(body), opts)); }; /* DELETE call factory. */ var delopts = function (body) { return helpers_1.merge(exports.writeopts(body), { method: 'DELETE' }); }; var del = function (url, body, opts) { return call(url, helpers_1.merge(delopts(body), opts)); }; var call = function (url, opts) { if (opts === void 0) { opts = {}; } return fetch(url ? basePath + "/" + url : basePath, helpers_1.merge(exports.baseopts, opts)) .then(function (r) { return exports.checkResponse(r); }); }; var fetchAPI = function (url, opts, consumer) { if (opts === void 0) { opts = {}; } return fetch(url ? basePath + "/" + url : basePath, opts) .then(function (r) { return exports.checkResponse(r, consumer); }); }; return { get: call, post: post, put: put, del: del, fetch: fetchAPI, writeopts: exports.writeopts, baseopts: exports.baseopts, createConsumer: createConsumer }; }; exports.default = exports.baseapi; var file_saver_1 = require("file-saver"); var createConsumer = function (opts) { return function (r) { var defaultName = opts.defaultName, contentType = opts.contentType; r.blob().then(function (b) { var contentDisposition = r.headers && r.headers.get("Content-Disposition"); var blob = b.slice(0, b.size, contentType); if (contentDisposition) { // "attachment; filename="qspecs-86995.xlsx"" var regex = new RegExp("filename[^;=\n]*=[\'\"]?(.*?\\2|[^;\n\'\"]*)", 'g'); var groups = regex.exec(contentDisposition); var filename = groups.length > 1 ? groups[1] : defaultName; file_saver_1.saveAs(blob, filename); } else { file_saver_1.saveAs(blob, defaultName); } }); }; }; /** Statuses - https://fetch.spec.whatwg.org/#statuses A status is a code. A null body status is a status that is 101, 204, 205, or 304. An ok status is any status in the range 200 to 299, inclusive. A redirect status is a status that is 301, 302, 303, 307, or 308 */ exports.checkResponse = function (r, c) { if (!r) { return error(r, errormodal_1.errorBuilder("Unable to obtain a response")); } var family = r && r.status.toString().charAt(0); switch (family) { case '2': case '3': switch (r.status) { case 302: return error(r, errormodal_1.errorBuilder("This would probably cause a CORS error origin filter")); case 204: return dialogmodal_1.dialogBuilder("success", "The server has successfully fulfilled the request and that there is no additional content to send in the response payload body"); default: if (c) return c(r); else return r.json().catch(function (err) { // Debug console.log(err); return Promise.reject(error(r)); }); } default: switch (r.status) { case 0: return error(r, errormodal_1.errorBuilder("This would appear a clear case of downtime.")); case 502: return error(r, errormodal_1.errorBuilder("This would appear a clear case of downtime.")); default: switch (family) { case '4': return error(r, errormodal_1.errorBuilder("Something is not quite right with this request.")); case '5': return error(r); default: return error(r); } } } }; var checkRejected = function (err) { if (!err) { return error(err, errormodal_1.errorBuilder("Unable to obtain a response")); } /** thrown on cors errors */ if (err instanceof TypeError) { return errormodal_1.errorBuilder("Unable to obtain a response", err.message, err.stack); } return error(err); }; /* makes a ErrorReport from evidence in the response, local overrides, and ultimately defaults. */ var error = function (response, report) { var _default = exports.defaultReport(response); var _report = report && helpers_1.merge(_default, report) || _default; var payload = response && response.json ? response.json().catch(function (err) { return checkRejected(err); }) : response; if (payload && payload.then) { // if body is a Promise then return a Promise that will evaluate the body // return new Promise(()=>payload); return payload.then(function (value) { throw helpers_1.merge(_report, errormodal_1.errorBuilder('Error', value ? value.message : undefined, value ? value.stacktrace : undefined)); }); } else if (payload) { throw helpers_1.merge(_report, errormodal_1.errorBuilder(payload.statusText, payload.message, payload.details)); } throw helpers_1.merge(_default, report); }; /* something is wrong, no much more. */ exports.defaultReport = function (response) { return errormodal_1.errorBuilder("Well, this was totally unexpected.", "Sadly, causes are still unclear at this time...", "One thing is clear, it's a " + response.status + " error"); }; //# sourceMappingURL=baseapi.js.map