IKHSAN
EN Read in EnglishID

homeio

Publik

Fork dari doctor-io/homeio

Branch
main
Commit terakhir
958d74616 Oktober 2026

useInstalledApps.ts

Buka raw
"use client";

import { useQuery } from "@tanstack/react-query";
import type { InstalledApp } from "@/lib/shared/contracts/apps";
import { queryKeys } from "@/lib/shared/query-keys";

type InstalledAppsResponse = {
  data: InstalledApp[];
};

const STATUS_VERIFY_POLL_INTERVAL_MS = 5_000;
const STATUS_VERIFY_WINDOW_MS = 30_000;

async function fetchInstalledApps() {
  const response = await fetch("/api/v1/apps", {
    cache: "no-store",
  });

  if (!response.ok) {
    throw new Error(`Failed to fetch apps (${response.status})`);
  }

  const json = (await response.json()) as InstalledAppsResponse;
  return json.data;
}

export function useInstalledApps() {
  return useQuery({
    queryKey: queryKeys.installedApps,
    queryFn: fetchInstalledApps,
    staleTime: 30_000,
    refetchOnMount: false,
    refetchOnReconnect: false,
    refetchOnWindowFocus: false,
    refetchInterval: (query) => {
      const apps = query.state.data;
      if (!apps || apps.length === 0) {
        return false;
      }

      const now = Date.now();
      const shouldPollForVerification = apps.some((app) => {
        if (app.status === "running") {
          return false;
        }

        const updatedAtMs = Date.parse(app.updatedAt);
        if (!Number.isFinite(updatedAtMs)) {
          return false;
        }

        return now - updatedAtMs <= STATUS_VERIFY_WINDOW_MS;
      });

      return shouldPollForVerification ? STATUS_VERIFY_POLL_INTERVAL_MS : false;
    },
  });
}
byte
1.482
baris
59
Jenis
ts
Commit terakhir
16 Oktober 2026