From 8baf77bcf7a564eb4f0fc877e264532672eaa499 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 23 Sep 2025 14:21:37 +0800 Subject: [PATCH] :recycle: Refactor room message sorting --- lib/database/drift_db.dart | 20 +++++++++++++---- lib/route.dart | 7 ++---- lib/screens/chat/room.dart | 22 ++++++++----------- lib/screens/chat/room.g.dart | 2 +- ...sages_screen.dart => search_messages.dart} | 7 ++++-- 5 files changed, 33 insertions(+), 25 deletions(-) rename lib/screens/chat/{search_messages_screen.dart => search_messages.dart} (95%) diff --git a/lib/database/drift_db.dart b/lib/database/drift_db.dart index d5b95614..2316aff8 100644 --- a/lib/database/drift_db.dart +++ b/lib/database/drift_db.dart @@ -141,15 +141,27 @@ class AppDatabase extends _$AppDatabase { Future> searchMessages( String roomId, - String query, - ) async { + String query, { + bool? withAttachments, + }) async { var selectStatement = select(chatMessages) ..where((m) => m.roomId.equals(roomId)); if (query.isNotEmpty) { + final searchTerm = '%${query}%'; selectStatement = - selectStatement - ..where((m) => m.content.like('%${query.toLowerCase()}%')); + selectStatement..where( + (m) => + m.content.like(searchTerm) | + m.meta.like(searchTerm) | + m.attachments.like(searchTerm) | + m.type.like(searchTerm), + ); + } + + if (withAttachments == true) { + selectStatement = + selectStatement..where((m) => m.attachments.equals('[]').not()); } final messages = diff --git a/lib/route.dart b/lib/route.dart index 50300231..b0899c1b 100644 --- a/lib/route.dart +++ b/lib/route.dart @@ -38,7 +38,7 @@ import 'package:island/screens/chat/chat.dart'; import 'package:island/screens/chat/room.dart'; import 'package:island/screens/chat/room_detail.dart'; import 'package:island/screens/chat/call.dart'; -import 'package:island/screens/chat/search_messages_screen.dart'; +import 'package:island/screens/chat/search_messages.dart'; import 'package:island/screens/creators/hub.dart'; import 'package:island/screens/creators/posts/post_manage_list.dart'; import 'package:island/screens/creators/stickers/stickers.dart'; @@ -86,10 +86,7 @@ Widget _tabPagesTransitionBuilder( } bool get _supportsAnalytics => - kIsWeb || - Platform.isAndroid || - Platform.isIOS || - Platform.isMacOS; + kIsWeb || Platform.isAndroid || Platform.isIOS || Platform.isMacOS; // Provider for the router final routerProvider = Provider((ref) { diff --git a/lib/screens/chat/room.dart b/lib/screens/chat/room.dart index dc8a2621..e723ca64 100644 --- a/lib/screens/chat/room.dart +++ b/lib/screens/chat/room.dart @@ -348,7 +348,11 @@ class MessagesNotifier extends _$MessagesNotifier { ); final List dbMessages; if (_searchQuery != null && _searchQuery!.isNotEmpty) { - dbMessages = await _database.searchMessages(_roomId, _searchQuery ?? ''); + dbMessages = await _database.searchMessages( + _roomId, + _searchQuery ?? '', + withAttachments: _withAttachments, + ); } else { final chatMessagesFromDb = await _database.getMessagesForRoom( _roomId, @@ -366,11 +370,6 @@ class MessagesNotifier extends _$MessagesNotifier { filteredMessages.where((msg) => _hasLink(msg)).toList(); } - if (_withAttachments == true) { - filteredMessages = - filteredMessages.where((msg) => _hasAttachment(msg)).toList(); - } - final dbLocalMessages = filteredMessages; if (offset == 0) { @@ -852,9 +851,11 @@ class MessagesNotifier extends _$MessagesNotifier { if (existingIndex >= 0) { final newList = [...currentMessages]; newList[existingIndex] = localMessage; - state = AsyncValue.data(newList); + state = AsyncValue.data(_sortMessages(newList)); } else { - state = AsyncValue.data([localMessage, ...currentMessages]); + state = AsyncValue.data( + _sortMessages([localMessage, ...currentMessages]), + ); } } @@ -987,11 +988,6 @@ class MessagesNotifier extends _$MessagesNotifier { final urlRegex = RegExp(r'https?://[^\s/$.?#].[^\s]*'); return urlRegex.hasMatch(content); } - - bool _hasAttachment(LocalChatMessage message) { - final remoteMessage = message.toRemoteMessage(); - return remoteMessage.attachments.isNotEmpty; - } } class ChatRoomScreen extends HookConsumerWidget { diff --git a/lib/screens/chat/room.g.dart b/lib/screens/chat/room.g.dart index 468eab73..03277c06 100644 --- a/lib/screens/chat/room.g.dart +++ b/lib/screens/chat/room.g.dart @@ -6,7 +6,7 @@ part of 'room.dart'; // RiverpodGenerator // ************************************************************************** -String _$messagesNotifierHash() => r'10379c60ae46d76152f857448edef2f63d5d2dd1'; +String _$messagesNotifierHash() => r'ebbbc77a74b7130ca5885aaaa06478888cb50262'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/screens/chat/search_messages_screen.dart b/lib/screens/chat/search_messages.dart similarity index 95% rename from lib/screens/chat/search_messages_screen.dart rename to lib/screens/chat/search_messages.dart index d0609b7a..9e4b51dd 100644 --- a/lib/screens/chat/search_messages_screen.dart +++ b/lib/screens/chat/search_messages.dart @@ -112,7 +112,7 @@ class SearchMessagesScreen extends HookConsumerWidget { ? Center(child: Text('noMessagesFound'.tr())) : SuperListView.builder( padding: const EdgeInsets.symmetric(vertical: 16), - reverse: true, // Show newest messages at the bottom + reverse: false, // Show newest messages at the top itemCount: messageList.length, itemBuilder: (context, index) { final message = messageList[index]; @@ -129,7 +129,10 @@ class SearchMessagesScreen extends HookConsumerWidget { }, ), loading: () => const Center(child: CircularProgressIndicator()), - error: (error, _) => Center(child: Text('errorGeneric'.tr(args: [error.toString()]))), + error: + (error, _) => Center( + child: Text('errorGeneric'.tr(args: [error.toString()])), + ), ), ), ],