homeio
PublikFork dari doctor-io/homeio
useStoreApp.ts
"use client";
import { useQuery } from "@tanstack/react-query";
import type { StoreAppDetail } from "@/lib/shared/contracts/apps";
import { queryKeys } from "@/lib/shared/query-keys";
type StoreAppDetailResponse = {
data: StoreAppDetail;
};
const STORE_APP_REQUEST_TIMEOUT_MS = 10_000;
export async function fetchStoreApp(appId: string) {
const endpoint = `/api/v1/store/apps/${encodeURIComponent(appId)}`;
const controller = new AbortController();
const timeout = setTimeout(() => {
controller.abort();
}, STORE_APP_REQUEST_TIMEOUT_MS);
let response: Response;
try {
response = await fetch(endpoint, {
cache: "no-store",
signal: controller.signal,
});
} catch (error) {
if (error instanceof Error && error.name === "AbortError") {
throw new Error("Failed to fetch store app (request timeout)");
}
throw error;
} finally {
clearTimeout(timeout);
}
if (response.status === 404) {
return null;
}
if (!response.ok) {
throw new Error(`Failed to fetch store app (${response.status})`);
}
const json = (await response.json()) as StoreAppDetailResponse;
return json.data;
}
export function useStoreApp(appId: string | null) {
return useQuery({
queryKey: appId ? queryKeys.storeApp(appId) : ["store", "app", "none"],
queryFn: () => fetchStoreApp(appId as string),
enabled: Boolean(appId),
staleTime: 60_000,
refetchOnMount: false,
refetchOnReconnect: false,
refetchOnWindowFocus: false,
});
}