From f5dc76a98f55f0f032a6fe4208465899f932355a Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Thu, 2 Mar 2023 11:59:00 +0600 Subject: [PATCH] fix(search): has to submit twice for search results --- lib/components/album/album_card.dart | 8 +- lib/components/library/user_playlists.dart | 26 ++++--- .../playlist/playlist_genre_view.dart | 73 ------------------- lib/components/shared/heart_button.dart | 2 +- lib/pages/search/search.dart | 26 ++++--- pubspec.lock | 4 +- 6 files changed, 37 insertions(+), 102 deletions(-) delete mode 100644 lib/components/playlist/playlist_genre_view.dart diff --git a/lib/components/album/album_card.dart b/lib/components/album/album_card.dart index e06b559ef..eade617fb 100644 --- a/lib/components/album/album_card.dart +++ b/lib/components/album/album_card.dart @@ -1,4 +1,4 @@ -import 'package:fl_query/fl_query.dart'; +import 'package:fl_query_hooks/fl_query_hooks.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -46,8 +46,8 @@ class AlbumCard extends HookConsumerWidget { final playing = useStream(PlaylistQueueNotifier.playing).data ?? PlaylistQueueNotifier.isPlaying; final playlistNotifier = ref.watch(PlaylistQueueNotifier.notifier); - final queryBowl = QueryClient.of(context); - final query = queryBowl + final queryClient = useQueryClient(); + final query = queryClient .getQuery, dynamic>("album-tracks/${album.id}"); final tracks = useState(query?.data ?? album.tracks ?? []); bool isPlaylistPlaying = playlistNotifier.isPlayingPlaylist(tracks.value); @@ -100,7 +100,7 @@ class AlbumCard extends HookConsumerWidget { updating.value = true; try { final fetchedTracks = - await queryBowl.fetchQuery, SpotifyApi>( + await queryClient.fetchQuery, SpotifyApi>( "album-tracks/${album.id}", () { return spotify.albums diff --git a/lib/components/library/user_playlists.dart b/lib/components/library/user_playlists.dart index b0eef87d7..d618b3e10 100644 --- a/lib/components/library/user_playlists.dart +++ b/lib/components/library/user_playlists.dart @@ -35,17 +35,21 @@ class UserPlaylists extends HookConsumerWidget { final playlistsQuery = useQueries.playlist.ofMine(ref); - Image image = Image(); - image.height = 300; - image.width = 300; - PlaylistSimple likedTracksPlaylist = PlaylistSimple(); - likedTracksPlaylist.name = "Liked Tracks"; - likedTracksPlaylist.type = "playlist"; - likedTracksPlaylist.collaborative = false; - likedTracksPlaylist.public = false; - likedTracksPlaylist.id = "user-liked-tracks"; - image.url = "https://t.scdn.co/images/3099b3803ad9496896c43f22fe9be8c4.png"; - likedTracksPlaylist.images = [image]; + final likedTracksPlaylist = useMemoized( + () => PlaylistSimple() + ..name = "Liked Tracks" + ..type = "playlist" + ..collaborative = false + ..public = false + ..id = "user-liked-tracks" + ..images = [ + Image() + ..height = 300 + ..width = 300 + ..url = + "https://t.scdn.co/images/3099b3803ad9496896c43f22fe9be8c4.png" + ], + []); final playlists = useMemoized( () { diff --git a/lib/components/playlist/playlist_genre_view.dart b/lib/components/playlist/playlist_genre_view.dart deleted file mode 100644 index 347089f58..000000000 --- a/lib/components/playlist/playlist_genre_view.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:platform_ui/platform_ui.dart'; -import 'package:spotify/spotify.dart'; -import 'package:spotube/components/shared/page_window_title_bar.dart'; -import 'package:spotube/components/playlist/playlist_card.dart'; -import 'package:spotube/provider/spotify_provider.dart'; - -class PlaylistGenreView extends ConsumerWidget { - final String genreId; - final String genreName; - final Iterable? playlists; - const PlaylistGenreView( - this.genreId, - this.genreName, { - this.playlists, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context, ref) { - return Scaffold( - appBar: PageWindowTitleBar( - leading: const PlatformBackButton(), - ), - body: Column( - children: [ - PlatformText.subheading( - genreName, - textAlign: TextAlign.center, - ), - Consumer( - builder: (context, ref, child) { - SpotifyApi spotifyApi = ref.watch(spotifyProvider); - return Expanded( - child: SingleChildScrollView( - child: FutureBuilder>( - future: playlists == null - ? (genreId != "user-featured-playlists" - ? spotifyApi.playlists - .getByCategoryId(genreId) - .all() - : spotifyApi.playlists.featured.all()) - : Future.value(playlists), - builder: (context, snapshot) { - if (snapshot.hasError) { - return const Center(child: Text("Error occurred")); - } - if (!snapshot.hasData) { - return const PlatformCircularProgressIndicator(); - } - return Center( - child: Wrap( - children: snapshot.data! - .map( - (playlist) => Padding( - padding: const EdgeInsets.all(8.0), - child: PlaylistCard(playlist), - ), - ) - .toList(), - ), - ); - }), - ), - ); - }, - ) - ], - ), - ); - } -} diff --git a/lib/components/shared/heart_button.dart b/lib/components/shared/heart_button.dart index 0a547d26a..5c7e6811a 100644 --- a/lib/components/shared/heart_button.dart +++ b/lib/components/shared/heart_button.dart @@ -125,7 +125,7 @@ class PlaylistHeartButton extends HookConsumerWidget { final isLikedQuery = useQueries.playlist.doesUserFollow( ref, playlist.id!, - me.data!.id!, + me.data?.id ?? '', ); final togglePlaylistLike = useMutations.playlist.toggleFavorite( diff --git a/lib/pages/search/search.dart b/lib/pages/search/search.dart index f7dddaefc..1c4b247b1 100644 --- a/lib/pages/search/search.dart +++ b/lib/pages/search/search.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart' hide Page; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -50,15 +52,13 @@ class SearchPage extends HookConsumerWidget { final searchArtist = useQueries.search.query(ref, searchTerm, SearchType.artist); - void onSearch() { - for (final query in [ - searchTrack, - searchAlbum, - searchPlaylist, - searchArtist, - ]) { - query.refreshAll(); - } + Future onSearch() async { + await Future.wait([ + searchTrack.refreshAll(), + searchAlbum.refreshAll(), + searchPlaylist.refreshAll(), + searchArtist.refreshAll(), + ]); } return SafeArea( @@ -82,10 +82,14 @@ class SearchPage extends HookConsumerWidget { other: null, ).resolve(platform!), placeholder: "Search...", - onSubmitted: (value) { + onSubmitted: (value) async { ref.read(searchTermStateProvider.notifier).state = value; - onSearch(); + // Fl-Query is too fast, so we need to delay the search + // to prevent spamming the API :) + Timer(const Duration(milliseconds: 50), () { + onSearch(); + }); }, ), ), diff --git a/pubspec.lock b/pubspec.lock index a95d9301d..10fbc3442 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -535,7 +535,7 @@ packages: description: path: "packages/fl_query" ref: new-architecture - resolved-ref: f2a23b085cd657a1612d87749f6592b4d67814c5 + resolved-ref: cf2550a2909d0cb957324fe114acacb431a5f33a url: "https://github.com/KRTirtho/fl-query.git" source: git version: "0.3.1" @@ -544,7 +544,7 @@ packages: description: path: "packages/fl_query_hooks" ref: new-architecture - resolved-ref: f2a23b085cd657a1612d87749f6592b4d67814c5 + resolved-ref: cf2550a2909d0cb957324fe114acacb431a5f33a url: "https://github.com/KRTirtho/fl-query.git" source: git version: "0.3.1"