diff --git a/lib/modules/player/player_actions.dart b/lib/modules/player/player_actions.dart index 4e3de7e0..df1e2a2d 100644 --- a/lib/modules/player/player_actions.dart +++ b/lib/modules/player/player_actions.dart @@ -2,7 +2,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/routes.gr.dart'; diff --git a/lib/pages/playlist/playlist.dart b/lib/pages/playlist/playlist.dart index 1f6ca75d..b50bf147 100644 --- a/lib/pages/playlist/playlist.dart +++ b/lib/pages/playlist/playlist.dart @@ -95,7 +95,11 @@ class PlaylistPage extends HookConsumerWidget { if (!confirmed) return null; if (isFavoritePlaylist.asData!.value) { - await favoritePlaylistsNotifier.removeFavorite(playlist); + if (isUserPlaylist) { + await favoritePlaylistsNotifier.delete(playlist.id); + } else { + await favoritePlaylistsNotifier.removeFavorite(playlist); + } } else { await favoritePlaylistsNotifier.addFavorite(playlist); } diff --git a/lib/provider/metadata_plugin/library/playlists.dart b/lib/provider/metadata_plugin/library/playlists.dart index 40db7951..832e7a04 100644 --- a/lib/provider/metadata_plugin/library/playlists.dart +++ b/lib/provider/metadata_plugin/library/playlists.dart @@ -64,15 +64,18 @@ class MetadataPluginSavedPlaylistsNotifier } Future delete(String playlistId) async { - await update((state) async { - (await metadataPlugin).playlist.deletePlaylist(playlistId); - return state.copyWith( - items: state.items.where((e) => (e).id != playlistId).toList(), - ); - }); - - ref.invalidate(metadataPluginIsSavedPlaylistProvider(playlistId)); - ref.invalidate(metadataPluginPlaylistTracksProvider(playlistId)); + if (state.value == null) return; + final oldState = state; + try { + state = const AsyncLoading(); + await (await metadataPlugin).playlist.deletePlaylist(playlistId); + ref.invalidateSelf(); + ref.invalidate(metadataPluginIsSavedPlaylistProvider(playlistId)); + ref.invalidate(metadataPluginPlaylistTracksProvider(playlistId)); + } catch (e) { + state = oldState; + rethrow; + } } Future addTracks(String playlistId, List trackIds) async { diff --git a/lib/provider/metadata_plugin/playlist/playlist.dart b/lib/provider/metadata_plugin/playlist/playlist.dart index af26673a..79ead185 100644 --- a/lib/provider/metadata_plugin/playlist/playlist.dart +++ b/lib/provider/metadata_plugin/playlist/playlist.dart @@ -40,23 +40,23 @@ class MetadataPluginPlaylistNotifier if (userId == null) { throw Exception('User ID is not available. Please log in first.'); } - await update( - (prev) async { - try { - final playlist = await (await metadataPlugin).playlist.create( - userId, - name: name, - description: description, - public: public, - collaborative: collaborative, - ); - return playlist!; - } catch (e) { - onError?.call(e); - rethrow; - } - }, - ); + state = const AsyncValue.loading(); + try { + final playlist = await (await metadataPlugin).playlist.create( + userId, + name: name, + description: description, + public: public, + collaborative: collaborative, + ); + if (playlist != null) { + state = AsyncValue.data(playlist); + } + ref.invalidate(metadataPluginSavedPlaylistsProvider); + } catch (e) { + onError?.call(e); + rethrow; + } } Future modify({ diff --git a/lib/services/metadata/endpoints/playlist.dart b/lib/services/metadata/endpoints/playlist.dart index 2a411ebd..c7f20487 100644 --- a/lib/services/metadata/endpoints/playlist.dart +++ b/lib/services/metadata/endpoints/playlist.dart @@ -127,7 +127,7 @@ class MetadataPluginPlaylistEndpoint { } Future deletePlaylist(String playlistId) async { - await hetuMetadataPlaylist.invoke( + return await hetuMetadataPlaylist.invoke( "deletePlaylist", positionalArgs: [playlistId], );