mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-14 08:25:16 +00:00
fix: "Add () to Playlist" option not showing in favorited playlists #904
This commit is contained in:
parent
96e0e8640d
commit
96021e1a49
@ -11,9 +11,12 @@ import 'package:spotube/services/queries/queries.dart';
|
|||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
import 'package:spotube/utils/type_conversion_utils.dart';
|
||||||
|
|
||||||
class PlaylistAddTrackDialog extends HookConsumerWidget {
|
class PlaylistAddTrackDialog extends HookConsumerWidget {
|
||||||
|
/// The id of the playlist this dialog was opened from
|
||||||
|
final String? openFromPlaylist;
|
||||||
final List<Track> tracks;
|
final List<Track> tracks;
|
||||||
const PlaylistAddTrackDialog({
|
const PlaylistAddTrackDialog({
|
||||||
required this.tracks,
|
required this.tracks,
|
||||||
|
required this.openFromPlaylist,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@ -30,11 +33,12 @@ class PlaylistAddTrackDialog extends HookConsumerWidget {
|
|||||||
?.where(
|
?.where(
|
||||||
(playlist) =>
|
(playlist) =>
|
||||||
playlist.owner?.id != null &&
|
playlist.owner?.id != null &&
|
||||||
playlist.owner!.id == me.data?.id,
|
playlist.owner!.id == me.data?.id &&
|
||||||
|
playlist.id != openFromPlaylist,
|
||||||
)
|
)
|
||||||
.toList() ??
|
.toList() ??
|
||||||
[],
|
[],
|
||||||
[userPlaylists.data, me.data?.id],
|
[userPlaylists.data, me.data?.id, openFromPlaylist],
|
||||||
);
|
);
|
||||||
|
|
||||||
final playlistsCheck = useState(<String, bool>{});
|
final playlistsCheck = useState(<String, bool>{});
|
||||||
|
@ -64,11 +64,15 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void actionAddToPlaylist(BuildContext context, Track track) {
|
void actionAddToPlaylist(
|
||||||
|
BuildContext context,
|
||||||
|
Track track,
|
||||||
|
) {
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) => PlaylistAddTrackDialog(
|
builder: (context) => PlaylistAddTrackDialog(
|
||||||
tracks: [track],
|
tracks: [track],
|
||||||
|
openFromPlaylist: playlistId,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ class TrackViewBodySection extends HookConsumerWidget {
|
|||||||
final playlist = ref.watch(ProxyPlaylistNotifier.provider);
|
final playlist = ref.watch(ProxyPlaylistNotifier.provider);
|
||||||
final playlistNotifier = ref.watch(ProxyPlaylistNotifier.notifier);
|
final playlistNotifier = ref.watch(ProxyPlaylistNotifier.notifier);
|
||||||
final props = InheritedTrackView.of(context);
|
final props = InheritedTrackView.of(context);
|
||||||
|
final trackViewState = ref.watch(trackViewProvider(props.tracks));
|
||||||
|
|
||||||
final searchController = useTextEditingController();
|
final searchController = useTextEditingController();
|
||||||
final searchFocus = useFocusNode();
|
final searchFocus = useFocusNode();
|
||||||
@ -38,8 +39,6 @@ class TrackViewBodySection extends HookConsumerWidget {
|
|||||||
return props.tracks.where((e) => trackIds.remove(e.id)).toList();
|
return props.tracks.where((e) => trackIds.remove(e.id)).toList();
|
||||||
}, [props.tracks]);
|
}, [props.tracks]);
|
||||||
|
|
||||||
final trackViewState = ref.watch(trackViewProvider(uniqTracks));
|
|
||||||
|
|
||||||
final tracks = useMemoized(() {
|
final tracks = useMemoized(() {
|
||||||
List<Track> filteredTracks;
|
List<Track> filteredTracks;
|
||||||
if (searchQuery.isEmpty) {
|
if (searchQuery.isEmpty) {
|
||||||
|
@ -38,20 +38,16 @@ class TrackViewBodyHeaders extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: trackViewState.isSelecting
|
child: Checkbox(
|
||||||
? Checkbox(
|
value: trackViewState.hasSelectedAll,
|
||||||
value: trackViewState.hasSelectedAll,
|
onChanged: (checked) {
|
||||||
onChanged: (checked) {
|
if (checked == true) {
|
||||||
if (checked == true) {
|
trackViewState.selectAll();
|
||||||
trackViewState.selectAll();
|
} else {
|
||||||
} else {
|
trackViewState.deselectAll();
|
||||||
trackViewState.deselectAll();
|
}
|
||||||
}
|
},
|
||||||
},
|
),
|
||||||
)
|
|
||||||
: constrains.mdAndUp
|
|
||||||
? const SizedBox(width: 32)
|
|
||||||
: const SizedBox(width: 16),
|
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
flex: 7,
|
flex: 7,
|
||||||
|
@ -11,7 +11,6 @@ import 'package:spotube/provider/download_manager_provider.dart';
|
|||||||
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
|
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
|
||||||
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
||||||
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
|
||||||
import 'package:spotube/services/queries/queries.dart';
|
|
||||||
|
|
||||||
class TrackViewBodyOptions extends HookConsumerWidget {
|
class TrackViewBodyOptions extends HookConsumerWidget {
|
||||||
const TrackViewBodyOptions({Key? key}) : super(key: key);
|
const TrackViewBodyOptions({Key? key}) : super(key: key);
|
||||||
@ -30,11 +29,6 @@ class TrackViewBodyOptions extends HookConsumerWidget {
|
|||||||
final trackViewState = ref.watch(trackViewProvider(props.tracks));
|
final trackViewState = ref.watch(trackViewProvider(props.tracks));
|
||||||
final selectedTracks = trackViewState.selectedTracks;
|
final selectedTracks = trackViewState.selectedTracks;
|
||||||
|
|
||||||
final userPlaylists = useQueries.playlist.ofMineAll(ref);
|
|
||||||
|
|
||||||
final isUserPlaylist =
|
|
||||||
userPlaylists.data?.any((e) => e.id == props.collectionId) ?? false;
|
|
||||||
|
|
||||||
return AdaptivePopSheetList(
|
return AdaptivePopSheetList(
|
||||||
tooltip: context.l10n.more_actions,
|
tooltip: context.l10n.more_actions,
|
||||||
headings: [
|
headings: [
|
||||||
@ -66,6 +60,7 @@ class TrackViewBodyOptions extends HookConsumerWidget {
|
|||||||
context: context,
|
context: context,
|
||||||
builder: (context) {
|
builder: (context) {
|
||||||
return PlaylistAddTrackDialog(
|
return PlaylistAddTrackDialog(
|
||||||
|
openFromPlaylist: props.collectionId,
|
||||||
tracks: selectedTracks.toList(),
|
tracks: selectedTracks.toList(),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -100,15 +95,14 @@ class TrackViewBodyOptions extends HookConsumerWidget {
|
|||||||
context.l10n.download_count(selectedTracks.length),
|
context.l10n.download_count(selectedTracks.length),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (!isUserPlaylist)
|
PopSheetEntry(
|
||||||
PopSheetEntry(
|
value: "add-to-playlist",
|
||||||
value: "add-to-playlist",
|
leading: const Icon(SpotubeIcons.playlistAdd),
|
||||||
leading: const Icon(SpotubeIcons.playlistAdd),
|
enabled: selectedTracks.isNotEmpty,
|
||||||
enabled: selectedTracks.isNotEmpty,
|
title: Text(
|
||||||
title: Text(
|
context.l10n.add_count_to_playlist(selectedTracks.length),
|
||||||
context.l10n.add_count_to_playlist(selectedTracks.length),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
|
),
|
||||||
PopSheetEntry(
|
PopSheetEntry(
|
||||||
enabled: selectedTracks.isNotEmpty,
|
enabled: selectedTracks.isNotEmpty,
|
||||||
value: "add-to-queue",
|
value: "add-to-queue",
|
||||||
|
@ -201,7 +201,7 @@ class SpotubeState extends ConsumerState<Spotube> {
|
|||||||
Brightness.dark,
|
Brightness.dark,
|
||||||
isAmoledTheme,
|
isAmoledTheme,
|
||||||
),
|
),
|
||||||
[paletteColor, accentMaterialColor, isAmoledTheme],
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return MaterialApp.router(
|
return MaterialApp.router(
|
||||||
|
@ -163,6 +163,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget {
|
|||||||
context: context,
|
context: context,
|
||||||
builder: (context) =>
|
builder: (context) =>
|
||||||
PlaylistAddTrackDialog(
|
PlaylistAddTrackDialog(
|
||||||
|
openFromPlaylist: null,
|
||||||
tracks: selectedTracks.value
|
tracks: selectedTracks.value
|
||||||
.map(
|
.map(
|
||||||
(e) => generatedPlaylist.data!
|
(e) => generatedPlaylist.data!
|
||||||
|
@ -71,5 +71,8 @@ ThemeData theme(Color seed, Brightness brightness, bool isAmoled) {
|
|||||||
scrollbarTheme: const ScrollbarThemeData(
|
scrollbarTheme: const ScrollbarThemeData(
|
||||||
thickness: MaterialStatePropertyAll(14),
|
thickness: MaterialStatePropertyAll(14),
|
||||||
),
|
),
|
||||||
|
checkboxTheme: CheckboxThemeData(
|
||||||
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user