From 038ab08765f98bc05c0680d4ea2408a0317eb809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Tinkl?= Date: Wed, 19 Apr 2023 18:48:57 +0200 Subject: [PATCH] fix: do not display ENS name when not ENS verified - expose "isEnsVerified" as model role - fix returning "ensName" when the user is not ensVerified - react to nickname updates correctly - fix sorting in the user/member list view --- .../chat_content/users/module.nim | 5 ++- .../chat_section/chat_content/users/view.nim | 1 + src/app/modules/main/chat_section/module.nim | 2 ++ src/app/modules/main/communities/module.nim | 1 + src/app/modules/main/io_interface.nim | 3 ++ src/app/modules/main/module.nim | 8 +++++ .../main/profile_section/contacts/module.nim | 35 +++++++++++-------- src/app/modules/main/view.nim | 3 ++ src/app/modules/shared_models/member_item.nim | 3 ++ .../modules/shared_models/member_model.nim | 10 ++++++ .../shared_models/message_item_qobject.nim | 6 ++-- .../modules/shared_models/section_details.nim | 3 +- .../modules/shared_models/section_item.nim | 3 +- src/app/modules/shared_models/user_item.nim | 16 +++++++-- src/app/modules/shared_models/user_model.nim | 24 ++++--------- .../service/contacts/dto/contacts.nim | 4 ++- src/app_service/service/contacts/service.nim | 4 +-- .../Components/StatusMessageHeader.qml | 6 ++-- .../AppLayouts/Chat/panels/UserListPanel.qml | 13 +++++-- .../communities/CommunityMembersTabPanel.qml | 4 +-- ...ommunityProfilePopupInviteFriendsPanel.qml | 4 +-- .../Chat/views/CommunitySettingsView.qml | 1 + .../Profile/panels/ContactsListPanel.qml | 3 +- ...NotificationCommunityMembershipRequest.qml | 6 +--- .../views/ActivityNotificationMessage.qml | 6 ++-- .../delegates/ContactListItemDelegate.qml | 7 ++-- ui/imports/shared/views/ExistingContacts.qml | 5 ++- ui/imports/shared/views/PickedContacts.qml | 4 +-- ui/imports/shared/views/ProfileDialogView.qml | 2 +- ui/imports/shared/views/chat/MessageView.qml | 3 +- .../views/chat/SimplifiedMessageView.qml | 2 +- ui/imports/utils/Utils.qml | 2 +- 32 files changed, 122 insertions(+), 77 deletions(-) diff --git a/src/app/modules/main/chat_section/chat_content/users/module.nim b/src/app/modules/main/chat_section/chat_content/users/module.nim index ff6b8b517f..8d1217c937 100644 --- a/src/app/modules/main/chat_section/chat_content/users/module.nim +++ b/src/app/modules/main/chat_section/chat_content/users/module.nim @@ -79,6 +79,7 @@ method contactUpdated*(self: Module, publicKey: string) = pubKey = publicKey, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, @@ -120,6 +121,7 @@ method addChatMember(self: Module, member: ChatMember) = pubKey = member.id, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, @@ -158,6 +160,7 @@ method onChatMemberUpdated*(self: Module, publicKey: string, admin: bool, joined pubKey = publicKey, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, @@ -177,4 +180,4 @@ method removeGroupMembers*(self: Module, pubKeys: seq[string]) = method updateMembersList*(self: Module) = let members = self.controller.getChatMembers() for member in members: - self.addChatMember(member) \ No newline at end of file + self.addChatMember(member) diff --git a/src/app/modules/main/chat_section/chat_content/users/view.nim b/src/app/modules/main/chat_section/chat_content/users/view.nim index 3c7c2a9f39..0b1e5d1501 100644 --- a/src/app/modules/main/chat_section/chat_content/users/view.nim +++ b/src/app/modules/main/chat_section/chat_content/users/view.nim @@ -58,6 +58,7 @@ QtObject: pubKey = pubKey, displayName = displayName, ensName = "", + isEnsVerified = false, localNickname = "", alias = "", icon = "", diff --git a/src/app/modules/main/chat_section/module.nim b/src/app/modules/main/chat_section/module.nim index f12797da7a..e1444a1179 100644 --- a/src/app/modules/main/chat_section/module.nim +++ b/src/app/modules/main/chat_section/module.nim @@ -247,10 +247,12 @@ proc createItemFromPublicKey(self: Module, publicKey: string): UserItem = pubKey = contactDetails.details.id, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, colorId = contactDetails.colorId, + colorHash = contactDetails.colorHash, onlineStatus = toOnlineStatus(self.controller.getStatusForContactWithId(publicKey).statusType), isContact = contactDetails.details.isContact(), isVerified = contactDetails.details.isContactVerified(), diff --git a/src/app/modules/main/communities/module.nim b/src/app/modules/main/communities/module.nim index 2b08b7978c..09abe87b2f 100644 --- a/src/app/modules/main/communities/module.nim +++ b/src/app/modules/main/communities/module.nim @@ -123,6 +123,7 @@ proc createMemberItem(self: Module, memberId, requestId: string): MemberItem = pubKey = memberId, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, diff --git a/src/app/modules/main/io_interface.nim b/src/app/modules/main/io_interface.nim index 7cee8251ae..2f8d80a3c6 100644 --- a/src/app/modules/main/io_interface.nim +++ b/src/app/modules/main/io_interface.nim @@ -239,6 +239,9 @@ method getAppSearchModule*(self: AccessInterface): QVariant {.base.} = method getContactDetailsAsJson*(self: AccessInterface, publicKey: string, getVerificationRequest: bool): string {.base.} = raise newException(ValueError, "No implementation available") +method isEnsVerified*(self: AccessInterface, publicKey: string): bool {.base.} = + raise newException(ValueError, "No implementation available") + method communityDataImported*(self: AccessInterface, community: CommunityDto) {.base.} = raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/module.nim b/src/app/modules/main/module.nim index e83c1180cb..68b3482d93 100644 --- a/src/app/modules/main/module.nim +++ b/src/app/modules/main/module.nim @@ -293,6 +293,7 @@ proc createChannelGroupItem[T](self: Module[T], channelGroup: ChannelGroupDto): pubKey = member.id, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, @@ -321,6 +322,7 @@ proc createChannelGroupItem[T](self: Module[T], channelGroup: ChannelGroupDto): pubKey = bannedMemberId, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, @@ -338,6 +340,7 @@ proc createChannelGroupItem[T](self: Module[T], channelGroup: ChannelGroupDto): pubKey = requestDto.publicKey, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, @@ -356,6 +359,7 @@ proc createChannelGroupItem[T](self: Module[T], channelGroup: ChannelGroupDto): pubKey = requestDto.publicKey, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, @@ -955,6 +959,9 @@ method getContactDetailsAsJson*[T](self: Module[T], publicKey: string, getVerifi } return $jsonObj +method isEnsVerified*[T](self: Module[T], publicKey: string): bool = + return self.controller.getContact(publicKey).ensVerified + method communityDataImported*[T](self: Module[T], community: CommunityDto) = if community.id == self.statusUrlCommunityToSpectate: self.statusUrlCommunityToSpectate = "" @@ -1018,6 +1025,7 @@ method contactUpdated*[T](self: Module[T], publicKey: string) = publicKey, contactDetails.details.displayName, contactDetails.details.name, + contactDetails.details.ensVerified, contactDetails.details.localNickname, contactDetails.details.alias, contactDetails.icon, diff --git a/src/app/modules/main/profile_section/contacts/module.nim b/src/app/modules/main/profile_section/contacts/module.nim index 98c7c711e8..ac42d12ff7 100644 --- a/src/app/modules/main/profile_section/contacts/module.nim +++ b/src/app/modules/main/profile_section/contacts/module.nim @@ -41,22 +41,23 @@ method delete*(self: Module) = self.view.delete proc createItemFromPublicKey(self: Module, publicKey: string): UserItem = - let contact = self.controller.getContact(publicKey) - let contactDetails = self.controller.getContactDetails(contact.id) + let contactDetails = self.controller.getContactDetails(publicKey) return initUserItem( - pubKey = contact.id, + pubKey = contactDetails.details.id, displayName = contactDetails.details.displayName, ensName = contactDetails.details.name, + isEnsVerified = contactDetails.details.ensVerified, localNickname = contactDetails.details.localNickname, alias = contactDetails.details.alias, icon = contactDetails.icon, colorId = contactDetails.colorId, + colorHash = contactDetails.colorHash, onlineStatus = toOnlineStatus(self.controller.getStatusForContactWithId(publicKey).statusType), - isContact = contact.isContact(), - isBlocked = contact.isBlocked(), - isVerified = contact.isContactVerified(), - isUntrustworthy = contact.isContactUntrustworthy() + isContact = contactDetails.details.isContact(), + isVerified = contactDetails.details.isContactVerified(), + isUntrustworthy = contactDetails.details.isContactUntrustworthy(), + isBlocked = contactDetails.details.isBlocked(), ) proc buildModel(self: Module, model: Model, group: ContactsGroup) = @@ -186,14 +187,18 @@ method contactsStatusUpdated*(self: Module, statusUpdates: seq[StatusUpdateDto]) self.view.myMutualContactsModel().setOnlineStatus(s.publicKey, status) method contactNicknameChanged*(self: Module, publicKey: string) = - let (name, _, _) = self.controller.getContactNameAndImage(publicKey) - self.view.myMutualContactsModel().updateName(publicKey, name) - self.view.receivedContactRequestsModel().updateName(publicKey, name) - self.view.sentContactRequestsModel().updateName(publicKey, name) + let contactDetails = self.controller.getContactDetails(publicKey) + let displayName = contactDetails.details.displayName + let ensName = contactDetails.details.name + let localNickname = contactDetails.details.localNickname + + self.view.myMutualContactsModel().setName(publicKey, displayName, ensName, localNickname) + self.view.receivedContactRequestsModel().setName(publicKey, displayName, ensName, localNickname) + self.view.sentContactRequestsModel().setName(publicKey, displayName, ensName, localNickname) # Temporary commented until we provide appropriate flags on the `status-go` side to cover all sections. - # self.view.receivedButRejectedContactRequestsModel().updateName(publicKey, name) - # self.view.sentButRejectedContactRequestsModel().updateName(publicKey, name) - self.view.blockedContactsModel().updateName(publicKey, name) + # self.view.receivedButRejectedContactRequestsModel().setName(publicKey, displayName, ensName, localNickname) + # self.view.sentButRejectedContactRequestsModel().setName(publicKey, displayName, ensName, localNickname) + self.view.blockedContactsModel().setName(publicKey, displayName, ensName, localNickname) method contactTrustStatusChanged*(self: Module, publicKey: string, isUntrustworthy: bool) = self.view.myMutualContactsModel().updateTrustStatus(publicKey, isUntrustworthy) @@ -282,4 +287,4 @@ method requestContactInfo*(self: Module, publicKey: string) = self.controller.requestContactInfo(publicKey) method onContactInfoRequestFinished*(self: Module, publicKey: string, ok: bool) = - self.view.onContactInfoRequestFinished(publicKey, ok) \ No newline at end of file + self.view.onContactInfoRequestFinished(publicKey, ok) diff --git a/src/app/modules/main/view.nim b/src/app/modules/main/view.nim index 3ae1d00508..0812b81fbf 100644 --- a/src/app/modules/main/view.nim +++ b/src/app/modules/main/view.nim @@ -210,6 +210,9 @@ QtObject: proc getContactDetailsAsJson(self: View, publicKey: string, getVerificationRequest: bool): string {.slot.} = return self.delegate.getContactDetailsAsJson(publicKey, getVerificationRequest) + proc isEnsVerified(self:View, publicKey: string): bool {.slot.} = + return self.delegate.isEnsVerified(publicKey) + proc resolveENS*(self: View, ensName: string, uuid: string) {.slot.} = self.delegate.resolveENS(ensName, uuid) diff --git a/src/app/modules/shared_models/member_item.nim b/src/app/modules/shared_models/member_item.nim index 9b3af11f18..1f33159142 100644 --- a/src/app/modules/shared_models/member_item.nim +++ b/src/app/modules/shared_models/member_item.nim @@ -17,6 +17,7 @@ proc initMemberItem*( pubKey: string, displayName: string, ensName: string, + isEnsVerified: bool, localNickname: string, alias: string, icon: string, @@ -44,6 +45,7 @@ proc initMemberItem*( pubKey = pubKey, displayName = displayName, ensName = ensName, + isEnsVerified = isEnsVerified, localNickname = localNickname, alias = alias, icon = icon, @@ -64,6 +66,7 @@ proc `$`*(self: MemberItem): string = pubKey: {self.pubkey}, displayName: {self.displayName}, ensName: {self.ensName}, + isEnsVerified: {self.isEnsVerified}, localNickname: {self.localNickname}, alias: {self.alias}, icon: {self.icon}, diff --git a/src/app/modules/shared_models/member_model.nim b/src/app/modules/shared_models/member_model.nim index 8d5b8eb656..95dead8e88 100644 --- a/src/app/modules/shared_models/member_model.nim +++ b/src/app/modules/shared_models/member_model.nim @@ -11,6 +11,7 @@ type PubKey = UserRole + 1 DisplayName EnsName + IsEnsVerified LocalNickname Alias Icon @@ -77,6 +78,7 @@ QtObject: ModelRole.PubKey.int: "pubKey", ModelRole.DisplayName.int: "displayName", ModelRole.EnsName.int: "ensName", + ModelRole.IsEnsVerified.int: "isEnsVerified", ModelRole.LocalNickname.int: "localNickname", ModelRole.Alias.int: "alias", ModelRole.Icon.int: "icon", @@ -113,6 +115,8 @@ QtObject: result = newQVariant(item.displayName) of ModelRole.EnsName: result = newQVariant(item.ensName) + of ModelRole.IsEnsVerified: + result = newQVariant(item.isEnsVerified) of ModelRole.LocalNickname: result = newQVariant(item.localNickname) of ModelRole.Alias: @@ -205,6 +209,7 @@ QtObject: pubKey: string, displayName: string, ensName: string, + isEnsVerified: bool, localNickname: string, alias: string, icon: string, @@ -220,6 +225,7 @@ QtObject: self.items[ind].displayName = displayName self.items[ind].ensName = ensName + self.items[ind].isEnsVerified = isEnsVerified self.items[ind].localNickname = localNickname self.items[ind].alias = alias self.items[ind].icon = icon @@ -232,6 +238,7 @@ QtObject: let index = self.createIndex(ind, 0, nil) self.dataChanged(index, index, @[ ModelRole.DisplayName.int, + ModelRole.IsEnsVerified.int, ModelRole.EnsName.int, ModelRole.LocalNickname.int, ModelRole.Alias.int, @@ -248,6 +255,7 @@ QtObject: pubKey: string, displayName: string, ensName: string, + isEnsVerified: bool, localNickname: string, alias: string, icon: string, @@ -261,6 +269,7 @@ QtObject: self.items[ind].displayName = displayName self.items[ind].ensName = ensName + self.items[ind].isEnsVerified = isEnsVerified self.items[ind].localNickname = localNickname self.items[ind].alias = alias self.items[ind].icon = icon @@ -272,6 +281,7 @@ QtObject: self.dataChanged(index, index, @[ ModelRole.DisplayName.int, ModelRole.EnsName.int, + ModelRole.IsEnsVerified.int, ModelRole.LocalNickname.int, ModelRole.Alias.int, ModelRole.Icon.int, diff --git a/src/app/modules/shared_models/message_item_qobject.nim b/src/app/modules/shared_models/message_item_qobject.nim index 5abb60f8c3..42ecc3516c 100644 --- a/src/app/modules/shared_models/message_item_qobject.nim +++ b/src/app/modules/shared_models/message_item_qobject.nim @@ -163,15 +163,15 @@ QtObject: proc pinned*(self: MessageItem): bool {.slot.} = result = ?.self.messageItem.pinned QtProperty[bool] pinned: - read = bool + read = pinned proc editMode*(self: MessageItem): bool {.slot.} = result = ?.self.messageItem.editMode QtProperty[bool] editMode: - read = bool + read = editMode proc isEdited*(self: MessageItem): bool {.slot.} = result = ?.self.messageItem.isEdited QtProperty[bool] isEdited: - read = bool + read = isEdited # this is not the greatest approach, but aligns with the rest of the code proc communityId*(self: MessageItem): string {.slot.} = result = ?.self.messageItem.communityId diff --git a/src/app/modules/shared_models/section_details.nim b/src/app/modules/shared_models/section_details.nim index cfa7d3f341..cd6a85081f 100644 --- a/src/app/modules/shared_models/section_details.nim +++ b/src/app/modules/shared_models/section_details.nim @@ -249,13 +249,14 @@ QtObject: pubkey: string, name: string, ensName: string, + isEnsVerified: bool, localNickname: string, alias: string, image: string, isContact: bool, isVerified: bool, isUntrustworthy: bool) = - self.item.updateMember(pubkey, name, ensName, localNickname, alias, image, isContact, + self.item.updateMember(pubkey, name, ensName, isEnsVerified, localNickname, alias, image, isContact, isVerified, isUntrustworthy) proc pendingRequestsToJoin(self: SectionDetails): QVariant {.slot.} = diff --git a/src/app/modules/shared_models/section_item.nim b/src/app/modules/shared_models/section_item.nim index effd95a3f7..401663d349 100644 --- a/src/app/modules/shared_models/section_item.nim +++ b/src/app/modules/shared_models/section_item.nim @@ -278,13 +278,14 @@ proc updateMember*( pubkey: string, name: string, ensName: string, + isEnsVerified: bool, nickname: string, alias: string, image: string, isContact: bool, isVerified: bool, isUntrustworthy: bool) = - self.membersModel.updateItem(pubkey, name, ensName, nickname, alias, image, isContact, + self.membersModel.updateItem(pubkey, name, ensName, isEnsVerified, nickname, alias, image, isContact, isVerified, isUntrustworthy) proc bannedMembers*(self: SectionItem): member_model.Model {.inline.} = diff --git a/src/app/modules/shared_models/user_item.nim b/src/app/modules/shared_models/user_item.nim index 76b6f23b3a..ccece749c6 100644 --- a/src/app/modules/shared_models/user_item.nim +++ b/src/app/modules/shared_models/user_item.nim @@ -23,6 +23,7 @@ type pubKey: string displayName: string ensName: string + isEnsVerified: bool localNickname: string alias: string icon: string @@ -41,6 +42,7 @@ proc setup*(self: UserItem, pubKey: string, displayName: string, ensName: string, + isEnsVerified: bool, localNickname: string, alias: string, icon: string, @@ -58,6 +60,7 @@ proc setup*(self: UserItem, self.pubKey = pubKey self.displayName = displayName self.ensName = ensName + self.isEnsVerified = isEnsVerified self.localNickname = localNickname self.alias = alias self.icon = icon @@ -77,6 +80,7 @@ proc initUserItem*( pubKey: string, displayName: string, ensName: string, + isEnsVerified: bool, localNickname: string, alias: string, icon: string, @@ -96,6 +100,7 @@ proc initUserItem*( pubKey = pubKey, displayName = displayName, ensName = ensName, + isEnsVerified = isEnsVerified, localNickname = localNickname, alias = alias, icon = icon, @@ -115,6 +120,7 @@ proc `$`*(self: UserItem): string = pubKey: {self.pubkey}, displayName: {self.displayName}, ensName: {self.ensName}, + isEnsVerified: {self.isEnsVerified}, localNickname: {self.localNickname}, alias: {self.alias}, icon: {self.icon}, @@ -140,11 +146,17 @@ proc `displayName=`*(self: UserItem, value: string) {.inline.} = self.displayName = value proc ensName*(self: UserItem): string {.inline.} = - self.ensName + if self.isEnsVerified: self.ensName else: "" proc `ensName=`*(self: UserItem, value: string) {.inline.} = self.ensName = value +proc isEnsVerified*(self: UserItem): bool {.inline.} = + self.isEnsVerified + +proc `isEnsVerified=`*(self: UserItem, value: bool) {.inline.} = + self.isEnsVerified = value + proc localNickname*(self: UserItem): string {.inline.} = self.localNickname @@ -170,7 +182,7 @@ proc `colorId=`*(self: UserItem, value: int) {.inline.} = self.colorId = value proc colorHash*(self: UserItem): string {.inline.} = - self.colorHash + if not self.isEnsVerified: self.colorHash else: "" proc `colorHash=`*(self: UserItem, value: string) {.inline.} = self.colorHash = value diff --git a/src/app/modules/shared_models/user_model.nim b/src/app/modules/shared_models/user_model.nim index 8e8d944fcf..cb772a57cc 100644 --- a/src/app/modules/shared_models/user_model.nim +++ b/src/app/modules/shared_models/user_model.nim @@ -8,6 +8,7 @@ type PubKey = UserRole + 1 DisplayName EnsName + IsEnsVerified LocalNickname Alias Icon @@ -67,6 +68,7 @@ QtObject: ModelRole.PubKey.int: "pubKey", ModelRole.DisplayName.int: "displayName", ModelRole.EnsName.int: "ensName", + ModelRole.IsEnsVerified.int: "isEnsVerified", ModelRole.LocalNickname.int: "localNickname", ModelRole.Alias.int: "alias", ModelRole.Icon.int: "icon", @@ -99,6 +101,8 @@ QtObject: result = newQVariant(item.displayName) of ModelRole.EnsName: result = newQVariant(item.ensName) + of ModelRole.IsEnsVerified: + result = newQVariant(item.isEnsVerified) of ModelRole.LocalNickname: result = newQVariant(item.localNickname) of ModelRole.Alias: @@ -227,6 +231,7 @@ QtObject: pubKey: string, displayName: string, ensName: string, + isEnsVerified: bool, localNickname: string, alias: string, icon: string, @@ -238,6 +243,7 @@ QtObject: self.items[ind].displayName = displayName self.items[ind].ensName = ensName + self.items[ind].isEnsVerified = isEnsVerified self.items[ind].localNickname = localNickname self.items[ind].alias = alias self.items[ind].icon = icon @@ -247,6 +253,7 @@ QtObject: self.dataChanged(index, index, @[ ModelRole.DisplayName.int, ModelRole.EnsName.int, + ModelRole.IsEnsVerified.int, ModelRole.LocalNickname.int, ModelRole.Alias.int, ModelRole.Icon.int, @@ -254,23 +261,6 @@ QtObject: ]) self.itemChanged(pubKey) - proc updateName*( - self: Model, - pubKey: string, - displayName: string - ) = - let ind = self.findIndexByPubKey(pubKey) - if(ind == -1): - return - - self.items[ind].displayName = displayName - - let index = self.createIndex(ind, 0, nil) - self.dataChanged(index, index, @[ - ModelRole.DisplayName.int - ]) - self.itemChanged(pubKey) - proc updateIncomingRequestStatus*( self: Model, pubKey: string, diff --git a/src/app_service/service/contacts/dto/contacts.nim b/src/app_service/service/contacts/dto/contacts.nim index fbc70352d8..aa3f5c02f3 100644 --- a/src/app_service/service/contacts/dto/contacts.nim +++ b/src/app_service/service/contacts/dto/contacts.nim @@ -133,8 +133,10 @@ proc toVerificationRequest*(jsonObj: JsonNode): VerificationRequest = proc toContactsDto*(jsonObj: JsonNode): ContactsDto = result = ContactsDto() discard jsonObj.getProp("id", result.id) - discard jsonObj.getProp("name", result.name) discard jsonObj.getProp("ensVerified", result.ensVerified) + result.name = "" + if (result.ensVerified): + discard jsonObj.getProp("name", result.name) discard jsonObj.getProp("displayName", result.displayName) discard jsonObj.getProp("alias", result.alias) discard jsonObj.getProp("lastUpdated", result.lastUpdated) diff --git a/src/app_service/service/contacts/service.nim b/src/app_service/service/contacts/service.nim index b539b7fa92..104d9db67b 100644 --- a/src/app_service/service/contacts/service.nim +++ b/src/app_service/service/contacts/service.nim @@ -570,7 +570,7 @@ QtObject: result.isCurrentUser = pubKey == singletonInstance.userProfile.getPubKey() result.details = contactDto if not contactDto.ensVerified: - result.colorHash = procs_from_visual_identity_service.getColorHashAsJson(pubKey) + result.colorHash = procs_from_visual_identity_service.getColorHashAsJson(pubKey) proc markUntrustworthy*(self: Service, publicKey: string) = let response = status_contacts.markUntrustworthy(publicKey) @@ -791,4 +791,4 @@ QtObject: ) self.threadpool.start(arg) except Exception as e: - error "Error requesting contact info", msg = e.msg, pubkey \ No newline at end of file + error "Error requesting contact info", msg = e.msg, pubkey diff --git a/ui/StatusQ/src/StatusQ/Components/StatusMessageHeader.qml b/ui/StatusQ/src/StatusQ/Components/StatusMessageHeader.qml index 27cd2767b3..2d718e3dc0 100644 --- a/ui/StatusQ/src/StatusQ/Components/StatusMessageHeader.qml +++ b/ui/StatusQ/src/StatusQ/Components/StatusMessageHeader.qml @@ -108,16 +108,16 @@ Item { Loader { id: tertiaryDetailTextLoader - active: !root.amISender && root.messageOriginInfo === "" + active: !root.amISender && root.messageOriginInfo === "" && !!root.tertiaryDetail + visible: active asynchronous: true sourceComponent: StatusBaseText { - id: tertiaryDetailText verticalAlignment: Text.AlignVCenter font.pixelSize: Theme.asideTextFontSize visible: text elide: Text.ElideMiddle color: Theme.palette.baseColor1 - text: root.tertiaryDetail ? Utils.elideText(root.tertiaryDetail, 5, 3) : "" + text: Utils.elideText(root.tertiaryDetail, 5, 3) } } diff --git a/ui/app/AppLayouts/Chat/panels/UserListPanel.qml b/ui/app/AppLayouts/Chat/panels/UserListPanel.qml index 912484a697..ac094e9cf0 100644 --- a/ui/app/AppLayouts/Chat/panels/UserListPanel.qml +++ b/ui/app/AppLayouts/Chat/panels/UserListPanel.qml @@ -60,13 +60,21 @@ Item { model: SortFilterProxyModel { sourceModel: root.usersModel + proxyRoles: ExpressionRole { + function displayNameProxy(nickname, ensName, displayName, aliasName) { + return ProfileUtils.displayName(nickname, ensName, displayName, aliasName) + } + name: "preferredDisplayName" + expression: displayNameProxy(model.localNickname, model.ensName, model.displayName, model.alias) + } + sorters: [ RoleSorter { roleName: "onlineStatus" sortOrder: Qt.DescendingOrder }, StringSorter { - roleName: "displayName" + roleName: "preferredDisplayName" caseSensitivity: Qt.CaseInsensitive } ] @@ -74,11 +82,10 @@ Item { section.property: "onlineStatus" section.delegate: (root.width > 58) ? sectionDelegateComponent : null delegate: StatusMemberListItem { - readonly property bool ensVerified: Utils.isEnsVerified(model.pubKey) width: ListView.view.width nickName: model.localNickname userName: ProfileUtils.displayName("", model.ensName, model.displayName, model.alias) - pubKey: ensVerified ? "" : Utils.getCompressedPk(model.pubKey) + pubKey: model.isEnsVerified ? "" : Utils.getCompressedPk(model.pubKey) isContact: model.isContact isVerified: model.isVerified isUntrustworthy: model.isUntrustworthy diff --git a/ui/app/AppLayouts/Chat/panels/communities/CommunityMembersTabPanel.qml b/ui/app/AppLayouts/Chat/panels/communities/CommunityMembersTabPanel.qml index 651466e1c4..dbb6f55ec3 100644 --- a/ui/app/AppLayouts/Chat/panels/communities/CommunityMembersTabPanel.qml +++ b/ui/app/AppLayouts/Chat/panels/communities/CommunityMembersTabPanel.qml @@ -51,7 +51,7 @@ Item { rightPadding: 0 placeholderText: root.placeholderText input.asset.name: "search" - enabled: model.count > 0 + enabled: !!model && model.count > 0 } ListView { @@ -131,7 +131,7 @@ Item { height: visible ? implicitHeight : 0 color: "transparent" - pubKey: model.ensName ? "" : Utils.getElidedCompressedPk(model.pubKey) + pubKey: model.isEnsVerified ? "" : Utils.getElidedCompressedPk(model.pubKey) nickName: model.localNickname userName: ProfileUtils.displayName("", model.ensName, model.displayName, model.alias) status: model.onlineStatus diff --git a/ui/app/AppLayouts/Chat/panels/communities/CommunityProfilePopupInviteFriendsPanel.qml b/ui/app/AppLayouts/Chat/panels/communities/CommunityProfilePopupInviteFriendsPanel.qml index 69ff49f6d9..a923507320 100644 --- a/ui/app/AppLayouts/Chat/panels/communities/CommunityProfilePopupInviteFriendsPanel.qml +++ b/ui/app/AppLayouts/Chat/panels/communities/CommunityProfilePopupInviteFriendsPanel.qml @@ -35,14 +35,12 @@ ColumnLayout { Layout.rightMargin: Style.current.padding } - StatusInput { + SearchBox { id: filterInput placeholderText: qsTr("Search contacts") maximumHeight: 36 topPadding: 0 bottomPadding: 0 - input.asset.name: "search" - input.clearable: true Layout.fillWidth: true Layout.topMargin: Style.current.bigPadding Layout.bottomMargin: Style.current.padding diff --git a/ui/app/AppLayouts/Chat/views/CommunitySettingsView.qml b/ui/app/AppLayouts/Chat/views/CommunitySettingsView.qml index 877d185607..f83f85e74f 100644 --- a/ui/app/AppLayouts/Chat/views/CommunitySettingsView.qml +++ b/ui/app/AppLayouts/Chat/views/CommunitySettingsView.qml @@ -467,6 +467,7 @@ StatusSectionLayout { MessageContextMenuView { id: memberContextMenuView store: root.rootStore + isProfile: true amIChatAdmin: root.rootStore.amIChatAdmin() myPublicKey: root.rootStore.myPublicKey() diff --git a/ui/app/AppLayouts/Profile/panels/ContactsListPanel.qml b/ui/app/AppLayouts/Profile/panels/ContactsListPanel.qml index 719d12e04d..91f9617514 100644 --- a/ui/app/AppLayouts/Profile/panels/ContactsListPanel.qml +++ b/ui/app/AppLayouts/Profile/panels/ContactsListPanel.qml @@ -93,10 +93,11 @@ Item { delegate: ContactPanel { id: panelDelegate + width: ListView.view.width contactsStore: root.contactsStore name: ProfileUtils.displayName(model.localNickname, model.ensName, model.displayName, model.alias) - ensVerified: !!model.ensName + ensVerified: model.isEnsVerified publicKey: model.pubKey compressedPk: Utils.getCompressedPk(model.pubKey) iconSource: model.icon diff --git a/ui/app/mainui/activitycenter/views/ActivityNotificationCommunityMembershipRequest.qml b/ui/app/mainui/activitycenter/views/ActivityNotificationCommunityMembershipRequest.qml index b6b92c2120..dab714e8e5 100644 --- a/ui/app/mainui/activitycenter/views/ActivityNotificationCommunityMembershipRequest.qml +++ b/ui/app/mainui/activitycenter/views/ActivityNotificationCommunityMembershipRequest.qml @@ -17,13 +17,9 @@ import "../stores" ActivityNotificationMessage { id: root - readonly property var contactDetails: notification ? - Utils.getContactDetailsAsJson(notification.author, false) : - null + contactDetails: notification ? Utils.getContactDetailsAsJson(notification.author, false) : null messageDetails.messageText: qsTr("Wants to join") - messageDetails.sender.displayName: contactDetails ? contactDetails.displayName : "" - messageDetails.sender.secondaryName: contactDetails ? contactDetails.localNickname : "" messageDetails.sender.profileImage.name: contactDetails ? contactDetails.displayIcon : "" messageDetails.sender.profileImage.assetSettings.isImage: true messageDetails.sender.profileImage.pubkey: notification ? notification.author : "" diff --git a/ui/app/mainui/activitycenter/views/ActivityNotificationMessage.qml b/ui/app/mainui/activitycenter/views/ActivityNotificationMessage.qml index 284477134c..a1830e0fd1 100644 --- a/ui/app/mainui/activitycenter/views/ActivityNotificationMessage.qml +++ b/ui/app/mainui/activitycenter/views/ActivityNotificationMessage.qml @@ -24,10 +24,10 @@ ActivityNotificationBase { messageText: notification ? notification.message.messageText : "" amISender: false sender.id: contactId - sender.displayName: contactDetails ? ProfileUtils.displayName(contactDetails.localNickname, contactDetails.ensVerified ? contactDetails.name : "", + sender.displayName: contactDetails ? ProfileUtils.displayName(contactDetails.localNickname, contactDetails.name, contactDetails.displayName, contactDetails.alias) : "" - sender.secondaryName: contactDetails && contactDetails.localNickname ? ProfileUtils.displayName("", contactDetails.ensVerified ? contactDetails.name : "", - contactDetails.displayName, contactDetails.alias) : "" + sender.secondaryName: contactDetails && contactDetails.localNickname ? + ProfileUtils.displayName("", contactDetails.name, contactDetails.displayName, contactDetails.alias) : "" sender.trustIndicator: contactDetails ? contactDetails.trustStatus : Constants.trustStatus.unknown sender.isEnsVerified: !!contactDetails && contactDetails.ensVerified sender.isContact: !!contactDetails && contactDetails.isContact diff --git a/ui/imports/shared/controls/delegates/ContactListItemDelegate.qml b/ui/imports/shared/controls/delegates/ContactListItemDelegate.qml index 0fc1270925..dfdf843817 100644 --- a/ui/imports/shared/controls/delegates/ContactListItemDelegate.qml +++ b/ui/imports/shared/controls/delegates/ContactListItemDelegate.qml @@ -14,20 +14,19 @@ StatusMemberListItem { id: root readonly property string _pubKey: model.pubKey // expose uncompressed pubkey - readonly property bool hasEnsName: Utils.isEnsVerified(model.pubKey) - pubKey: hasEnsName ? "" : Utils.getCompressedPk(model.pubKey) + pubKey: model.isEnsVerified ? "" : Utils.getCompressedPk(model.pubKey) nickName: model.localNickname userName: ProfileUtils.displayName("", model.ensName, model.displayName, model.alias) isVerified: model.isVerified isUntrustworthy: model.isUntrustworthy isContact: model.isContact asset.name: model.icon - asset.color: Utils.colorForPubkey(model.pubKey) + asset.color: Utils.colorForColorId(model.colorId) asset.isImage: (asset.name !== "") asset.isLetterIdenticon: (asset.name === "") status: model.onlineStatus statusListItemIcon.badge.border.color: sensor.containsMouse ? Theme.palette.baseColor2 : Theme.palette.baseColor4 - ringSettings.ringSpecModel: Utils.getColorHashAsJson(model.pubKey, hasEnsName) + ringSettings.ringSpecModel: model.colorHash color: (sensor.containsMouse || highlighted) ? Theme.palette.baseColor2 : "transparent" } diff --git a/ui/imports/shared/views/ExistingContacts.qml b/ui/imports/shared/views/ExistingContacts.qml index 8ab3f2b290..2dacc7433f 100644 --- a/ui/imports/shared/views/ExistingContacts.qml +++ b/ui/imports/shared/views/ExistingContacts.qml @@ -83,8 +83,7 @@ Item { delegate: StatusMemberListItem { width: contactListView.availableWidth - - pubKey: Utils.getCompressedPk(model.pubKey) + pubKey: model.isEnsVerified ? "" : Utils.getCompressedPk(model.pubKey) isContact: model.isContact status: model.onlineStatus height: visible ? implicitHeight : 0 @@ -97,7 +96,7 @@ Item { asset.width: 40 asset.height: 40 asset.color: Utils.colorForColorId(model.colorId) - ringSettings.ringSpecModel: Utils.getColorHashAsJson(model.pubKey, model.ensName) + ringSettings.ringSpecModel: model.colorHash statusListItemIcon.badge.border.color: Theme.palette.baseColor4 statusListItemIcon.badge.implicitHeight: 14 // 10 px + 2 px * 2 borders statusListItemIcon.badge.implicitWidth: 14 // 10 px + 2 px * 2 borders diff --git a/ui/imports/shared/views/PickedContacts.qml b/ui/imports/shared/views/PickedContacts.qml index 884a79c23c..168ad28a77 100644 --- a/ui/imports/shared/views/PickedContacts.qml +++ b/ui/imports/shared/views/PickedContacts.qml @@ -46,7 +46,7 @@ Item { delegate: StatusMemberListItem { width: contactGridView.cellWidth - pubKey: Utils.getCompressedPk(model.pubKey) + pubKey: model.isEnsVerified ? "" : Utils.getCompressedPk(model.pubKey) isContact: model.isContact status: model.onlineStatus nickName: model.localNickname @@ -59,7 +59,7 @@ Item { asset.height: 40 color: "transparent" asset.color: Utils.colorForColorId(model.colorId) - ringSettings.ringSpecModel: Utils.getColorHashAsJson(model.pubKey) + ringSettings.ringSpecModel: model.colorHash statusListItemIcon.badge.border.color: Theme.palette.baseColor4 statusListItemIcon.badge.implicitHeight: 14 // 10 px + 2 px * 2 borders statusListItemIcon.badge.implicitWidth: 14 // 10 px + 2 px * 2 borders diff --git a/ui/imports/shared/views/ProfileDialogView.qml b/ui/imports/shared/views/ProfileDialogView.qml index f9b5bc470d..a5b4a0c200 100644 --- a/ui/imports/shared/views/ProfileDialogView.qml +++ b/ui/imports/shared/views/ProfileDialogView.qml @@ -697,6 +697,7 @@ Pane { Layout.rightMargin: column.anchors.rightMargin bottomPadding: -4 StatusTabButton { + leftPadding: 0 width: implicitWidth text: qsTr("Communities") } @@ -709,7 +710,6 @@ Pane { text: qsTr("Collectibles") } StatusTabButton { - leftPadding: 0 width: implicitWidth text: qsTr("Assets") } diff --git a/ui/imports/shared/views/chat/MessageView.qml b/ui/imports/shared/views/chat/MessageView.qml index 29bde34a0c..0bfeb2a7d1 100644 --- a/ui/imports/shared/views/chat/MessageView.qml +++ b/ui/imports/shared/views/chat/MessageView.qml @@ -443,8 +443,7 @@ Loader { if (!root.pinnedMessage || root.isDiscordMessage) return "" const contact = Utils.getContactDetailsAsJson(root.messagePinnedBy, false) - const ensName = contact.ensVerified ? contact.name : "" - return ProfileUtils.displayName(contact.localNickname, ensName, contact.displayName, contact.alias) + return ProfileUtils.displayName(contact.localNickname, contact.name, contact.displayName, contact.alias) } isInPinnedPopup: root.isInPinnedPopup hasExpired: root.isExpired diff --git a/ui/imports/shared/views/chat/SimplifiedMessageView.qml b/ui/imports/shared/views/chat/SimplifiedMessageView.qml index 47c3afddb7..2c2006b5d2 100644 --- a/ui/imports/shared/views/chat/SimplifiedMessageView.qml +++ b/ui/imports/shared/views/chat/SimplifiedMessageView.qml @@ -55,7 +55,7 @@ RowLayout { sender: root.messageDetails.sender amISender: root.messageDetails.amISender messageOriginInfo: root.messageDetails.messageOriginInfo - tertiaryDetail: Utils.getElidedCompressedPk(sender.id) + tertiaryDetail: sender.isEnsVerified ? "" : Utils.getElidedCompressedPk(sender.id) timestamp: root.timestamp onClicked: root.openProfilePopup() } diff --git a/ui/imports/utils/Utils.qml b/ui/imports/utils/Utils.qml index f2e43a6b5a..7cd8d0ab4c 100644 --- a/ui/imports/utils/Utils.qml +++ b/ui/imports/utils/Utils.qml @@ -436,7 +436,7 @@ QtObject { function isEnsVerified(publicKey) { if (publicKey === "" || !isChatKey(publicKey) ) return - return getContactDetailsAsJson(publicKey, false).ensVerified + return mainModuleInst.isEnsVerified(publicKey) } function getEmojiHashAsJson(publicKey) {