import 'package:collection/collection.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/metadata_plugin/metadata_plugin_provider.dart'; import 'package:spotube/provider/metadata_plugin/utils/paginated.dart'; import 'package:spotube/services/metadata/endpoints/error.dart'; class FavoritePlaylistsNotifier extends PaginatedAsyncNotifier { FavoritePlaylistsNotifier() : super(); @override fetch(int offset, int limit) async { final playlists = await (await metadataPlugin) ?.user .savedPlaylists(limit: limit, offset: offset); return playlists!; } @override build() async { ref.watch(metadataPluginProvider); final playlists = await fetch(0, 20); return playlists; } void updatePlaylist(SpotubeSimplePlaylistObject playlist) { if (state.value == null) return; if (state.value!.items.none((e) => e.id == playlist.id)) return; state = AsyncData( state.value!.copyWith( items: state.value!.items .map((element) => element.id == playlist.id ? playlist : element) .toList() as List, ) as SpotubePaginationResponseObject, ); } // Future addFavorite(PlaylistSimple playlist) async { // await update((state) async { // await spotify.invoke( // (api) => api.playlists.followPlaylist(playlist.id!), // ); // return state.copyWith( // items: [...state.items, playlist], // ); // }); // ref.invalidate(isFavoritePlaylistProvider(playlist.id!)); // } // Future removeFavorite(PlaylistSimple playlist) async { // await update((state) async { // await spotify.invoke( // (api) => api.playlists.unfollowPlaylist(playlist.id!), // ); // return state.copyWith( // items: state.items.where((e) => e.id != playlist.id).toList(), // ); // }); // ref.invalidate(isFavoritePlaylistProvider(playlist.id!)); // } // Future addTracks(String playlistId, List trackIds) async { // if (state.value == null) return; // final spotify = ref.read(spotifyProvider); // await spotify.invoke( // (api) => api.playlists.addTracks( // trackIds.map((id) => 'spotify:track:$id').toList(), // playlistId, // ), // ); // ref.invalidate(playlistTracksProvider(playlistId)); // } // Future removeTracks(String playlistId, List trackIds) async { // if (state.value == null) return; // final spotify = ref.read(spotifyProvider); // await spotify.invoke( // (api) => api.playlists.removeTracks( // trackIds.map((id) => 'spotify:track:$id').toList(), // playlistId, // ), // ); // ref.invalidate(playlistTracksProvider(playlistId)); // } } final metadataPluginSavedPlaylistsProvider = AsyncNotifierProvider< FavoritePlaylistsNotifier, SpotubePaginationResponseObject>( () => FavoritePlaylistsNotifier(), ); final metadataPluginIsSavedPlaylistProvider = FutureProvider.family( (ref, id) async { final plugin = await ref.watch(metadataPluginProvider.future); if (plugin == null) { throw MetadataPluginException.noDefaultPlugin( "Failed to get metadata plugin", ); } final follows = await plugin.user.isSavedPlaylist(id); return follows; }, );