import Axios, {AxiosError, AxiosRequestConfig, AxiosResponse} from "axios"; interface Response { code: number message: string data: T } export const authError = new Error("unauthenticated"); export async function getRequest(url: string): Promise { const cors = url.includes("//"); return sendRequest({ method: "GET", url: cors ? url : `/api${url}`, responseType: "json", }, cors); } export function postRequest(url: string, data: object = {}): Promise { return sendRequest({ method: "POST", url: `/api${url}`, responseType: "json", data, }); } export function putRequest(url: string, data: object): Promise { return sendRequest({ method: "PUT", url: `/api${url}`, responseType: "json", data, }); } export function deleteRequest(url: string): Promise { return sendRequest({ method: "DELETE", url: `/api${url}`, responseType: "json", }); } async function sendRequest(config: AxiosRequestConfig, cors: boolean = false): Promise { try { const res = await Axios(config); return await handleResponse(res, cors); } catch (e) { if (e === authError) { throw e; } return await handleResponse((e as AxiosError).response as AxiosResponse); } } function handleResponse(response: AxiosResponse, object: boolean = false): Promise { if (object) { return Promise.resolve(response.data); } else { const obj: Response | undefined = response?.data; if (![200, 201].includes(response.status)) { if (response.status === 403) { return Promise.reject(authError); } else { return Promise.reject(obj?.message || "Ukjent feil"); } } if (!obj) { return Promise.reject("Ingen data mottatt"); } return Promise.resolve(obj.data); } }