IKHSAN
ENID Baca dalam Bahasa Indonesia

homeio

Public

Forked from doctor-io/homeio

Branch
main
Latest commit
958d74616 October 2026

useNetworkStatus.ts

Open raw
"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,
  });
}
bytes
1,225
lines
46
Type
ts
Latest commit
16 October 2026