homeio
PublikFork dari doctor-io/homeio
useNetworkStatus.ts
"use client";
import { useQuery } from "@tanstack/react-query";
import type { NetworkStatus } from "@/lib/shared/contracts/network";
import { queryKeys } from "@/lib/shared/query-keys";
type NetworkStatusResponse = {
data: NetworkStatus;
meta?: {
source?: "helper" | "fallback";
};
};
async function fetchNetworkStatus() {
const response = await fetch("/api/v1/network/status", {
cache: "no-store",
});
if (!response.ok) {
throw new Error(`Failed to fetch network status (${response.status})`);
}
const json = (await response.json()) as NetworkStatusResponse;
return json.data;
}
export function useNetworkStatus() {
return useQuery({
queryKey: queryKeys.networkStatus,
queryFn: fetchNetworkStatus,
refetchInterval: (query) => {
if (query.state.status !== "error") {
// SSE-driven invalidation keeps this fresh; polling is fallback only.
return 120_000;
}
const failureCount = Math.max(1, query.state.fetchFailureCount);
const exponentialBackoffMs = 60_000 * 2 ** Math.min(failureCount - 1, 2);
return Math.min(exponentialBackoffMs, 300_000);
},
staleTime: 10_000,
retry: 0,
refetchOnWindowFocus: false,
});
}