import { useCallback, useEffect, useRef, useState } from "react"; import { toast } from "@/components/ui/use-toast"; import { getErrorMessage } from "@/lib/error-message"; interface UseApiQueryOptions { enabled?: boolean; errorToast?: string; initialData?: T; } interface UseApiQueryResult { data: T | undefined; isLoading: boolean; error: string; refetch: () => Promise; } export function useApiQuery( fetcher: () => Promise, options: UseApiQueryOptions = {}, ): UseApiQueryResult { const { enabled = true, errorToast, initialData } = options; const [data, setData] = useState(initialData); const [isLoading, setIsLoading] = useState(enabled); const [error, setError] = useState(""); const fetcherRef = useRef(fetcher); fetcherRef.current = fetcher; const run = useCallback(async () => { setIsLoading(true); setError(""); try { setData(await fetcherRef.current()); } catch (err) { const message = getErrorMessage(err, errorToast || "Request failed"); setError(message); if (errorToast) { toast({ title: errorToast, description: message, variant: "destructive", }); } } finally { setIsLoading(false); } }, [errorToast]); useEffect(() => { if (enabled) void run(); }, [enabled, run]); return { data, isLoading, error, refetch: run }; }