IKHSAN
EN Read in EnglishID

homeio

Publik

Fork dari doctor-io/homeio

Branch
main
Commit terakhir
958d74616 Oktober 2026

useStoreApp.ts

Buka raw
"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,
  });
}
byte
1.513
baris
59
Jenis
ts
Commit terakhir
16 Oktober 2026