From fc8c3fcc41d15921a57a4d86e9dc0fb89fa9f498 Mon Sep 17 00:00:00 2001 From: Micah Morrison Date: Mon, 18 Dec 2023 10:51:13 -0500 Subject: [PATCH] Show default community suggestions --- lib/community/pages/create_post_page.dart | 2 -- lib/feed/utils/community.dart | 13 ++++++++ lib/search/bloc/search_bloc.dart | 10 ++---- lib/shared/input_dialogs.dart | 37 ++++++++++++----------- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/lib/community/pages/create_post_page.dart b/lib/community/pages/create_post_page.dart index 841255c2e..2942a2003 100644 --- a/lib/community/pages/create_post_page.dart +++ b/lib/community/pages/create_post_page.dart @@ -750,7 +750,6 @@ class _CommunitySelectorState extends State { Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; final theme = Theme.of(context); - final accountState = context.read().state; return Transform.translate( offset: const Offset(-8, 0), @@ -767,7 +766,6 @@ class _CommunitySelectorState extends State { widget.onCommunitySelected(cv); }, - emptySuggestions: accountState.subsciptions, ); }, borderRadius: const BorderRadius.all(Radius.circular(50)), diff --git a/lib/feed/utils/community.dart b/lib/feed/utils/community.dart index 548c91f01..7393c817b 100644 --- a/lib/feed/utils/community.dart +++ b/lib/feed/utils/community.dart @@ -75,3 +75,16 @@ Future toggleFavoriteCommunity(BuildContext context, Community community, await Favorite.insertFavorite(favorite); if (context.mounted) context.read().add(GetFavoritedCommunities()); } + +/// Takes a list of [communities] and returns the list with any [favoriteCommunities] at the beginning of the list +/// Note that you may need to call [toList] on any lists that are marked as readonly. +List? prioritizeFavorites(List? communities, List? favoriteCommunities) { + return communities + ?..sort( + (a, b) => favoriteCommunities?.any((c) => c.community.id == a.community.id) == true + ? -1 + : favoriteCommunities?.any((c) => c.community.id == b.community.id) == true + ? 1 + : b.counts.subscribers.compareTo(a.counts.subscribers), + ); +} diff --git a/lib/search/bloc/search_bloc.dart b/lib/search/bloc/search_bloc.dart index 981b2dc4b..21c9680d8 100644 --- a/lib/search/bloc/search_bloc.dart +++ b/lib/search/bloc/search_bloc.dart @@ -12,6 +12,7 @@ import 'package:thunder/core/auth/helpers/fetch_account.dart'; import 'package:thunder/core/models/post_view_media.dart'; import 'package:thunder/core/singletons/lemmy_client.dart'; +import 'package:thunder/feed/utils/community.dart'; import 'package:thunder/post/utils/post.dart'; import 'package:thunder/search/utils/search_utils.dart'; import 'package:thunder/utils/comment.dart'; @@ -135,14 +136,7 @@ class SearchBloc extends Bloc { return emit(state.copyWith( status: SearchStatus.success, - communities: searchResponse.communities.toList() - ..sort( - (a, b) => event.favoriteCommunities?.any((c) => c.community.id == a.community.id) == true - ? -1 - : event.favoriteCommunities?.any((c) => c.community.id == b.community.id) == true - ? 1 - : b.counts.subscribers.compareTo(a.counts.subscribers), - ), + communities: prioritizeFavorites(searchResponse.communities.toList(), event.favoriteCommunities), users: searchResponse.users, comments: searchResponse.comments, posts: await parsePostViews(searchResponse.posts), diff --git a/lib/shared/input_dialogs.dart b/lib/shared/input_dialogs.dart index bab735501..f679cf81c 100644 --- a/lib/shared/input_dialogs.dart +++ b/lib/shared/input_dialogs.dart @@ -14,6 +14,7 @@ import 'package:thunder/core/auth/bloc/auth_bloc.dart'; import 'package:thunder/core/auth/helpers/fetch_account.dart'; import 'package:thunder/core/enums/full_name_separator.dart'; import 'package:thunder/core/singletons/lemmy_client.dart'; +import 'package:thunder/feed/utils/community.dart'; import 'package:thunder/shared/community_icon.dart'; import 'package:thunder/shared/dialogs.dart'; import 'package:thunder/shared/user_avatar.dart'; @@ -104,6 +105,13 @@ Widget buildUserSuggestionWidget(BuildContext context, PersonView payload, {void /// Shows a dialog which allows typing/search for a community void showCommunityInputDialog(BuildContext context, {required String title, required void Function(CommunityView) onCommunitySelected, Iterable? emptySuggestions}) async { + try { + emptySuggestions ??= context.read().state.subsciptions; + // TODO sort + } catch (e) { + // If we can't read the AccountBloc here, for whatever reason, it's ok. No need for subscriptions. + } + Future onSubmitted({CommunityView? payload, String? value}) async { if (payload != null) { onCommunitySelected(payload); @@ -144,15 +152,7 @@ void showCommunityInputDialog(BuildContext context, {required String title, requ Future> getCommunitySuggestions(BuildContext context, String query, Iterable? emptySuggestions) async { if (query.isNotEmpty != true) { - return (emptySuggestions?.toList() - ?..sort( - (a, b) => _getFavoriteStatus(context, a.community) - ? -1 - : _getFavoriteStatus(context, b.community) - ? 1 - : b.counts.subscribers.compareTo(a.counts.subscribers), - )) ?? - const Iterable.empty(); + return emptySuggestions ?? const Iterable.empty(); } Account? account = await fetchActiveProfileAccount(); final SearchResponse searchResponse = await LemmyClient.instance.lemmyApiV3.run(Search( @@ -162,14 +162,17 @@ Future> getCommunitySuggestions(BuildContext context, St limit: 20, sort: SortType.topAll, )); - return searchResponse.communities.toList() - ..sort( - (a, b) => _getFavoriteStatus(context, a.community) - ? -1 - : _getFavoriteStatus(context, b.community) - ? 1 - : b.counts.subscribers.compareTo(a.counts.subscribers), - ); + + List? favorites; + if (context.mounted) { + try { + favorites = context.read().state.favorites; + } catch (e) { + // Don't worry if we can't fetch favorites + } + } + + return prioritizeFavorites(searchResponse.communities.toList(), favorites) ?? const Iterable.empty(); } Widget buildCommunitySuggestionWidget(BuildContext context, CommunityView payload, {void Function(CommunityView)? onSelected}) {