From 747a1c37272a9e3473072d2d51378c87560b39a2 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Fri, 10 Apr 2026 14:57:53 +0200 Subject: [PATCH] feat(26-02): React Query hooks for discovery data - Create useDiscoverySetups, useDiscoveryItems, useDiscoveryCategories hooks - Export DiscoverySetup and DiscoveryCategory interfaces - Set staleTime 2min for setups/items, 5min for categories --- src/client/hooks/useDiscovery.ts | 65 ++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/client/hooks/useDiscovery.ts diff --git a/src/client/hooks/useDiscovery.ts b/src/client/hooks/useDiscovery.ts new file mode 100644 index 0000000..5fcfd3d --- /dev/null +++ b/src/client/hooks/useDiscovery.ts @@ -0,0 +1,65 @@ +import { useQuery } from "@tanstack/react-query"; +import { apiGet } from "../lib/api"; + +export interface DiscoverySetup { + id: number; + name: string; + createdAt: string; + itemCount: number; + creatorName: string | null; +} + +export interface DiscoveryCategory { + name: string; + itemCount: number; +} + +interface GlobalItem { + id: number; + brand: string; + model: string; + category: string | null; + weightGrams: number | null; + priceCents: number | null; + imageUrl: string | null; + description: string | null; + sourceUrl: string | null; + imageCredit: string | null; + imageSourceUrl: string | null; + createdAt: string; +} + +interface CursorPage { + items: T[]; + nextCursor: string | null; + hasMore: boolean; +} + +export function useDiscoverySetups(limit = 6) { + return useQuery({ + queryKey: ["discovery", "setups", limit], + queryFn: () => + apiGet>( + `/api/discovery/setups?limit=${limit}`, + ), + staleTime: 2 * 60 * 1000, + }); +} + +export function useDiscoveryItems(limit = 8) { + return useQuery({ + queryKey: ["discovery", "items", limit], + queryFn: () => + apiGet>(`/api/discovery/items?limit=${limit}`), + staleTime: 2 * 60 * 1000, + }); +} + +export function useDiscoveryCategories(limit = 12) { + return useQuery({ + queryKey: ["discovery", "categories", limit], + queryFn: () => + apiGet(`/api/discovery/categories?limit=${limit}`), + staleTime: 5 * 60 * 1000, + }); +}