import { AuthApi } from "./AuthApi"; interface APIResponse { data: any; status: number; } export class ApiError extends Error { constructor(message: string, public code: number, public data: any) { super(message); } } export class APIClient { /** * Get backend URL */ static backendURL(): string { const URL = process.env.REACT_APP_BACKEND ?? ""; if (URL.length === 0) throw new Error("Backend URL undefined!"); return URL; } /** * Perform a request on the backend */ static async exec(args: { uri: string; method: "GET" | "POST" | "DELETE" | "PATCH" | "PUT"; allowFail?: boolean; jsonData?: any; }): Promise { const res = await fetch(this.backendURL() + args.uri, { method: args.method, body: args.jsonData ? JSON.stringify(args.jsonData) : undefined, headers: { "X-auth-token": AuthApi.SignedIn ? AuthApi.AuthToken : "none", "Content-Type": args.jsonData ? "application/json" : "text/plain", }, }); let data; if (res.headers.get("content-type") === "application/json") data = await res.json(); else data = await res.blob(); // Handle expired tokens if (res.status === 412) { AuthApi.RemoveAuthToken(); window.location.href = "/"; } if (!args.allowFail && !res.ok) throw new ApiError("Request failed!", res.status, data); return { data: data, status: res.status, }; } }