feat: Implement full Phase 3 API optimizations

This commit is contained in:
gpt-engineer-app[bot]
2025-10-30 23:02:26 +00:00
parent 46ca1c29bc
commit 0091584677
18 changed files with 654 additions and 243 deletions

View File

@@ -0,0 +1,38 @@
import { useQuery } from '@tanstack/react-query';
import { supabase } from '@/integrations/supabase/client';
import { queryKeys } from '@/lib/queryKeys';
/**
* Hook to fetch reviews for a specific entity (park or ride)
*/
export function useEntityReviews(entityType: 'park' | 'ride', entityId: string | undefined, enabled = true) {
return useQuery({
queryKey: queryKeys.reviews.entity(entityType, entityId || ''),
queryFn: async () => {
if (!entityId) return [];
const query = supabase
.from('reviews')
.select(`
*,
profiles!reviews_user_id_fkey(username, avatar_url, display_name)
`)
.eq('moderation_status', 'approved')
.order('created_at', { ascending: false });
if (entityType === 'park') {
query.eq('park_id', entityId);
} else {
query.eq('ride_id', entityId);
}
const { data, error } = await query;
if (error) throw error;
return data || [];
},
enabled: enabled && !!entityId,
staleTime: 3 * 60 * 1000, // 3 minutes
gcTime: 10 * 60 * 1000,
refetchOnWindowFocus: false,
});
}

View File

@@ -0,0 +1,61 @@
import { useQuery } from '@tanstack/react-query';
import { supabase } from '@/integrations/supabase/client';
import { queryKeys } from '@/lib/queryKeys';
/**
* Hook to fetch all reviews by a specific user
*/
export function useUserReviews(
userId: string | undefined,
filter: 'all' | 'parks' | 'rides',
sortBy: 'date' | 'rating',
enabled = true
) {
return useQuery({
queryKey: queryKeys.reviews.user(userId || '', filter, sortBy),
queryFn: async () => {
if (!userId) return [];
let query = supabase
.from('reviews')
.select(`
id,
rating,
title,
content,
visit_date,
wait_time_minutes,
helpful_votes,
moderation_status,
created_at,
parks:park_id (id, name, slug),
rides:ride_id (
id,
name,
slug,
parks:park_id (name, slug)
)
`)
.eq('user_id', userId);
if (filter === 'parks') {
query = query.not('park_id', 'is', null);
} else if (filter === 'rides') {
query = query.not('ride_id', 'is', null);
}
query = query.order(
sortBy === 'date' ? 'created_at' : 'rating',
{ ascending: false }
);
const { data, error } = await query;
if (error) throw error;
return data || [];
},
enabled: enabled && !!userId,
staleTime: 5 * 60 * 1000, // 5 minutes
gcTime: 15 * 60 * 1000,
refetchOnWindowFocus: false,
});
}