diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index fde8d26..3dbe0a8 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -22,11 +22,12 @@ class RoomChatController extends AsyncNotifier { if (event.type == EventTypes.Redaction) { final controller = await future; - await controller.removeMessage( - controller.messages.firstWhere( - (message) => message.id == event.redacts, - ), + final message = controller.messages.firstWhereOrNull( + (message) => message.id == event.redacts, ); + if (message == null) return; + + await controller.removeMessage(message); } else { final message = await event.toMessage(includeEdits: true); if (event.relationshipType == RelationshipTypes.edit) { diff --git a/lib/helpers/extensions/event_to_message.dart b/lib/helpers/extensions/event_to_message.dart index c1443e5..ed7d326 100644 --- a/lib/helpers/extensions/event_to_message.dart +++ b/lib/helpers/extensions/event_to_message.dart @@ -17,6 +17,8 @@ extension EventToMessage on Event { ? null : await room.getEventById(replyId); + final sender = + await event.fetchSenderUser() ?? event.senderFromMemoryOrFallback; final newContent = event.content["m.new_content"] as Map?; final metadata = { "formatted": @@ -26,9 +28,8 @@ extension EventToMessage on Event { event.body, "reply": await replyEvent?.toMessage(mustBeText: true), "eventType": event.type, - "displayName": - event.senderFromMemoryOrFallback.displayName ?? - event.senderFromMemoryOrFallback.id, + "avatarUrl": sender.avatarUrl.toString(), + "displayName": sender.displayName ?? sender.id, "txnId": transactionId, }; @@ -107,7 +108,7 @@ extension EventToMessage on Event { id: eventId, authorId: senderId, text: - "${event.senderFromMemoryOrFallback.displayName} ${switch (Membership.values.firstWhereOrNull((membership) => membership.name == event.content["membership"])) { + "${event.asUser.displayName ?? event.asUser.id} ${switch (Membership.values.firstWhereOrNull((membership) => membership.name == event.content["membership"])) { Membership.invite => "was invited to", Membership.join => "joined", Membership.leave => "left", diff --git a/lib/widgets/chat_page/chat_box.dart b/lib/widgets/chat_page/chat_box.dart index ad35a2d..1a03603 100644 --- a/lib/widgets/chat_page/chat_box.dart +++ b/lib/widgets/chat_page/chat_box.dart @@ -2,7 +2,6 @@ import "dart:io"; import "package:flutter/material.dart"; import "package:flutter/services.dart"; import "package:flutter_chat_core/flutter_chat_core.dart"; -import "package:flutter_chat_ui/flutter_chat_ui.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:fluttertagger/fluttertagger.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; @@ -35,17 +34,22 @@ class ChatBox extends HookConsumerWidget { Future send() => ref .watch(RoomChatController.provider(room).notifier) - .send(controller.value.text); + .send(controller.value.text, replyTo: replyToMessage); final node = useFocusNode( onKeyEvent: (_, event) { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter && - !(Platform.isAndroid || Platform.isIOS) ^ - HardwareKeyboard.instance.isShiftPressed) { - send(); - return KeyEventResult.handled; + if (event is! KeyDownEvent || Platform.isAndroid || Platform.isIOS) { + if (event.logicalKey == LogicalKeyboardKey.enter && + !HardwareKeyboard.instance.isShiftPressed) { + send(); + return KeyEventResult.handled; + } + if (event.logicalKey == LogicalKeyboardKey.escape) { + onDismiss(); + return KeyEventResult.handled; + } } + return KeyEventResult.ignored; }, ); @@ -73,10 +77,17 @@ class ChatBox extends HookConsumerWidget { spacing: 8, children: [ SizedBox(width: 4), - Avatar( - userId: replyToMessage!.authorId, + AvatarOrHash( + ref + .watch( + AvatarController.provider( + replyToMessage!.metadata!["avatarUrl"], + ), + ) + .whenOrNull(data: (data) => data), + replyToMessage!.metadata!["displayName"].toString(), headers: room.client.headers, - size: 16, + height: 16, ), Text( replyToMessage!.metadata?["displayName"] ??