From ac424bde36e467a50c2320fb0ab1eec7a5879f18 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 10 Oct 2025 00:50:17 +0800 Subject: [PATCH] :lipstick: Optimize the ability to search --- lib/pods/chat/messages_notifier.dart | 21 +++++++++++++++++---- lib/screens/chat/search_messages.dart | 5 ++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/pods/chat/messages_notifier.dart b/lib/pods/chat/messages_notifier.dart index e1d7f314..a296ea42 100644 --- a/lib/pods/chat/messages_notifier.dart +++ b/lib/pods/chat/messages_notifier.dart @@ -124,6 +124,7 @@ class MessagesNotifier extends _$MessagesNotifier { }) async { talker.log('Getting cached messages from offset $offset, take $take'); final List dbMessages; + if (searchQuery != null && searchQuery.isNotEmpty) { dbMessages = await _database.searchMessages( _roomId, @@ -147,6 +148,13 @@ class MessagesNotifier extends _$MessagesNotifier { filteredMessages.where((msg) => _hasLink(msg)).toList(); } + if (withAttachments == true) { + filteredMessages = + filteredMessages + .where((msg) => msg.toRemoteMessage().attachments.isNotEmpty) + .toList(); + } + final dbLocalMessages = filteredMessages; // Always ensure unique messages to prevent duplicate keys @@ -778,18 +786,23 @@ class MessagesNotifier extends _$MessagesNotifier { bool? withAttachments, }) async { final trimmedQuery = query.trim(); + final hasFilters = [withLinks, withAttachments].any((e) => e == true); - if (trimmedQuery.isEmpty) { + if (trimmedQuery.isEmpty && !hasFilters) { return []; } - talker.log('Getting search results for query: $trimmedQuery'); + talker.log( + 'Getting search results for query: $trimmedQuery, filters: links=$withLinks, attachments=$withAttachments', + ); try { + // When filtering without query, get more messages to ensure we find all matches + final take = (trimmedQuery.isEmpty && hasFilters) ? 1000 : 50; final messages = await _getCachedMessages( offset: 0, - take: 50, - searchQuery: trimmedQuery, + take: take, + searchQuery: trimmedQuery.isNotEmpty ? trimmedQuery : null, withLinks: withLinks, withAttachments: withAttachments, ); // Limit initial search results diff --git a/lib/screens/chat/search_messages.dart b/lib/screens/chat/search_messages.dart index 0dc7f518..649b2dfb 100644 --- a/lib/screens/chat/search_messages.dart +++ b/lib/screens/chat/search_messages.dart @@ -130,7 +130,10 @@ class SearchMessagesScreen extends HookConsumerWidget { // Optimized search function with debouncing void performSearch(String query) async { - if (query.trim().isEmpty) { + final trimmedQuery = query.trim(); + final hasFilters = withLinks.value || withAttachments.value; + + if (trimmedQuery.isEmpty && !hasFilters) { searchState.value = SearchState.idle; searchResultCount.value = null; searchResults.value = const AsyncValue.data([]);