mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-12-08 08:17:31 +00:00
fix(track_collection_view): keyboard focus on scroll and no space for search results in playlist/album
This commit is contained in:
parent
cca5625df7
commit
7a8bd92104
@ -5,13 +5,10 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
|
|
||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/hooks/use_palette_color.dart';
|
|
||||||
import 'package:spotube/provider/authentication_provider.dart';
|
import 'package:spotube/provider/authentication_provider.dart';
|
||||||
import 'package:spotube/services/mutations/mutations.dart';
|
import 'package:spotube/services/mutations/mutations.dart';
|
||||||
import 'package:spotube/services/queries/queries.dart';
|
import 'package:spotube/services/queries/queries.dart';
|
||||||
|
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class HeartButton extends HookConsumerWidget {
|
class HeartButton extends HookConsumerWidget {
|
||||||
final bool isLiked;
|
final bool isLiked;
|
||||||
final void Function()? onPressed;
|
final void Function()? onPressed;
|
||||||
@ -163,15 +160,6 @@ class PlaylistHeartButton extends HookConsumerWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
final titleImage = useMemoized(
|
|
||||||
() => TypeConversionUtils.image_X_UrlString(
|
|
||||||
playlist.images,
|
|
||||||
placeholder: ImagePlaceholder.collection,
|
|
||||||
),
|
|
||||||
[playlist.images]);
|
|
||||||
|
|
||||||
final color = usePaletteGenerator(titleImage).dominantColor;
|
|
||||||
|
|
||||||
if (me.isLoading || !me.hasData) {
|
if (me.isLoading || !me.hasData) {
|
||||||
return const CircularProgressIndicator();
|
return const CircularProgressIndicator();
|
||||||
}
|
}
|
||||||
@ -181,7 +169,7 @@ class PlaylistHeartButton extends HookConsumerWidget {
|
|||||||
tooltip: isLikedQuery.data ?? false
|
tooltip: isLikedQuery.data ?? false
|
||||||
? context.l10n.remove_from_favorites
|
? context.l10n.remove_from_favorites
|
||||||
: context.l10n.save_as_favorite,
|
: context.l10n.save_as_favorite,
|
||||||
color: color?.titleTextColor,
|
color: Colors.white,
|
||||||
onPressed: isLikedQuery.hasData
|
onPressed: isLikedQuery.hasData
|
||||||
? () {
|
? () {
|
||||||
togglePlaylistLike.mutate(isLikedQuery.data!);
|
togglePlaylistLike.mutate(isLikedQuery.data!);
|
||||||
@ -224,6 +212,7 @@ class AlbumHeartButton extends HookConsumerWidget {
|
|||||||
tooltip: isLiked
|
tooltip: isLiked
|
||||||
? context.l10n.remove_from_favorites
|
? context.l10n.remove_from_favorites
|
||||||
: context.l10n.save_as_favorite,
|
: context.l10n.save_as_favorite,
|
||||||
|
color: Colors.white,
|
||||||
onPressed: albumIsSaved.hasData
|
onPressed: albumIsSaved.hasData
|
||||||
? () {
|
? () {
|
||||||
toggleAlbumLike.mutate(isLiked);
|
toggleAlbumLike.mutate(isLiked);
|
||||||
|
|||||||
@ -65,7 +65,6 @@ class TrackCollectionView<T> extends HookConsumerWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
final mediaQuery = MediaQuery.of(context);
|
|
||||||
final auth = ref.watch(AuthenticationNotifier.provider);
|
final auth = ref.watch(AuthenticationNotifier.provider);
|
||||||
final color = usePaletteGenerator(titleImage).dominantColor;
|
final color = usePaletteGenerator(titleImage).dominantColor;
|
||||||
|
|
||||||
@ -343,7 +342,6 @@ class TrackCollectionView<T> extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return TracksTableView(
|
return TracksTableView(
|
||||||
List.from(
|
|
||||||
(tracksSnapshot.data ?? []).map(
|
(tracksSnapshot.data ?? []).map(
|
||||||
(track) {
|
(track) {
|
||||||
if (track is Track) {
|
if (track is Track) {
|
||||||
@ -355,11 +353,19 @@ class TrackCollectionView<T> extends HookConsumerWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
).toList(),
|
||||||
),
|
|
||||||
onTrackPlayButtonPressed: onPlay,
|
onTrackPlayButtonPressed: onPlay,
|
||||||
playlistId: id,
|
playlistId: id,
|
||||||
userPlaylist: isOwned,
|
userPlaylist: isOwned,
|
||||||
|
onFiltering: () {
|
||||||
|
// scroll the flexible space
|
||||||
|
// to allow more space for search results
|
||||||
|
controller.animateTo(
|
||||||
|
390,
|
||||||
|
duration: const Duration(milliseconds: 200),
|
||||||
|
curve: Curves.easeInOut,
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
@ -33,10 +33,14 @@ class TracksTableView extends HookConsumerWidget {
|
|||||||
final bool isSliver;
|
final bool isSliver;
|
||||||
|
|
||||||
final Widget? heading;
|
final Widget? heading;
|
||||||
|
|
||||||
|
final VoidCallback? onFiltering;
|
||||||
|
|
||||||
const TracksTableView(
|
const TracksTableView(
|
||||||
this.tracks, {
|
this.tracks, {
|
||||||
Key? key,
|
Key? key,
|
||||||
this.onTrackPlayButtonPressed,
|
this.onTrackPlayButtonPressed,
|
||||||
|
this.onFiltering,
|
||||||
this.userPlaylist = false,
|
this.userPlaylist = false,
|
||||||
this.playlistId,
|
this.playlistId,
|
||||||
this.heading,
|
this.heading,
|
||||||
@ -46,6 +50,7 @@ class TracksTableView extends HookConsumerWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(context, ref) {
|
Widget build(context, ref) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
|
final mediaQuery = MediaQuery.of(context);
|
||||||
|
|
||||||
ref.watch(ProxyPlaylistNotifier.provider);
|
ref.watch(ProxyPlaylistNotifier.provider);
|
||||||
final playback = ref.watch(ProxyPlaylistNotifier.notifier);
|
final playback = ref.watch(ProxyPlaylistNotifier.notifier);
|
||||||
@ -178,6 +183,7 @@ class TracksTableView extends HookConsumerWidget {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
isFiltering.value = !isFiltering.value;
|
isFiltering.value = !isFiltering.value;
|
||||||
if (isFiltering.value) {
|
if (isFiltering.value) {
|
||||||
|
onFiltering?.call();
|
||||||
searchFocus.requestFocus();
|
searchFocus.requestFocus();
|
||||||
} else {
|
} else {
|
||||||
searchController.clear();
|
searchController.clear();
|
||||||
@ -314,7 +320,6 @@ class TracksTableView extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: TextField(
|
child: TextField(
|
||||||
autofocus: true,
|
|
||||||
focusNode: searchFocus,
|
focusNode: searchFocus,
|
||||||
controller: searchController,
|
controller: searchController,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
@ -375,7 +380,12 @@ class TracksTableView extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}).toList(),
|
}),
|
||||||
|
// extra space for mobile devices where keyboard takes half of the screen
|
||||||
|
if (isFiltering.value)
|
||||||
|
SizedBox(
|
||||||
|
height: mediaQuery.size.height * .75, //75% of the screen
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
if (isSliver) {
|
if (isSliver) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user