export interface APIResponse { error?: string; message?: string; fromClient?: boolean; result: ResultType; } export function request(name: string, data: any): Promise> { const adminAjax = document.getElementById('gecko-google-calendar-admin-ajax-url'); const adminAjaxData = JSON.parse(adminAjax.innerHTML); const adminAjaxUrl = (adminAjax) ? adminAjaxData.gecko_ajax_url : "/wp-admin/admin-ajax.php"; const form = new FormData(); form.append("action", "gecko_google_calendar_" + name); form.append("data", JSON.stringify(data)); const params: RequestInit = { method: "POST", body: form, credentials: "same-origin" }; return fetch(adminAjaxUrl, params) .then(r => { if (r.status >= 400) { return Promise.reject(r.json() .catch(e => { console.error(`API endpoint "${ name }" threw error, but didn't return valid JSON!`); return { error: true, fromClient: true, message: "Invalid JSON from server" }; }) ); } return r; }) .then(r => r.json() .catch(e => { console.error(`API endpoint "${ name }" didn't return valid JSON!`); return { error: true, fromClient: true, message: "Invalid JSON from server" }; }) ) .then(r => { if (r.error) { return Promise.reject(r); } return r; }) }