feat(CommunityTokens): Display community member contact data for token holders list (#11787)

* feat(CommunityTokens): proposal of CommunityCollectibleOwner

Close #11143

* feat(Communities): implement viewProfile from token holders list

* fix: re-request community token owners after a contact get removed from a community
This commit is contained in:
Mikhail Rogachev 2023-08-17 11:24:14 +04:00 committed by GitHub
parent b38faeae64
commit f4b028bd71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 102 additions and 35 deletions

View File

@ -1,5 +1,6 @@
import strformat, sequtils, stint import strformat, sequtils, stint
import ../../../../../../app_service/service/community_tokens/dto/community_token import ../../../../../../app_service/service/community_tokens/dto/community_token
import ../../../../../../app_service/service/community_tokens/community_collectible_owner
import ../../../../../../app_service/service/network/dto import ../../../../../../app_service/service/network/dto
import ../../../../../../app_service/common/types import ../../../../../../app_service/common/types
from backend/collectibles_types import CollectibleOwner from backend/collectibles_types import CollectibleOwner
@ -24,7 +25,7 @@ type
proc initTokenItem*( proc initTokenItem*(
tokenDto: CommunityTokenDto, tokenDto: CommunityTokenDto,
network: NetworkDto, network: NetworkDto,
tokenOwners: seq[CollectibleOwner], tokenOwners: seq[CommunityCollectibleOwner],
accountName: string, accountName: string,
burnState: ContractTransactionStatus, burnState: ContractTransactionStatus,
remoteDestructedAddresses: seq[string], remoteDestructedAddresses: seq[string],
@ -41,10 +42,9 @@ proc initTokenItem*(
result.burnState = burnState result.burnState = burnState
result.remoteDestructedAddresses = remoteDestructedAddresses result.remoteDestructedAddresses = remoteDestructedAddresses
result.tokenOwnersModel = newTokenOwnersModel() result.tokenOwnersModel = newTokenOwnersModel()
result.tokenOwnersModel.setItems(tokenOwners.map(proc(owner: CollectibleOwner): TokenOwnersItem = result.tokenOwnersModel.setItems(tokenOwners.map(proc(owner: CommunityCollectibleOwner): TokenOwnersItem =
# TODO find member with the address - later when airdrop to member will be added result = initTokenOwnersItem(owner.contactId, owner.name, owner.imageSource, owner.collectibleOwner, remoteDestructedAddresses)
result = initTokenOwnersItem("", "", owner, remoteDestructedAddresses) ))
))
proc `$`*(self: TokenItem): string = proc `$`*(self: TokenItem): string =
result = fmt"""TokenItem( result = fmt"""TokenItem(

View File

@ -3,9 +3,9 @@ import token_item
import token_owners_item import token_owners_item
import token_owners_model import token_owners_model
import ../../../../../../app_service/service/community_tokens/dto/community_token import ../../../../../../app_service/service/community_tokens/dto/community_token
import ../../../../../../app_service/service/community_tokens/community_collectible_owner
import ../../../../../../app_service/common/utils import ../../../../../../app_service/common/utils
import ../../../../../../app_service/common/types import ../../../../../../app_service/common/types
from backend/collectibles_types import CollectibleOwner
type type
ModelRole {.pure.} = enum ModelRole {.pure.} = enum
@ -107,12 +107,11 @@ QtObject:
self.dataChanged(index, index, @[ModelRole.RemainingSupply.int]) self.dataChanged(index, index, @[ModelRole.RemainingSupply.int])
return return
proc setCommunityTokenOwners*(self: TokenModel, chainId: int, contractAddress: string, owners: seq[CollectibleOwner]) = proc setCommunityTokenOwners*(self: TokenModel, chainId: int, contractAddress: string, owners: seq[CommunityCollectibleOwner]) =
for i in 0 ..< self.items.len: for i in 0 ..< self.items.len:
if((self.items[i].tokenDto.address == contractAddress) and (self.items[i].tokenDto.chainId == chainId)): if((self.items[i].tokenDto.address == contractAddress) and (self.items[i].tokenDto.chainId == chainId)):
self.items[i].tokenOwnersModel.setItems(owners.map(proc(owner: CollectibleOwner): TokenOwnersItem = self.items[i].tokenOwnersModel.setItems(owners.map(proc(owner: CommunityCollectibleOwner): TokenOwnersItem =
# TODO find member with the address - later when airdrop to member will be added result = initTokenOwnersItem(owner.contactId, owner.name, owner.imageSource, owner.collectibleOwner, self.items[i].remoteDestructedAddresses)
result = initTokenOwnersItem("", "", owner, self.items[i].remoteDestructedAddresses)
)) ))
let index = self.createIndex(i, 0, nil) let index = self.createIndex(i, 0, nil)
defer: index.delete defer: index.delete

View File

@ -4,6 +4,7 @@ import ../../../../../../app_service/common/types
type type
TokenOwnersItem* = object TokenOwnersItem* = object
contactId*: string
name*: string name*: string
imageSource*: string imageSource*: string
ownerDetails*: CollectibleOwner ownerDetails*: CollectibleOwner
@ -16,11 +17,13 @@ proc remoteDestructTransactionStatus*(remoteDestructedAddresses: seq[string], ad
return ContractTransactionStatus.Completed return ContractTransactionStatus.Completed
proc initTokenOwnersItem*( proc initTokenOwnersItem*(
contactId: string,
name: string, name: string,
imageSource: string, imageSource: string,
ownerDetails: CollectibleOwner, ownerDetails: CollectibleOwner,
remoteDestructedAddresses: seq[string] remoteDestructedAddresses: seq[string]
): TokenOwnersItem = ): TokenOwnersItem =
result.contactId = contactId
result.name = name result.name = name
result.imageSource = imageSource result.imageSource = imageSource
result.ownerDetails = ownerDetails result.ownerDetails = ownerDetails
@ -30,6 +33,7 @@ proc initTokenOwnersItem*(
proc `$`*(self: TokenOwnersItem): string = proc `$`*(self: TokenOwnersItem): string =
result = fmt"""TokenOwnersItem( result = fmt"""TokenOwnersItem(
contactId: {self.contactId},
name: {self.name}, name: {self.name},
amount: {self.amount}, amount: {self.amount},
ownerDetails: {self.ownerDetails} ownerDetails: {self.ownerDetails}

View File

@ -4,6 +4,7 @@ import token_owners_item
type type
ModelRole {.pure.} = enum ModelRole {.pure.} = enum
Name = UserRole + 1 Name = UserRole + 1
ContactId,
ImageSource ImageSource
WalletAddress WalletAddress
Amount Amount
@ -45,6 +46,7 @@ QtObject:
method roleNames(self: TokenOwnersModel): Table[int, string] = method roleNames(self: TokenOwnersModel): Table[int, string] =
{ {
ModelRole.Name.int:"name", ModelRole.Name.int:"name",
ModelRole.ContactId.int:"contactId",
ModelRole.ImageSource.int:"imageSource", ModelRole.ImageSource.int:"imageSource",
ModelRole.WalletAddress.int:"walletAddress", ModelRole.WalletAddress.int:"walletAddress",
ModelRole.Amount.int:"amount", ModelRole.Amount.int:"amount",
@ -70,6 +72,8 @@ QtObject:
case enumRole: case enumRole:
of ModelRole.Name: of ModelRole.Name:
result = newQVariant(item.name) result = newQVariant(item.name)
of ModelRole.ContactId:
result = newQVariant(item.contactId)
of ModelRole.ImageSource: of ModelRole.ImageSource:
result = newQVariant(item.imageSource) result = newQVariant(item.imageSource)
of ModelRole.WalletAddress: of ModelRole.WalletAddress:

View File

@ -23,7 +23,7 @@ import ../../../app_service/service/token/service as token_service
import ../../../app_service/service/network/service as networks_service import ../../../app_service/service/network/service as networks_service
import ../../../app_service/service/visual_identity/service as procs_from_visual_identity_service import ../../../app_service/service/visual_identity/service as procs_from_visual_identity_service
from backend/collectibles_types import CollectibleOwner import ../../../app_service/service/community_tokens/community_collectible_owner
import io_interface import io_interface
import ../shared_modules/keycard_popup/io_interface as keycard_shared_module import ../shared_modules/keycard_popup/io_interface as keycard_shared_module
@ -404,6 +404,10 @@ proc init*(self: Controller) =
var args = CommunityMemberArgs(e) var args = CommunityMemberArgs(e)
self.delegate.onAcceptRequestToJoinSuccess(args.communityId, args.pubKey, args.requestId) self.delegate.onAcceptRequestToJoinSuccess(args.communityId, args.pubKey, args.requestId)
self.events.on(SIGNAL_COMMUNITY_MEMBERS_CHANGED) do(e: Args):
let args = CommunityMembersArgs(e)
self.communityTokensService.fetchCommunityTokenOwners(args.communityId)
self.events.on(SIGNAL_SHARED_KEYCARD_MODULE_FLOW_TERMINATED) do(e: Args): self.events.on(SIGNAL_SHARED_KEYCARD_MODULE_FLOW_TERMINATED) do(e: Args):
let args = SharedKeycarModuleFlowTerminatedArgs(e) let args = SharedKeycarModuleFlowTerminatedArgs(e)
if args.uniqueIdentifier == UNIQUE_MAIN_MODULE_KEYCARD_SYNC_IDENTIFIER: if args.uniqueIdentifier == UNIQUE_MAIN_MODULE_KEYCARD_SYNC_IDENTIFIER:
@ -504,7 +508,7 @@ proc getVerificationRequestFrom*(self: Controller, publicKey: string): Verificat
proc getCommunityTokens*(self: Controller, communityId: string): seq[CommunityTokenDto] = proc getCommunityTokens*(self: Controller, communityId: string): seq[CommunityTokenDto] =
self.communityTokensService.getCommunityTokens(communityId) self.communityTokensService.getCommunityTokens(communityId)
proc getCommunityTokenOwners*(self: Controller, communityId: string, chainId: int, contractAddress: string): seq[CollectibleOwner] = proc getCommunityTokenOwners*(self: Controller, communityId: string, chainId: int, contractAddress: string): seq[CommunityCollectibleOwner] =
return self.communityTokensService.getCommunityTokenOwners(communityId, chainId, contractAddress) return self.communityTokensService.getCommunityTokenOwners(communityId, chainId, contractAddress)
proc getCommunityTokenOwnerName*(self: Controller, contractOwnerAddress: string): string = proc getCommunityTokenOwnerName*(self: Controller, contractOwnerAddress: string): string =

View File

@ -12,8 +12,8 @@ import ../../../app_service/service/community_tokens/service as community_token_
import ../../../app_service/service/wallet_account/service as wallet_account_service import ../../../app_service/service/wallet_account/service as wallet_account_service
import ../../../app_service/service/token/service as token_service import ../../../app_service/service/token/service as token_service
import ../../../app_service/service/community_tokens/service as community_tokens_service import ../../../app_service/service/community_tokens/service as community_tokens_service
import ../../../app_service/service/community_tokens/community_collectible_owner
from ../../../app_service/common/types import StatusType, ContractTransactionStatus from ../../../app_service/common/types import StatusType, ContractTransactionStatus
from backend/collectibles_types import CollectibleOwner
import ../../global/app_signals import ../../global/app_signals
import ../../core/eventemitter import ../../core/eventemitter
@ -294,7 +294,7 @@ method onCommunityTokenDeploymentStarted*(self: AccessInterface, communityToken:
method onOwnerTokensDeploymentStarted*(self: AccessInterface, ownerToken: CommunityTokenDto, masterToken: CommunityTokenDto) {.base.} = method onOwnerTokensDeploymentStarted*(self: AccessInterface, ownerToken: CommunityTokenDto, masterToken: CommunityTokenDto) {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method onCommunityTokenOwnersFetched*(self: AccessInterface, communityId: string, chainId: int, contractAddress: string, owners: seq[CollectibleOwner]) {.base.} = method onCommunityTokenOwnersFetched*(self: AccessInterface, communityId: string, chainId: int, contractAddress: string, owners: seq[CommunityCollectibleOwner]) {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method onCommunityTokenDeployStateChanged*(self: AccessInterface, communityId: string, chainId: int, contractAddress: string, deployState: DeployState) {.base.} = method onCommunityTokenDeployStateChanged*(self: AccessInterface, communityId: string, chainId: int, contractAddress: string, deployState: DeployState) {.base.} =

View File

@ -28,7 +28,7 @@ import network_connection/module as network_connection_module
import shared_urls/module as shared_urls_module import shared_urls/module as shared_urls_module
import ../../../app_service/service/contacts/dto/contacts import ../../../app_service/service/contacts/dto/contacts
from backend/collectibles_types import CollectibleOwner import ../../../app_service/service/community_tokens/community_collectible_owner
import ../../../app_service/service/keychain/service as keychain_service import ../../../app_service/service/keychain/service as keychain_service
import ../../../app_service/service/chat/service as chat_service import ../../../app_service/service/chat/service as chat_service
@ -1060,7 +1060,7 @@ method onCommunityTokenRemoved*[T](self: Module[T], communityId: string, chainId
if item.id != "": if item.id != "":
item.removeCommunityToken(chainId, address) item.removeCommunityToken(chainId, address)
method onCommunityTokenOwnersFetched*[T](self: Module[T], communityId: string, chainId: int, contractAddress: string, owners: seq[CollectibleOwner]) = method onCommunityTokenOwnersFetched*[T](self: Module[T], communityId: string, chainId: int, contractAddress: string, owners: seq[CommunityCollectibleOwner]) =
let item = self.view.model().getItemById(communityId) let item = self.view.model().getItemById(communityId)
if item.id != "": if item.id != "":
item.setCommunityTokenOwners(chainId, contractAddress, owners) item.setCommunityTokenOwners(chainId, contractAddress, owners)

View File

@ -3,11 +3,11 @@ import ./member_model, ./member_item
import ../main/communities/models/[pending_request_item, pending_request_model] import ../main/communities/models/[pending_request_item, pending_request_model]
import ../main/communities/tokens/models/token_model as community_tokens_model import ../main/communities/tokens/models/token_model as community_tokens_model
import ../main/communities/tokens/models/token_item import ../main/communities/tokens/models/token_item
from backend/collectibles_types import CollectibleOwner
import ../../global/global_singleton import ../../global/global_singleton
import ../../../app_service/common/types import ../../../app_service/common/types
import ../../../app_service/service/community_tokens/community_collectible_owner
type type
SectionType* {.pure.} = enum SectionType* {.pure.} = enum
@ -353,7 +353,7 @@ proc updateBurnState*(self: SectionItem, chainId: int, contractAddress: string,
proc updateRemoteDestructedAddresses*(self: SectionItem, chainId: int, contractAddress: string, addresess: seq[string]) {.inline.} = proc updateRemoteDestructedAddresses*(self: SectionItem, chainId: int, contractAddress: string, addresess: seq[string]) {.inline.} =
self.communityTokensModel.updateRemoteDestructedAddresses(chainId, contractAddress, addresess) self.communityTokensModel.updateRemoteDestructedAddresses(chainId, contractAddress, addresess)
proc setCommunityTokenOwners*(self: SectionItem, chainId: int, contractAddress: string, owners: seq[CollectibleOwner]) {.inline.} = proc setCommunityTokenOwners*(self: SectionItem, chainId: int, contractAddress: string, owners: seq[CommunityCollectibleOwner]) {.inline.} =
self.communityTokensModel.setCommunityTokenOwners(chainId, contractAddress, owners) self.communityTokensModel.setCommunityTokenOwners(chainId, contractAddress, owners)
proc communityTokens*(self: SectionItem): community_tokens_model.TokenModel {.inline.} = proc communityTokens*(self: SectionItem): community_tokens_model.TokenModel {.inline.} =

View File

@ -0,0 +1,9 @@
import json
from backend/collectibles_types import CollectibleOwner
type
CommunityCollectibleOwner* = object
contactId*: string
name*: string
imageSource*: string
collectibleOwner*: CollectibleOwner

View File

@ -4,6 +4,7 @@ import ../../../app/core/eventemitter
import ../../../app/core/tasks/[qt, threadpool] import ../../../app/core/tasks/[qt, threadpool]
import ../../../app/modules/shared_models/currency_amount import ../../../app/modules/shared_models/currency_amount
import ../../../backend/communities as communities_backend
import ../../../backend/community_tokens as tokens_backend import ../../../backend/community_tokens as tokens_backend
import ../transaction/service as transaction_service import ../transaction/service as transaction_service
import ../token/service as token_service import ../token/service as token_service
@ -19,7 +20,9 @@ import ../../common/conversion
import ../../common/account_constants import ../../common/account_constants
import ../../common/utils as common_utils import ../../common/utils as common_utils
import ../community/dto/community import ../community/dto/community
import ../contacts/dto/contacts
import ./community_collectible_owner
import ./dto/deployment_parameters import ./dto/deployment_parameters
import ./dto/community_token import ./dto/community_token
import ./dto/community_token_owner import ./dto/community_token_owner
@ -197,7 +200,7 @@ type
communityId*: string communityId*: string
contractAddress*: string contractAddress*: string
chainId*: int chainId*: int
owners*: seq[CollectibleOwner] owners*: seq[CommunityCollectibleOwner]
# Signals which may be emitted by this service: # Signals which may be emitted by this service:
const SIGNAL_COMMUNITY_TOKEN_DEPLOY_STATUS* = "communityTokenDeployStatus" const SIGNAL_COMMUNITY_TOKEN_DEPLOY_STATUS* = "communityTokenDeployStatus"
@ -231,7 +234,7 @@ QtObject:
tokenOwnersTimer: QTimer tokenOwnersTimer: QTimer
tokenOwners1SecTimer: QTimer # used to update 1 sec after changes in owners tokenOwners1SecTimer: QTimer # used to update 1 sec after changes in owners
tempTokenOwnersToFetch: CommunityTokenDto # used by 1sec timer tempTokenOwnersToFetch: CommunityTokenDto # used by 1sec timer
tokenOwnersCache: Table[ContractTuple, seq[CollectibleOwner]] tokenOwnersCache: Table[ContractTuple, seq[CommunityCollectibleOwner]]
tempFeeTable: Table[int, SuggestedFeesDto] # fees per chain, filled during gas computation, used during operation (deployment, mint, burn) tempFeeTable: Table[int, SuggestedFeesDto] # fees per chain, filled during gas computation, used during operation (deployment, mint, burn)
tempGasTable: Table[ContractTuple, int] # gas per contract, filled during gas computation, used during operation (deployment, mint, burn) tempGasTable: Table[ContractTuple, int] # gas per contract, filled during gas computation, used during operation (deployment, mint, burn)
@ -245,7 +248,7 @@ QtObject:
# Forward declaration # Forward declaration
proc fetchAllTokenOwners*(self: Service) proc fetchAllTokenOwners*(self: Service)
proc getCommunityTokenOwners*(self: Service, communityId: string, chainId: int, contractAddress: string): seq[CollectibleOwner] proc getCommunityTokenOwners*(self: Service, communityId: string, chainId: int, contractAddress: string): seq[CommunityCollectibleOwner]
proc getCommunityToken*(self: Service, chainId: int, address: string): CommunityTokenDto proc getCommunityToken*(self: Service, chainId: int, address: string): CommunityTokenDto
proc delete*(self: Service) = proc delete*(self: Service) =
@ -699,12 +702,12 @@ QtObject:
if common_utils.contractUniqueKey(token.chainId, token.address) == contractUniqueKey: if common_utils.contractUniqueKey(token.chainId, token.address) == contractUniqueKey:
return token return token
proc getOwnerBalances(self: Service, contractOwners: seq[CollectibleOwner], ownerAddress: string): seq[CollectibleBalance] = proc getOwnerBalances(self: Service, contractOwners: seq[CommunityCollectibleOwner], ownerAddress: string): seq[CollectibleBalance] =
for owner in contractOwners: for owner in contractOwners:
if owner.address == ownerAddress: if owner.collectibleOwner.address == ownerAddress:
return owner.balances return owner.collectibleOwner.balances
proc collectTokensToBurn(self: Service, walletAndAmountList: seq[WalletAndAmount], contractOwners: seq[CollectibleOwner]): seq[UInt256] = proc collectTokensToBurn(self: Service, walletAndAmountList: seq[WalletAndAmount], contractOwners: seq[CommunityCollectibleOwner]): seq[UInt256] =
if len(walletAndAmountList) == 0 or len(contractOwners) == 0: if len(walletAndAmountList) == 0 or len(contractOwners) == 0:
return return
for walletAndAmount in walletAndAmountList: for walletAndAmount in walletAndAmountList:
@ -1009,7 +1012,7 @@ QtObject:
self.threadpool.start(arg) self.threadpool.start(arg)
# get owners from cache # get owners from cache
proc getCommunityTokenOwners*(self: Service, communityId: string, chainId: int, contractAddress: string): seq[CollectibleOwner] = proc getCommunityTokenOwners*(self: Service, communityId: string, chainId: int, contractAddress: string): seq[CommunityCollectibleOwner] =
return self.tokenOwnersCache.getOrDefault((chainId: chainId, address: contractAddress)) return self.tokenOwnersCache.getOrDefault((chainId: chainId, address: contractAddress))
proc onCommunityTokenOwnersFetched*(self:Service, response: string) {.slot.} = proc onCommunityTokenOwnersFetched*(self:Service, response: string) {.slot.} =
@ -1024,8 +1027,29 @@ QtObject:
let resultJson = responseJson["result"] let resultJson = responseJson["result"]
var owners = fromJson(resultJson, CollectibleContractOwnership).owners var owners = fromJson(resultJson, CollectibleContractOwnership).owners
owners = owners.filter(x => x.address != ZERO_ADDRESS) owners = owners.filter(x => x.address != ZERO_ADDRESS)
self.tokenOwnersCache[(chainId, contractAddress)] = owners
let data = CommunityTokenOwnersArgs(chainId: chainId, contractAddress: contractAddress, communityId: communityId, owners: owners) let response = communities_backend.getCommunityMembersForWalletAddresses(communityId, chainId)
if response.error != nil:
let errorMessage = responseJson["error"].getStr
error "Can't get community members with addresses", errorMsg=errorMessage
return
let communityOwners = owners.map(proc(owner: CollectibleOwner): CommunityCollectibleOwner =
let ownerAddressUp = owner.address.toUpper()
for responseAddress in response.result.keys():
let responseAddressUp = responseAddress.toUpper()
if ownerAddressUp == responseAddressUp:
let member = response.result[responseAddress].toContactsDto()
return CommunityCollectibleOwner(
contactId: member.id,
name: member.displayName,
imageSource: member.image.thumbnail,
collectibleOwner: owner
)
return CommunityCollectibleOwner(collectibleOwner: owner)
)
self.tokenOwnersCache[(chainId, contractAddress)] = communityOwners
let data = CommunityTokenOwnersArgs(chainId: chainId, contractAddress: contractAddress, communityId: communityId, owners: communityOwners)
self.events.emit(SIGNAL_COMMUNITY_TOKEN_OWNERS_FETCHED, data) self.events.emit(SIGNAL_COMMUNITY_TOKEN_OWNERS_FETCHED, data)
proc onRefreshTransferableTokenOwners*(self:Service) {.slot.} = proc onRefreshTransferableTokenOwners*(self:Service) {.slot.} =
@ -1042,6 +1066,11 @@ QtObject:
for token in allTokens: for token in allTokens:
self.fetchCommunityOwners(token) self.fetchCommunityOwners(token)
proc fetchCommunityTokenOwners*(self: Service, communityId: string) =
let tokens = self.getCommunityTokens(communityId)
for token in tokens:
self.fetchCommunityOwners(token)
proc getOwnerToken*(self: Service, communityId: string): CommunityTokenDto = proc getOwnerToken*(self: Service, communityId: string): CommunityTokenDto =
let communityTokens = self.getCommunityTokens(communityId) let communityTokens = self.getCommunityTokens(communityId)
for token in communityTokens: for token in communityTokens:

View File

@ -457,3 +457,6 @@ proc getCheckChannelPermissionResponses*(communityId: string,): RpcResponse[Json
proc getCommunityPublicKeyFromPrivateKey*(communityPrivateKey: string,): RpcResponse[JsonNode] {.raises: [Exception].} = proc getCommunityPublicKeyFromPrivateKey*(communityPrivateKey: string,): RpcResponse[JsonNode] {.raises: [Exception].} =
return callPrivateRPC("getCommunityPublicKeyFromPrivateKey".prefix, %*[communityPrivateKey]) return callPrivateRPC("getCommunityPublicKeyFromPrivateKey".prefix, %*[communityPrivateKey])
proc getCommunityMembersForWalletAddresses*(communityId: string, chainId: int): RpcResponse[JsonNode] {.raises: [Exception].} =
return callPrivateRPC("getCommunityMembersForWalletAddresses".prefix, %* [communityId, chainId])

View File

@ -46,9 +46,9 @@ SplitView {
isAirdropEnabled: airdropCheckBox.checked isAirdropEnabled: airdropCheckBox.checked
onViewProfileRequested: onViewProfileRequested:
logs.logEvent("onViewProfileRequested: " + address) logs.logEvent("onViewProfileRequested: " + contactId)
onViewMessagesRequested: onViewMessagesRequested:
logs.logEvent("onViewMessagesRequested: " + address) logs.logEvent("onViewMessagesRequested: " + contactId)
onAirdropRequested: onAirdropRequested:
logs.logEvent("onAirdropRequested: " + address) logs.logEvent("onAirdropRequested: " + address)
onRemoteDestructRequested: onRemoteDestructRequested:

View File

@ -537,6 +537,14 @@ StackView {
} }
} }
onViewProfileRequested: {
Global.openProfilePopup(contactId)
}
onViewMessagesRequested: {
// TODO: https://github.com/status-im/status-desktop/issues/11860
console.warn("View Messages is not implemented yet")
}
onBanRequested: { onBanRequested: {
tokenMasterActionPopup.openPopup( tokenMasterActionPopup.openPopup(
TokenMasterActionPopup.ActionType.Ban, name) TokenMasterActionPopup.ActionType.Ban, name)

View File

@ -27,8 +27,8 @@ Control {
readonly property bool empty: countCheckHelper.count === 0 readonly property bool empty: countCheckHelper.count === 0
signal viewProfileRequested(string address) signal viewProfileRequested(string contactId)
signal viewMessagesRequested(string address) signal viewMessagesRequested(string contactId)
signal airdropRequested(string address) signal airdropRequested(string address)
signal remoteDestructRequested(string name, string address) signal remoteDestructRequested(string name, string address)
signal kickRequested(string name, string address) signal kickRequested(string name, string address)
@ -134,6 +134,7 @@ Control {
const entry = ModelUtils.get(proxyModel, index) const entry = ModelUtils.get(proxyModel, index)
menu.contactId = entry.contactId
menu.name = entry.name menu.name = entry.name
menu.currentAddress = entry.walletAddress menu.currentAddress = entry.walletAddress
menu.popup(parent, mouse.x, mouse.y) menu.popup(parent, mouse.x, mouse.y)
@ -146,6 +147,7 @@ Control {
StatusMenu { StatusMenu {
id: menu id: menu
property string contactId
property string name property string name
property string currentAddress property string currentAddress
readonly property bool rawAddress: name === "" readonly property bool rawAddress: name === ""
@ -157,7 +159,7 @@ Control {
icon.name: "profile" icon.name: "profile"
enabled: !menu.rawAddress enabled: !menu.rawAddress
onTriggered: root.viewProfileRequested(menu.currentAddress) onTriggered: root.viewProfileRequested(menu.contactId)
} }
StatusAction { StatusAction {
@ -165,7 +167,7 @@ Control {
icon.name: "chat" icon.name: "chat"
enabled: !menu.rawAddress enabled: !menu.rawAddress
onTriggered: root.viewMessagesRequested(menu.currentAddress) onTriggered: root.viewMessagesRequested(menu.contactId)
} }
StatusAction { StatusAction {

View File

@ -67,6 +67,9 @@ StatusScrollView {
signal airdropRequested(string address) signal airdropRequested(string address)
signal generalAirdropRequested signal generalAirdropRequested
signal viewProfileRequested(string contactId)
signal viewMessagesRequested(string contactId)
signal remoteDestructRequested(string name, string address) signal remoteDestructRequested(string name, string address)
signal kickRequested(string name, string address) signal kickRequested(string name, string address)
signal banRequested(string name, string address) signal banRequested(string name, string address)
@ -208,6 +211,8 @@ StatusScrollView {
Layout.topMargin: Style.current.padding Layout.topMargin: Style.current.padding
Layout.fillWidth: true Layout.fillWidth: true
onViewProfileRequested: root.viewProfileRequested(contactId)
onViewMessagesRequested: root.viewMessagesRequested(contactId)
onAirdropRequested: root.airdropRequested(address) onAirdropRequested: root.airdropRequested(address)
onGeneralAirdropRequested: root.generalAirdropRequested() onGeneralAirdropRequested: root.generalAirdropRequested()
onRemoteDestructRequested: root.remoteDestructRequested(name, address) onRemoteDestructRequested: root.remoteDestructRequested(name, address)

2
vendor/status-go vendored

@ -1 +1 @@
Subproject commit c4cd5775db42219444ea6b57c472958c907c636f Subproject commit 6d3e6d1b5da9d7ee1883065fb731e122721e0065