frontend/app/lib/api.ts
2025-07-29 11:05:49 +02:00

90 lines
2.1 KiB
TypeScript

const BASE_URL = import.meta.env.VITE_API_URL;
const makePostRequest = async (
url: string,
body: object,
error = "Une erreur est survenue",
method = "POST"
) => {
const response = await fetch(BASE_URL + url, {
method,
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify(body),
credentials: "include", // Include cookies for authentication
});
const data = await response.json();
if (!response.ok) throw new Error(data.error || error);
return data?.data || data;
};
// TODO: Use swr or react-query for caching and revalidation
// TODO: Cache all to localStorage or IndexedDB for offline support
const makeRequest = async (
url: string,
error = "Une erreur est survenue",
) => {
const response = await fetch(BASE_URL + url, { credentials: "include"});
const data = await response.json();
if (!response.ok) throw new Error(data.error || error);
return data?.data || data;
};
/**
* === AUTH API ===
*/
export const requestLogin = async (email: string, token: string) => {
return makePostRequest(
"/auth/request",
{ email, token },
"Échec de la demande de connexion"
);
};
export const verifyOtp = async ({
otpCode,
email,
}: {
otpCode: string;
email: string;
}) => {
return makePostRequest(
"/auth/verify",
{ email, code: otpCode },
"Code de vérification invalide"
);
};
export const getClasses = async () => {
try {
const res = await fetch("/classes.json");
return res.json();
} catch (error) {
console.error("Error fetching classes:", error);
return [];
}
};
export const registerUser = async (
firstName: string,
lastName: string,
className: string,
token: string
) => {
return makePostRequest(
"/auth/register",
{ firstName, lastName, className, token },
"Échec de l'inscription"
);
};
/**
* === COLLES API ===
*/
export const getColles = async (weekNumber: number, year: number) => {
return makeRequest(`/colles?week=${weekNumber}&year=${year}`, "Échec de la récupération des colles");
};