♻️ Refactor room message sorting
This commit is contained in:
@@ -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 =
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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()])),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
Reference in New Issue
Block a user