import 'package:collection/collection.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 ArtistQueries { const ArtistQueries(); Query get( WidgetRef ref, String artist, ) { return useSpotifyQuery( "artist-profile/$artist", (spotify) => spotify.artists.get(artist), ref: ref, ); } InfiniteQuery, dynamic, String> followedByMe( WidgetRef ref) { return useSpotifyInfiniteQuery, dynamic, String>( "user-following-artists", (pageParam, spotify) async { return spotify.me .following(FollowingType.artist) .getPage(15, pageParam); }, initialPage: "", nextPage: (lastPage, pages) => pages.last.isLast || (pages.last.items?.length ?? 0) < 15 ? null : pages.last.after, ref: ref, ); } Query doIFollow( WidgetRef ref, String artist, ) { return useSpotifyQuery( "user-follows-artists-query/$artist", (spotify) async { final result = await spotify.me.isFollowing( FollowingType.artist, [artist], ); return result.first; }, ref: ref, ); } Query, dynamic> topTracksOf( WidgetRef ref, String artist, ) { return useSpotifyQuery, dynamic>( "artist-top-track-query/$artist", (spotify) { return spotify.artists.getTopTracks(artist, "US"); }, ref: ref, ); } InfiniteQuery, dynamic, int> albumsOf( WidgetRef ref, String artist, ) { return useSpotifyInfiniteQuery, dynamic, int>( "artist-albums/$artist", (pageParam, spotify) async { return spotify.artists.albums(artist).getPage(5, pageParam); }, initialPage: 0, nextPage: (lastPage, pages) { final page = pages.elementAtOrNull(lastPage); if (page == null || page.isLast || (page.items ?? []).length < 5) { return null; } return page.nextOffset; }, ref: ref, ); } Query, dynamic> relatedArtistsOf( WidgetRef ref, String artist, ) { return useSpotifyQuery, dynamic>( "artist-related-artist-query/$artist", (spotify) { return spotify.artists.getRelatedArtists(artist); }, ref: ref, ); } }