Files
component-lib/src/services/fetch.ts
2021-07-18 13:27:18 -06:00

101 lines
3.3 KiB
TypeScript

declare var window: any;
const defaultBasePath = '';
export function fetchAsync(method: 'GET' | 'POST' | 'DELETE' | 'PUT', url: string, body?: any) {
const headers = { 'Content-Type': 'application/json; charset=utf-8' };
// if (access_token) headers['Authorization'] = `Token ${access_token}`;
return window.fetch(`${defaultBasePath}${url}`, {
method,
headers,
body: body && JSON.stringify(body)
}).then((response: any) => {
if (response.status === 401) {
window.location.href = '/auth/login';
// throw new Error('401');
}
if (response.status === 403 && url === '/api/v1/organization/') {
// this indicates a user that is not supposed to be in bx-console
window.location.href = '/auth/logout';
}
const result = response.json();
if (!response.ok) throw result;
return result;
});
}
export function get<T>(url: string): Promise<T> {
return fetchAsync('GET', url);
}
export function post<T>(url: string, body?: any): Promise<T> {
return fetchAsync('POST', url, body);
}
export function postWithFile<T>(url: string, body?: any): Promise<T> {
return fetchWithFile('POST', url, body);
}
export function putWithFile<T>(url: string, body?: any): Promise<T> {
return fetchWithFile('PUT', url, body);
}
export function fetchWithFile<T>(method: string, url: string, body?: any): Promise<T> {
return window.fetch(`${defaultBasePath}${url}`, {
method: method,
body: body
}).then((response: any) => {
if (response.status === 401) {
window.location.href = '/auth/login';
// throw new Error('401');
}
const result = response.json();
if (!response.ok) throw result;
return result;
})
}
export function del(url: string) {
return fetchAsync('DELETE', url);
}
export function put(url: string, body?: any) {
return fetchAsync('PUT', url, body);
}
export function toQueryString(obj: any) {
const parts = [];
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
parts.push(encodeURIComponent(i) + "=" + encodeURIComponent(obj[i]));
}
}
return parts.join("&");
}
export function serializeObject<T>(form: any) {
let obj: {[key: string]: any} = {};
if (typeof form == 'object' && form.nodeName == "FORM") {
for (let i = 0; i < form.elements.length; i++) {
const field = form.elements[i];
if (field.name
&& field.type != 'file'
&& field.type != 'reset'
&& field.type != 'submit'
&& field.type != 'button') {
if (field.type == 'select-multiple') {
obj[field.name] = '';
let tempvalue = '';
for (let j = 0; j < form.elements[i].options.length; j++) {
if (field.options[j].selected)
tempvalue += field.options[j].value + ';';
}
if (tempvalue.charAt(tempvalue.length - 1) === ';') obj[field.name] = tempvalue.substring(0, tempvalue.length - 1);
} else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) {
obj[field.name] = field.value;
}
}
}
}
return obj as T;
}