You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/packages/ui-default/utils/request.js

106 lines
2.6 KiB
JavaScript

import i18n from './i18n';
const request = {
/**
* @param {object} options
*/
async ajax(options) {
return new Promise((resolve, reject) => {
$
.ajax({
dataType: 'json',
headers: {
Accept: 'application/json',
},
...options,
})
.fail((jqXHR, textStatus, errorThrown) => {
if (textStatus === 'abort') {
const err = new Error(i18n('Aborted'));
err.aborted = true;
reject(err);
} else if (jqXHR.readyState === 0) {
reject(new Error(i18n('Network error')));
} else if (typeof jqXHR.responseJSON === 'object' && jqXHR.responseJSON.error) {
const { error } = jqXHR.responseJSON;
if (error.params) {
const message = i18n(error.message, ...error.params);
const err = new Error(message);
err.rawMessage = error.message;
err.params = error.params;
reject(err);
} else reject(new Error(jqXHR.responseJSON.error.message));
} else if (errorThrown instanceof Error) {
reject(errorThrown);
} else {
reject(new Error(textStatus));
}
})
.done(resolve);
});
},
/**
* @param {string} url
* @param {FormData} FormData
* @param {object} options
*/
postFile(url, form, options = {}) {
return this.ajax({
url,
data: form,
processData: false,
contentType: false,
type: 'POST',
dataType: undefined,
...options,
});
},
/**
* @param {string} url
* @param {JQueryStatic | Node | string | object} dataOrForm
* @param {object} options
*/
post(url, dataOrForm = {}, options = {}) {
let postData;
if (dataOrForm instanceof jQuery && dataOrForm.is('form')) {
// $form
postData = dataOrForm.serialize();
} else if (dataOrForm instanceof Node && $(dataOrForm).is('form')) {
// form
postData = $(dataOrForm).serialize();
} else if (typeof dataOrForm === 'string') {
// foo=bar&box=boz
postData = dataOrForm;
} else {
// {foo: 'bar'}
postData = JSON.stringify(dataOrForm);
options.contentType = 'application/json';
}
return request.ajax({
url,
method: 'post',
data: postData,
...options,
});
},
/**
* @param {string} url
* @param {object} qs
* @param {object} options
*/
get(url, qs = {}, options = {}) {
return request.ajax({
url,
data: qs,
method: 'get',
...options,
});
},
};
export default request;
window.Hydro.utils.request = request;