From ee97aedcfc64d972e70dc51aa25232913ecb4073 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sat, 23 Mar 2024 20:37:52 +0600 Subject: [PATCH] chore: remove direct access to .value without calling asData.value --- .vscode/settings.json | 2 ++ lib/components/home/sections/genres.dart | 6 ++--- .../home/sections/made_for_user.dart | 4 ++-- lib/components/library/user_albums.dart | 6 ++--- lib/components/library/user_local_tracks.dart | 6 ++--- lib/components/shared/heart_button.dart | 4 ++-- .../shared/track_tile/track_options.dart | 2 +- .../sections/body/use_is_user_playlist.dart | 4 ++-- lib/pages/album/album.dart | 6 ++--- lib/pages/artist/artist.dart | 7 +++--- lib/pages/artist/section/footer.dart | 10 ++++----- lib/pages/artist/section/header.dart | 2 +- lib/pages/artist/section/top_tracks.dart | 6 ++--- lib/pages/home/genres/genres.dart | 4 ++-- .../playlist_generate/playlist_generate.dart | 2 +- .../playlist_generate_result.dart | 22 ++++++++++--------- lib/pages/playlist/liked_playlist.dart | 2 +- lib/pages/playlist/playlist.dart | 6 ++--- lib/pages/search/search.dart | 4 ++-- lib/pages/search/sections/albums.dart | 2 +- 20 files changed, 56 insertions(+), 51 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 472520ab..0fedc544 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,10 +4,12 @@ "acousticness", "Buildless", "danceability", + "fuzzywuzzy", "instrumentalness", "Mpris", "riverpod", "Scrobblenaut", + "skeletonizer", "speechiness", "Spotube", "winget" diff --git a/lib/components/home/sections/genres.dart b/lib/components/home/sections/genres.dart index 87f28821..ac2644f0 100644 --- a/lib/components/home/sections/genres.dart +++ b/lib/components/home/sections/genres.dart @@ -26,12 +26,12 @@ class HomeGenresSection extends HookConsumerWidget { final categoriesQuery = ref.watch(categoriesProvider); final categories = useMemoized( () => - categoriesQuery.value - ?.where((c) => (c.icons?.length ?? 0) > 0) + categoriesQuery.asData?.value + .where((c) => (c.icons?.length ?? 0) > 0) .take(mediaQuery.mdAndDown ? 6 : 10) .toList() ?? [], - [mediaQuery.mdAndDown, categoriesQuery.value], + [mediaQuery.mdAndDown, categoriesQuery.asData?.value], ); return SliverMainAxisGroup( diff --git a/lib/components/home/sections/made_for_user.dart b/lib/components/home/sections/made_for_user.dart index 439d9c38..d1d269f6 100644 --- a/lib/components/home/sections/made_for_user.dart +++ b/lib/components/home/sections/made_for_user.dart @@ -12,9 +12,9 @@ class HomeMadeForUserSection extends HookConsumerWidget { final madeForUser = ref.watch(viewProvider("made-for-x-hub")); return SliverList.builder( - itemCount: madeForUser.value?["content"]?["items"]?.length ?? 0, + itemCount: madeForUser.asData?.value["content"]?["items"]?.length ?? 0, itemBuilder: (context, index) { - final item = madeForUser.value?["content"]?["items"]?[index]; + final item = madeForUser.asData?.value["content"]?["items"]?[index]; final playlists = item["content"]?["items"] ?.where((itemL2) => itemL2["type"] == "playlist") .map((itemL2) => PlaylistSimple.fromJson(itemL2)) diff --git a/lib/components/library/user_albums.dart b/lib/components/library/user_albums.dart index be421a40..f58d6693 100644 --- a/lib/components/library/user_albums.dart +++ b/lib/components/library/user_albums.dart @@ -44,7 +44,7 @@ class UserAlbums extends HookConsumerWidget { .map((e) => e.$2) .toList() ?? []; - }, [albumsQuery.value, searchText.value]); + }, [albumsQuery.asData?.value, searchText.value]); if (auth == null) { return const AnonymousFallback(); @@ -87,8 +87,8 @@ class UserAlbums extends HookConsumerWidget { runAlignment: WrapAlignment.center, crossAxisAlignment: WrapCrossAlignment.center, children: [ - if (albumsQuery.value == null || - albumsQuery.value!.items.isEmpty) + if (albumsQuery.asData?.value == null || + albumsQuery.asData!.value.items.isEmpty) ...List.generate( 10, (index) => AlbumCard(FakeData.album), diff --git a/lib/components/library/user_local_tracks.dart b/lib/components/library/user_local_tracks.dart index 5450bc34..e2098570 100644 --- a/lib/components/library/user_local_tracks.dart +++ b/lib/components/library/user_local_tracks.dart @@ -160,7 +160,7 @@ class UserLocalTracks extends HookConsumerWidget { final playlist = ref.watch(ProxyPlaylistNotifier.provider); final trackSnapshot = ref.watch(localTracksProvider); final isPlaylistPlaying = - playlist.containsTracks(trackSnapshot.value ?? []); + playlist.containsTracks(trackSnapshot.asData?.value ?? []); final searchController = useTextEditingController(); useValueListenable(searchController); @@ -177,13 +177,13 @@ class UserLocalTracks extends HookConsumerWidget { children: [ const SizedBox(width: 10), FilledButton( - onPressed: trackSnapshot.value != null + onPressed: trackSnapshot.asData?.value != null ? () async { if (trackSnapshot.asData?.value.isNotEmpty == true) { if (!isPlaylistPlaying) { await playLocalTracks( ref, - trackSnapshot.value!, + trackSnapshot.asData!.value, ); } else { // TODO: Remove stop capability diff --git a/lib/components/shared/heart_button.dart b/lib/components/shared/heart_button.dart index a733c36c..9475f9e3 100644 --- a/lib/components/shared/heart_button.dart +++ b/lib/components/shared/heart_button.dart @@ -68,7 +68,7 @@ UseTrackToggleLike useTrackToggleLike(Track track, WidgetRef ref) { () => savedTracks.asData?.value.any((element) => element.id == track.id) ?? false, - [savedTracks.value, track.id], + [savedTracks.asData?.value, track.id], ); final scrobblerNotifier = ref.read(scrobblerProvider.notifier); @@ -109,7 +109,7 @@ class TrackHeartButton extends HookConsumerWidget { ? context.l10n.remove_from_favorites : context.l10n.save_as_favorite, isLiked: isLiked, - onPressed: savedTracks.value != null + onPressed: savedTracks.asData?.value != null ? () { toggleTrackLike(track); } diff --git a/lib/components/shared/track_tile/track_options.dart b/lib/components/shared/track_tile/track_options.dart index 76c91003..29349602 100644 --- a/lib/components/shared/track_tile/track_options.dart +++ b/lib/components/shared/track_tile/track_options.dart @@ -348,7 +348,7 @@ class TrackOptions extends HookConsumerWidget { leading: const Icon(SpotubeIcons.queueRemove), title: Text(context.l10n.remove_from_queue), ), - if (me.value != null) + if (me.asData?.value != null) PopSheetEntry( value: TrackOptionValue.favorite, leading: favorites.isLiked diff --git a/lib/components/shared/tracks_view/sections/body/use_is_user_playlist.dart b/lib/components/shared/tracks_view/sections/body/use_is_user_playlist.dart index d32efed2..2f87ccc8 100644 --- a/lib/components/shared/tracks_view/sections/body/use_is_user_playlist.dart +++ b/lib/components/shared/tracks_view/sections/body/use_is_user_playlist.dart @@ -10,9 +10,9 @@ bool useIsUserPlaylist(WidgetRef ref, String playlistId) { () => userPlaylistsQuery.asData?.value.items.any((e) => e.id == playlistId && - me.value != null && + me.asData?.value != null && e.owner?.id == me.asData?.value.id) ?? false, - [userPlaylistsQuery.value, playlistId, me.value], + [userPlaylistsQuery.asData?.value, playlistId, me.asData?.value], ); } diff --git a/lib/pages/album/album.dart b/lib/pages/album/album.dart index 7c03b6dd..b24b69f4 100644 --- a/lib/pages/album/album.dart +++ b/lib/pages/album/album.dart @@ -45,11 +45,11 @@ class AlbumPage extends HookConsumerWidget { ), routePath: "/album/${album.id}", shareUrl: album.externalUrls!.spotify!, - isLiked: isSavedAlbum.value ?? false, - onHeart: isSavedAlbum.value == null + isLiked: isSavedAlbum.asData?.value ?? false, + onHeart: isSavedAlbum.asData?.value == null ? null : () async { - if (isSavedAlbum.value!) { + if (isSavedAlbum.asData!.value) { await favoriteAlbumsNotifier.removeFavorites([album.id!]); } else { await favoriteAlbumsNotifier.addFavorites([album.id!]); diff --git a/lib/pages/artist/artist.dart b/lib/pages/artist/artist.dart index c153f0af..c3b04691 100644 --- a/lib/pages/artist/artist.dart +++ b/lib/pages/artist/artist.dart @@ -35,7 +35,7 @@ class ArtistPage extends HookConsumerWidget { ), extendBodyBehindAppBar: true, body: Builder(builder: (context) { - if (artistQuery.hasError && artistQuery.value == null) { + if (artistQuery.hasError && artistQuery.asData?.value == null) { return Center(child: Text(artistQuery.error.toString())); } return Skeletonizer( @@ -66,11 +66,12 @@ class ArtistPage extends HookConsumerWidget { SliverSafeArea( sliver: ArtistPageRelatedArtists(artistId: artistId), ), - if (artistQuery.value != null) + if (artistQuery.asData?.value != null) SliverSafeArea( top: false, sliver: SliverToBoxAdapter( - child: ArtistPageFooter(artist: artistQuery.value!), + child: + ArtistPageFooter(artist: artistQuery.asData!.value), ), ), ], diff --git a/lib/pages/artist/section/footer.dart b/lib/pages/artist/section/footer.dart index 835dbdd3..4707b939 100644 --- a/lib/pages/artist/section/footer.dart +++ b/lib/pages/artist/section/footer.dart @@ -23,7 +23,7 @@ class ArtistPageFooter extends ConsumerWidget { placeholder: ImagePlaceholder.artist, ); final summary = ref.watch(artistWikipediaSummaryProvider(artist)); - if (summary.value == null) return const SizedBox.shrink(); + if (summary.asData?.value == null) return const SizedBox.shrink(); return Container( margin: const EdgeInsets.all(16), @@ -39,9 +39,9 @@ class ArtistPageFooter extends ConsumerWidget { BlendMode.darken, ), image: UniversalImage.imageProvider( - summary.value!.thumbnail?.source_ ?? artistImage, - height: summary.value!.thumbnail?.height.toDouble(), - width: summary.value!.thumbnail?.width.toDouble(), + summary.asData?.value!.thumbnail?.source_ ?? artistImage, + height: summary.asData?.value!.thumbnail?.height.toDouble(), + width: summary.asData?.value!.thumbnail?.width.toDouble(), ), fit: BoxFit.cover, alignment: Alignment.center, @@ -70,7 +70,7 @@ class ArtistPageFooter extends ConsumerWidget { ), const TextSpan(text: '\n\n'), TextSpan( - text: summary.value!.extract, + text: summary.asData?.value!.extract, ), TextSpan( text: '\n...read more at wikipedia', diff --git a/lib/pages/artist/section/header.dart b/lib/pages/artist/section/header.dart index 1f1d028d..e5cb8900 100644 --- a/lib/pages/artist/section/header.dart +++ b/lib/pages/artist/section/header.dart @@ -22,7 +22,7 @@ class ArtistPageHeader extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { final artistQuery = ref.watch(artistProvider(artistId)); - final artist = artistQuery.value ?? FakeData.artist; + final artist = artistQuery.asData?.value ?? FakeData.artist; final scaffoldMessenger = ScaffoldMessenger.of(context); final mediaQuery = MediaQuery.of(context); diff --git a/lib/pages/artist/section/top_tracks.dart b/lib/pages/artist/section/top_tracks.dart index 9ad2b0db..173ace54 100644 --- a/lib/pages/artist/section/top_tracks.dart +++ b/lib/pages/artist/section/top_tracks.dart @@ -23,7 +23,7 @@ class ArtistPageTopTracks extends HookConsumerWidget { final topTracksQuery = ref.watch(artistTopTracksProvider(artistId)); final isPlaylistPlaying = playlist.containsTracks( - topTracksQuery.value ?? [], + topTracksQuery.asData?.value ?? [], ); if (topTracksQuery.hasError) { @@ -34,8 +34,8 @@ class ArtistPageTopTracks extends HookConsumerWidget { ); } - final topTracks = - topTracksQuery.value ?? List.generate(10, (index) => FakeData.track); + final topTracks = topTracksQuery.asData?.value ?? + List.generate(10, (index) => FakeData.track); void playPlaylist(List tracks, {Track? currentTrack}) async { currentTrack ??= tracks.first; diff --git a/lib/pages/home/genres/genres.dart b/lib/pages/home/genres/genres.dart index ed6c2835..a981cbe7 100644 --- a/lib/pages/home/genres/genres.dart +++ b/lib/pages/home/genres/genres.dart @@ -39,9 +39,9 @@ class GenrePage extends HookConsumerWidget { crossAxisSpacing: 12, mainAxisSpacing: 12, ), - itemCount: categories.value!.length, + itemCount: categories.asData!.value.length, itemBuilder: (context, index) { - final category = categories.value![index]; + final category = categories.asData!.value[index]; final gradient = gradients[Random().nextInt(gradients.length)]; return InkWell( borderRadius: BorderRadius.circular(8), diff --git a/lib/pages/library/playlist_generate/playlist_generate.dart b/lib/pages/library/playlist_generate/playlist_generate.dart index 49a33164..5044090d 100644 --- a/lib/pages/library/playlist_generate/playlist_generate.dart +++ b/lib/pages/library/playlist_generate/playlist_generate.dart @@ -187,7 +187,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget { ); final genreSelector = MultiSelectField( - options: genresCollection.value ?? [], + options: genresCollection.asData?.value ?? [], selectedOptions: genres.value, getValueForOption: (option) => option, onSelected: (value) { diff --git a/lib/pages/library/playlist_generate/playlist_generate_result.dart b/lib/pages/library/playlist_generate/playlist_generate_result.dart index deb86a97..5390c337 100644 --- a/lib/pages/library/playlist_generate/playlist_generate_result.dart +++ b/lib/pages/library/playlist_generate/playlist_generate_result.dart @@ -34,12 +34,12 @@ class PlaylistGenerateResultPage extends HookConsumerWidget { ); useEffect(() { - if (generatedPlaylist.value != null) { + if (generatedPlaylist.asData?.value != null) { selectedTracks.value = - generatedPlaylist.value!.map((e) => e.id!).toList(); + generatedPlaylist.asData!.value.map((e) => e.id!).toList(); } return null; - }, [generatedPlaylist.value]); + }, [generatedPlaylist.asData?.value]); final isAllTrackSelected = selectedTracks.value.length == (generatedPlaylist.asData?.value.length ?? 0); @@ -78,7 +78,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget { ? null : () async { await playlistNotifier.load( - generatedPlaylist.value!.where( + generatedPlaylist.asData!.value.where( (e) => selectedTracks.value.contains(e.id!), ), autoPlay: true, @@ -92,7 +92,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget { ? null : () async { await playlistNotifier.addTracks( - generatedPlaylist.value!.where( + generatedPlaylist.asData!.value.where( (e) => selectedTracks.value.contains(e.id!), ), ); @@ -142,7 +142,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget { openFromPlaylist: null, tracks: selectedTracks.value .map( - (e) => generatedPlaylist.value! + (e) => generatedPlaylist.asData!.value .firstWhere( (element) => element.id == e, ), @@ -167,7 +167,7 @@ class PlaylistGenerateResultPage extends HookConsumerWidget { ], ), const SizedBox(height: 16), - if (generatedPlaylist.value != null) + if (generatedPlaylist.asData?.value != null) Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -181,8 +181,9 @@ class PlaylistGenerateResultPage extends HookConsumerWidget { if (isAllTrackSelected) { selectedTracks.value = []; } else { - selectedTracks.value = generatedPlaylist.value - ?.map((e) => e.id!) + selectedTracks.value = generatedPlaylist + .asData?.value + .map((e) => e.id!) .toList() ?? []; } @@ -203,7 +204,8 @@ class PlaylistGenerateResultPage extends HookConsumerWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - for (final track in generatedPlaylist.value ?? []) + for (final track + in generatedPlaylist.asData?.value ?? []) CheckboxListTile( value: selectedTracks.value.contains(track.id), onChanged: (value) { diff --git a/lib/pages/playlist/liked_playlist.dart b/lib/pages/playlist/liked_playlist.dart index eeea8cb1..72983518 100644 --- a/lib/pages/playlist/liked_playlist.dart +++ b/lib/pages/playlist/liked_playlist.dart @@ -15,7 +15,7 @@ class LikedPlaylistPage extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { final likedTracks = ref.watch(likedTracksProvider); - final tracks = likedTracks.value ?? []; + final tracks = likedTracks.asData?.value ?? []; return InheritedTrackView( collectionId: playlist.id!, diff --git a/lib/pages/playlist/playlist.dart b/lib/pages/playlist/playlist.dart index ce070b06..d9d224e0 100644 --- a/lib/pages/playlist/playlist.dart +++ b/lib/pages/playlist/playlist.dart @@ -48,9 +48,9 @@ class PlaylistPage extends HookConsumerWidget { description: playlist.description, tracks: tracks.asData?.value.items ?? [], routePath: '/playlist/${playlist.id}', - isLiked: isFavoritePlaylist.value ?? false, + isLiked: isFavoritePlaylist.asData?.value ?? false, shareUrl: playlist.externalUrls?.spotify ?? "", - onHeart: isFavoritePlaylist.value == null + onHeart: isFavoritePlaylist.asData?.value == null ? null : () async { final confirmed = isUserPlaylist @@ -62,7 +62,7 @@ class PlaylistPage extends HookConsumerWidget { : true; if (!confirmed) return null; - if (isFavoritePlaylist.value!) { + if (isFavoritePlaylist.asData!.value) { await favoritePlaylistsNotifier.removeFavorite(playlist); } else { await favoritePlaylistsNotifier.addFavorite(playlist); diff --git a/lib/pages/search/search.dart b/lib/pages/search/search.dart index ca66e02a..c58b8df3 100644 --- a/lib/pages/search/search.dart +++ b/lib/pages/search/search.dart @@ -168,8 +168,8 @@ class SearchPage extends HookConsumerWidget { }, builder: (context, controller) { return SearchBar( - autoFocus: queries.none( - (s) => s.value != null && !s.hasError) && + autoFocus: queries.none((s) => + s.asData?.value != null && !s.hasError) && !kIsMobile, controller: controller, leading: const Icon(SpotubeIcons.search), diff --git a/lib/pages/search/sections/albums.dart b/lib/pages/search/sections/albums.dart index dee27041..d15c34ff 100644 --- a/lib/pages/search/sections/albums.dart +++ b/lib/pages/search/sections/albums.dart @@ -24,7 +24,7 @@ class SearchAlbumsSection extends HookConsumerWidget { .map((e) => e.toAlbum()) .toList() ?? [], - [query.value], + [query.asData?.value], ); return HorizontalPlaybuttonCardView(