From 9745205302cb5d066513f3ee2eefd9a187498f47 Mon Sep 17 00:00:00 2001 From: Pascal Precht Date: Mon, 7 Dec 2020 15:59:24 +0100 Subject: [PATCH] refactor(Chat): move send message logic out of status chat input `StatusChatInput` ideally shouldn't rely on chatsModel and other global objects at all. Also, when using the component in different places, it can cause accidental sending of message when testing the component (because all the logic is already wired up) --- ui/app/AppLayouts/Chat/ChatColumn.qml | 15 ++++++++++++ ui/shared/status/StatusChatInput.qml | 33 ++++++++++++--------------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/ui/app/AppLayouts/Chat/ChatColumn.qml b/ui/app/AppLayouts/Chat/ChatColumn.qml index 91e1e8b3c9..b5c67eef73 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn.qml @@ -268,6 +268,21 @@ StackLayout { onStickerSelected: { chatsModel.stickers.send(hashId, packId) } + onSendMessage: { + if (chatInput.fileUrls.length > 0){ + chatsModel.sendImage(chatInput.fileUrls[0]); + } + var msg = chatsModel.plainText(Emoji.deparse(chatInput.textInput.text)) + if (msg.length > 0){ + msg = chatInput.interpretMessage(msg) + chatsModel.sendMessage(msg, chatInput.isReply ? SelectedMessage.messageId : "", Utils.isOnlyEmoji(msg) ? Constants.emojiType : Constants.messageType); + chatInput.textInput.text = ""; + if(event) event.accepted = true + chatInput.messageSound.stop() + Qt.callLater(chatInput.messageSound.play); + } + + } } } } diff --git a/ui/shared/status/StatusChatInput.qml b/ui/shared/status/StatusChatInput.qml index 78d88082b7..761cf8dbbb 100644 --- a/ui/shared/status/StatusChatInput.qml +++ b/ui/shared/status/StatusChatInput.qml @@ -16,6 +16,7 @@ Rectangle { signal sendTransactionCommandButtonClicked() signal receiveTransactionCommandButtonClicked() signal stickerSelected(string hashId, string packId) + signal sendMessage(var event) property bool emojiEvent: false; property bool paste: false; @@ -37,6 +38,9 @@ Rectangle { property alias textInput: messageInputField property bool isStatusUpdateInput: chatType === Constants.chatTypeStatusUpdate + property var fileUrls: [] + property alias messageSound: sendMessageSound + height: { if (extendedArea.visible) { return messageInput.height + extendedArea.height + Style.current.bigPadding @@ -71,7 +75,7 @@ Rectangle { messageInputField.insert(start, text.replace(/\n/g, "
")); } - function interpretMessage(msg) { + property var interpretMessage: function (msg) { if (msg.startsWith("/shrug")) { return msg.replace("/shrug", "") + " ¯\\\\\\_(ツ)\\_/¯" } @@ -98,8 +102,12 @@ Rectangle { event.accepted = true; return } + if (control.isStatusUpdateInput) { + return // Status update require the send button to be clicked + } if (messageInputField.length < messageLimit) { - sendMsg(event); + control.sendMessage(event) + control.hideExtendedArea(); return; } if(event) event.accepted = true @@ -334,25 +342,10 @@ Rectangle { return true; } - function sendMsg(event){ - if(control.isImage){ - chatsModel.sendImage(imageArea.imageSource); - } - var msg = chatsModel.plainText(Emoji.deparse(messageInputField.text)) - if(msg.length > 0){ - msg = interpretMessage(msg) - chatsModel.sendMessage(msg, control.isReply ? SelectedMessage.messageId : "", Utils.isOnlyEmoji(msg) ? Constants.emojiType : Constants.messageType); - messageInputField.text = ""; - if(event) event.accepted = true - sendMessageSound.stop() - Qt.callLater(sendMessageSound.play); - } - control.hideExtendedArea(); - } - function hideExtendedArea() { isImage = false; isReply = false; + control.fileUrls = [] imageArea.imageSource = ""; replyArea.userName = "" replyArea.identicon = "" @@ -362,7 +355,8 @@ Rectangle { function showImageArea(imagePath) { isImage = true; isReply = false; - imageArea.imageSource = imageDialog.fileUrls[0] + control.fileUrls = imageDialog.fileUrls + imageArea.imageSource = control.fileUrls[0] } function showReplyArea(userName, message, identicon) { @@ -582,6 +576,7 @@ Rectangle { anchors.topMargin: control.isStatusUpdateInput ? 0 : Style.current.halfPadding visible: isImage onImageRemoved: { + control.fileUrls = [] isImage = false } }