status-desktop/ui/app/AppLayouts/Chat/components/ProfilePopup.qml

393 lines
13 KiB
QML
Raw Normal View History

2020-06-17 19:18:31 +00:00
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
import QtGraphicalEffects 1.13
import "../../../../imports"
import "../../../../shared"
import "../../../../shared/status"
import "./"
ModalPopup {
id: popup
2020-10-02 13:02:56 +00:00
property Popup parentPopup
2020-09-17 14:26:26 +00:00
property var identicon: ""
property var userName: ""
property string nickname: ""
2020-09-17 14:26:26 +00:00
property var fromAuthor: ""
property var text: ""
property var alias: ""
readonly property int innerMargin: 20
2020-07-09 17:47:36 +00:00
property bool isEnsVerified: false
property bool noFooter: false
property bool isBlocked: false
2020-06-17 21:43:26 +00:00
signal blockButtonClicked(name: string, address: string)
signal unblockButtonClicked(name: string, address: string)
signal removeButtonClicked(address: string)
signal contactUnblocked(publicKey: string)
2020-10-02 14:37:51 +00:00
signal contactBlocked(publicKey: string)
signal contactAdded(publicKey: string)
signal contactRemoved(publicKey: string)
clip: true
noTopMargin: true
2020-10-02 14:37:51 +00:00
function openPopup(showFooter, userNameParam, fromAuthorParam, identiconParam, textParam, nicknameParam) {
userName = userNameParam || ""
nickname = nicknameParam || ""
fromAuthor = fromAuthorParam || ""
identicon = identiconParam || ""
text = textParam || ""
isEnsVerified = chatsModel.ensView.isEnsVerified(this.fromAuthor)
2020-12-06 22:15:51 +00:00
isBlocked = profileModel.contacts.isContactBlocked(this.fromAuthor);
alias = chatsModel.alias(this.fromAuthor) || ""
2020-10-02 14:37:51 +00:00
2020-10-02 13:02:56 +00:00
noFooter = !showFooter;
2020-06-17 21:43:26 +00:00
popup.open()
}
header: Item {
height: 78
2020-06-23 19:04:08 +00:00
width: parent.width
2020-11-30 17:03:52 +00:00
RoundedImage {
2020-06-23 19:04:08 +00:00
id: profilePic
width: 40
height: 40
2020-11-30 17:03:52 +00:00
border.color: Style.current.border
2020-06-23 19:04:08 +00:00
border.width: 1
anchors.verticalCenter: parent.verticalCenter
2020-11-30 17:03:52 +00:00
source: identicon
2020-06-23 19:04:08 +00:00
}
StyledText {
2020-06-23 19:04:08 +00:00
id: profileName
text: Utils.removeStatusEns(userName)
elide: Text.ElideRight
2020-06-23 19:04:08 +00:00
anchors.top: parent.top
anchors.topMargin: Style.current.padding
2020-06-23 19:04:08 +00:00
anchors.left: profilePic.right
anchors.leftMargin: Style.current.halfPadding
anchors.right: qrCodeButton.left
anchors.rightMargin: Style.current.padding
2020-06-23 19:04:08 +00:00
font.bold: true
font.pixelSize: 17
}
2020-06-23 19:04:08 +00:00
StyledText {
text: isEnsVerified ? alias : fromAuthor
elide: !isEnsVerified ? Text.ElideMiddle : Text.ElideRight
2020-06-23 19:04:08 +00:00
anchors.left: profilePic.right
anchors.leftMargin: Style.current.smallPadding
anchors.bottom: parent.bottom
anchors.bottomMargin: Style.current.padding
anchors.right: qrCodeButton.left
anchors.rightMargin: Style.current.padding
2020-06-23 19:04:08 +00:00
anchors.topMargin: 2
font.pixelSize: 14
color: Style.current.secondaryText
2020-06-23 19:04:08 +00:00
}
StatusIconButton {
id: qrCodeButton
icon.name: "qr-code-icon"
anchors.verticalCenter: profileName.verticalCenter
2020-06-23 19:04:08 +00:00
anchors.right: parent.right
anchors.rightMargin: 52
iconColor: Style.current.textColor
onClicked: qrCodePopup.open()
width: 32
height: 32
2020-06-23 19:04:08 +00:00
}
Separator {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.leftMargin: -Style.current.padding
anchors.right: parent.right
anchors.rightMargin: -Style.current.padding
}
2020-12-04 16:01:38 +00:00
ModalPopup {
id: qrCodePopup
2020-12-04 16:01:38 +00:00
width: 320
height: 320
Image {
asynchronous: true
fillMode: Image.PreserveAspectFit
source: profileModel.qrCode(fromAuthor)
anchors.horizontalCenter: parent.horizontalCenter
height: 212
width: 212
mipmap: true
smooth: false
}
}
}
2020-06-23 17:17:58 +00:00
Item {
2020-06-23 19:04:08 +00:00
anchors.fill: parent
TextWithLabel {
id: ensText
//% "ENS username"
label: qsTrId("ens-username")
text: userName
2020-06-23 19:04:08 +00:00
anchors.top: parent.top
visible: isEnsVerified
height: visible ? implicitHeight : 0
textToCopy: userName
}
2020-06-23 19:04:08 +00:00
StyledText {
id: labelChatKey
//% "Chat key"
text: qsTrId("chat-key")
2020-06-23 19:04:08 +00:00
font.pixelSize: 13
font.weight: Font.Medium
color: Style.current.secondaryText
anchors.top: ensText.bottom
anchors.topMargin: ensText.visible ? popup.innerMargin : 0
2020-06-23 19:04:08 +00:00
}
Address {
2020-06-23 19:04:08 +00:00
id: valueChatKey
text: fromAuthor
width: 160
maxWidth: parent.width - (3 * Style.current.smallPadding) - copyBtn.width
color: Style.current.textColor
font.pixelSize: 15
2020-06-23 19:04:08 +00:00
anchors.top: labelChatKey.bottom
anchors.topMargin: 4
2020-06-23 19:04:08 +00:00
}
2020-06-23 17:17:58 +00:00
CopyToClipBoardButton {
id: copyBtn
anchors.top: labelChatKey.bottom
anchors.left: valueChatKey.right
textToCopy: valueChatKey.text
}
2020-06-23 19:04:08 +00:00
Separator {
id: separator
anchors.top: valueChatKey.bottom
anchors.topMargin: popup.innerMargin
2020-06-23 19:04:08 +00:00
anchors.left: parent.left
anchors.leftMargin: -Style.current.padding
2020-06-23 19:04:08 +00:00
anchors.right: parent.right
anchors.rightMargin: -Style.current.padding
2020-06-23 19:04:08 +00:00
}
TextWithLabel {
2020-06-23 19:04:08 +00:00
id: valueShareURL
2021-02-18 16:36:05 +00:00
//% "Share Profile URL"
label: qsTrId("share-profile-url")
text: Constants.userLinkPrefix + fromAuthor.substr(0, 4) + "..." + fromAuthor.substr(fromAuthor.length - 5)
anchors.top: separator.top
anchors.topMargin: popup.innerMargin
textToCopy: Constants.userLinkPrefix + fromAuthor
}
Separator {
id: separator2
anchors.top: valueShareURL.bottom
anchors.topMargin: popup.innerMargin
anchors.left: parent.left
anchors.leftMargin: -Style.current.padding
anchors.right: parent.right
anchors.rightMargin: -Style.current.padding
}
TextWithLabel {
id: chatSettings
visible: profileModel.profile.pubKey !== fromAuthor
2020-09-22 07:53:03 +00:00
//% "Chat settings"
label: qsTrId("chat-settings")
2020-09-22 07:53:03 +00:00
//% "Nickname"
text: qsTrId("nickname")
anchors.top: separator2.top
anchors.topMargin: popup.innerMargin
}
SVGImage {
id: nicknameCaret
visible: profileModel.profile.pubKey !== fromAuthor
source: "../../../img/caret.svg"
rotation: -90
anchors.right: parent.right
anchors.rightMargin: Style.current.padding
anchors.bottom: chatSettings.bottom
anchors.bottomMargin: 5
width: 13
2021-03-03 13:52:51 +00:00
height: 7
fillMode: Image.PreserveAspectFit
ColorOverlay {
anchors.fill: parent
source: parent
color: Style.current.secondaryText
}
}
StyledText {
id: nicknameText
visible: profileModel.profile.pubKey !== fromAuthor
2020-09-22 07:53:03 +00:00
//% "None"
text: nickname ? nickname : qsTrId("none")
anchors.right: nicknameCaret.left
anchors.rightMargin: Style.current.padding
anchors.verticalCenter: nicknameCaret.verticalCenter
color: Style.current.secondaryText
}
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.left: chatSettings.left
anchors.right: nicknameCaret.right
anchors.top: chatSettings.top
anchors.bottom: chatSettings.bottom
onClicked: {
2020-09-16 16:00:21 +00:00
nicknamePopup.open()
}
}
NicknamePopup {
id: nicknamePopup
changeUsername: function (newUsername) {
popup.userName = newUsername
}
changeNickname: function (newNickname) {
popup.nickname = newNickname
}
}
}
footer: Item {
id: footerContainer
visible: !noFooter
width: parent.width
height: children[0].height
StatusButton {
id: blockBtn
anchors.right: addToContactsButton.left
anchors.rightMargin: addToContactsButton ? Style.current.padding : 0
2020-06-23 19:04:08 +00:00
anchors.bottom: parent.bottom
type: "warn"
showBorder: true
bgColor: "transparent"
borderColor: Style.current.border
hoveredBorderColor: Style.current.transparent
text: isBlocked ?
2021-02-18 16:36:05 +00:00
//% "Unblock User"
qsTrId("unblock-user") :
//% "Block User"
qsTrId("block-user")
2020-10-02 14:37:51 +00:00
onClicked: {
if (isBlocked) {
2020-12-07 15:23:52 +00:00
unblockContactConfirmationDialog.contactName = userName;
unblockContactConfirmationDialog.contactAddress = fromAuthor;
unblockContactConfirmationDialog.open();
return;
}
2020-10-02 14:37:51 +00:00
blockContactConfirmationDialog.contactName = userName;
blockContactConfirmationDialog.contactAddress = fromAuthor;
blockContactConfirmationDialog.open();
2020-10-02 14:37:51 +00:00
}
}
StatusButton {
property bool isAdded: profileModel.contacts.isAdded(fromAuthor)
2020-06-23 19:04:08 +00:00
id: addToContactsButton
anchors.right: sendMessageBtn.left
anchors.rightMargin: sendMessageBtn.visible ? Style.current.padding : 0
text: isAdded ?
//% "Remove Contact"
qsTrId("remove-contact") :
//% "Add to contacts"
qsTrId("add-to-contacts")
2020-06-23 19:04:08 +00:00
anchors.bottom: parent.bottom
type: isAdded ? "warn" : "primary"
showBorder: isAdded
borderColor: Style.current.border
bgColor: isAdded ? "transparent" : Style.current.buttonBackgroundColor
hoveredBorderColor: Style.current.transparent
visible: !isBlocked
width: visible ? implicitWidth : 0
2020-06-23 19:04:08 +00:00
onClicked: {
2020-12-06 22:15:51 +00:00
if (profileModel.contacts.isAdded(fromAuthor)) {
2020-10-02 14:37:51 +00:00
removeContactConfirmationDialog.parentPopup = profilePopup;
removeContactConfirmationDialog.open();
2020-06-23 19:04:08 +00:00
} else {
2020-12-06 22:15:51 +00:00
profileModel.contacts.addContact(fromAuthor);
2020-10-02 14:37:51 +00:00
contactAdded(fromAuthor);
profilePopup.close();
2020-06-23 19:04:08 +00:00
}
}
2020-06-23 19:04:08 +00:00
}
StatusButton {
id: sendMessageBtn
anchors.right: parent.right
anchors.bottom: parent.bottom
2021-02-18 16:36:05 +00:00
//% "Send message"
text: qsTrId("send-message")
visible: !isBlocked && chatsModel.channelView.activeChannel.id !== popup.fromAuthor
width: visible ? implicitWidth : 0
onClicked: {
appMain.changeAppSection(Constants.chat)
chatsModel.channelView.joinPrivateChat(fromAuthor, "")
popup.close()
let pp = parentPopup
while (pp) {
pp.close()
pp = pp.parentPopup
}
}
}
BlockContactConfirmationDialog {
id: blockContactConfirmationDialog
onBlockButtonClicked: {
profileModel.contacts.blockContact(fromAuthor)
blockContactConfirmationDialog.close();
popup.close()
contactBlocked(fromAuthor)
}
}
UnblockContactConfirmationDialog {
id: unblockContactConfirmationDialog
onUnblockButtonClicked: {
profileModel.contacts.unblockContact(fromAuthor)
unblockContactConfirmationDialog.close();
popup.close()
contactUnblocked(fromAuthor)
}
}
ConfirmationDialog {
id: removeContactConfirmationDialog
// % "Remove contact"
title: qsTrId("remove-contact")
//% "Are you sure you want to remove this contact?"
confirmationText: qsTrId("are-you-sure-you-want-to-remove-this-contact-")
onConfirmButtonClicked: {
if (profileModel.contacts.isAdded(fromAuthor)) {
profileModel.contacts.removeContact(fromAuthor);
}
removeContactConfirmationDialog.close();
popup.close();
contactRemoved(fromAuthor);
}
}
}
}