"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import { fetchD4Metrics, type D4MetricsQuery, type D4MetricsResponse } from "@/lib/d4Metrics"; export interface UseD4MetricsOptions { enabled?: boolean; } export function useD4Metrics(query: D4MetricsQuery = {}, options: UseD4MetricsOptions = {}) { const enabled = options.enabled ?? true; const queryKey = useMemo(() => JSON.stringify(query), [query]); const [refreshIndex, setRefreshIndex] = useState(0); const requestKey = `${queryKey}:${refreshIndex}`; const [result, setResult] = useState<{ key: string | null; data: D4MetricsResponse | null; error: string | null; }>({ key: null, data: null, error: null, }); const refetch = useCallback(() => { setRefreshIndex((current) => current + 1); }, []); useEffect(() => { if (!enabled) { return; } const abortController = new AbortController(); const parsedQuery = JSON.parse(queryKey) as D4MetricsQuery; fetchD4Metrics(parsedQuery, abortController.signal) .then((response) => { setResult({ key: requestKey, data: response, error: null, }); }) .catch((requestError: unknown) => { if (abortController.signal.aborted) { return; } setResult({ key: requestKey, data: null, error: requestError instanceof Error ? requestError.message : "D4 指标请求失败", }); }); return () => { abortController.abort(); }; }, [enabled, queryKey, requestKey]); const isCurrentResult = result.key === requestKey; return { data: isCurrentResult ? result.data : null, error: isCurrentResult ? result.error : null, isLoading: enabled && !isCurrentResult, refetch, }; }