Molodetz blogrol volgens DPP-template
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
// retoor <retoor@molodetz.nl>
|
||||
export class Http {
|
||||
static termsGate = null;
|
||||
|
||||
static suspend() {
|
||||
return new Promise(() => {});
|
||||
}
|
||||
|
||||
static async getJson(url) {
|
||||
const response = await fetch(url, { headers: { Accept: "application/json" }, credentials: "same-origin" });
|
||||
if (!response.ok) {
|
||||
throw new Error(`${response.status} ${response.statusText}`);
|
||||
}
|
||||
return response.json();
|
||||
}
|
||||
|
||||
static async #post(url, body, headers) {
|
||||
const response = await fetch(url, {
|
||||
method: "POST",
|
||||
body,
|
||||
credentials: "same-origin",
|
||||
headers: { Accept: "application/json", ...headers },
|
||||
});
|
||||
if (response.status === 403 && Http.termsGate) {
|
||||
const handled = await Http.termsGate.intercept(response.clone());
|
||||
if (handled) {
|
||||
return Http.#post(url, body, headers);
|
||||
}
|
||||
}
|
||||
if (response.redirected && response.url.includes("/auth/login")) {
|
||||
window.location.href = response.url;
|
||||
return Http.suspend();
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
static async send(url, data = {}) {
|
||||
const response = await Http.#post(url, JSON.stringify(data), { "Content-Type": "application/json" });
|
||||
const payload = await response.json().catch(() => ({}));
|
||||
if (!response.ok || payload.ok === false) {
|
||||
const message = payload.error?.message || (payload.messages || []).join(", ") || response.statusText;
|
||||
throw new Error(message);
|
||||
}
|
||||
return payload;
|
||||
}
|
||||
|
||||
static async sendForm(url, form) {
|
||||
const body = new URLSearchParams(new FormData(form));
|
||||
const response = await Http.#post(url, body, { "Content-Type": "application/x-www-form-urlencoded" });
|
||||
if (!response.ok) {
|
||||
const payload = await response.json().catch(() => ({}));
|
||||
throw new Error(`${response.status} ${payload.error?.message || (payload.messages || []).join(", ") || ""}`.trim());
|
||||
}
|
||||
return response.json().catch(() => ({ ok: true }));
|
||||
}
|
||||
|
||||
static postJson(url, data) {
|
||||
return Http.send(url, data);
|
||||
}
|
||||
|
||||
static postForm(url, form) {
|
||||
return Http.sendForm(url, form);
|
||||
}
|
||||
|
||||
static async sendDelete(url) {
|
||||
const response = await fetch(url, { method: "DELETE", credentials: "same-origin", headers: { Accept: "application/json" } });
|
||||
if (!response.ok) {
|
||||
throw new Error(`${response.status}`);
|
||||
}
|
||||
return response.json().catch(() => ({ ok: true }));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user