homeio
PublicForked from doctor-io/homeio
useInstalledApps.ts
"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;
},
});
}