diff --git a/commet/lib/ui/molecules/message_input.dart b/commet/lib/ui/molecules/message_input.dart index b202db60e..97f70a912 100644 --- a/commet/lib/ui/molecules/message_input.dart +++ b/commet/lib/ui/molecules/message_input.dart @@ -601,8 +601,8 @@ class MessageInputState extends State { } if (widget.disableEnterToSend != true) { - if (HardwareKeyboard.instance - .isLogicalKeyPressed(LogicalKeyboardKey.enter)) { + if (event is KeyDownEvent && + event.logicalKey == LogicalKeyboardKey.enter) { if (autoFillSelection != null && autoFillRange != null) { applyAutoFill(autoFillResults![autoFillSelection!]); return KeyEventResult.handled; diff --git a/commet/lib/ui/organisms/chat/chat.dart b/commet/lib/ui/organisms/chat/chat.dart index f5575d6a0..aaf956994 100644 --- a/commet/lib/ui/organisms/chat/chat.dart +++ b/commet/lib/ui/organisms/chat/chat.dart @@ -176,88 +176,92 @@ class ChatState extends State { } void sendMessage(String message, {Client? overrideClient}) async { + if (processing) return; + setState(() { processing = true; }); - for (var file in attachments) { - await file.resolve(); - var exif = await readExifFromBytes(file.data!); - - if (exif.keys.any((e) => e.toLowerCase().contains("gps"))) { - // ignore: use_build_context_synchronously - var confirmation = await AdaptiveDialog.confirmation(context, - title: file.name ?? "File", - confirmationText: "Send File", - cancelText: "Don't send file", - dangerous: true, - prompt: - "Location data was detected in file '${file.name}', are you sure you want to send?"); - - if (confirmation != true) { - setState(() { - processing = false; - }); - return; + try { + for (var file in attachments) { + await file.resolve(); + var exif = await readExifFromBytes(file.data!); + + if (exif.keys.any((e) => e.toLowerCase().contains("gps"))) { + // ignore: use_build_context_synchronously + var confirmation = await AdaptiveDialog.confirmation(context, + title: file.name ?? "File", + confirmationText: "Send File", + cancelText: "Don't send file", + dangerous: true, + prompt: + "Location data was detected in file '${file.name}', are you sure you want to send?"); + + if (confirmation != true) { + return; + } } } - } - var targetRoom = room; - var targetThread = threadsComponent; + var targetRoom = room; + var targetThread = threadsComponent; - if (overrideClient != null) { - var newRoom = overrideClient.getRoom(targetRoom.identifier); - if (newRoom != null) { - targetRoom = newRoom; - targetThread = targetRoom.client.getComponent(); - Log.d("Overriding room for client: ${overrideClient}"); - } else { - Log.e( - "Failed to find correct room to send event for override client. Cancelling"); + if (overrideClient != null) { + var newRoom = overrideClient.getRoom(targetRoom.identifier); + if (newRoom != null) { + targetRoom = newRoom; + targetThread = targetRoom.client.getComponent(); + Log.d("Overriding room for client: ${overrideClient}"); + } else { + Log.e( + "Failed to find correct room to send event for override client. Cancelling"); - return; + return; + } } - } - - var processedAttachments = await targetRoom.processAttachments(attachments); - setState(() { - processing = false; - }); + var processedAttachments = + await targetRoom.processAttachments(attachments); + + var component = targetRoom.client.getComponent(); + + if (component?.isExecutable(message) == true) { + await doCommand(component, message); + } else if (isThread) { + await targetThread!.sendMessage( + threadRootEventId: widget.threadId!, + room: targetRoom, + message: message, + inReplyTo: interactionType == EventInteractionType.reply + ? interactingEvent + : null, + replaceEvent: interactionType == EventInteractionType.edit + ? interactingEvent + : null, + processedAttachments: processedAttachments); + } else { + await targetRoom.sendMessage( + message: message, + inReplyTo: interactionType == EventInteractionType.reply + ? interactingEvent + : null, + replaceEvent: interactionType == EventInteractionType.edit + ? interactingEvent + : null, + processedAttachments: processedAttachments); + } - var component = targetRoom.client.getComponent(); - - if (component?.isExecutable(message) == true) { - doCommand(component, message); - } else if (isThread) { - targetThread!.sendMessage( - threadRootEventId: widget.threadId!, - room: targetRoom, - message: message, - inReplyTo: interactionType == EventInteractionType.reply - ? interactingEvent - : null, - replaceEvent: interactionType == EventInteractionType.edit - ? interactingEvent - : null, - processedAttachments: processedAttachments); - } else { - targetRoom.sendMessage( - message: message, - inReplyTo: interactionType == EventInteractionType.reply - ? interactingEvent - : null, - replaceEvent: interactionType == EventInteractionType.edit - ? interactingEvent - : null, - processedAttachments: processedAttachments); + typingIndicators?.setTypingStatus(false); + setInteractingEvent(null); + clearAttachments(); + setMessageInputText.add(""); + } finally { + if (mounted) { + setState(() { + processing = false; + }); + } } - - typingIndicators?.setTypingStatus(false); - setInteractingEvent(null); - clearAttachments(); - setMessageInputText.add(""); } Future doCommand(