"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 { 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 = { 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, }; }