98 lines
2.8 KiB
TypeScript
98 lines
2.8 KiB
TypeScript
"use client";
|
|
|
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
import { useTranslationStore } from "@/lib/store";
|
|
import { API_BASE } from "@/lib/config";
|
|
import type { AdminDashboardData } from "./types";
|
|
|
|
const TIMEOUT_MS = 15000;
|
|
export const REFETCH_INTERVAL_MS = 30000;
|
|
|
|
export const QUERY_KEY = ["admin", "dashboard"];
|
|
|
|
async function fetchDashboardData(adminToken: string | null | undefined): Promise<AdminDashboardData> {
|
|
if (!adminToken) {
|
|
throw new Error("AUTH_REQUIRED");
|
|
}
|
|
|
|
const controller = new AbortController();
|
|
const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
|
|
try {
|
|
const response = await fetch(`${API_BASE}/api/v1/admin/dashboard`, {
|
|
headers: {
|
|
Authorization: `Bearer ${adminToken}`,
|
|
},
|
|
signal: controller.signal,
|
|
});
|
|
|
|
clearTimeout(timeoutId);
|
|
|
|
if (!response.ok) {
|
|
if (response.status === 401) {
|
|
throw new Error("UNAUTHORIZED");
|
|
}
|
|
throw new Error(`HTTP_ERROR_${response.status}`);
|
|
}
|
|
|
|
return await response.json();
|
|
} catch (err) {
|
|
clearTimeout(timeoutId);
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
export function useAdminDashboard() {
|
|
const { settings } = useTranslationStore();
|
|
const queryClient = useQueryClient();
|
|
|
|
const { data, isLoading, error, refetch } = useQuery({
|
|
queryKey: QUERY_KEY,
|
|
queryFn: () => fetchDashboardData(settings.adminToken),
|
|
enabled: !!settings.adminToken,
|
|
refetchInterval: REFETCH_INTERVAL_MS,
|
|
staleTime: 10000,
|
|
retry: 1,
|
|
});
|
|
|
|
const getErrorMessage = (err: Error | null): string | null => {
|
|
if (!err) return null;
|
|
|
|
const errorMap: Record<string, string> = {
|
|
AUTH_REQUIRED: "Veuillez vous connecter pour accéder au tableau de bord",
|
|
UNAUTHORIZED: "Session expirée. Veuillez vous reconnecter.",
|
|
HTTP_ERROR_403: "Accès refusé. Droits administrateur requis.",
|
|
HTTP_ERROR_404: "Service indisponible. Veuillez réessayer plus tard.",
|
|
HTTP_ERROR_500: "Erreur serveur. Veuillez réessayer plus tard.",
|
|
HTTP_ERROR_502: "Service temporairement indisponible.",
|
|
HTTP_ERROR_503: "Service en maintenance. Veuillez réessayer plus tard.",
|
|
};
|
|
|
|
const code = err.message;
|
|
if (errorMap[code]) {
|
|
return errorMap[code];
|
|
}
|
|
|
|
if (err.name === "AbortError") {
|
|
return "Le serveur met trop de temps à répondre. Veuillez réessayer.";
|
|
}
|
|
|
|
if (err.message.includes("fetch") || err.message.includes("network")) {
|
|
return "Impossible de se connecter au serveur. Vérifiez votre connexion.";
|
|
}
|
|
|
|
return "Une erreur inattendue s'est produite. Veuillez réessayer.";
|
|
};
|
|
|
|
const errorMessage = error ? getErrorMessage(error as Error) : null;
|
|
|
|
return {
|
|
data: data ?? null,
|
|
isLoading,
|
|
error: errorMessage,
|
|
refetch,
|
|
queryClient,
|
|
queryKey: QUERY_KEY,
|
|
};
|
|
}
|