2020-06-17 19:18:31 +00:00
|
|
|
import QtQuick 2.13
|
|
|
|
import QtQuick.Controls 2.13
|
|
|
|
import QtQuick.Layouts 1.13
|
2020-09-15 20:10:43 +00:00
|
|
|
import QtGraphicalEffects 1.13
|
2021-08-30 14:01:34 +00:00
|
|
|
|
2021-09-28 15:04:06 +00:00
|
|
|
|
|
|
|
import utils 1.0
|
2021-10-27 21:27:49 +00:00
|
|
|
import shared 1.0
|
|
|
|
import shared.popups 1.0
|
2021-12-21 20:52:17 +00:00
|
|
|
import shared.stores 1.0
|
2020-06-04 10:30:49 +00:00
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
import StatusQ.Core.Theme 0.1
|
|
|
|
import StatusQ.Components 0.1
|
|
|
|
import StatusQ.Controls 0.1
|
|
|
|
import StatusQ.Popups 0.1
|
|
|
|
|
|
|
|
StatusModal {
|
2020-06-04 10:30:49 +00:00
|
|
|
id: popup
|
2021-08-30 14:01:34 +00:00
|
|
|
anchors.centerIn: parent
|
2020-10-02 13:02:56 +00:00
|
|
|
|
|
|
|
property Popup parentPopup
|
|
|
|
|
2021-12-31 12:29:51 +00:00
|
|
|
property var contactsStore
|
|
|
|
|
|
|
|
property string userPublicKey: ""
|
|
|
|
property string userDisplayName: ""
|
|
|
|
property string userName: ""
|
|
|
|
property string userNickname: ""
|
|
|
|
property string userEnsName: ""
|
|
|
|
property string userIcon: ""
|
|
|
|
property string text: ""
|
|
|
|
|
2021-01-12 20:51:00 +00:00
|
|
|
|
|
|
|
readonly property int innerMargin: 20
|
2021-09-14 14:52:08 +00:00
|
|
|
|
2021-12-31 12:29:51 +00:00
|
|
|
property bool userIsEnsVerified: false
|
|
|
|
property bool userIsBlocked: false
|
2021-07-22 17:08:37 +00:00
|
|
|
property bool isCurrentUser: false
|
2020-06-17 21:43:26 +00:00
|
|
|
|
2020-08-10 11:56:16 +00:00
|
|
|
signal blockButtonClicked(name: string, address: string)
|
2020-12-02 09:10:22 +00:00
|
|
|
signal unblockButtonClicked(name: string, address: string)
|
2020-08-10 12:15:57 +00:00
|
|
|
signal removeButtonClicked(address: string)
|
2020-08-10 11:56:16 +00:00
|
|
|
|
2020-12-02 09:10:22 +00:00
|
|
|
signal contactUnblocked(publicKey: string)
|
2020-10-02 14:37:51 +00:00
|
|
|
signal contactBlocked(publicKey: string)
|
|
|
|
signal contactAdded(publicKey: string)
|
|
|
|
|
2021-12-31 12:29:51 +00:00
|
|
|
function openPopup(publicKey) {
|
|
|
|
// All this should be improved more, but for now we leave it like this.
|
|
|
|
let contactDetails = Utils.getContactDetailsAsJson(publicKey)
|
|
|
|
userPublicKey = publicKey
|
|
|
|
userDisplayName = contactDetails.displayName
|
|
|
|
userName = contactDetails.alias
|
|
|
|
userNickname = contactDetails.localNickname
|
|
|
|
userEnsName = contactDetails.name
|
|
|
|
userIcon = contactDetails.displayIcon
|
|
|
|
userIsEnsVerified = contactDetails.ensVerified
|
|
|
|
userIsBlocked = contactDetails.isBlocked
|
|
|
|
|
|
|
|
text = "" // this is most likely unneeded
|
|
|
|
isCurrentUser = userProfile.pubKey === publicKey
|
|
|
|
showFooter = !isCurrentUser
|
2020-06-17 21:43:26 +00:00
|
|
|
popup.open()
|
|
|
|
}
|
2020-06-09 10:05:25 +00:00
|
|
|
|
2021-12-31 12:29:51 +00:00
|
|
|
header.title: userDisplayName
|
|
|
|
header.subTitle: userIsEnsVerified ? userName : userPublicKey
|
2021-08-30 14:01:34 +00:00
|
|
|
header.subTitleElide: Text.ElideMiddle
|
2021-12-31 12:29:51 +00:00
|
|
|
header.image.source: userIcon
|
2021-08-30 14:01:34 +00:00
|
|
|
|
|
|
|
headerActionButton: StatusFlatRoundButton {
|
|
|
|
type: StatusFlatRoundButton.Type.Secondary
|
|
|
|
width: 32
|
|
|
|
height: 32
|
|
|
|
|
|
|
|
icon.width: 20
|
|
|
|
icon.height: 20
|
|
|
|
icon.name: "qr"
|
2021-09-07 13:31:48 +00:00
|
|
|
onClicked: contentItem.qrCodePopup.open()
|
2021-08-30 14:01:34 +00:00
|
|
|
}
|
|
|
|
|
2021-09-02 14:40:10 +00:00
|
|
|
contentItem: Item {
|
2021-08-30 14:01:34 +00:00
|
|
|
width: popup.width
|
|
|
|
height: modalContent.height
|
2020-06-23 19:04:08 +00:00
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
property alias qrCodePopup: qrCodePopup
|
|
|
|
property alias unblockContactConfirmationDialog: unblockContactConfirmationDialog
|
|
|
|
property alias blockContactConfirmationDialog: blockContactConfirmationDialog
|
|
|
|
property alias removeContactConfirmationDialog: removeContactConfirmationDialog
|
|
|
|
|
|
|
|
Column {
|
|
|
|
id: modalContent
|
2020-06-23 19:04:08 +00:00
|
|
|
anchors.top: parent.top
|
2021-08-30 14:01:34 +00:00
|
|
|
width: parent.width
|
2020-06-09 10:05:25 +00:00
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
Item {
|
|
|
|
height: 16
|
|
|
|
width: parent.width
|
|
|
|
}
|
2020-06-09 10:05:25 +00:00
|
|
|
|
2021-12-13 14:24:21 +00:00
|
|
|
StatusDescriptionListItem {
|
2021-12-31 12:29:51 +00:00
|
|
|
title: userIsEnsVerified ?
|
2021-12-17 19:58:51 +00:00
|
|
|
qsTr("ENS username") :
|
|
|
|
qsTr("Username")
|
2021-12-31 12:29:51 +00:00
|
|
|
subTitle: userIsEnsVerified ? userEnsName : userName
|
2021-08-30 14:01:34 +00:00
|
|
|
tooltip.text: qsTr("Copy to clipboard")
|
|
|
|
icon.name: "copy"
|
|
|
|
iconButton.onClicked: {
|
2021-12-31 12:29:51 +00:00
|
|
|
globalUtils.copyToClipboard(subTitle)
|
2021-12-17 19:58:51 +00:00
|
|
|
tooltip.visible = !tooltip.visible
|
2021-08-30 14:01:34 +00:00
|
|
|
}
|
|
|
|
width: parent.width
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusDescriptionListItem {
|
|
|
|
title: qsTr("Chat key")
|
2021-12-31 12:29:51 +00:00
|
|
|
subTitle: userPublicKey
|
2021-08-30 14:01:34 +00:00
|
|
|
subTitleComponent.elide: Text.ElideMiddle
|
|
|
|
subTitleComponent.width: 320
|
|
|
|
subTitleComponent.font.family: Theme.palette.monoFont.name
|
|
|
|
tooltip.text: qsTr("Copy to clipboard")
|
|
|
|
icon.name: "copy"
|
|
|
|
iconButton.onClicked: {
|
2021-12-31 12:29:51 +00:00
|
|
|
globalUtils.copyToClipboard(subTitle)
|
2021-12-17 19:58:51 +00:00
|
|
|
tooltip.visible = !tooltip.visible
|
2021-08-30 14:01:34 +00:00
|
|
|
}
|
|
|
|
width: parent.width
|
|
|
|
}
|
|
|
|
|
2021-12-13 14:24:21 +00:00
|
|
|
StatusModalDivider {
|
|
|
|
topPadding: 12
|
|
|
|
bottomPadding: 16
|
|
|
|
}
|
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
StatusDescriptionListItem {
|
|
|
|
title: qsTr("Share Profile URL")
|
|
|
|
subTitle: {
|
|
|
|
let user = ""
|
|
|
|
if (isCurrentUser) {
|
2021-12-17 19:58:51 +00:00
|
|
|
user = userProfile.name
|
2021-08-30 14:01:34 +00:00
|
|
|
} else {
|
2021-12-31 12:29:51 +00:00
|
|
|
if (userIsEnsVerified) {
|
|
|
|
user = userEnsName
|
2021-08-30 14:01:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (user === ""){
|
2021-12-31 12:29:51 +00:00
|
|
|
user = userPublicKey.substr(0, 4) + "..." + userPublicKey.substr(userPublicKey.length - 5)
|
2021-08-30 14:01:34 +00:00
|
|
|
}
|
|
|
|
return Constants.userLinkPrefix + user;
|
|
|
|
}
|
|
|
|
tooltip.text: qsTr("Copy to clipboard")
|
|
|
|
icon.name: "copy"
|
|
|
|
iconButton.onClicked: {
|
|
|
|
let user = ""
|
|
|
|
if (isCurrentUser) {
|
2021-12-17 19:58:51 +00:00
|
|
|
user = userProfile.name
|
2021-08-30 14:01:34 +00:00
|
|
|
} else {
|
2021-12-31 12:29:51 +00:00
|
|
|
if (userIsEnsVerified) {
|
2021-08-30 14:01:34 +00:00
|
|
|
user = userName.startsWith("@") ? userName.substring(1) : userName
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (user === ""){
|
2021-12-31 12:29:51 +00:00
|
|
|
user = userPublicKey
|
2021-08-30 14:01:34 +00:00
|
|
|
}
|
|
|
|
|
2021-12-31 12:29:51 +00:00
|
|
|
globalUtils.copyToClipboard(subTitle)
|
2021-08-30 14:01:34 +00:00
|
|
|
tooltip.visible = !tooltip.visible
|
|
|
|
}
|
|
|
|
width: parent.width
|
|
|
|
}
|
|
|
|
|
2021-12-13 14:24:21 +00:00
|
|
|
StatusModalDivider {
|
|
|
|
visible: !isCurrentUser
|
|
|
|
topPadding: 8
|
|
|
|
bottomPadding: 12
|
|
|
|
}
|
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
StatusDescriptionListItem {
|
2021-09-24 20:21:25 +00:00
|
|
|
visible: !isCurrentUser
|
2021-08-30 14:01:34 +00:00
|
|
|
title: qsTr("Chat settings")
|
|
|
|
subTitle: qsTr("Nickname")
|
2021-12-31 12:29:51 +00:00
|
|
|
value: userNickname ? userNickname : qsTr("None")
|
2021-08-30 14:01:34 +00:00
|
|
|
sensor.enabled: true
|
|
|
|
sensor.onClicked: {
|
|
|
|
nicknamePopup.open()
|
|
|
|
}
|
|
|
|
width: parent.width
|
|
|
|
}
|
|
|
|
|
|
|
|
Item {
|
2021-09-24 20:21:25 +00:00
|
|
|
visible: !isCurrentUser
|
2021-08-30 14:01:34 +00:00
|
|
|
width: parent.width
|
|
|
|
height: 16
|
|
|
|
}
|
2021-01-12 20:51:00 +00:00
|
|
|
}
|
|
|
|
|
2021-10-14 11:33:34 +00:00
|
|
|
// TODO: replace with StatusModal
|
2020-12-04 16:01:38 +00:00
|
|
|
ModalPopup {
|
2020-12-04 13:51:25 +00:00
|
|
|
id: qrCodePopup
|
2020-12-04 16:01:38 +00:00
|
|
|
width: 320
|
|
|
|
height: 320
|
2020-12-04 13:51:25 +00:00
|
|
|
Image {
|
|
|
|
asynchronous: true
|
|
|
|
fillMode: Image.PreserveAspectFit
|
2021-12-31 12:29:51 +00:00
|
|
|
source: globalUtils.qrCode(userPublicKey)
|
2020-12-04 13:51:25 +00:00
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
height: 212
|
|
|
|
width: 212
|
|
|
|
mipmap: true
|
|
|
|
smooth: false
|
|
|
|
}
|
|
|
|
}
|
2020-06-29 15:23:28 +00:00
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
UnblockContactConfirmationDialog {
|
|
|
|
id: unblockContactConfirmationDialog
|
|
|
|
onUnblockButtonClicked: {
|
2021-12-31 12:29:51 +00:00
|
|
|
popup.contactsStore.unblockContact(userPublicKey)
|
2021-08-30 14:01:34 +00:00
|
|
|
unblockContactConfirmationDialog.close();
|
|
|
|
popup.close()
|
2021-12-31 12:29:51 +00:00
|
|
|
popup.contactUnblocked(userPublicKey)
|
2021-07-22 17:08:37 +00:00
|
|
|
}
|
2020-06-29 15:23:28 +00:00
|
|
|
}
|
2020-09-15 20:10:43 +00:00
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
BlockContactConfirmationDialog {
|
|
|
|
id: blockContactConfirmationDialog
|
|
|
|
onBlockButtonClicked: {
|
2021-12-31 12:29:51 +00:00
|
|
|
popup.contactsStore.blockContact(userPublicKey)
|
2021-08-30 14:01:34 +00:00
|
|
|
blockContactConfirmationDialog.close();
|
|
|
|
popup.close()
|
2020-09-15 20:10:43 +00:00
|
|
|
|
2021-12-31 12:29:51 +00:00
|
|
|
popup.contactBlocked(userPublicKey)
|
2020-09-15 20:10:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
ConfirmationDialog {
|
|
|
|
id: removeContactConfirmationDialog
|
2021-09-09 09:10:29 +00:00
|
|
|
header.title: qsTr("Remove contact")
|
2021-08-30 14:01:34 +00:00
|
|
|
confirmationText: qsTr("Are you sure you want to remove this contact?")
|
|
|
|
onConfirmButtonClicked: {
|
2021-12-31 12:29:51 +00:00
|
|
|
if (popup.contactsStore.isContactAdded(userPublicKey)) {
|
|
|
|
popup.contactsStore.removeContact(userPublicKey);
|
2021-08-30 14:01:34 +00:00
|
|
|
}
|
|
|
|
removeContactConfirmationDialog.close();
|
|
|
|
popup.close();
|
2020-09-16 16:00:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NicknamePopup {
|
|
|
|
id: nicknamePopup
|
2021-10-22 20:49:47 +00:00
|
|
|
onDoneClicked: {
|
|
|
|
// Change username title only if it was not an ENS name
|
2021-12-31 12:29:51 +00:00
|
|
|
if (userIsEnsVerified) {
|
2021-10-22 20:49:47 +00:00
|
|
|
popup.userName = newUsername;
|
|
|
|
}
|
2021-12-31 12:29:51 +00:00
|
|
|
popup.userNickname = newNickname;
|
|
|
|
popup.contactsStore.changeContactNickname(userPublicKey, newNickname);
|
2021-10-22 20:49:47 +00:00
|
|
|
popup.close()
|
2020-09-28 14:31:00 +00:00
|
|
|
}
|
2020-09-15 20:10:43 +00:00
|
|
|
}
|
2020-06-29 15:23:28 +00:00
|
|
|
}
|
2020-06-09 10:05:25 +00:00
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
rightButtons: [
|
|
|
|
StatusFlatButton {
|
2021-12-31 12:29:51 +00:00
|
|
|
text: userIsBlocked ?
|
2021-08-30 14:01:34 +00:00
|
|
|
qsTr("Unblock User") :
|
|
|
|
qsTr("Block User")
|
|
|
|
type: StatusBaseButton.Type.Danger
|
2020-10-02 14:37:51 +00:00
|
|
|
onClicked: {
|
2021-12-31 12:29:51 +00:00
|
|
|
if (userIsBlocked) {
|
2021-09-07 13:31:48 +00:00
|
|
|
contentItem.unblockContactConfirmationDialog.contactName = userName;
|
2021-12-31 12:29:51 +00:00
|
|
|
contentItem.unblockContactConfirmationDialog.contactAddress = userPublicKey;
|
2021-09-07 13:31:48 +00:00
|
|
|
contentItem.unblockContactConfirmationDialog.open();
|
2020-12-02 09:10:22 +00:00
|
|
|
return;
|
|
|
|
}
|
2021-09-07 14:30:33 +00:00
|
|
|
contentItem.blockContactConfirmationDialog.contactName = userName;
|
2021-12-31 12:29:51 +00:00
|
|
|
contentItem.blockContactConfirmationDialog.contactAddress = userPublicKey;
|
2021-09-07 13:31:48 +00:00
|
|
|
contentItem.blockContactConfirmationDialog.open();
|
2020-10-02 14:37:51 +00:00
|
|
|
}
|
2021-08-30 14:01:34 +00:00
|
|
|
},
|
2020-06-11 08:22:20 +00:00
|
|
|
|
2021-08-30 14:01:34 +00:00
|
|
|
StatusFlatButton {
|
2021-12-31 12:29:51 +00:00
|
|
|
property bool isAdded: popup.contactsStore.isContactAdded(userPublicKey)
|
|
|
|
visible: !userIsBlocked && isAdded
|
2021-08-30 14:01:34 +00:00
|
|
|
type: StatusBaseButton.Type.Danger
|
|
|
|
text: qsTr('Remove Contact')
|
2020-06-23 19:04:08 +00:00
|
|
|
onClicked: {
|
2021-09-07 13:31:48 +00:00
|
|
|
contentItem.removeContactConfirmationDialog.parentPopup = popup;
|
|
|
|
contentItem.removeContactConfirmationDialog.open();
|
2020-06-19 17:18:04 +00:00
|
|
|
}
|
2021-08-30 14:01:34 +00:00
|
|
|
},
|
2021-01-11 20:59:05 +00:00
|
|
|
|
|
|
|
StatusButton {
|
2021-12-31 12:29:51 +00:00
|
|
|
property bool isAdded: popup.contactsStore.isContactAdded(userPublicKey)
|
2021-08-30 14:01:34 +00:00
|
|
|
text: qsTr("Add to contacts")
|
2021-12-31 12:29:51 +00:00
|
|
|
visible: !userIsBlocked && !isAdded
|
2021-01-11 20:59:05 +00:00
|
|
|
onClicked: {
|
2021-12-31 12:29:51 +00:00
|
|
|
popup.contactsStore.addContact(userPublicKey);
|
|
|
|
popup.contactAdded(userPublicKey);
|
2021-01-12 20:51:00 +00:00
|
|
|
popup.close();
|
|
|
|
}
|
|
|
|
}
|
2021-08-30 14:01:34 +00:00
|
|
|
]
|
2020-06-04 10:30:49 +00:00
|
|
|
}
|