diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index 1428df1..8977953 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -10,7 +10,6 @@ import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/controllers/selected_room_controller.dart"; import "package:nexus/helpers/extensions/event_to_message.dart"; import "package:nexus/helpers/extensions/list_to_messages.dart"; -import "package:nexus/models/event.dart"; import "package:nexus/models/requests/get_room_state_request.dart"; import "package:nexus/models/requests/paginate_request.dart"; import "package:nexus/models/requests/redact_event_request.dart"; @@ -153,20 +152,17 @@ class RoomChatController extends AsyncNotifier { const ISet.empty(), ); - final existingIds = controller.messages.map((m) => m.id).toSet(); - - final messages = await response.events - .where((event) => !existingIds.contains(event.eventId)) - .fold({}, (acc, event) { - acc[event.eventId] = - event; // overwrites duplicates in response.events - return acc; - }) - .values - .toIList() - .reversed - .toMessages(ref); - await controller.insertAllMessages(messages, index: 0); + final messages = await response.events.reversed.toMessages(ref); + await controller.insertAllMessages( + messages + .where( + (newMessage) => !controller.messages.any( + (message) => message.id == newMessage.id, + ), + ) + .toList(), + index: 0, + ); } Future updateMessage(Message message, Message newMessage) async => @@ -181,12 +177,14 @@ class RoomChatController extends AsyncNotifier { var taggedMessage = message; for (final tag in tags) { - final escaped = RegExp.escape(tag.id); // TODO: Fix + final escaped = RegExp.escape(tag.id); final pattern = RegExp(r"@+(" + escaped + r")(#[^#]*#)?"); taggedMessage = taggedMessage.replaceAllMapped( pattern, - (match) => match.group(1)!, + (match) => match.group( + 1, + )!, // TODO: Return an HTML or Markdown link from here, not plaintext ); } @@ -194,6 +192,7 @@ class RoomChatController extends AsyncNotifier { client.sendMessage( SendMessageRequest( roomId: roomId, + mentions: Mentions(), // TODO: Add parsed mentions text: taggedMessage, relation: relation == null ? null diff --git a/lib/main.dart b/lib/main.dart index 8100343..e51d8af 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -37,6 +37,7 @@ New Value: ${newValue is AsyncData ? newValue.value : newValue} void showError(Object error, [StackTrace? stackTrace]) { if (error.toString().contains("DioException")) return; + if (error.toString().contains("Invalid source")) return; if (error.toString().contains("UTF-16")) return; if (error.toString().contains("HTTP request failed")) return; if (error.toString().contains("Invalid image data")) return; diff --git a/lib/widgets/chat_page/sidebar.dart b/lib/widgets/chat_page/sidebar.dart index a883228..cd394e3 100644 --- a/lib/widgets/chat_page/sidebar.dart +++ b/lib/widgets/chat_page/sidebar.dart @@ -1,4 +1,3 @@ -import "package:collection/collection.dart"; import "package:flutter/material.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; @@ -66,11 +65,9 @@ class Sidebar extends HookConsumerWidget { fallback: space.icon == null ? null : Icon(space.icon), space.title, headers: {}, // TODO - hasBadge: - space.children.firstWhereOrNull( - (room) => room.metadata?.unreadMessages != 0, - ) != - null, + hasBadge: space.children.any( + (room) => room.metadata?.unreadMessages != 0, + ), badgeNumber: space.children.fold( 0, (previousValue, room) =>