♻️ Refactor room message sorting
This commit is contained in:
		@@ -141,15 +141,27 @@ class AppDatabase extends _$AppDatabase {
 | 
			
		||||
 | 
			
		||||
  Future<List<LocalChatMessage>> 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 =
 | 
			
		||||
 
 | 
			
		||||
@@ -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<GoRouter>((ref) {
 | 
			
		||||
 
 | 
			
		||||
@@ -348,7 +348,11 @@ class MessagesNotifier extends _$MessagesNotifier {
 | 
			
		||||
    );
 | 
			
		||||
    final List<LocalChatMessage> 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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ part of 'room.dart';
 | 
			
		||||
// RiverpodGenerator
 | 
			
		||||
// **************************************************************************
 | 
			
		||||
 | 
			
		||||
String _$messagesNotifierHash() => r'10379c60ae46d76152f857448edef2f63d5d2dd1';
 | 
			
		||||
String _$messagesNotifierHash() => r'ebbbc77a74b7130ca5885aaaa06478888cb50262';
 | 
			
		||||
 | 
			
		||||
/// Copied from Dart SDK
 | 
			
		||||
class _SystemHash {
 | 
			
		||||
 
 | 
			
		||||
@@ -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()])),
 | 
			
		||||
                  ),
 | 
			
		||||
            ),
 | 
			
		||||
          ),
 | 
			
		||||
        ],
 | 
			
		||||
		Reference in New Issue
	
	Block a user