import QtQuick 2.12 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 import QtQml.Models 2.3 import StatusQ.Popups 0.1 import StatusQ.Components 0.1 import utils 1.0 import shared 1.0 import shared.panels 1.0 import shared.popups 1.0 import shared.status 1.0 import shared.controls.chat 1.0 import shared.controls.chat.menuItems 1.0 StatusMenu { id: root property var store property string myPublicKey: "" property string selectedUserPublicKey: "" property string selectedUserDisplayName: "" property string selectedUserIcon: "" readonly property bool isMe: { return root.selectedUserPublicKey === root.store.contactsStore.myPublicKey; } readonly property var contactDetails: { if (root.selectedUserPublicKey === "" || isMe) { return {} } return Utils.getContactDetailsAsJson(root.selectedUserPublicKey); } readonly property bool isContact: { return root.selectedUserPublicKey !== "" && !!contactDetails.isContact } readonly property bool isBlockedContact: (!!contactDetails && contactDetails.isBlocked) || false readonly property int outgoingVerificationStatus: { if (root.selectedUserPublicKey === "" || root.isMe || !root.isContact) { return 0 } return contactDetails.verificationStatus } readonly property int incomingVerificationStatus: { if (root.selectedUserPublicKey === "" || root.isMe || !root.isContact) { return 0 } return contactDetails.incomingVerificationStatus } readonly property bool hasPendingContactRequest: { return !root.isMe && root.selectedUserPublicKey !== "" && root.store.contactsStore.hasPendingContactRequest(root.selectedUserPublicKey); } readonly property bool hasActiveReceivedVerificationRequestFrom: { if (!root.selectedUserPublicKey || root.isMe || !root.isContact) { return false } return contactDetails.incomingVerificationStatus === Constants.verificationStatus.verifying || contactDetails.incomingVerificationStatus === Constants.verificationStatus.verified } readonly property bool isVerificationRequestSent: { if (!root.selectedUserPublicKey || root.isMe || !root.isContact) { return false } return root.outgoingVerificationStatus !== Constants.verificationStatus.unverified && root.outgoingVerificationStatus !== Constants.verificationStatus.verified && root.outgoingVerificationStatus !== Constants.verificationStatus.trusted } readonly property bool isTrusted: { if (!root.selectedUserPublicKey || root.isMe || !root.isContact) { return false } return root.outgoingVerificationStatus === Constants.verificationStatus.trusted || root.incomingVerificationStatus === Constants.verificationStatus.trusted } readonly property bool userTrustIsUnknown: contactDetails && contactDetails.trustStatus === Constants.trustStatus.unknown readonly property bool userIsUntrustworthy: contactDetails && contactDetails.trustStatus === Constants.trustStatus.untrustworthy signal openProfileClicked(string publicKey) signal createOneToOneChat(string communityId, string chatId, string ensName) onClosed: { // Reset selectedUserPublicKey so that associated properties get recalculated on re-open selectedUserPublicKey = "" } ProfileHeader { width: parent.width height: visible ? implicitHeight : 0 displayNameVisible: false displayNamePlusIconsVisible: true editButtonVisible: false displayName: root.selectedUserDisplayName pubkey: root.selectedUserPublicKey icon: root.selectedUserIcon trustStatus: contactDetails && contactDetails.trustStatus ? contactDetails.trustStatus : Constants.trustStatus.unknown isContact: root.isContact isCurrentUser: root.isMe userIsEnsVerified: (!!contactDetails && contactDetails.ensVerified) || false } StatusMenuSeparator { topPadding: root.topPadding } ViewProfileMenuItem { id: viewProfileAction onTriggered: { root.openProfileClicked(root.selectedUserPublicKey) root.close() } } SendMessageMenuItem { id: sendMessageMenuItem enabled: root.isContact && !root.isBlockedContact onTriggered: { root.createOneToOneChat("", root.selectedUserPublicKey, "") root.close() } } SendContactRequestMenuItem { id: sendContactRequestMenuItem enabled: !root.isMe && !root.isContact && !root.isBlockedContact && !root.hasPendingContactRequest onTriggered: { Global.openContactRequestPopup(root.selectedUserPublicKey, null) root.close() } } StatusAction { id: verifyIdentityAction text: qsTr("Verify Identity") icon.name: "checkmark-circle" enabled: !root.isMe && root.isContact && !root.isBlockedContact && root.outgoingVerificationStatus === Constants.verificationStatus.unverified && !root.hasActiveReceivedVerificationRequestFrom onTriggered: { Global.openSendIDRequestPopup(root.selectedUserPublicKey, null) root.close() } } StatusAction { id: pendingIdentityAction text: isVerificationRequestSent || root.incomingVerificationStatus === Constants.verificationStatus.verified ? qsTr("ID Request Pending....") : qsTr("Respond to ID Request...") icon.name: "checkmark-circle" enabled: !root.isMe && root.isContact && !root.isBlockedContact && !root.isTrusted && (root.hasActiveReceivedVerificationRequestFrom || root.isVerificationRequestSent) onTriggered: { if (hasActiveReceivedVerificationRequestFrom) { Global.openIncomingIDRequestPopup(root.selectedUserPublicKey, null) } else if (root.isVerificationRequestSent) { Global.openOutgoingIDRequestPopup(root.selectedUserPublicKey, null) } root.close() } } StatusAction { id: renameAction text: qsTr("Rename") icon.name: "edit_pencil" enabled: !root.isMe onTriggered: { Global.openNicknamePopupRequested(root.selectedUserPublicKey, contactDetails.localNickname, "%1 (%2)".arg(root.selectedUserDisplayName).arg(Utils.getElidedCompressedPk(root.selectedUserPublicKey))) root.close() } } StatusAction { id: unblockAction text: qsTr("Unblock User") icon.name: "remove-circle" enabled: !root.isMe && root.isBlockedContact onTriggered: Global.unblockContactRequested(root.selectedUserPublicKey, root.selectedUserDisplayName) } StatusMenuSeparator { visible: blockMenuItem.enabled || markUntrustworthyMenuItem.enabled || removeUntrustworthyMarkMenuItem.enabled } StatusAction { id: markUntrustworthyMenuItem text: qsTr("Mark as Untrustworthy") icon.name: "warning" type: StatusAction.Type.Danger enabled: !root.isMe && root.userTrustIsUnknown onTriggered: root.store.contactsStore.markUntrustworthy(root.selectedUserPublicKey) } StatusAction { id: removeUntrustworthyMarkMenuItem text: qsTr("Remove Untrustworthy Mark") icon.name: "warning" enabled: !root.isMe && root.userIsUntrustworthy onTriggered: root.store.contactsStore.removeTrustStatus(root.selectedUserPublicKey) } StatusAction { text: qsTr("Remove Contact") icon.name: "remove-contact" type: StatusAction.Type.Danger enabled: root.isContact && !root.isBlockedContact && !root.hasPendingContactRequest onTriggered: { Global.removeContactRequested(root.selectedUserDisplayName, root.selectedUserPublicKey) root.close() } } StatusAction { id: blockMenuItem text: qsTr("Block User") icon.name: "cancel" type: StatusAction.Type.Danger enabled: !root.isMe && !root.isBlockedContact onTriggered: Global.blockContactRequested(root.selectedUserPublicKey, root.selectedUserDisplayName) } }