68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { useQuery } from '@tanstack/react-query';
|
|
import { fetchStatistics, fetchItemNames, searchItems, fetchItemGroup } from '@/lib/api';
|
|
import { FilterState, FitStatistics, ItemCount } from '@/types/api';
|
|
import { useMemo } from 'react';
|
|
|
|
export function useStatistics(filters: FilterState) {
|
|
return useQuery({
|
|
queryKey: ['statistics', filters],
|
|
queryFn: () => fetchStatistics({
|
|
ship: filters.ship,
|
|
systems: filters.systems.length > 0 ? filters.systems : undefined,
|
|
modules: filters.modules.length > 0 ? filters.modules : undefined,
|
|
groups: filters.groups.length > 0 ? filters.groups : undefined,
|
|
}),
|
|
staleTime: 30000,
|
|
});
|
|
}
|
|
|
|
export function useItemNames(ids: number[]) {
|
|
return useQuery({
|
|
queryKey: ['itemNames', ids.sort().join(',')],
|
|
queryFn: () => fetchItemNames(ids),
|
|
enabled: ids.length > 0,
|
|
staleTime: Infinity, // Item names don't change
|
|
});
|
|
}
|
|
|
|
export function useSearch(query: string) {
|
|
return useQuery({
|
|
queryKey: ['search', query],
|
|
queryFn: () => searchItems(query),
|
|
enabled: query.length >= 2,
|
|
staleTime: 60000,
|
|
});
|
|
}
|
|
|
|
export function useItemGroup(itemId: number | null) {
|
|
return useQuery({
|
|
queryKey: ['itemGroup', itemId],
|
|
queryFn: () => fetchItemGroup(itemId!),
|
|
enabled: itemId !== null,
|
|
staleTime: Infinity, // Groups don't change
|
|
});
|
|
}
|
|
|
|
// Hook to extract all unique item IDs from statistics for batch name lookup
|
|
export function useStatisticsItemIds(stats: FitStatistics | undefined): number[] {
|
|
return useMemo(() => {
|
|
if (!stats) return [];
|
|
|
|
const ids = new Set<number>();
|
|
|
|
const addItems = (items: ItemCount[]) => {
|
|
items.forEach(item => ids.add(item.itemId));
|
|
};
|
|
|
|
addItems(stats.ships);
|
|
addItems(stats.systemBreakdown);
|
|
addItems(stats.highSlotModules);
|
|
addItems(stats.midSlotModules);
|
|
addItems(stats.lowSlotModules);
|
|
addItems(stats.rigs);
|
|
addItems(stats.drones);
|
|
|
|
return Array.from(ids);
|
|
}, [stats]);
|
|
}
|