From 94f6041ec5feed6374df259f63b2ec262676a52b Mon Sep 17 00:00:00 2001 From: Anthony Laibe Date: Tue, 24 Aug 2021 11:10:26 +0200 Subject: [PATCH] feat(@desktop/chat): Align chat member and suggestion Removed all computation of suggestion from qml Reuse user list in order to populate the suggestion box As a side effect, the suggestion are not serialized from qml to nim Remove InputArea which seems not used anymore --- src/app/chat/view.nim | 33 +++---- src/app/chat/views/message_list.nim | 14 +-- src/app/chat/views/messages.nim | 76 +++++++-------- src/app/chat/views/suggestions_list.nim | 77 --------------- src/app/chat/views/user_list.nim | 31 ++++-- src/status/chat.nim | 1 + src/status/profile/profile.nim | 4 +- ui/app/AppLayouts/Chat/ChatColumn.qml | 64 +------------ .../ChatColumn/ChatComponents/InputArea.qml | 95 ------------------- .../MessageComponents/CompactMessage.qml | 10 +- .../Chat/ChatColumn/SuggestionFilter.qml | 11 ++- ui/nim-status-client.pro | 1 - ui/shared/status/StatusChatInput.qml | 15 +-- 13 files changed, 97 insertions(+), 335 deletions(-) delete mode 100644 src/app/chat/views/suggestions_list.nim delete mode 100644 ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/InputArea.qml diff --git a/src/app/chat/view.nim b/src/app/chat/view.nim index ef034c84a0..7042fd7941 100644 --- a/src/app/chat/view.nim +++ b/src/app/chat/view.nim @@ -10,7 +10,7 @@ import ../../status/ens as status_ens import ../../status/chat/[chat, message] import ../../status/profile/profile import web3/[conversions, ethtypes] -import views/[channels_list, message_list, chat_item, suggestions_list, reactions, stickers, groups, transactions, communities, community_list, community_item, format_input, ens, activity_notification_list, channel, messages, message_item, gif] +import views/[channels_list, message_list, chat_item, reactions, stickers, groups, transactions, communities, community_list, community_item, format_input, ens, activity_notification_list, channel, messages, message_item, gif] import ../utils/image_utils import ../../status/tasks/[qt, task_runner_impl] import ../../status/tasks/marathon/mailserver/worker @@ -78,7 +78,6 @@ QtObject: channelView*: ChannelView messageView*: MessageView messageSearchViewController: MessageSearchViewController - currentSuggestions*: SuggestionsList activityNotificationList*: ActivityNotificationList callResult: string reactions*: ReactionView @@ -94,10 +93,9 @@ QtObject: proc setup(self: ChatsView) = self.QAbstractListModel.setup - proc delete(self: ChatsView) = + proc delete(self: ChatsView) = self.formatInputView.delete self.ensView.delete - self.currentSuggestions.delete self.activityNotificationList.delete self.reactions.delete self.stickers.delete @@ -116,10 +114,9 @@ QtObject: result.communities = newCommunitiesView(status) result.channelView = newChannelView(status, result.communities) result.messageView = newMessageView(status, result.channelView, result.communities) - result.messageSearchViewController = newMessageSearchViewController(status, + result.messageSearchViewController = newMessageSearchViewController(status, result.channelView, result.communities) result.connected = false - result.currentSuggestions = newSuggestionsList() result.activityNotificationList = newActivityNotificationList(status) result.reactions = newReactionView( status, @@ -165,7 +162,7 @@ QtObject: QtProperty[QVariant] messageView: read = getMessageView - proc getMessageSearchViewController*(self: ChatsView): QVariant {.slot.} = + proc getMessageSearchViewController*(self: ChatsView): QVariant {.slot.} = newQVariant(self.messageSearchViewController) QtProperty[QVariant] messageSearchViewController: @@ -181,7 +178,7 @@ QtObject: let tmpImagePath = image_resizer(image, 2000, TMPDIR) var channelId = self.channelView.activeChannel.id - + if isStatusUpdate: channelId = "@" & self.pubKey @@ -221,12 +218,6 @@ QtObject: return status_ens.userNameOrAlias(self.status.chat.contacts[pubKey]) generateAlias(pubKey) - proc getCurrentSuggestions(self: ChatsView): QVariant {.slot.} = - return newQVariant(self.currentSuggestions) - - QtProperty[QVariant] suggestionList: - read = getCurrentSuggestions - proc activityNotificationsChanged*(self: ChatsView) {.signal.} proc getActivityNotificationList(self: ChatsView): QVariant {.slot.} = @@ -266,7 +257,7 @@ QtObject: if channel.name == "" or channel.name == channel.id: if channel.ensName != "": channel.name = channel.ensName - else: + else: channel.name = contact.username else: channel.name = contact.localNickname @@ -336,16 +327,20 @@ QtObject: self.communities.updateCommunityChat(chat) if(self.channelView.activeChannel.id == chat.id): self.activeChannelChanged() + continue + self.messageView.upsertChannel(chat.id) self.channelView.chats.updateChat(chat) + if(self.channelView.activeChannel.id == chat.id): self.channelView.activeChannel.setChatItem(chat) self.activeChannelChanged() - self.currentSuggestions.setNewData(self.status.contacts.getContacts()) + if self.channelView.contextChannel.id == chat.id: self.channelView.contextChannel.setChatItem(chat) self.channelView.contextChannelChanged() + self.messageView.calculateUnreadMessages() proc isConnected*(self: ChatsView): bool {.slot.} = @@ -490,7 +485,7 @@ QtObject: proc calculateUnreadMessages*(self: ChatsView) = self.messageView.calculateUnreadMessages() - proc sendingMessage*(self: ChatsView) = + proc sendingMessage*(self: ChatsView) = self.messageView.sendingMessage() proc sendingMessageFailed*(self: ChatsView) = @@ -499,11 +494,11 @@ QtObject: proc markMessageAsSent*(self: ChatsView, chat: string, messageId: string) = self.messageView.markMessageAsSent(chat, messageId) - # TODO: this method was created just to test the store functionality. + # TODO: this method was created just to test the store functionality. # It should be removed, once peer management is added to status-go proc requestAllHistoricMessages(self: ChatsView) {.slot.} = debug "Requesting messages" - # TODO: the mailservers must change depending on whether we are using wakuV1 or wakuV2 + # TODO: the mailservers must change depending on whether we are using wakuV1 or wakuV2 # in the meantime I'm hardcoding a specific mailserver echo self.status.mailservers.setMailserver("16Uiu2HAm4v86W3bmT1BiH6oSPzcsSr24iDQpSN5Qa992BCjjwgrD") echo self.status.mailservers.requestAllHistoricMessages() diff --git a/src/app/chat/views/message_list.nim b/src/app/chat/views/message_list.nim index 7a74ea62ea..ab5cd8936b 100644 --- a/src/app/chat/views/message_list.nim +++ b/src/app/chat/views/message_list.nim @@ -56,7 +56,7 @@ QtObject: isEdited*: Table[string, bool] messageReactions*: Table[string, string] timedoutMessages: HashSet[string] - userList: UserListView + userList*: UserListView loadingHistoryMessages: bool initialMessagesLoaded: bool @@ -152,7 +152,7 @@ QtObject: return self.messages[self.messageIndex[messageId]] proc deleteMessage*(self: ChatMessageList, messageId: string): bool = - if not self.messageIndex.hasKey(messageId): + if not self.messageIndex.hasKey(messageId): return false let messageIndex = self.messageIndex[messageId] @@ -180,7 +180,7 @@ QtObject: self.messages[msgIdx].parsedText = message.parsedText self.messages[msgIdx].text = message.text self.dataChanged(topLeft, bottomRight, @[ChatMessageRoles.Message.int, ChatMessageRoles.PlainText.int, ChatMessageRoles.IsEdited.int]) - + proc resetTimeOut*(self: ChatMessageList, messageId: string) = if not self.messageIndex.hasKey(messageId): return let msgIdx = self.messageIndex[messageId] @@ -332,8 +332,8 @@ QtObject: proc add*(self: ChatMessageList, message: Message) = if self.messageIndex.hasKey(message.id) and message.editedAt == "0": return # duplicated msg - - if message.editedAt != "0": + + if message.editedAt != "0": self.isEdited[message.id] = true if self.messageIndex.hasKey(message.id): self.replaceMessage(message) @@ -380,7 +380,7 @@ QtObject: self.countChanged() proc setMessageReactions*(self: ChatMessageList, messageId: string, newReactions: string)= - self.messageReactions[messageId] = newReactions + self.messageReactions[messageId] = newReactions if not self.messageIndex.hasKey(messageId): return let msgIdx = self.messageIndex[messageId] let topLeft = self.createIndex(msgIdx, 0, nil) @@ -393,7 +393,7 @@ QtObject: let msgIdx = self.messageIndex[messageId] if msgIdx < 0: return false if msgIdx >= self.messages.len: return false - + var message = self.messages[msgIdx] message.isPinned = pinned message.pinnedBy = pinnedBy diff --git a/src/app/chat/views/messages.nim b/src/app/chat/views/messages.nim index b5e799a193..0cf9c5d2ed 100644 --- a/src/app/chat/views/messages.nim +++ b/src/app/chat/views/messages.nim @@ -65,63 +65,55 @@ QtObject: proc setLoadingHistoryMessages*(self: MessageView, chatId: string, value: bool) proc setInitialMessagesLoaded*(self: MessageView, chatId: string, value: bool) - proc replaceMentionsWithPubKeys(self: MessageView, mentions: seq[string], contacts: seq[Profile], message: string, predicate: proc (contact: Profile): string): string = - var updatedMessage = message - for mention in mentions: - let matches = contacts.filter(c => "@" & predicate(c).toLowerAscii == mention.toLowerAscii).map(c => c.address) - if matches.len > 0: - let pubKey = matches[0] - var startIndex = 0 - var index = updatedMessage.find(mention) - - while index > -1: - if index == 0 or updatedMessage[index-1] == ' ': - updatedMessage = updatedMessage.replaceWord(mention, '@' & pubKey) - startIndex = index + mention.len - index = updatedMessage.find(mention, startIndex) - - result = updatedMessage - - proc hideMessage(self: MessageView, mId: string) {.signal.} - - proc sendOrEditMessage*(self: MessageView, message: string, replyTo: string, contentType: int = ContentType.Message.int, isStatusUpdate: bool = false, contactsString: string = "", isEdit: bool = false, messageId: string = "") {.slot.} = + proc replaceMentionsWithPubKeys(self: MessageView, message: string): string = let aliasPattern = re(r"(@[A-z][a-z]+ [A-z][a-z]* [A-z][a-z]*)", flags = {reStudy, reIgnoreCase}) let ensPattern = re(r"(@\w+(?=(\.stateofus)?\.eth))", flags = {reStudy, reIgnoreCase}) let namePattern = re(r"(@\w+)", flags = {reStudy, reIgnoreCase}) - var contacts: seq[Profile] - if (contactsString == ""): - contacts = self.status.contacts.getContacts() - else: - let contactsJSON = parseJson(contactsString) - contacts = @[] - for contact in contactsJSON: - contacts.add(Profile( - address: contact["address"].str, - alias: contact["alias"].str, - ensName: contact["ensName"].str - )) - let aliasMentions = findAll(message, aliasPattern) let ensMentions = findAll(message, ensPattern) let nameMentions = findAll(message, namePattern) + var updatedMessage = message - var m = self.replaceMentionsWithPubKeys(aliasMentions, contacts, message, (c => c.alias)) - m = self.replaceMentionsWithPubKeys(ensMentions, contacts, m, (c => c.ensName)) - m = self.replaceMentionsWithPubKeys(nameMentions, contacts, m, (c => c.ensName.split(".")[0])) + for publicKey in self.messageList[self.channelView.activeChannel.id].userList.users: + let user = self.messageList[self.channelView.activeChannel.id].userList.userDetails[publicKey] + + for mention in aliasMentions: + if "@" & user.alias.toLowerAscii != mention.toLowerAscii: + continue + updatedMessage = updatedMessage.replaceWord(mention, '@' & publicKey) + + for mention in ensMentions: + if "@" & user.userName.toLowerAscii != mention.toLowerAscii: + continue + + updatedMessage = updatedMessage.replaceWord(mention, '@' & publicKey) + + for mention in nameMentions: + if "@" & user.userName.split(".")[0].toLowerAscii != mention.toLowerAscii: + continue + + updatedMessage = updatedMessage.replaceWord(mention, '@' & publicKey) + + return updatedMessage + + proc hideMessage(self: MessageView, mId: string) {.signal.} + + proc sendOrEditMessage*(self: MessageView, message: string, replyTo: string, contentType: int = ContentType.Message.int, isStatusUpdate: bool = false, isEdit: bool = false, messageId: string = "") {.slot.} = + let updatedMessage = self.replaceMentionsWithPubKeys(message) var channelId = self.channelView.activeChannel.id if isStatusUpdate: channelId = "@" & self.pubKey if not isEdit: - self.status.chat.sendMessage(channelId, m, replyTo, contentType) + self.status.chat.sendMessage(channelId, updatedMessage, replyTo, contentType) else: - self.status.chat.editMessage(messageId, m) + self.status.chat.editMessage(messageId, updatedMessage) - proc sendMessage*(self: MessageView, message: string, replyTo: string, contentType: int = ContentType.Message.int, isStatusUpdate: bool = false, contactsString: string = "") {.slot.} = - self.sendOrEditMessage(message, replyTo, contentType, isStatusUpdate, contactsString, false, "") + proc sendMessage*(self: MessageView, message: string, replyTo: string, contentType: int = ContentType.Message.int, isStatusUpdate: bool = false) {.slot.} = + self.sendOrEditMessage(message, replyTo, contentType, isStatusUpdate, false, "") proc verifyMessageSent*(self: MessageView, data: string) {.slot.} = let messageData = data.parseJson @@ -138,8 +130,8 @@ QtObject: proc messageEdited(self: MessageView, editedMessageId: string, editedMessageContent: string) {.signal.} - proc editMessage*(self: MessageView, messageId: string, originalMessageId: string, message: string, contactsString: string = "") {.slot.} = - self.sendOrEditMessage(message, "", ContentType.Message.int, false, contactsString, true, originalMessageId) + proc editMessage*(self: MessageView, messageId: string, originalMessageId: string, message: string) {.slot.} = + self.sendOrEditMessage(message, "", ContentType.Message.int, false, true, originalMessageId) self.messageEdited(originalMessageId, message) proc messagePushed*(self: MessageView, messageIndex: int) {.signal.} diff --git a/src/app/chat/views/suggestions_list.nim b/src/app/chat/views/suggestions_list.nim deleted file mode 100644 index ae2206f81d..0000000000 --- a/src/app/chat/views/suggestions_list.nim +++ /dev/null @@ -1,77 +0,0 @@ -import NimQml, tables -import ../../../status/profile/profile - -type - SuggestionRoles {.pure.} = enum - Alias = UserRole + 1, - Identicon = UserRole + 2, - Address = UserRole + 3, - EnsName = UserRole + 4, - EnsVerified = UserRole + 5 - LocalNickname = UserRole + 6 - -QtObject: - type SuggestionsList* = ref object of QAbstractListModel - suggestions*: seq[Profile] - - proc setup(self: SuggestionsList) = self.QAbstractListModel.setup - - proc delete(self: SuggestionsList) = - self.suggestions = @[] - self.QAbstractListModel.delete - - proc newSuggestionsList*(): SuggestionsList = - new(result, delete) - result.suggestions = @[] - result.setup - - proc rowData(self: SuggestionsList, index: int, column: string): string {.slot.} = - if (index >= self.suggestions.len): - return - let suggestion = self.suggestions[index] - case column: - of "alias": result = suggestion.alias - of "ensName": result = suggestion.ensName - of "address": result = suggestion.address - of "identicon": result = suggestion.identicon - of "localNickname": result = suggestion.localNickname - - method rowCount(self: SuggestionsList, index: QModelIndex = nil): int = - return self.suggestions.len - - method data(self: SuggestionsList, index: QModelIndex, role: int): QVariant = - if not index.isValid: - return - if index.row < 0 or index.row >= self.suggestions.len: - return - let suggestion = self.suggestions[index.row] - let suggestionRole = role.SuggestionRoles - case suggestionRole: - of SuggestionRoles.Alias: result = newQVariant(suggestion.alias) - of SuggestionRoles.Identicon: result = newQVariant(suggestion.identicon) - of SuggestionRoles.Address: result = newQVariant(suggestion.address) - of SuggestionRoles.EnsName: result = newQVariant(suggestion.ensName) - of SuggestionRoles.EnsVerified: result = newQVariant(suggestion.ensVerified) - of SuggestionRoles.LocalNickname: result = newQVariant(suggestion.localNickname) - - method roleNames(self: SuggestionsList): Table[int, string] = - { SuggestionRoles.Alias.int:"alias", - SuggestionRoles.Identicon.int:"identicon", - SuggestionRoles.Address.int:"address", - SuggestionRoles.EnsName.int:"ensName", - SuggestionRoles.LocalNickname.int:"localNickname", - SuggestionRoles.EnsVerified.int:"ensVerified" }.toTable - - proc addSuggestionToList*(self: SuggestionsList, profile: Profile) = - self.beginInsertRows(newQModelIndex(), self.suggestions.len, self.suggestions.len) - self.suggestions.add(profile) - self.endInsertRows() - - proc setNewData*(self: SuggestionsList, suggestionsList: seq[Profile]) = - self.beginResetModel() - self.suggestions = suggestionsList - self.endResetModel() - - proc forceUpdate*(self: SuggestionsList) = - self.beginResetModel() - self.endResetModel() diff --git a/src/app/chat/views/user_list.nim b/src/app/chat/views/user_list.nim index dc24b3999d..444847764d 100644 --- a/src/app/chat/views/user_list.nim +++ b/src/app/chat/views/user_list.nim @@ -17,8 +17,8 @@ type Identicon = UserRole + 6 User = object - username: string - alias: string + username*: string + alias*: string localName: string lastSeen: string identicon: string @@ -27,8 +27,8 @@ QtObject: type UserListView* = ref object of QAbstractListModel status: Status - users: seq[string] - userDetails: OrderedTable[string, User] + users*: seq[string] + userDetails*: OrderedTable[string, User] proc delete(self: UserListView) = self.userDetails.clear() @@ -44,6 +44,19 @@ QtObject: result.status = status result.setup + proc rowData(self: UserListView, index: int, column: string): string {.slot.} = + if (index >= self.users.len): + return + + let publicKey = self.users[index] + case column: + of "publicKey": result = publicKey + of "userName": result = self.userDetails[publicKey].username + of "lastSeen": result = self.userDetails[publicKey].lastSeen + of "alias": result = self.userDetails[publicKey].alias + of "localName": result = self.userDetails[publicKey].localName + of "identicon": result = self.userdetails[publicKey].identicon + method rowCount*(self: UserListView, index: QModelIndex = nil): int = self.users.len method data(self: UserListView, index: QModelIndex, role: int): QVariant = @@ -51,11 +64,11 @@ QtObject: return if index.row < 0 or index.row >= self.users.len: return - + let pubkey = self.users[index.row] case role.UserListRoles: - of UserListRoles.UserName: result = newQVariant(self.userDetails[pubkey].userName) + of UserListRoles.UserName: result = newQVariant(self.userDetails[pubkey].username) of UserListRoles.LastSeen: result = newQVariant(self.userDetails[pubkey].lastSeen) of UserListRoles.Alias: result = newQVariant(self.userDetails[pubkey].alias) of UserListRoles.LocalName: result = newQVariant(self.userDetails[pubkey].localName) @@ -82,7 +95,7 @@ QtObject: var alias: string var identicon: string var localName: string - + if self.status.chat.contacts.hasKey(pk): userName = ens.userNameOrAlias(self.status.chat.contacts[pk]) alias = self.status.chat.contacts[pk].alias @@ -104,13 +117,13 @@ QtObject: ) self.users.add(pk) self.endInsertRows() - + # Checking for removed members var toDelete: seq[string] for userPublicKey in self.users: var found = false for m in members: - if m.id == userPublicKey: + if m.id == userPublicKey: found = true break if not found: diff --git a/src/status/chat.nim b/src/status/chat.nim index 01f6bed652..c967c4785a 100644 --- a/src/status/chat.nim +++ b/src/status/chat.nim @@ -327,6 +327,7 @@ QtObject: if (forceActiveChat): chats[0].isActive = true self.events.emit("chatUpdate", ChatUpdateArgs(messages: messages, chats: chats, contacts: @[])) + for msg in messages: self.events.emit("sendingMessage", MessageArgs(id: msg.id, channel: msg.chatId)) diff --git a/src/status/profile/profile.nim b/src/status/profile/profile.nim index e74eebcef1..69341db835 100644 --- a/src/status/profile/profile.nim +++ b/src/status/profile/profile.nim @@ -1,4 +1,4 @@ -import json +import json, strformat import ../types type Profile* = ref object @@ -11,6 +11,8 @@ type Profile* = ref object appearance*: int systemTags*: seq[string] +proc `$`*(self: Profile): string = + return fmt"Profile(id:{self.id}, username:{self.username})" const contactAdded* = ":contact/added" const contactBlocked* = ":contact/blocked" diff --git a/ui/app/AppLayouts/Chat/ChatColumn.qml b/ui/app/AppLayouts/Chat/ChatColumn.qml index d3bf438541..fc700dbfc3 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn.qml @@ -41,7 +41,6 @@ Item { property string activeMessage property var currentTime: 0 property var idMap: ({}) - property var suggestionsObj: ([]) property Timer timer: Timer { } property var userList property var onActivated: function () { @@ -64,52 +63,6 @@ Item { } } - function addSuggestionFromMessageList(i){ - const contactAddr = chatsModel.messageView.messageList.getMessageData(i, "publicKey"); - if(idMap[contactAddr]) return; - suggestionsObj.push({ - alias: chatsModel.messageView.messageList.getMessageData(i, "alias"), - ensName: chatsModel.messageView.messageList.getMessageData(i, "ensName"), - address: contactAddr, - identicon: chatsModel.messageView.messageList.getMessageData(i, "identicon"), - localNickname: chatsModel.messageView.messageList.getMessageData(i, "localName") - }) - chatInput.suggestionsList.append(suggestionsObj[suggestionsObj.length - 1]); - idMap[contactAddr] = true; - } - - function populateSuggestions() { - chatInput.suggestionsList.clear() - - idMap = {} - - let isCommunity = chatsModel.communities.activeCommunity.active - let dataSource = isCommunity ? chatsModel.communities.activeCommunity.members : chatsModel.suggestionList - - const len = dataSource.rowCount() - for (let i = 0; i < len; i++) { - const contactAddr = dataSource.rowData(i, "address"); - if(idMap[contactAddr]) continue; - suggestionsObj.push({ - alias: dataSource.rowData(i, "alias"), - ensName: dataSource.rowData(i, "ensName"), - address: contactAddr, - identicon: getProfileImage(contactAddr, false, false) || dataSource.rowData(i, "identicon"), - localNickname: dataSource.rowData(i, "localNickname") - }) - - chatInput.suggestionsList.append(suggestionsObj[suggestionsObj.length - 1]); - idMap[contactAddr] = true; - } - - if (isCommunity) return; - - const len2 = chatsModel.messageView.messageList.rowCount(); - for (let f = 0; f < len2; f++) { - addSuggestionFromMessageList(f); - } - } - function showReplyArea() { isReply = true; isImage = false; @@ -356,21 +309,6 @@ Item { isBlocked = profileModel.contacts.isContactBlocked(activeChatId); chatInput.suggestions.hide(); chatInput.textInput.forceActiveFocus(Qt.MouseFocusReason) - populateSuggestions(); - } - } - - Connections { - target: chatsModel.messageView - onMessagePushed: { - addSuggestionFromMessageList(messageIndex); - } - } - - Connections { - target: profileModel - onContactsChanged: { - populateSuggestions(); } } @@ -462,7 +400,7 @@ Item { let msg = chatsModel.plainText(Emoji.deparse(chatInput.textInput.text)) if (msg.length > 0){ msg = chatInput.interpretMessage(msg) - chatsModel.messageView.sendMessage(msg, chatInput.isReply ? SelectedMessage.messageId : "", Utils.isOnlyEmoji(msg) ? Constants.emojiType : Constants.messageType, false, JSON.stringify(suggestionsObj)); + chatsModel.messageView.sendMessage(msg, chatInput.isReply ? SelectedMessage.messageId : "", Utils.isOnlyEmoji(msg) ? Constants.emojiType : Constants.messageType, false); if(event) event.accepted = true sendMessageSound.stop(); Qt.callLater(sendMessageSound.play); diff --git a/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/InputArea.qml b/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/InputArea.qml deleted file mode 100644 index bdf5e604d9..0000000000 --- a/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/InputArea.qml +++ /dev/null @@ -1,95 +0,0 @@ -import QtQuick 2.13 -import "../../../../../imports" -import "../../../../../shared" -import "../../../../../shared/status" -import "../../components" - -Item { - property alias chatInput: chatInput - - id: inputArea - height: chatInput.height - - Connections { - target: chatsModel.messageView - onLoadingMessagesChanged: - if(value){ - loadingMessagesIndicator.active = true - } else { - timer.setTimeout(function(){ - loadingMessagesIndicator.active = false; - }, 5000); - } - } - - Loader { - id: loadingMessagesIndicator - active: chatsModel.messageView.loadingMessages - sourceComponent: loadingIndicator - anchors.right: parent.right - anchors.bottom: chatInput.top - anchors.rightMargin: Style.current.padding - anchors.bottomMargin: Style.current.padding - } - - Component { - id: loadingIndicator - LoadingAnimation {} - } - - StatusChatInput { - id: chatInput - visible: { - const community = chatsModel.communities.activeCommunity - if (chatsModel.channelView.activeChannel.chatType === Constants.chatTypePrivateGroupChat) { - return chatsModel.channelView.activeChannel.isMember - } - return !community.active || - community.access === Constants.communityChatPublicAccess || - community.admin || - chatsModel.channelView.activeChannel.canPost - } - isContactBlocked: isBlocked - chatInputPlaceholder: isBlocked ? - //% "This user has been blocked." - qsTrId("this-user-has-been-blocked-") : - //% "Type a message." - qsTrId("type-a-message-") - anchors.bottom: parent.bottom - recentStickers: chatsModel.stickers.recent - stickerPackList: chatsModel.stickers.stickerPacks - chatType: chatsModel.channelView.activeChannel.chatType - onSendTransactionCommandButtonClicked: { - if (chatsModel.channelView.activeChannel.ensVerified) { - txModalLoader.sourceComponent = cmpSendTransactionWithEns - } else { - txModalLoader.sourceComponent = cmpSendTransactionNoEns - } - txModalLoader.item.open() - } - onReceiveTransactionCommandButtonClicked: { - txModalLoader.sourceComponent = cmpReceiveTransaction - txModalLoader.item.open() - } - onStickerSelected: { - chatsModel.stickers.send(hashId, packId) - } - onSendMessage: { - if (chatInput.fileUrls.length > 0){ - chatsModel.sendImages(JSON.stringify(fileUrls)); - } - let msg = chatsModel.plainText(Emoji.deparse(chatInput.textInput.text)) - if (msg.length > 0){ - msg = chatInput.interpretMessage(msg) - chatsModel.messageView.sendMessage(msg, chatInput.isReply ? SelectedMessage.messageId : "", Utils.isOnlyEmoji(msg) ? Constants.emojiType : Constants.messageType, false, JSON.stringify(suggestionsObj)); - if(event) event.accepted = true - sendMessageSound.stop(); - Qt.callLater(sendMessageSound.play); - - chatInput.textInput.clear(); - chatInput.textInput.textFormat = TextEdit.PlainText; - chatInput.textInput.textFormat = TextEdit.RichText; - } - } - } -} diff --git a/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/CompactMessage.qml b/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/CompactMessage.qml index 0c6c6dd1fd..af79ca3e06 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/CompactMessage.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/CompactMessage.qml @@ -224,14 +224,6 @@ Item { StatusChatInput { id: editTextInput readonly property string originalText: Utils.getMessageWithStyle(Emoji.parse(message)) - Component.onCompleted: { - suggestionsList.clear() - for (let i = 0; i < chatInput.suggestionsList.count; i++) { - suggestionsList.append(chatInput.suggestionsList.get(i)) - } - textInput.forceActiveFocus() - textInput.cursorPosition = textInput.length - } chatInputPlaceholder: qsTrId("type-a-message-") chatType: chatsModel.channelView.activeChannel.chatType isEdit: true @@ -274,7 +266,7 @@ Item { if (msg.length > 0){ msg = chatInput.interpretMessage(msg) isEdit = false - chatsModel.messageView.editMessage(messageId, contentType == Constants.editType ? replaces : messageId, msg, JSON.stringify(suggestionsObj)); + chatsModel.messageView.editMessage(messageId, contentType == Constants.editType ? replaces : messageId, msg); } } } diff --git a/ui/app/AppLayouts/Chat/ChatColumn/SuggestionFilter.qml b/ui/app/AppLayouts/Chat/ChatColumn/SuggestionFilter.qml index cc3855b6a5..d933b23923 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn/SuggestionFilter.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn/SuggestionFilter.qml @@ -32,9 +32,16 @@ Item { if (!isFilteringPropertyOk()) return - var length = sourceModel.count + var length = sourceModel.rowCount() for (var i = 0; i < length; ++i) { - var item = sourceModel.get(i); + const publicKey = sourceModel.rowData(i, "publicKey"); + var item = { + alias: sourceModel.rowData(i, "alias"), + userName: sourceModel.rowData(i, "userName"), + publicKey: publicKey, + identicon: getProfileImage(publicKey, false, false) || sourceModel.rowData(i, "identicon"), + localName: sourceModel.rowData(i, "localName") + } if (isAcceptedItem(item)) { filterModel.append(item) } diff --git a/ui/nim-status-client.pro b/ui/nim-status-client.pro index cca421a6d1..02acc3bcbd 100644 --- a/ui/nim-status-client.pro +++ b/ui/nim-status-client.pro @@ -106,7 +106,6 @@ DISTFILES += \ app/AppLayouts/Chat/ChatColumn/ChatComponents/ChatCommandsPopup.qml \ app/AppLayouts/Chat/ChatColumn/ChatComponents/ChatInputButton.qml \ app/AppLayouts/Chat/ChatColumn/ChatComponents/ChatRequestMessage.qml \ - app/AppLayouts/Chat/ChatColumn/ChatComponents/InputArea.qml \ app/AppLayouts/Chat/ChatColumn/ChatComponents/RequestModal.qml \ app/AppLayouts/Chat/ChatColumn/ChatComponents/SignTransactionModal.qml \ app/AppLayouts/Chat/ChatColumn/CompactMessage.qml \ diff --git a/ui/shared/status/StatusChatInput.qml b/ui/shared/status/StatusChatInput.qml index fbd5924425..39163b8162 100644 --- a/ui/shared/status/StatusChatInput.qml +++ b/ui/shared/status/StatusChatInput.qml @@ -47,11 +47,10 @@ Rectangle { property var fileUrls: [] - property alias suggestionsList: suggestions - property alias suggestions: suggestionsBox - property var imageErrorMessageLocation: StatusChatInput.ImageErrorMessageLocation.Top + property alias suggestions: suggestionsBox + enum ImageErrorMessageLocation { Top, Bottom @@ -522,10 +521,6 @@ Rectangle { } } - ListModel { - id: suggestions - } - FileDialog { id: imageDialog //% "Please choose an image" @@ -567,17 +562,17 @@ Rectangle { SuggestionBox { id: suggestionsBox - model: suggestions + model: chatsModel.messageView.messageList.userList x : messageInput.x y: -height - Style.current.smallPadding width: messageInput.width filter: messageInputField.text cursorPosition: messageInputField.cursorPosition - property: ["ensName", "localNickname", "alias"] + property: ["userName", "localName", "alias"] onItemSelected: function (item, lastAtPosition, lastCursorPosition) { const hasEmoji = Emoji.hasEmoji(messageInputField.text) - const properties = "ensName, alias"; // Ignore localNickname + const properties = "userName, alias"; // Ignore localName let aliasName = item[properties.split(",").map(p => p.trim()).find(p => !!item[p])] aliasName = aliasName.replace(/(\.stateofus)?\.eth/, "")