Files
flyer-crawler.projectium.com/src/hooks/queries/useFlyerItemCountQuery.ts

52 lines
1.6 KiB
TypeScript

// src/hooks/queries/useFlyerItemCountQuery.ts
import { useQuery } from '@tanstack/react-query';
import { countFlyerItemsForFlyers } from '../../services/apiClient';
import { queryKeys } from '../../config/queryKeys';
interface FlyerItemCount {
count: number;
}
/**
* Query hook for counting total flyer items across multiple flyers.
*
* This is used to display the total number of active deals available.
*
* @param flyerIds - Array of flyer IDs to count items for
* @param enabled - Whether the query should run
* @returns Query result with count data
*
* @example
* ```tsx
* const { data } = useFlyerItemCountQuery(validFlyerIds, validFlyerIds.length > 0);
* const totalItems = data?.count ?? 0;
* ```
*/
export const useFlyerItemCountQuery = (flyerIds: number[], enabled: boolean = true) => {
return useQuery({
// Include flyerIds in the key so cache is per-set of flyers
queryKey: queryKeys.flyerItemsCount(flyerIds),
queryFn: async (): Promise<FlyerItemCount> => {
if (flyerIds.length === 0) {
return { count: 0 };
}
const response = await countFlyerItemsForFlyers(flyerIds);
if (!response.ok) {
const error = await response.json().catch(() => ({
message: `Request failed with status ${response.status}`,
}));
throw new Error(error.message || 'Failed to count flyer items');
}
const json = await response.json();
// API returns { success: true, data: {...} }, extract the data object
return json.data ?? json;
},
enabled: enabled && flyerIds.length > 0,
// Count doesn't change frequently
staleTime: 1000 * 60 * 5, // 5 minutes
});
};