diff --git a/lib/components/home/sections/featured.dart b/lib/components/home/sections/featured.dart index 2e87a75e..0db5a1e8 100644 --- a/lib/components/home/sections/featured.dart +++ b/lib/components/home/sections/featured.dart @@ -13,10 +13,10 @@ class HomeFeaturedSection extends HookConsumerWidget { Widget build(BuildContext context, ref) { final featuredPlaylists = ref.watch(featuredPlaylistsProvider); final featuredPlaylistsNotifier = - ref.read(featuredPlaylistsProvider.notifier); + ref.watch(featuredPlaylistsProvider.notifier); return Skeletonizer( - enabled: featuredPlaylists.isLoadingAndEmpty, + enabled: featuredPlaylists.isLoading, child: HorizontalPlaybuttonCardView( items: featuredPlaylists.asData?.value.items ?? [], title: Text(context.l10n.featured), diff --git a/lib/components/library/user_albums.dart b/lib/components/library/user_albums.dart index ce2351ba..8066d24f 100644 --- a/lib/components/library/user_albums.dart +++ b/lib/components/library/user_albums.dart @@ -80,7 +80,7 @@ class UserAlbums extends HookConsumerWidget { padding: const EdgeInsets.all(8.0), controller: controller, child: Skeletonizer( - enabled: albumsQuery.isLoadingAndEmpty, + enabled: albumsQuery.isLoading, child: Center( child: Wrap( runSpacing: 20, diff --git a/lib/components/shared/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart b/lib/components/shared/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart index 06ba9a56..8f0e6048 100644 --- a/lib/components/shared/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart +++ b/lib/components/shared/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart @@ -84,11 +84,11 @@ class HorizontalPlaybuttonCardView extends HookWidget { itemBuilder: (context, index) { final item = items[index]; - return switch (item.runtimeType) { - PlaylistSimple => + return switch (item) { + PlaylistSimple() => PlaylistCard(item as PlaylistSimple), - Album => AlbumCard(item as Album), - Artist => Padding( + Album() => AlbumCard(item as Album), + Artist() => Padding( padding: const EdgeInsets.symmetric( horizontal: 12.0), child: ArtistCard(item as Artist), diff --git a/lib/pages/album/album.dart b/lib/pages/album/album.dart index b5ea6e41..fac0a6a6 100644 --- a/lib/pages/album/album.dart +++ b/lib/pages/album/album.dart @@ -33,7 +33,7 @@ class AlbumPage extends HookConsumerWidget { tracks: tracks.asData?.value.items ?? [], pagination: PaginationProps( hasNextPage: tracks.asData?.value.hasMore ?? false, - isLoading: tracks.isLoading, + isLoading: tracks.isLoadingNextPage, onFetchMore: () async { await tracksNotifier.fetchMore(); }, diff --git a/lib/pages/artist/artist.dart b/lib/pages/artist/artist.dart index 38b263cb..c153f0af 100644 --- a/lib/pages/artist/artist.dart +++ b/lib/pages/artist/artist.dart @@ -39,7 +39,7 @@ class ArtistPage extends HookConsumerWidget { return Center(child: Text(artistQuery.error.toString())); } return Skeletonizer( - enabled: artistQuery.isLoadingAndEmpty, + enabled: artistQuery.isLoading, child: CustomScrollView( controller: scrollController, slivers: [ diff --git a/lib/pages/playlist/playlist.dart b/lib/pages/playlist/playlist.dart index 92efd0c1..7962c66a 100644 --- a/lib/pages/playlist/playlist.dart +++ b/lib/pages/playlist/playlist.dart @@ -36,7 +36,7 @@ class PlaylistPage extends HookConsumerWidget { ), pagination: PaginationProps( hasNextPage: tracks.asData?.value.hasMore ?? false, - isLoading: tracks.isLoading, + isLoading: tracks.isLoadingNextPage, onFetchMore: tracksNotifier.fetchMore, onRefresh: () async { ref.invalidate(playlistTracksProvider(playlist.id!)); diff --git a/lib/pages/search/sections/tracks.dart b/lib/pages/search/sections/tracks.dart index 3fd57726..0fdb50af 100644 --- a/lib/pages/search/sections/tracks.dart +++ b/lib/pages/search/sections/tracks.dart @@ -37,7 +37,7 @@ class SearchTracksSection extends HookConsumerWidget { style: theme.textTheme.titleLarge!, ), ), - if (searchTrack.isLoadingAndEmpty) + if (searchTrack.isLoading) const CircularProgressIndicator() else if (searchTrack.hasError) Text(searchTrack.error.toString()) diff --git a/lib/provider/spotify/utils/async.dart b/lib/provider/spotify/utils/async.dart index 277869eb..1040d682 100644 --- a/lib/provider/spotify/utils/async.dart +++ b/lib/provider/spotify/utils/async.dart @@ -1,6 +1,5 @@ part of '../spotify.dart'; extension PaginationExtension on AsyncValue { - bool get isLoadingAndEmpty => value == null && isLoading; - bool get isLoadingNextPage => value != null && isLoading; + bool get isLoadingNextPage => this is AsyncData && this is AsyncLoadingNext; } diff --git a/lib/provider/spotify/utils/provider.dart b/lib/provider/spotify/utils/provider.dart index bd8001aa..a0e44030 100644 --- a/lib/provider/spotify/utils/provider.dart +++ b/lib/provider/spotify/utils/provider.dart @@ -1,17 +1,25 @@ part of '../spotify.dart'; +// ignore: subtype_of_sealed_class +class AsyncLoadingNext extends AsyncData { + const AsyncLoadingNext(super.value); +} + abstract class PaginatedAsyncNotifier> extends AsyncNotifier with SpotifyMixin { Future> fetch(int offset, int limit); Future fetchMore() async { if (state.value == null || !state.value!.hasMore) return; - state = const AsyncValue.loading(); + + state = AsyncLoadingNext(state.asData!.value); state = await AsyncValue.guard( () async { final items = await fetch( - state.value!.offset + state.value!.limit, state.value!.limit); + state.value!.offset + state.value!.limit, + state.value!.limit, + ); return state.value!.copyWith( hasMore: items.length == state.value!.limit, items: [ @@ -57,7 +65,7 @@ abstract class CursorPaginatedAsyncNotifier fetchMore() async { if (state.value == null || !state.value!.hasMore) return; - state = const AsyncValue.loading(); + state = AsyncLoadingNext(state.asData!.value); state = await AsyncValue.guard( () async { @@ -105,7 +113,7 @@ abstract class FamilyPaginatedAsyncNotifier< Future fetchMore() async { if (state.value == null || !state.value!.hasMore) return; - state = const AsyncLoading(); + state = AsyncLoadingNext(state.asData!.value); state = await AsyncValue.guard( () async { @@ -165,7 +173,7 @@ abstract class FamilyCursorPaginatedAsyncNotifier< Future fetchMore() async { if (state.value == null || !state.value!.hasMore) return; - state = const AsyncLoading(); + state = AsyncLoadingNext(state.asData!.value); state = await AsyncValue.guard( () async {