diff --git a/lib/components/shared/tracks_view/sections/header/header_actions.dart b/lib/components/shared/tracks_view/sections/header/header_actions.dart index b050c199..75aa3f61 100644 --- a/lib/components/shared/tracks_view/sections/header/header_actions.dart +++ b/lib/components/shared/tracks_view/sections/header/header_actions.dart @@ -70,9 +70,9 @@ class TrackViewHeaderActions extends HookConsumerWidget { tooltip: props.isLiked ? context.l10n.remove_from_favorites : context.l10n.save_as_favorite, - onPressed: () { - props.onHeart?.call(); - if (isUserPlaylist) { + onPressed: () async { + final shouldPop = await props.onHeart?.call(); + if (isUserPlaylist && shouldPop == true && context.mounted) { context.pop(); } }, diff --git a/lib/components/shared/tracks_view/track_view_props.dart b/lib/components/shared/tracks_view/track_view_props.dart index 1c6c7647..21bbaec7 100644 --- a/lib/components/shared/tracks_view/track_view_props.dart +++ b/lib/components/shared/tracks_view/track_view_props.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:fl_query/fl_query.dart'; import 'package:flutter/material.dart' hide Page; import 'package:spotify/spotify.dart'; @@ -62,7 +64,7 @@ class InheritedTrackView extends InheritedWidget { final String shareUrl; // events - final VoidCallback? onHeart; // if null heart button will hidden + final FutureOr Function()? onHeart; // if null heart button will hidden const InheritedTrackView({ super.key, diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 0628cc43..b1e8331f 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -290,5 +290,7 @@ "start_a_radio": "Start a Radio", "how_to_start_radio": "How do you want to start the radio?", "replace_queue_question": "Do you want to replace the current queue or append to it?", - "endless_playback": "Endless Playback" + "endless_playback": "Endless Playback", + "delete_playlist": "Delete Playlist", + "delete_playlist_confirmation": "Are you sure you want to delete this playlist?" } \ No newline at end of file diff --git a/lib/pages/playlist/playlist.dart b/lib/pages/playlist/playlist.dart index 29601a09..89a279ab 100644 --- a/lib/pages/playlist/playlist.dart +++ b/lib/pages/playlist/playlist.dart @@ -2,8 +2,11 @@ import 'package:flutter/material.dart' hide Page; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; +import 'package:spotube/components/shared/dialogs/prompt_dialog.dart'; +import 'package:spotube/components/shared/tracks_view/sections/body/use_is_user_playlist.dart'; import 'package:spotube/components/shared/tracks_view/track_view.dart'; import 'package:spotube/components/shared/tracks_view/track_view_props.dart'; +import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/infinite_query.dart'; import 'package:spotube/provider/spotify_provider.dart'; import 'package:spotube/services/mutations/mutations.dart'; @@ -45,6 +48,8 @@ class PlaylistPage extends HookConsumerWidget { ], ); + final isUserPlaylist = useIsUserPlaylist(ref, playlist.id!); + return InheritedTrackView( collectionId: playlist.id!, image: TypeConversionUtils.image_X_UrlString( @@ -72,9 +77,20 @@ class PlaylistPage extends HookConsumerWidget { shareUrl: playlist.externalUrls?.spotify ?? "", onHeart: () async { if (!isLikedQuery.hasData || togglePlaylistLike.isMutating) { - return; + return false; } - await togglePlaylistLike.mutate(isLikedQuery.data!); + final confirmed = isUserPlaylist + ? await showPromptDialog( + context: context, + title: context.l10n.delete_playlist, + message: context.l10n.delete_playlist_confirmation, + ) + : true; + if (confirmed) { + await togglePlaylistLike.mutate(isLikedQuery.data!); + return isUserPlaylist; + } + return null; }, child: const TrackView(), ); diff --git a/untranslated_messages.json b/untranslated_messages.json index e4e45624..4525caeb 100644 --- a/untranslated_messages.json +++ b/untranslated_messages.json @@ -3,77 +3,99 @@ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "bn": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "ca": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "de": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "es": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "fa": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "fr": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "hi": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "it": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "ja": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "ne": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "nl": [ @@ -81,48 +103,62 @@ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "pl": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "pt": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "ru": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "tr": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "uk": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ], "zh": [ "start_a_radio", "how_to_start_radio", "replace_queue_question", - "endless_playback" + "endless_playback", + "delete_playlist", + "delete_playlist_confirmation" ] }