sws-frontend
Version:
sws frontend project
149 lines • 6.72 kB
JavaScript
;
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