import 'package:catcher/catcher.dart'; import 'package:fl_query/fl_query.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/hooks/use_spotify_infinite_query.dart'; import 'package:spotube/hooks/use_spotify_query.dart'; class PlaylistQueries { Query useDoesUserFollowQuery( WidgetRef ref, String playlistId, String userId, ) { return useSpotifyQuery( "playlist-is-followed/$playlistId/$userId", (spotify) async { final result = await spotify.playlists.followedBy(playlistId, [userId]); return result.first; }, ref: ref, ); } Query, dynamic> useOfMineQuery(WidgetRef ref) { return useSpotifyQuery, dynamic>( "current-user-playlists", (spotify) { return spotify.playlists.me.all(); }, ref: ref, ); } Future> tracksOf(String playlistId, SpotifyApi spotify) { if (playlistId == "user-liked-tracks") { return spotify.tracks.me.saved.all().then( (tracks) => tracks.map((e) => e.track!).toList(), ); } return spotify.playlists.getTracksByPlaylistId(playlistId).all().then( (value) => value.toList(), ); } Query, dynamic> useTracksOfQuery( WidgetRef ref, String playlistId, ) { return useSpotifyQuery, dynamic>( "playlist-tracks/$playlistId", (spotify) => tracksOf(playlistId, spotify), ref: ref, ); } InfiniteQuery, dynamic, int> useFeaturedQuery( WidgetRef ref, ) { return useSpotifyInfiniteQuery, dynamic, int>( "featured-playlists", (pageParam, spotify) async { try { final playlists = await spotify.playlists.featured.getPage(5, pageParam); return playlists; } catch (e, stack) { Catcher.reportCheckedError(e, stack); rethrow; } }, initialPage: 0, nextPage: (lastPage, pages) => pages.last.isLast || (pages.last.items?.length ?? 0) < 5 ? null : pages.last.nextOffset, ref: ref, ); } }