Files
thrilltrack-explorer/src-old/hooks/search/useGlobalSearch.ts

54 lines
1.8 KiB
TypeScript

import { useQuery } from '@tanstack/react-query';
import { supabase } from '@/lib/supabaseClient';
import { queryKeys } from '@/lib/queryKeys';
/**
* Hook for global search across parks, rides, and companies
* Searches in parallel and caches results
*/
export function useGlobalSearch(query: string) {
return useQuery({
queryKey: queryKeys.search.global(query.toLowerCase()),
queryFn: async () => {
if (query.length < 2) {
return { parks: [], rides: [], companies: [] };
}
const searchTerm = `%${query.toLowerCase()}%`;
// Run all 3 queries in parallel
const [parksResult, ridesResult, companiesResult] = await Promise.all([
supabase
.from('parks')
.select(`*, location:locations(*)`)
.or(`name.ilike.${searchTerm},description.ilike.${searchTerm}`)
.limit(5),
supabase
.from('rides')
.select(`*, park:parks!inner(name, slug)`)
.or(`name.ilike.${searchTerm},description.ilike.${searchTerm}`)
.limit(5),
supabase
.from('companies')
.select('id, name, slug, description, company_type, logo_url, average_rating, review_count')
.or(`name.ilike.${searchTerm},description.ilike.${searchTerm}`)
.limit(3),
]);
if (parksResult.error) throw parksResult.error;
if (ridesResult.error) throw ridesResult.error;
if (companiesResult.error) throw companiesResult.error;
return {
parks: parksResult.data || [],
rides: ridesResult.data || [],
companies: companiesResult.data || [],
};
},
enabled: query.length >= 2,
staleTime: 2 * 60 * 1000, // 2 minutes - search results fairly stable
gcTime: 5 * 60 * 1000,
refetchOnWindowFocus: false,
});
}