diff --git a/src/app/chat/view.nim b/src/app/chat/view.nim index 75f862246a..11c59b00b5 100644 --- a/src/app/chat/view.nim +++ b/src/app/chat/view.nim @@ -9,7 +9,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] +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] import ../utils/image_utils import ../../status/tasks/[qt, task_runner_impl] import ../../status/tasks/marathon/mailserver/worker diff --git a/src/app/chat/views/chat_item.nim b/src/app/chat/views/chat_item.nim index 2eb2fa3395..edff34d2e2 100644 --- a/src/app/chat/views/chat_item.nim +++ b/src/app/chat/views/chat_item.nim @@ -41,6 +41,11 @@ QtObject: QtProperty[string] id: read = id + proc communityId*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.communityId + + QtProperty[string] communityId: + read = communityId + proc description*(self: ChatItemView): string {.slot.} = result = ?.self.chatItem.description QtProperty[string] description: diff --git a/src/app/chat/views/message_item.nim b/src/app/chat/views/message_item.nim index 99e03833dc..12d982ac00 100644 --- a/src/app/chat/views/message_item.nim +++ b/src/app/chat/views/message_item.nim @@ -15,6 +15,11 @@ QtObject: proc delete*(self: MessageItem) = self.QObject.delete + proc newMessageItem*(status: Status): MessageItem = + new(result, delete) + result.status = status + result.setup + proc newMessageItem*(status: Status, message: Message): MessageItem = new(result, delete) result.messageItem = message diff --git a/src/app/chat/views/message_list.nim b/src/app/chat/views/message_list.nim index e8896f362c..e5089a9dc7 100644 --- a/src/app/chat/views/message_list.nim +++ b/src/app/chat/views/message_list.nim @@ -391,4 +391,13 @@ QtObject: newQVariant(self.userList) QtProperty[QVariant] userList: - read = getUserList \ No newline at end of file + read = getUserList + + proc messageSearch*(self: ChatMessageList, searchTerm: string): string {.slot.} = + let lowercaseTerm = searchTerm.toLowerAscii + var messageIds: seq[string] = @[] + for message in self.messages: + if message.text.toLowerAscii.contains(lowercaseTerm): + # TODO try to send a Variant + messageIds.add(message.id) + return messageIds.toJson \ No newline at end of file diff --git a/src/app/chat/views/messages.nim b/src/app/chat/views/messages.nim index 15d6596024..1517a4c2d6 100644 --- a/src/app/chat/views/messages.nim +++ b/src/app/chat/views/messages.nim @@ -10,7 +10,7 @@ import ../../../status/chat/[chat, message] import ../../../status/profile/profile import ../../../status/tasks/[qt, task_runner_impl] -import communities, chat_item, channels_list, communities, community_list, message_list, channel +import communities, chat_item, channels_list, communities, community_list, message_list, channel, message_item # TODO: remove me import ../../../status/libstatus/chat as libstatus_chat @@ -70,6 +70,7 @@ QtObject: pinnedMessagesList*: OrderedTable[string, ChatMessageList] channelView*: ChannelView communities*: CommunitiesView + observedMessageItem*: MessageItem pubKey*: string loadingMessages*: bool unreadMessageCnt: int @@ -84,8 +85,8 @@ QtObject: self.messageList = initOrderedTable[string, ChatMessageList]() self.pinnedMessagesList = initOrderedTable[string, ChatMessageList]() self.channelOpenTime = initTable[string, int64]() - # self.QObject.delete self.QAbstractListModel.delete + self.observedMessageItem.delete proc newMessageView*(status: Status, channelView: ChannelView, communitiesView: CommunitiesView): MessageView = new(result, delete) @@ -97,6 +98,7 @@ QtObject: result.messageList[status_utils.getTimelineChatId()] = newChatMessageList(status_utils.getTimelineChatId(), result.status, false) result.loadingMessages = false result.unreadMessageCnt = 0 + result.observedMessageItem = newMessageItem(status) result.setup # proc getMessageListIndexById(self: MessageView, id: string): int @@ -284,6 +286,23 @@ QtObject: read = getMessageList notify = activeChannelChanged + proc observedMessageItemChanged*(self: MessageView) {.signal.} + + proc setObservedMessageItem*(self: MessageView, chatId: string, messageId: string) {.slot.} = + if(messageId == ""): return + if (not self.messageList.hasKey(chatId)): return + let message = self.messageList[chatId].getMessageById(messageId) + if (message.id == ""): + return + self.observedMessageItem.setMessageItem(message) + self.observedMessageItemChanged() + + proc getObservedMessageItem*(self: MessageView): QVariant {.slot.} = newQVariant(self.observedMessageItem) + QtProperty[QVariant] observedMessageItem: + read = getObservedMessageItem + write = setObservedMessageItem + notify = observedMessageItemChanged + proc getPinnedMessagesList(self: MessageView): QVariant {.slot.} = self.upsertChannel(self.channelView.activeChannel.id) return newQVariant(self.pinnedMessagesList[self.channelView.activeChannel.id]) diff --git a/ui/app/AppLayouts/Chat/ChatColumn.qml b/ui/app/AppLayouts/Chat/ChatColumn.qml index f9b0b9a149..e9cd7f3f71 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn.qml @@ -287,7 +287,6 @@ StackLayout { } } - searchButton.visible: false membersButton.visible: appSettings.showOnlineUsers && chatsModel.channelView.activeChannel.chatType !== Constants.chatTypeOneToOne notificationButton.visible: appSettings.isActivityCenterEnabled notificationCount: chatsModel.activityNotificationList.unreadCount diff --git a/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/ActivityChannelBadge.qml b/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/ActivityChannelBadge.qml index ff354386da..08c83de7f0 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/ActivityChannelBadge.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/ActivityChannelBadge.qml @@ -4,6 +4,7 @@ import "../../../../../imports" import "../../../../../shared" import "../../../../../shared/status" import ".." +import "../../components" Rectangle { property string chatId: "" @@ -34,11 +35,13 @@ Rectangle { Loader { active: true height: parent.height + anchors.left: parent.left + anchors.leftMargin: 4 sourceComponent: { switch (model.notificationType) { - case Constants.activityCenterNotificationTypeMention: return wrapper.communityId ? communityComponent : channelComponent + case Constants.activityCenterNotificationTypeMention: return communityOrChannelContentComponent case Constants.activityCenterNotificationTypeReply: return replyComponent - default: return channelComponent + default: return communityOrChannelContentComponent } } } @@ -63,7 +66,6 @@ Rectangle { height: 16 source: "../../../../img/reply-small-arrow.svg" anchors.left: parent.left - anchors.leftMargin: 4 anchors.verticalCenter:parent.verticalCenter } @@ -86,185 +88,13 @@ Rectangle { } Component { - id: communityComponent + id: communityOrChannelContentComponent - Item { - property int communityIndex: chatsModel.communities.joinedCommunities.getCommunityIndex(wrapper.communityId) - - property string image: communityIndex > -1 ? chatsModel.communities.joinedCommunities.rowData(communityIndex, "thumbnailImage") : "" - property string iconColor: !image && communityIndex > -1 ? chatsModel.communities.joinedCommunities.rowData(communityIndex, "communityColor"): "" - property bool useLetterIdenticon: !image - property string communityName: communityIndex > -1 ? chatsModel.communities.joinedCommunities.rowData(communityIndex, "name") : "" - property string channelName: chatsModel.getChannelNameById(wrapper.chatId) - - id: communityBadge - width: childrenRect.width - height: parent.height - SVGImage { - id: communityIcon - width: 16 - height: 16 - source: "../../../../img/communities.svg" - anchors.left: parent.left - anchors.leftMargin: 4 - anchors.verticalCenter:parent.verticalCenter - - ColorOverlay { - anchors.fill: parent - source: parent - color: Style.current.secondaryText - } - } - - Loader { - id: communityImageLoader - active: true - anchors.left: communityIcon.right - anchors.leftMargin: 2 - anchors.verticalCenter: parent.verticalCenter - sourceComponent: communityBadge.useLetterIdenticon ? letterIdenticon :imageIcon - } - - Component { - id: imageIcon - RoundedImage { - source: communityBadge.image - noMouseArea: true - noHover: true - width: 16 - height: 16 - } - } - - Component { - id: letterIdenticon - StatusLetterIdenticon { - width: 16 - height: 16 - letterSize: 12 - chatName: communityBadge.communityName - color: communityBadge.iconColor - } - } - - function getLinkStyle(link, hoveredLink) { - return `` + - `${link}` - } - - StyledTextEdit { - id: communityName - text: communityBadge.getLinkStyle(communityBadge.communityName, hoveredLink) - height: 18 - readOnly: true - textFormat: Text.RichText - width: implicitWidth > 300 ? 300 : implicitWidth - clip: true - anchors.left: communityImageLoader.right - anchors.leftMargin: 4 - color: Style.current.secondaryText - font.pixelSize: 13 - anchors.verticalCenter: parent.verticalCenter - onLinkActivated: function () { - chatsModel.communities.setActiveCommunity(wrapper.communityId) - } - } - - SVGImage { - id: caretImage - source: "../../../../img/show-category.svg" - width: 16 - height: 16 - anchors.left: communityName.right - anchors.verticalCenter: parent.verticalCenter - - ColorOverlay { - anchors.fill: parent - source: parent - color: Style.current.secondaryText - } - } - - StyledTextEdit { - id: channelName - text: communityBadge.getLinkStyle(communityBadge.channelName || wrapper.name, hoveredLink) - height: 18 - readOnly: true - textFormat: Text.RichText - width: implicitWidth > 300 ? 300 : implicitWidth - clip: true - anchors.left: caretImage.right - color: Style.current.secondaryText - font.pixelSize: 13 - anchors.verticalCenter: parent.verticalCenter - onLinkActivated: function () { - chatsModel.communities.setActiveCommunity(wrapper.communityId) - chatsModel.setActiveChannel(model.message.chatId) - } - } - } - } - - Component { - id: channelComponent - - Item { - width: childrenRect.width - height: parent.height - - Connections { - enabled: realChatType === Constants.chatTypeOneToOne - target: profileModel.contacts.list - onContactChanged: { - if (pubkey === wrapper.chatId) { - wrapper.profileImage = appMain.getProfileImage(wrapper.chatId) - } - } - } - - SVGImage { - id: channelIcon - width: 16 - height: 16 - fillMode: Image.PreserveAspectFit - source: "../../../../img/channel-icon-" + (wrapper.realChatType === Constants.chatTypePublic ? "public-chat.svg" : "group.svg") - anchors.left: parent.left - anchors.leftMargin: 4 - anchors.verticalCenter:parent.verticalCenter - } - - StatusIdenticon { - id: contactImage - height: 16 - width: 16 - chatId: wrapper.chatId - chatName: wrapper.name - chatType: wrapper.realChatType - identicon: wrapper.profileImage || wrapper.identicon - anchors.left: channelIcon.right - anchors.leftMargin: 4 - anchors.verticalCenter: parent.verticalCenter - letterSize: 11 - } - - StyledText { - id: contactInfo - text: wrapper.realChatType !== Constants.chatTypePublic ? - Emoji.parse(Utils.removeStatusEns(Utils.filterXSS(wrapper.name))) : - "#" + Utils.filterXSS(wrapper.name) - anchors.left: contactImage.right - anchors.leftMargin: 4 - color: Style.current.secondaryText - font.weight: Font.Medium - font.pixelSize: 13 - anchors.verticalCenter: parent.verticalCenter - } + BadgeContent { + chatId: wrapper.chatId + name: wrapper.name + identicon: wrapper.identicon + communityId: wrapper.communityId } } } diff --git a/ui/app/AppLayouts/Chat/ChatColumn/Message.qml b/ui/app/AppLayouts/Chat/ChatColumn/Message.qml index 091a2a0a33..7bbf47cd93 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn/Message.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn/Message.qml @@ -17,7 +17,7 @@ Item { property bool isCurrentUser: false property string timestamp: "1234567" property string sticker: "Qme8vJtyrEHxABcSVGPF95PtozDgUyfr1xGjePmFdZgk9v" - property int contentType: 2 // constants don't work in default props + property int contentType: 1 // constants don't work in default props property string chatId: "chatId" property string outgoingStatus: "" property string responseTo: "" diff --git a/ui/app/AppLayouts/Chat/components/BadgeContent.qml b/ui/app/AppLayouts/Chat/components/BadgeContent.qml new file mode 100644 index 0000000000..86af0e0e0e --- /dev/null +++ b/ui/app/AppLayouts/Chat/components/BadgeContent.qml @@ -0,0 +1,214 @@ +import QtQuick 2.13 +import QtGraphicalEffects 1.13 +import "../../../../imports" +import "../../../../shared" +import "../../../../shared/status" + +Item { + property color textColor: Style.current.textColor + property string chatId: "" + property string name: "channelName" + property string identicon + property string communityId + property int chatType: chatsModel.channelView.chats.getChannelType(chatId) + property int realChatType: { + if (chatType === Constants.chatTypeCommunity) { + // TODO add a check for private community chats once it is created + return Constants.chatTypePubliccommunityComponent + } + return chatType + } + + property string profileImage: realChatType === Constants.chatTypeOneToOne ? appMain.getProfileImage(chatId) || "" : "" + + id: wrapper + height: 24 + width: childrenRect.width + + Loader { + active: true + height: parent.height + sourceComponent: wrapper.communityId ? communityComponent : channelComponent + } + + Component { + id: communityComponent + + Item { + property int communityIndex: chatsModel.communities.joinedCommunities.getCommunityIndex(wrapper.communityId) + + property string image: communityIndex > -1 ? chatsModel.communities.joinedCommunities.rowData(communityIndex, "thumbnailImage") : "" + property string iconColor: !image && communityIndex > -1 ? chatsModel.communities.joinedCommunities.rowData(communityIndex, "communityColor"): "" + property bool useLetterIdenticon: !image + property string communityName: communityIndex > -1 ? chatsModel.communities.joinedCommunities.rowData(communityIndex, "name") : "" + property string channelName: chatsModel.getChannelNameById(wrapper.chatId) + + id: communityBadge + width: childrenRect.width + height: parent.height + SVGImage { + id: communityIcon + width: 16 + height: 16 + source: "../../../img/communities.svg" + anchors.left: parent.left + anchors.verticalCenter:parent.verticalCenter + + ColorOverlay { + anchors.fill: parent + source: parent + color: wrapper.textColor + } + } + + Loader { + id: communityImageLoader + active: true + anchors.left: communityIcon.right + anchors.leftMargin: 2 + anchors.verticalCenter: parent.verticalCenter + sourceComponent: communityBadge.useLetterIdenticon ? letterIdenticon :imageIcon + } + + Component { + id: imageIcon + RoundedImage { + source: communityBadge.image + noMouseArea: true + noHover: true + width: 16 + height: 16 + } + } + + Component { + id: letterIdenticon + StatusLetterIdenticon { + width: 16 + height: 16 + letterSize: 12 + chatName: communityBadge.communityName + color: communityBadge.iconColor + } + } + + function getLinkStyle(link, hoveredLink) { + return `` + + `${link}` + } + + StyledTextEdit { + id: communityName + text: communityBadge.getLinkStyle(communityBadge.communityName, hoveredLink) + height: 18 + readOnly: true + textFormat: Text.RichText + width: implicitWidth > 300 ? 300 : implicitWidth + clip: true + anchors.left: communityImageLoader.right + anchors.leftMargin: 4 + color: wrapper.textColor + font.pixelSize: 13 + anchors.verticalCenter: parent.verticalCenter + onLinkActivated: function () { + chatsModel.communities.setActiveCommunity(wrapper.communityId) + } + } + + SVGImage { + id: caretImage + source: "../../../img/show-category.svg" + width: 16 + height: 16 + anchors.left: communityName.right + anchors.verticalCenter: parent.verticalCenter + + ColorOverlay { + anchors.fill: parent + source: parent + color: wrapper.textColor + } + } + + StyledTextEdit { + id: channelName + text: communityBadge.getLinkStyle(communityBadge.channelName || wrapper.name, hoveredLink) + height: 18 + readOnly: true + textFormat: Text.RichText + width: implicitWidth > 300 ? 300 : implicitWidth + clip: true + anchors.left: caretImage.right + color: wrapper.textColor + font.pixelSize: 13 + anchors.verticalCenter: parent.verticalCenter + onLinkActivated: function () { + chatsModel.communities.setActiveCommunity(wrapper.communityId) + chatsModel.setActiveChannel(model.message.chatId) + } + } + } + } + + Component { + id: channelComponent + + Item { + width: childrenRect.width + height: parent.height + + Connections { + enabled: realChatType === Constants.chatTypeOneToOne + target: profileModel.contacts.list + onContactChanged: { + if (pubkey === wrapper.chatId) { + wrapper.profileImage = appMain.getProfileImage(wrapper.chatId) + } + } + } + + SVGImage { + id: channelIcon + width: 16 + height: 16 + fillMode: Image.PreserveAspectFit + source: "../../../img/channel-icon-" + (wrapper.realChatType === Constants.chatTypePublic ? "public-chat.svg" : "group.svg") + anchors.left: parent.left + anchors.verticalCenter:parent.verticalCenter + } + + StatusIdenticon { + id: contactImage + height: 16 + width: 16 + chatId: wrapper.chatId + chatName: wrapper.name + chatType: wrapper.realChatType + identicon: wrapper.profileImage || wrapper.identicon + anchors.left: channelIcon.right + anchors.leftMargin: 4 + anchors.verticalCenter: parent.verticalCenter + letterSize: 11 + } + + StyledText { + id: contactInfo + text: wrapper.realChatType !== Constants.chatTypePublic ? + Emoji.parse(Utils.removeStatusEns(Utils.filterXSS(wrapper.name))) : + "#" + Utils.filterXSS(wrapper.name) + anchors.left: contactImage.right + anchors.leftMargin: 4 + color: wrapper.textColor + font.weight: Font.Medium + font.pixelSize: 13 + anchors.verticalCenter: parent.verticalCenter + } + } + } +} diff --git a/ui/app/AppLayouts/Chat/components/SearchPopup.qml b/ui/app/AppLayouts/Chat/components/SearchPopup.qml new file mode 100644 index 0000000000..4b6d3220c9 --- /dev/null +++ b/ui/app/AppLayouts/Chat/components/SearchPopup.qml @@ -0,0 +1,231 @@ +import QtQuick 2.13 +import QtQuick.Controls 2.13 +import "../../../../imports" +import "../../../../shared" +import "../../../../shared/status" +import "../ChatColumn" + +Popup { + property var searchResults + property string chatId: chatsModel.channelView.activeChannel.id + + id: popup + modal: true + + Overlay.modal: Rectangle { + color: Qt.rgba(0, 0, 0, 0.4) + } + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + parent: Overlay.overlay + x: Math.round(((parent ? parent.width : 0) - width) / 2) + y: Math.round(((parent ? parent.height : 0) - height) / 2) + width: 690 + height: { + if (!searchResults || !searchResults.length) { + return 122 + } + + // FIXME childrenRect has a binding loop for some reason + const childrenHeight = searchHeader.height + channelBadge.height + channelBadge.anchors.topMargin + + searchResultContent.height + searchResultContent.anchors.topMargin + + // min height + if (childrenHeight < 560) { + return 560 + } + // max height + if (childrenHeight > 970) { + return 970 + } + return childrenHeight + } + background: Rectangle { + color: Style.current.background + radius: 16 + } + onOpened: { + popupOpened = true + searchInput.forceActiveFocus(Qt.MouseFocusReason) + } + onClosed: { + popupOpened = false + destroy() + } + padding: 0 + + Item { + id: searchHeader + width: parent.width + height: 64 + + SVGImage { + id: searchImage + source: "../../../img/search.svg" + width: 28 + height: 28 + anchors.left: parent.left + anchors.leftMargin: Style.current.padding + anchors.verticalCenter: parent.verticalCenter + } + + property var searchMessages: Backpressure.debounce(searchInput, 400, function (value) { + if (value === "") { + searchResults = [] + return + } + + // TODO add loading? + const messageIdsStr = chatsModel.messageView.messageList.messageSearch(value) + try { + searchResults = JSON.parse(messageIdsStr) + } catch (e) { + console.error ("Error parsing search result", e) + } + }) + + StyledTextField { + id: searchInput + anchors.left: searchImage.right + anchors.leftMargin: Style.current.smallPadding + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: Style.current.padding + placeholderText: qsTr("Search") + placeholderTextColor: Style.current.secondaryText + selectByMouse: true + font.pixelSize: 28 + background: Rectangle { + color: Style.current.transparent + } + Keys.onReleased: Qt.callLater(searchHeader.searchMessages, searchInput.text) + } + + Separator { + anchors.bottom: parent.bottom + anchors.topMargin: 0 + } + } + + Rectangle { + id: channelBadge + color: Style.current.inputBackground + border.width: 0 + radius: Style.current.radius + height: 32 + width: childrenRect.width + 2 * inText.anchors.leftMargin + anchors.left: parent.left + anchors.leftMargin: Style.current.padding + anchors.top: searchHeader.bottom + anchors.topMargin: 12 + + StyledText { + id: inText + text: qsTr("In:") + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.verticalCenter: parent.verticalCenter + font.pixelSize: 15 + } + + BadgeContent { + chatId: chatId + name: chatsModel.channelView.activeChannel.name + identicon: chatsModel.channelView.activeChannel.identicon + communityId: chatsModel.channelView.activeChannel.communityId + anchors.left: inText.right + anchors.leftMargin: 4 + anchors.verticalCenter: parent.verticalCenter + } + } + + Item { + id: searchResultContent + visible: !!popup.searchResults && popup.searchResults.length > 0 + width: parent.width + height: visible ? implicitHeight + anchors.topMargin : 0 + implicitHeight: childrenRect.height + anchors.top: channelBadge.bottom + anchors.topMargin: visible ? 13 : 0 + + Separator { + id: sep2 + anchors.top: parent.top + anchors.topMargin: 0 + } + + StyledText { + id: sectionTitle + text: qsTr("Messages") + font.pixelSize: 15 + color: Style.current.secondaryText + anchors.top: sep2.bottom + anchors.topMargin: Style.current.smallPadding + anchors.left: parent.left + anchors.leftMargin: Style.current.bigPadding + } + + Column { + anchors.top: sectionTitle.bottom + anchors.topMargin: 4 + width: parent.width + height: searchResultContent.visible ? childrenRect.height : 0 + spacing: 0 + + Repeater { + model: popup.searchResults + + delegate: Message { + property var messageItem: ({}) + + function getMessage() { + chatsModel.messageView.setObservedMessageItem(popup.chatId, modelData) + return chatsModel.messageView.observedMessageItem + } + + Component.onCompleted: { + messageItem = getMessage() + } + + anchors.right: undefined + messageId: messageItem.messageId + fromAuthor: messageItem.fromAuthor + chatId: messageItem.chatId + userName: messageItem.userName + alias: messageItem.alias + localName: messageItem.localName + message: messageItem.message + plainText: messageItem.plainText + identicon: messageItem.identicon + isCurrentUser: messageItem.isCurrentUser + timestamp: messageItem.timestamp + sticker: messageItem.sticker + contentType: messageItem.contentType + outgoingStatus: messageItem.outgoingStatus + responseTo: messageItem.responseTo + imageClick: imagePopup.openPopup.bind(imagePopup) + linkUrls: messageItem.linkUrls + communityId: messageItem.communityId + hasMention: messageItem.hasMention + stickerPackId: messageItem.stickerPackId + pinnedBy: messageItem.pinnedBy + pinnedMessage: messageItem.isPinned + activityCenterMessage: true + clickMessage: function (isProfileClick) { + if (isProfileClick) { + const pk = messageItem.fromAuthor + const userProfileImage = appMain.getProfileImage(pk) + return openProfilePopup(chatsModel.userNameOrAlias(pk), pk, userProfileImage || utilsModel.generateIdenticon(pk)) + } + + popup.close() + + positionAtMessage(messageItem.messageId) + } + + prevMessageIndex: -1 + prevMsgTimestamp: "" + } + } + } + } +} diff --git a/ui/nim-status-client.pro b/ui/nim-status-client.pro index 826782d62a..9bd6688598 100644 --- a/ui/nim-status-client.pro +++ b/ui/nim-status-client.pro @@ -158,6 +158,7 @@ DISTFILES += \ app/AppLayouts/Chat/ContactsColumn/AddChat.qml \ app/AppLayouts/Chat/ContactsColumn/ClosedEmptyView.qml \ app/AppLayouts/Chat/components/AcceptRejectOptionsButtons.qml \ + app/AppLayouts/Chat/components/BadgeContent.qml \ app/AppLayouts/Chat/components/ChooseBrowserPopup.qml \ app/AppLayouts/Chat/ContactsColumn/CommunityButton.qml \ app/AppLayouts/Chat/ContactsColumn/CommunityList.qml \ @@ -179,6 +180,7 @@ DISTFILES += \ app/AppLayouts/Chat/components/InviteFriendsPopup.qml \ app/AppLayouts/Chat/components/MessageContextMenu.qml \ app/AppLayouts/Chat/components/NicknamePopup.qml \ + app/AppLayouts/Chat/components/SearchPopup.qml \ app/AppLayouts/Chat/components/SuggestedChannels.qml \ app/AppLayouts/Chat/components/GroupInfoPopup.qml \ app/AppLayouts/Chat/data/channelList.js \