import 'package:riverpod/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'; class MetadataPluginSavedAlbumNotifier extends PaginatedAsyncNotifier { @override Future> fetch( int offset, int limit, ) async { return await (await metadataPlugin).user.savedAlbums( limit: limit, offset: offset, ); } @override build() async { ref.watch(metadataPluginProvider); return await fetch(0, 20); } Future addFavorite(List albums) async { await update((state) async { (await metadataPlugin).album.save(albums.map((e) => e.id).toList()); return state.copyWith( items: [...state.items, ...albums], ); }); for (final album in albums) { ref.invalidate(metadataPluginIsSavedAlbumProvider(album.id)); } } Future removeFavorite(List albums) async { await update((state) async { final albumIds = albums.map((e) => e.id).toList(); (await metadataPlugin).album.unsave(albumIds); return state.copyWith( items: state.items .where( (e) => albumIds.contains((e).id) == false, ) .toList(), ); }); for (final album in albums) { ref.invalidate(metadataPluginIsSavedAlbumProvider(album.id)); } } } final metadataPluginSavedAlbumsProvider = AsyncNotifierProvider< MetadataPluginSavedAlbumNotifier, SpotubePaginationResponseObject>( () => MetadataPluginSavedAlbumNotifier(), ); final metadataPluginIsSavedAlbumProvider = FutureProvider.autoDispose.family( (ref, albumId) async { final metadataPlugin = await ref.watch(metadataPluginProvider.future); return metadataPlugin!.user .isSavedAlbums([albumId]).then((value) => value.first); }, );