// src/hooks/queries/useShoppingListsQuery.ts import { useQuery } from '@tanstack/react-query'; import * as apiClient from '../../services/apiClient'; import { queryKeys } from '../../config/queryKeys'; import type { ShoppingList } from '../../types'; /** * Query hook for fetching the user's shopping lists. * * This hook is automatically disabled when the user is not authenticated, * and the cached data is invalidated when the user logs out. * * @param enabled - Whether the query should run (typically based on auth status) * @returns Query result with shopping lists data, loading state, and error state * * @example * ```tsx * const { data: shoppingLists, isLoading, error } = useShoppingListsQuery(!!user); * ``` */ export const useShoppingListsQuery = (enabled: boolean) => { return useQuery({ queryKey: queryKeys.shoppingLists(), queryFn: async (): Promise => { const response = await apiClient.fetchShoppingLists(); if (!response.ok) { const error = await response.json().catch(() => ({ message: `Request failed with status ${response.status}`, })); throw new Error(error.message || 'Failed to fetch shopping lists'); } const json = await response.json(); // ADR-028: API returns { success: true, data: [...] } // If success is false or data is not an array, return empty array to prevent .map() errors if (!json.success || !Array.isArray(json.data)) { return []; } // Ensure each shopping list has a valid items array (Bugsink issue a723d36e-175c-409d-9c49-b8e5d8fd2101) return json.data.map((list: ShoppingList) => ({ ...list, items: Array.isArray(list.items) ? list.items : [], })); }, enabled, // Keep data fresh for 1 minute since users actively manage shopping lists staleTime: 1000 * 60, }); };