mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 17:51:12 -05:00
65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
|
import { supabase } from '@/lib/supabaseClient';
|
|
import { Profile } from '@/types/database';
|
|
import { getErrorMessage } from '@/lib/errorHandler';
|
|
|
|
export function useProfile(userId: string | undefined) {
|
|
const queryClient = useQueryClient();
|
|
|
|
const query = useQuery({
|
|
queryKey: ['profile', userId],
|
|
queryFn: async () => {
|
|
if (!userId) return null;
|
|
|
|
// Get current viewer ID
|
|
const { data: { user } } = await supabase.auth.getUser();
|
|
const viewerId = user?.id || null;
|
|
|
|
// Use get_filtered_profile RPC for privacy-aware field filtering
|
|
const { data, error } = await supabase.rpc('get_filtered_profile', {
|
|
_profile_user_id: userId,
|
|
_viewer_id: viewerId || ''
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
if (!data) return null;
|
|
|
|
// Type the JSONB response properly
|
|
const profileData = data as unknown as Profile;
|
|
|
|
// Fetch location separately if location_id is present and visible
|
|
if (profileData.location_id) {
|
|
const { data: location } = await supabase
|
|
.from('locations')
|
|
.select('id, name, city, state_province, country, timezone')
|
|
.eq('id', profileData.location_id)
|
|
.single();
|
|
|
|
if (location) {
|
|
profileData.location = location;
|
|
}
|
|
}
|
|
|
|
return profileData;
|
|
},
|
|
enabled: !!userId,
|
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
refetchOnWindowFocus: false,
|
|
retry: 2,
|
|
});
|
|
|
|
const refreshProfile = () => {
|
|
if (userId) {
|
|
queryClient.invalidateQueries({ queryKey: ['profile', userId] });
|
|
}
|
|
};
|
|
|
|
return {
|
|
...query,
|
|
refreshProfile,
|
|
};
|
|
}
|