TO prevet making multiple requests I do this for getting the playlist :
export const usePlaylistFull = (playlistId: number) => {
const queryClient = useQueryClient();
const supabase = useSupabaseClient();
return useQuery({
queryKey: playlistKeys.detail(playlistId),
queryFn: async () => {
if (!playlistId) throw Error('Missing playlist id');
const { data, error } = await supabase
.from('playlist')
.select(`
*,
user(*),
items:playlist_item(
*,
movie(*)
),
guests:playlist_guest(
*,
user:user(*)
)
`)
.eq('id', playlistId)
.order('rank', { ascending: true, referencedTable: 'playlist_item' })
.returns<Playlist[]>()
.single();
if (error || !data) throw error;
queryClient.setQueryData(playlistKeys.items(playlistId), data.items);
queryClient.setQueryData(playlistKeys.guests(playlistId), data.guests);
const { items, guests, ...playlistData } = data;
return playlistData;
},
enabled: !!playlistId,
});
}
SO here I manually set Query data for playlistItems for making only one requst. But the usePlayItems do this for being invalidate (only items) :
export const usePlaylistItems = (playlistId?: number) => {
const supabase = useSupabaseClient();
return useQuery({
queryKey: playlistKeys.items(playlistId as number),
queryFn: async () => {
if (!playlistId) throw Error('Missing playlist id');
const { data, error } = await supabase
.from('playlist_item')
.select(`
*,
movie(*)
`)
.eq('playlist_id', playlistId)
.order('rank', { ascending: true })
if (error) throw error;
return data;
},
enabled: !!playlistId,
});
}```