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