diff --git a/packages/neon/neon_news/lib/sort/folders.dart b/packages/neon/neon_news/lib/sort/folders.dart index 2797a079..435cc6a5 100644 --- a/packages/neon/neon_news/lib/sort/folders.dart +++ b/packages/neon/neon_news/lib/sort/folders.dart @@ -2,8 +2,8 @@ part of '../neon_news.dart'; final foldersSortBox = SortBox( { - FoldersSortProperty.alphabetical: (final folderFeedsWrapper) => folderFeedsWrapper.folder.name.toLowerCase(), - FoldersSortProperty.unreadCount: (final folderFeedsWrapper) => feedsUnreadCountSum(folderFeedsWrapper.feeds), + FoldersSortProperty.alphabetical: (final folderFeedsWrapper) => folderFeedsWrapper.$1.name.toLowerCase(), + FoldersSortProperty.unreadCount: (final folderFeedsWrapper) => folderFeedsWrapper.$3, }, { FoldersSortProperty.alphabetical: Box(FoldersSortProperty.unreadCount, SortBoxOrder.descending), @@ -11,19 +11,4 @@ final foldersSortBox = SortBox( }, ); -class FolderFeedsWrapper { - FolderFeedsWrapper( - this.folder, - this.feeds, - ); - - final NextcloudNewsFolder folder; - final List feeds; -} - -int feedsUnreadCountSum(final List feeds) => [ - 0, // Fixes error when no feeds are in the folder - ...feeds.map((final f) => f.unreadCount!), - ].reduce( - (final a, final b) => a + b, - ); +typedef FolderFeedsWrapper = (NextcloudNewsFolder folder, int feedCount, int unreadCount); diff --git a/packages/neon/neon_news/lib/widgets/folders_view.dart b/packages/neon/neon_news/lib/widgets/folders_view.dart index df8e457d..6839df97 100644 --- a/packages/neon/neon_news/lib/widgets/folders_view.dart +++ b/packages/neon/neon_news/lib/widgets/folders_view.dart @@ -19,14 +19,13 @@ class NewsFoldersView extends StatelessWidget { sortBoxOrderOption: bloc.options.foldersSortBoxOrderOption, input: feeds.data == null ? null - : folders.data - ?.map( - (final folder) => FolderFeedsWrapper( - folder, - feeds.data!.where((final feed) => feed.folderId == folder.id).toList(), - ), - ) - .toList(), + : folders.data?.map((final folder) { + final feedsInFolder = feeds.data!.where((final feed) => feed.folderId == folder.id); + final feedCount = feedsInFolder.length; + final unreadCount = feedsInFolder.fold(0, (final a, final b) => a + b.unreadCount!); + + return (folder, feedCount, unreadCount); + }).toList(), builder: (final context, final sorted) => NeonListView( scrollKey: 'news-folders', withFloatingActionButton: true, @@ -44,10 +43,10 @@ class NewsFoldersView extends StatelessWidget { final BuildContext context, final FolderFeedsWrapper folderFeedsWrapper, ) { - final unreadCount = feedsUnreadCountSum(folderFeedsWrapper.feeds); + final (folder, feedCount, unreadCount) = folderFeedsWrapper; return ListTile( title: Text( - folderFeedsWrapper.folder.name, + folder.name, style: unreadCount == 0 ? Theme.of(context).textTheme.titleMedium!.copyWith(color: Theme.of(context).disabledColor) : null, @@ -68,7 +67,7 @@ class NewsFoldersView extends StatelessWidget { ), Center( child: Text( - folderFeedsWrapper.feeds.length.toString(), + feedCount.toString(), style: TextStyle( color: Theme.of(context).colorScheme.onPrimary, ), @@ -95,19 +94,19 @@ class NewsFoldersView extends StatelessWidget { if (await showConfirmationDialog( context, // ignore: use_build_context_synchronously - AppLocalizations.of(context).folderDeleteConfirm(folderFeedsWrapper.folder.name), + AppLocalizations.of(context).folderDeleteConfirm(folder.name), )) { - bloc.deleteFolder(folderFeedsWrapper.folder.id); + bloc.deleteFolder(folder.id); } break; case NewsFolderAction.rename: final result = await showRenameDialog( context: context, title: AppLocalizations.of(context).folderRename, - value: folderFeedsWrapper.folder.name, + value: folder.name, ); if (result != null) { - bloc.renameFolder(folderFeedsWrapper.folder.id, result); + bloc.renameFolder(folder.id, result); } break; } @@ -115,7 +114,7 @@ class NewsFoldersView extends StatelessWidget { ), onLongPress: () { if (unreadCount > 0) { - bloc.markFolderAsRead(folderFeedsWrapper.folder.id); + bloc.markFolderAsRead(folder.id); } }, onTap: () async { @@ -123,7 +122,7 @@ class NewsFoldersView extends StatelessWidget { MaterialPageRoute( builder: (final context) => NewsFolderPage( bloc: bloc, - folder: folderFeedsWrapper.folder, + folder: folder, ), ), );