Skip to content

commit a1d543b

abduznik edited this page May 23, 2026 · 1 revision

feat: use ID-based sorting for Recently Added shelf

Commit: a1d543b88cb840640dce9d507dbba6fac550727d

Author: abduznik

Date: 2026-04-29

Why: Adds a new feature or capability to the application.

Files Changed

lib/core/romm/romm_service.dart             | 21 +++++++++++++++++++++
 lib/providers/paginated_games_provider.dart |  6 ++++++
 lib/ui/screens/library_screen.dart          | 18 ++++++++++++------
 3 files changed, 39 insertions(+), 6 deletions(-)
  • lib/core/romm/romm_service.dart
  • lib/providers/paginated_games_provider.dart
  • lib/ui/screens/library_screen.dart

Diff

diff --git a/lib/core/romm/romm_service.dart b/lib/core/romm/romm_service.dart
index 9a6d36f..f8bceb2 100644
--- a/lib/core/romm/romm_service.dart
+++ b/lib/core/romm/romm_service.dart
@@ -250,6 +250,27 @@ class RommService {
     return _fetchPaginatedGames(params);
   }
 
+  Future<List<Game>> getRecentlyAdded({int limit = 15}) async {
+    try {
+      final response = await _dio.get(
+        '/api/roms', 
+        queryParameters: {
+          'limit': limit, 
+          'order_by': 'id', 
+          'order_dir': 'desc', 
+          'with_char_index': false, 
+          'with_filter_values': false
+        }, 
+        options: _authOptions
+      );
+      if (response.statusCode == 200) {
+        final List<dynamic> items = response.data is Map ? (response.data['items'] ?? []) : (response.data is List ? response.data : []);
+        return items.map((e) => Game.fromJson(e as Map<String, dynamic>)).toList();
+      }
+      return [];
+    } catch (_) { return []; }
+  }
+
   Future<List<Game>> getRecentlyPlayed({int limit = 15}) async {
     try {
       final response = await _dio.get('/api/roms', queryParameters: {'limit': limit, 'order_by': 'last_played', 'order_dir': 'desc', 'last_played': true, 'with_char_index': false, 'with_filter_values': false}, options: _authOptions);
diff --git a/lib/providers/paginated_games_provider.dart b/lib/providers/paginated_games_provider.dart
index 535981e..b33a1da 100644
--- a/lib/providers/paginated_games_provider.dart
+++ b/lib/providers/paginated_games_provider.dart
@@ -375,3 +375,9 @@ final recentlyPlayedProvider = FutureProvider<List<Game>>((ref) async {
   if (service == null) return [];
   return service.getRecentlyPlayed(limit: 15);
 });
+
+final recentlyAddedProvider = FutureProvider<List<Game>>((ref) async {
+  final service = ref.watch(rommServiceProvider);
+  if (service == null) return [];
+  return service.getRecentlyAdded(limit: 15);
+});
diff --git a/lib/ui/screens/library_screen.dart b/lib/ui/screens/library_screen.dart
index 6c6fdd7..7c931a0 100644
--- a/lib/ui/screens/library_screen.dart
+++ b/lib/ui/screens/library_screen.dart
@@ -64,6 +64,8 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen> with LibraryActio
 
   Future<void> _refreshLibrary() async {
     ref.invalidate(platformsProvider);
+    ref.invalidate(recentlyAddedProvider);
+    ref.invalidate(recentlyPlayedProvider);
     ref.read(paginatedGamesProvider.notifier).reset();
     await ref.read(paginatedGamesProvider.notifier).loadInitial(
       platformId: ref.read(selectedPlatformIdProvider)?.toString(),
@@ -533,12 +535,16 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen> with LibraryActio
                                       ),
                                     ),
                                     // 2. Recently Added
-                                    _buildHorizontalShelf(
-                                      context: context,
-                                      title: 'Recently Added',
-                                      icon: Icons.new_releases_outlined,
-                                      games: displayGames.take(15).toList(),
-                                      ref: ref,
+                                    ref.watch(recentlyAddedProvider).when(
+                                      loading: () => const SizedBox.shrink(),
+                                      error: (e, s) => const SizedBox.shrink(),
+                                      data: (games) => _buildHorizontalShelf(
+                                        context: context,
+                                        title: 'Recently Added',
+                                        icon: Icons.new_releases_outlined,
+                                        games: games,
+                                        ref: ref,
+                                      ),
                                     ),
                                     // 3. Installed Games
                                     metadataCacheAsync.when(

Clone this wiki locally