♻️ Refactor room message sorting

This commit is contained in:
2025-09-23 14:21:37 +08:00
parent b2ac5fbef2
commit 8baf77bcf7
5 changed files with 33 additions and 25 deletions

View File

@@ -141,15 +141,27 @@ class AppDatabase extends _$AppDatabase {
Future<List<LocalChatMessage>> searchMessages( Future<List<LocalChatMessage>> searchMessages(
String roomId, String roomId,
String query, String query, {
) async { bool? withAttachments,
}) async {
var selectStatement = select(chatMessages) var selectStatement = select(chatMessages)
..where((m) => m.roomId.equals(roomId)); ..where((m) => m.roomId.equals(roomId));
if (query.isNotEmpty) { if (query.isNotEmpty) {
final searchTerm = '%${query}%';
selectStatement = selectStatement =
selectStatement selectStatement..where(
..where((m) => m.content.like('%${query.toLowerCase()}%')); (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 = final messages =

View File

@@ -38,7 +38,7 @@ import 'package:island/screens/chat/chat.dart';
import 'package:island/screens/chat/room.dart'; import 'package:island/screens/chat/room.dart';
import 'package:island/screens/chat/room_detail.dart'; import 'package:island/screens/chat/room_detail.dart';
import 'package:island/screens/chat/call.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/hub.dart';
import 'package:island/screens/creators/posts/post_manage_list.dart'; import 'package:island/screens/creators/posts/post_manage_list.dart';
import 'package:island/screens/creators/stickers/stickers.dart'; import 'package:island/screens/creators/stickers/stickers.dart';
@@ -86,10 +86,7 @@ Widget _tabPagesTransitionBuilder(
} }
bool get _supportsAnalytics => bool get _supportsAnalytics =>
kIsWeb || kIsWeb || Platform.isAndroid || Platform.isIOS || Platform.isMacOS;
Platform.isAndroid ||
Platform.isIOS ||
Platform.isMacOS;
// Provider for the router // Provider for the router
final routerProvider = Provider<GoRouter>((ref) { final routerProvider = Provider<GoRouter>((ref) {

View File

@@ -348,7 +348,11 @@ class MessagesNotifier extends _$MessagesNotifier {
); );
final List<LocalChatMessage> dbMessages; final List<LocalChatMessage> dbMessages;
if (_searchQuery != null && _searchQuery!.isNotEmpty) { if (_searchQuery != null && _searchQuery!.isNotEmpty) {
dbMessages = await _database.searchMessages(_roomId, _searchQuery ?? ''); dbMessages = await _database.searchMessages(
_roomId,
_searchQuery ?? '',
withAttachments: _withAttachments,
);
} else { } else {
final chatMessagesFromDb = await _database.getMessagesForRoom( final chatMessagesFromDb = await _database.getMessagesForRoom(
_roomId, _roomId,
@@ -366,11 +370,6 @@ class MessagesNotifier extends _$MessagesNotifier {
filteredMessages.where((msg) => _hasLink(msg)).toList(); filteredMessages.where((msg) => _hasLink(msg)).toList();
} }
if (_withAttachments == true) {
filteredMessages =
filteredMessages.where((msg) => _hasAttachment(msg)).toList();
}
final dbLocalMessages = filteredMessages; final dbLocalMessages = filteredMessages;
if (offset == 0) { if (offset == 0) {
@@ -852,9 +851,11 @@ class MessagesNotifier extends _$MessagesNotifier {
if (existingIndex >= 0) { if (existingIndex >= 0) {
final newList = [...currentMessages]; final newList = [...currentMessages];
newList[existingIndex] = localMessage; newList[existingIndex] = localMessage;
state = AsyncValue.data(newList); state = AsyncValue.data(_sortMessages(newList));
} else { } 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]*'); final urlRegex = RegExp(r'https?://[^\s/$.?#].[^\s]*');
return urlRegex.hasMatch(content); return urlRegex.hasMatch(content);
} }
bool _hasAttachment(LocalChatMessage message) {
final remoteMessage = message.toRemoteMessage();
return remoteMessage.attachments.isNotEmpty;
}
} }
class ChatRoomScreen extends HookConsumerWidget { class ChatRoomScreen extends HookConsumerWidget {

View File

@@ -6,7 +6,7 @@ part of 'room.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$messagesNotifierHash() => r'10379c60ae46d76152f857448edef2f63d5d2dd1'; String _$messagesNotifierHash() => r'ebbbc77a74b7130ca5885aaaa06478888cb50262';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View File

@@ -112,7 +112,7 @@ class SearchMessagesScreen extends HookConsumerWidget {
? Center(child: Text('noMessagesFound'.tr())) ? Center(child: Text('noMessagesFound'.tr()))
: SuperListView.builder( : SuperListView.builder(
padding: const EdgeInsets.symmetric(vertical: 16), 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, itemCount: messageList.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final message = messageList[index]; final message = messageList[index];
@@ -129,7 +129,10 @@ class SearchMessagesScreen extends HookConsumerWidget {
}, },
), ),
loading: () => const Center(child: CircularProgressIndicator()), 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()])),
),
), ),
), ),
], ],