From 345c6ac7144fe2bbae15b04474ec138dbef54b3b Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Fri, 5 Sep 2025 10:50:14 +0600 Subject: [PATCH] chore: fix pagination for liked tracks and saved albums not working --- lib/pages/library/user_albums.dart | 4 ++-- lib/pages/playlist/liked_playlist.dart | 13 +++++++---- .../utils/family_paginated.dart | 22 ++++++++----------- .../metadata_plugin/utils/paginated.dart | 22 ++++++++----------- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/lib/pages/library/user_albums.dart b/lib/pages/library/user_albums.dart index adec2e83..4f183346 100644 --- a/lib/pages/library/user_albums.dart +++ b/lib/pages/library/user_albums.dart @@ -99,7 +99,7 @@ class UserAlbumsPage extends HookConsumerWidget { features: const [ InputFeature.leading(Icon(SpotubeIcons.filter)) ], - placeholder: Text(context.l10n.filter_artist), + placeholder: Text(context.l10n.filter_albums), ), ), ), @@ -121,7 +121,7 @@ class UserAlbumsPage extends HookConsumerWidget { color: Theme.of(context).colorScheme.primary, ), Text( - context.l10n.not_following_artists, + context.l10n.no_favorite_albums_yet, textAlign: TextAlign.center, ).muted().small() ], diff --git a/lib/pages/playlist/liked_playlist.dart b/lib/pages/playlist/liked_playlist.dart index d840d9d0..80c05303 100644 --- a/lib/pages/playlist/liked_playlist.dart +++ b/lib/pages/playlist/liked_playlist.dart @@ -8,6 +8,7 @@ import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/pages/playlist/playlist.dart'; import 'package:spotube/provider/metadata_plugin/library/tracks.dart'; import 'package:auto_route/auto_route.dart'; +import 'package:spotube/provider/metadata_plugin/utils/common.dart'; @RoutePage() class LikedPlaylistPage extends HookConsumerWidget { @@ -22,6 +23,8 @@ class LikedPlaylistPage extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { final likedTracks = ref.watch(metadataPluginSavedTracksProvider); + final likedTracksNotifier = + ref.watch(metadataPluginSavedTracksProvider.notifier); final tracks = likedTracks.asData?.value.items ?? []; return material.RefreshIndicator.adaptive( @@ -33,11 +36,13 @@ class LikedPlaylistPage extends HookConsumerWidget { collection: playlist, image: Assets.images.likedTracks.path, pagination: PaginationProps( - hasNextPage: false, - isLoading: likedTracks.isLoading, - onFetchMore: () {}, + hasNextPage: likedTracks.asData?.value.hasMore ?? false, + isLoading: likedTracks.isLoadingNextPage && !likedTracks.isLoading, + onFetchMore: () async { + await likedTracksNotifier.fetchMore(); + }, onFetchAll: () async { - return tracks.toList(); + return await likedTracksNotifier.fetchAll(); }, onRefresh: () async { ref.invalidate(metadataPluginSavedTracksProvider); diff --git a/lib/provider/metadata_plugin/utils/family_paginated.dart b/lib/provider/metadata_plugin/utils/family_paginated.dart index 97717d04..ae05368f 100644 --- a/lib/provider/metadata_plugin/utils/family_paginated.dart +++ b/lib/provider/metadata_plugin/utils/family_paginated.dart @@ -14,20 +14,16 @@ abstract class FamilyPaginatedAsyncNotifier state = AsyncLoadingNext(state.asData!.value); - state = await AsyncValue.guard( - () async { - final newState = await fetch( - state.value!.nextOffset!, - state.value!.limit, - ); - - final oldItems = - state.value!.items.isEmpty ? [] : state.value!.items.cast(); - final items = newState.items.isEmpty ? [] : newState.items.cast(); - - return newState.copyWith(items: [...oldItems, ...items]); - }, + final newState = await fetch( + state.value!.nextOffset!, + state.value!.limit, ); + + final oldItems = + state.value!.items.isEmpty ? [] : state.value!.items.cast(); + final items = newState.items.isEmpty ? [] : newState.items.cast(); + + state = AsyncData(newState.copyWith(items: [...oldItems, ...items])); } Future> fetchAll() async { diff --git a/lib/provider/metadata_plugin/utils/paginated.dart b/lib/provider/metadata_plugin/utils/paginated.dart index e1d2bf26..1c19828a 100644 --- a/lib/provider/metadata_plugin/utils/paginated.dart +++ b/lib/provider/metadata_plugin/utils/paginated.dart @@ -16,20 +16,16 @@ mixin PaginatedAsyncNotifierMixin state = AsyncLoadingNext(state.asData!.value); - state = await AsyncValue.guard( - () async { - final newState = await fetch( - state.value!.nextOffset!, - state.value!.limit, - ); - - final oldItems = - state.value!.items.isEmpty ? [] : state.value!.items.cast(); - final items = newState.items.isEmpty ? [] : newState.items.cast(); - - return newState.copyWith(items: [...oldItems, ...items]); - }, + final newState = await fetch( + state.value!.nextOffset!, + state.value!.limit, ); + + final oldItems = + state.value!.items.isEmpty ? [] : state.value!.items.cast(); + final items = newState.items.isEmpty ? [] : newState.items.cast(); + + state = AsyncData(newState.copyWith(items: [...oldItems, ...items])); } Future> fetchAll() async {