/** * Inventory Dashboard React Query hooks */ import { useMutation, useQuery, useQueryClient, UseQueryOptions, UseMutationOptions } from '@tanstack/react-query'; import { inventoryDashboardService } from '../services/inventoryDashboard'; import { InventoryDashboardSummary, InventoryAnalytics, BusinessModelInsights, DashboardFilter, AlertsFilter, RecentActivity, } from '../types/dashboard'; import { ApiError } from '../client'; // Query Keys export const inventoryDashboardKeys = { all: ['inventory-dashboard'] as const, summary: (tenantId: string, filter?: DashboardFilter) => [...inventoryDashboardKeys.all, 'summary', tenantId, filter] as const, analytics: (tenantId: string, startDate?: string, endDate?: string) => [...inventoryDashboardKeys.all, 'analytics', tenantId, { startDate, endDate }] as const, insights: (tenantId: string) => [...inventoryDashboardKeys.all, 'business-insights', tenantId] as const, activity: (tenantId: string, limit?: number) => [...inventoryDashboardKeys.all, 'recent-activity', tenantId, limit] as const, alerts: (tenantId: string, filter?: AlertsFilter) => [...inventoryDashboardKeys.all, 'alerts', tenantId, filter] as const, stockSummary: (tenantId: string) => [...inventoryDashboardKeys.all, 'stock-summary', tenantId] as const, topCategories: (tenantId: string, limit?: number) => [...inventoryDashboardKeys.all, 'top-categories', tenantId, limit] as const, expiryCalendar: (tenantId: string, daysAhead?: number) => [...inventoryDashboardKeys.all, 'expiry-calendar', tenantId, daysAhead] as const, } as const; // Queries export const useInventoryDashboardSummary = ( tenantId: string, filter?: DashboardFilter, options?: Omit, 'queryKey' | 'queryFn'> ) => { return useQuery({ queryKey: inventoryDashboardKeys.summary(tenantId, filter), queryFn: () => inventoryDashboardService.getDashboardSummary(tenantId, filter), enabled: !!tenantId, staleTime: 30 * 1000, // 30 seconds ...options, }); }; export const useInventoryAnalytics = ( tenantId: string, startDate?: string, endDate?: string, options?: Omit, 'queryKey' | 'queryFn'> ) => { return useQuery({ queryKey: inventoryDashboardKeys.analytics(tenantId, startDate, endDate), queryFn: () => inventoryDashboardService.getInventoryAnalytics(tenantId, startDate, endDate), enabled: !!tenantId, staleTime: 2 * 60 * 1000, // 2 minutes ...options, }); }; export const useBusinessModelInsights = ( tenantId: string, options?: Omit, 'queryKey' | 'queryFn'> ) => { return useQuery({ queryKey: inventoryDashboardKeys.insights(tenantId), queryFn: () => inventoryDashboardService.getBusinessModelInsights(tenantId), enabled: !!tenantId, staleTime: 10 * 60 * 1000, // 10 minutes ...options, }); }; export const useRecentActivity = ( tenantId: string, limit: number = 20, options?: Omit, 'queryKey' | 'queryFn'> ) => { return useQuery({ queryKey: inventoryDashboardKeys.activity(tenantId, limit), queryFn: () => inventoryDashboardService.getRecentActivity(tenantId, limit), enabled: !!tenantId, staleTime: 30 * 1000, // 30 seconds ...options, }); }; export const useInventoryAlerts = ( tenantId: string, filter?: AlertsFilter, options?: Omit, 'queryKey' | 'queryFn'> ) => { return useQuery<{ items: any[]; total: number }, ApiError>({ queryKey: inventoryDashboardKeys.alerts(tenantId, filter), queryFn: () => inventoryDashboardService.getAlerts(tenantId, filter), enabled: !!tenantId, staleTime: 30 * 1000, // 30 seconds ...options, }); }; export const useStockSummary = ( tenantId: string, options?: Omit, 'queryKey' | 'queryFn'> ) => { return useQuery<{ in_stock: number; low_stock: number; out_of_stock: number; overstock: number; total_value: number; }, ApiError>({ queryKey: inventoryDashboardKeys.stockSummary(tenantId), queryFn: () => inventoryDashboardService.getStockSummary(tenantId), enabled: !!tenantId, staleTime: 1 * 60 * 1000, // 1 minute ...options, }); }; export const useTopCategories = ( tenantId: string, limit: number = 10, options?: Omit, ApiError>, 'queryKey' | 'queryFn'> ) => { return useQuery, ApiError>({ queryKey: inventoryDashboardKeys.topCategories(tenantId, limit), queryFn: () => inventoryDashboardService.getTopCategories(tenantId, limit), enabled: !!tenantId, staleTime: 5 * 60 * 1000, // 5 minutes ...options, }); }; export const useExpiryCalendar = ( tenantId: string, daysAhead: number = 30, options?: Omit; }>, ApiError>, 'queryKey' | 'queryFn'> ) => { return useQuery; }>, ApiError>({ queryKey: inventoryDashboardKeys.expiryCalendar(tenantId, daysAhead), queryFn: () => inventoryDashboardService.getExpiryCalendar(tenantId, daysAhead), enabled: !!tenantId, staleTime: 5 * 60 * 1000, // 5 minutes ...options, }); };