Files
thrilltrack-explorer/src-old/hooks/rides/useRideDetail.ts

52 lines
1.6 KiB
TypeScript

import { useQuery } from '@tanstack/react-query';
import { supabase } from '@/lib/supabaseClient';
import { queryKeys } from '@/lib/queryKeys';
/**
* Hook to fetch ride detail with park, manufacturer, and designer
*/
export function useRideDetail(parkSlug: string | undefined, rideSlug: string | undefined, enabled = true) {
return useQuery({
queryKey: queryKeys.rides.detail(parkSlug || '', rideSlug || ''),
queryFn: async () => {
if (!parkSlug || !rideSlug) throw new Error('Both park and ride slugs are required');
// First get park to find park_id
const { data: parkData, error: parkError } = await supabase
.from('parks')
.select('id')
.eq('slug', parkSlug)
.maybeSingle();
if (parkError) throw parkError;
if (!parkData) return null;
// Then get ride details
const { data: rideData, error: rideError } = await supabase
.from('rides')
.select(`
*,
park:parks!inner(id, name, slug, location:locations(*)),
manufacturer:companies!rides_manufacturer_id_fkey(*),
designer:companies!rides_designer_id_fkey(*)
`)
.eq('park_id', parkData.id)
.eq('slug', rideSlug)
.maybeSingle();
if (rideError) throw rideError;
// Add currentParkId for easier access
if (rideData) {
return { ...rideData, currentParkId: parkData.id };
}
return rideData;
},
enabled: enabled && !!parkSlug && !!rideSlug,
staleTime: 5 * 60 * 1000, // 5 minutes
gcTime: 15 * 60 * 1000, // 15 minutes
refetchOnWindowFocus: false,
});
}