import {fetch} from "@tauri-apps/plugin-http"; import {configs} from "@/lib/configs"; export class ApiError extends Error { statusCode: number; constructor(message: string, statusCode: number) { super(message); this.statusCode = statusCode; this.name = 'ApiError'; } } function buildUrl(url: string, params: Record = {}, lang: string = "fr"): string { const fullUrl = new URL(url, configs.apiUrl); fullUrl.searchParams.set("lang", lang); fullUrl.searchParams.set("plateforme", "desktop"); for (const [key, value] of Object.entries(params)) { if (value !== undefined && value !== null) fullUrl.searchParams.set(key, String(value)); } return fullUrl.toString(); } async function handleResponse(response: Response): Promise { if (!response.ok) { const body = await response.json().catch(() => ({message: response.statusText})); throw new ApiError(body.message || body || response.statusText, response.status); } return response.json() as Promise; } export async function apiGet(url: string, auth: string, lang: string = "fr", params: Record = {}): Promise { const response = await fetch(buildUrl(url, params, lang), { method: "GET", headers: {"Authorization": `Bearer ${auth}`}, }); return handleResponse(response); } export async function apiPost(url: string, data: object, auth: string, lang: string = "fr"): Promise { const response = await fetch(buildUrl(url, {}, lang), { method: "POST", headers: {"Authorization": `Bearer ${auth}`, "Content-Type": "application/json"}, body: JSON.stringify(data), }); return handleResponse(response); } export async function apiPut(url: string, data: object, auth: string, lang: string = "fr"): Promise { const response = await fetch(buildUrl(url, {}, lang), { method: "PUT", headers: {"Authorization": `Bearer ${auth}`, "Content-Type": "application/json"}, body: JSON.stringify(data), }); return handleResponse(response); } export async function apiPatch(url: string, data: object, auth: string, lang: string = "fr"): Promise { const response = await fetch(buildUrl(url, {}, lang), { method: "PATCH", headers: {"Authorization": `Bearer ${auth}`, "Content-Type": "application/json"}, body: JSON.stringify(data), }); return handleResponse(response); } export async function apiDelete(url: string, data: object, auth: string, lang: string = "fr"): Promise { const response = await fetch(buildUrl(url, {}, lang), { method: "DELETE", headers: {"Authorization": `Bearer ${auth}`, "Content-Type": "application/json"}, body: JSON.stringify(data), }); return handleResponse(response); } export async function apiPostPublic(url: string, data: object, lang: string = "fr"): Promise { const response = await fetch(buildUrl(url, {}, lang), { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify(data), }); return handleResponse(response); } export async function apiUpload(url: string, file: File, auth: string, lang: string = "fr"): Promise { const formData = new FormData(); formData.append("file", file); const response = await fetch(buildUrl(url, {}, lang), { method: "POST", headers: {"Authorization": `Bearer ${auth}`}, body: formData, }); return handleResponse(response); }