diff --git a/src/components/profile/RideCreditsManager.tsx b/src/components/profile/RideCreditsManager.tsx index 0678ca3b..5bca06a8 100644 --- a/src/components/profile/RideCreditsManager.tsx +++ b/src/components/profile/RideCreditsManager.tsx @@ -29,6 +29,20 @@ export function RideCreditsManager({ userId }: RideCreditsManagerProps) { const fetchCredits = async () => { try { setLoading(true); + + // First, get ride IDs that match the category filter (if any) + let rideIdsToFilter: string[] | null = null; + if (filterCategory !== 'all') { + const { data: filteredRides, error: rideError } = await supabase + .from('rides') + .select('id') + .eq('category', filterCategory); + + if (rideError) throw rideError; + rideIdsToFilter = filteredRides.map(r => r.id); + } + + // Build main query let query = supabase .from('user_ride_credits') .select(` @@ -47,24 +61,42 @@ export function RideCreditsManager({ userId }: RideCreditsManagerProps) { ) `) .eq('user_id', userId); - - if (filterCategory !== 'all') { - query = query.eq('rides.category', filterCategory); + + // Apply ride ID filter if category filter is active + if (rideIdsToFilter && rideIdsToFilter.length > 0) { + query = query.in('ride_id', rideIdsToFilter); + } else if (rideIdsToFilter && rideIdsToFilter.length === 0) { + // No rides match the category - return empty + setCredits([]); + setLoading(false); + return; } - + + // Apply sorting if (sortBy === 'date') { query = query.order('first_ride_date', { ascending: false, nullsFirst: false }); } else if (sortBy === 'count') { query = query.order('ride_count', { ascending: false }); } else if (sortBy === 'name') { - query = query.order('rides(name)', { ascending: true }); + // Note: Can't order by joined table - we'll sort client-side + query = query.order('created_at', { ascending: false }); } - + const { data, error } = await query; if (error) throw error; - // Type assertion since the query returns properly structured data - setCredits((data || []) as UserRideCredit[]); + let processedData = (data || []) as UserRideCredit[]; + + // Sort by name client-side if needed + if (sortBy === 'name') { + processedData.sort((a, b) => { + const nameA = a.rides?.name || ''; + const nameB = b.rides?.name || ''; + return nameA.localeCompare(nameB); + }); + } + + setCredits(processedData); } catch (error) { console.error('Error fetching ride credits:', error); toast.error(getErrorMessage(error));