import 'package:hooks_riverpod/hooks_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/common.dart'; import 'package:spotube/provider/metadata_plugin/utils/paginated.dart'; class MetadataPluginSavedTracksNotifier extends AutoDisposePaginatedAsyncNotifier { MetadataPluginSavedTracksNotifier() : super(); @override fetch(offset, limit) async { final tracks = await (await metadataPlugin).user.savedTracks( offset: offset, limit: limit, ); return tracks; } @override build() async { ref.cacheFor(); ref.watch(metadataPluginProvider); return await fetch(0, 20); } Future addFavorite(List tracks) async { await (await metadataPlugin).track.save(tracks.map((e) => e.id).toList()); for (final track in tracks) { ref.invalidate(metadataPluginIsSavedTrackProvider(track.id)); } } Future removeFavorite(List tracks) async { await (await metadataPlugin).track.unsave(tracks.map((e) => e.id).toList()); for (final track in tracks) { ref.invalidate(metadataPluginIsSavedTrackProvider(track.id)); } } } final metadataPluginSavedTracksProvider = AutoDisposeAsyncNotifierProvider< MetadataPluginSavedTracksNotifier, SpotubePaginationResponseObject>( () => MetadataPluginSavedTracksNotifier(), ); final metadataPluginIsSavedTrackProvider = FutureProvider.autoDispose.family( (ref, trackId) async { final metadataPlugin = await ref.watch(metadataPluginProvider.future); return metadataPlugin!.user .isSavedTracks([trackId]).then((value) => value.first); }, );