239 lines
7.7 KiB
QML
239 lines
7.7 KiB
QML
|
import QtQuick 2.13
|
||
|
import QtQuick.Controls 2.13
|
||
|
import QtQuick.Layouts 1.13
|
||
|
import QtGraphicalEffects 1.13
|
||
|
|
||
|
import utils 1.0
|
||
|
import shared 1.0
|
||
|
import shared.popups 1.0
|
||
|
import shared.stores 1.0
|
||
|
import shared.controls.chat 1.0
|
||
|
|
||
|
import StatusQ.Core 0.1
|
||
|
import StatusQ.Core.Theme 0.1
|
||
|
import StatusQ.Components 0.1
|
||
|
import StatusQ.Controls 0.1
|
||
|
import StatusQ.Popups 0.1
|
||
|
|
||
|
Rectangle {
|
||
|
id: root
|
||
|
|
||
|
property Popup parentPopup
|
||
|
|
||
|
property var profileStore
|
||
|
property var contactsStore
|
||
|
|
||
|
property string userPublicKey: profileStore.pubkey
|
||
|
property string userDisplayName: profileStore.displayName
|
||
|
property string userName: profileStore.username
|
||
|
property string userNickname: profileStore.details.localNickname
|
||
|
property string userEnsName: profileStore.ensName
|
||
|
property string userIcon: profileStore.profileLargeImage
|
||
|
property string text: ""
|
||
|
|
||
|
property bool userIsEnsVerified: profileStore.details.ensVerified
|
||
|
property bool userIsBlocked: profileStore.details.isBlocked
|
||
|
property bool isCurrentUser: profileStore.pubkey === userPublicKey
|
||
|
property bool isAddedContact: false
|
||
|
|
||
|
readonly property alias qrCodePopup: qrCodePopup
|
||
|
readonly property alias unblockContactConfirmationDialog: unblockContactConfirmationDialog
|
||
|
readonly property alias blockContactConfirmationDialog: blockContactConfirmationDialog
|
||
|
readonly property alias removeContactConfirmationDialog: removeContactConfirmationDialog
|
||
|
|
||
|
signal contactUnblocked(publicKey: string)
|
||
|
signal contactBlocked(publicKey: string)
|
||
|
signal contactAdded(publicKey: string)
|
||
|
signal contactRemoved(publicKey: string)
|
||
|
signal nicknameEdited(publicKey: string)
|
||
|
|
||
|
implicitWidth: modalContent.implicitWidth
|
||
|
implicitHeight: modalContent.implicitHeight
|
||
|
|
||
|
color: Theme.palette.statusAppLayout.backgroundColor
|
||
|
radius: 8
|
||
|
|
||
|
QtObject {
|
||
|
id: d
|
||
|
readonly property string subTitle: root.userIsEnsVerified ? root.userName : Utils.getElidedCompressedPk(userPublicKey)
|
||
|
readonly property int subTitleElide: Text.ElideMiddle
|
||
|
}
|
||
|
|
||
|
ColumnLayout {
|
||
|
id: modalContent
|
||
|
anchors.fill: parent
|
||
|
|
||
|
Item {
|
||
|
Layout.fillWidth: true
|
||
|
implicitHeight: 16
|
||
|
}
|
||
|
|
||
|
ProfileHeader {
|
||
|
Layout.fillWidth: true
|
||
|
|
||
|
displayName: root.userDisplayName
|
||
|
pubkey: root.userPublicKey
|
||
|
icon: root.isCurrentUser ? root.profileStore.icon : root.userIcon
|
||
|
|
||
|
displayNameVisible: false
|
||
|
pubkeyVisible: false
|
||
|
imageSize: ProfileHeader.ImageSize.Middle
|
||
|
editImageButtonVisible: root.isCurrentUser
|
||
|
}
|
||
|
|
||
|
StatusBanner {
|
||
|
Layout.fillWidth: true
|
||
|
visible: root.userIsBlocked
|
||
|
type: StatusBanner.Type.Danger
|
||
|
statusText: qsTr("Blocked")
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
Layout.fillWidth: true
|
||
|
implicitHeight: 16
|
||
|
}
|
||
|
|
||
|
StatusDescriptionListItem {
|
||
|
Layout.fillWidth: true
|
||
|
title: root.userIsEnsVerified ? qsTr("ENS username") : qsTr("Username")
|
||
|
subTitle: root.userIsEnsVerified ? root.userEnsName : root.userName
|
||
|
tooltip.text: qsTr("Copied to clipboard")
|
||
|
tooltip.timeout: 1000
|
||
|
icon.name: "copy"
|
||
|
iconButton.onClicked: {
|
||
|
globalUtils.copyToClipboard(subTitle)
|
||
|
tooltip.open();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
StatusDescriptionListItem {
|
||
|
Layout.fillWidth: true
|
||
|
title: qsTr("Chat key")
|
||
|
subTitle: Utils.getCompressedPk(root.userPublicKey)
|
||
|
subTitleComponent.elide: Text.ElideMiddle
|
||
|
subTitleComponent.width: 320
|
||
|
subTitleComponent.font.family: Theme.palette.monoFont.name
|
||
|
tooltip.text: qsTr("Copied to clipboard")
|
||
|
tooltip.timeout: 1000
|
||
|
icon.name: "copy"
|
||
|
iconButton.onClicked: {
|
||
|
globalUtils.copyToClipboard(subTitle)
|
||
|
tooltip.open();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
StatusDescriptionListItem {
|
||
|
Layout.fillWidth: true
|
||
|
title: qsTr("Share Profile URL")
|
||
|
subTitle: {
|
||
|
let user = ""
|
||
|
if (isCurrentUser) {
|
||
|
user = root.profileStore.ensName !== "" ? root.profileStore.ensName
|
||
|
: (root.profileStore.pubkey.substring(0, 5) + "..." + root.profileStore.pubkey.substring(root.profileStore.pubkey.length - 5))
|
||
|
} else if (userIsEnsVerified) {
|
||
|
user = userEnsName
|
||
|
}
|
||
|
|
||
|
if (user === ""){
|
||
|
user = userPublicKey.substr(0, 4) + "..." + userPublicKey.substr(userPublicKey.length - 5)
|
||
|
}
|
||
|
return Constants.userLinkPrefix + user;
|
||
|
}
|
||
|
tooltip.text: qsTr("Copied to clipboard")
|
||
|
tooltip.timeout: 1000
|
||
|
icon.name: "copy"
|
||
|
iconButton.onClicked: {
|
||
|
let user = ""
|
||
|
if (isCurrentUser) {
|
||
|
user = root.profileStore.ensName !== "" ? root.profileStore.ensName : root.profileStore.pubkey
|
||
|
} else {
|
||
|
user = (userEnsName !== "" ? userEnsName : userPublicKey)
|
||
|
}
|
||
|
root.profileStore.copyToClipboard(Constants.userLinkPrefix + user)
|
||
|
tooltip.open();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
StatusDescriptionListItem {
|
||
|
Layout.fillWidth: true
|
||
|
visible: !isCurrentUser
|
||
|
title: qsTr("Chat settings")
|
||
|
subTitle: qsTr("Nickname")
|
||
|
value: userNickname ? userNickname : qsTr("None")
|
||
|
sensor.enabled: true
|
||
|
sensor.onClicked: {
|
||
|
nicknamePopup.open()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
Layout.fillWidth: true
|
||
|
visible: !isCurrentUser
|
||
|
implicitHeight: 16
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// TODO: replace with StatusModal
|
||
|
ModalPopup {
|
||
|
id: qrCodePopup
|
||
|
width: 320
|
||
|
height: 320
|
||
|
Image {
|
||
|
asynchronous: true
|
||
|
fillMode: Image.PreserveAspectFit
|
||
|
source: globalUtils.qrCode(userPublicKey)
|
||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||
|
height: 212
|
||
|
width: 212
|
||
|
mipmap: true
|
||
|
smooth: false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
UnblockContactConfirmationDialog {
|
||
|
id: unblockContactConfirmationDialog
|
||
|
onUnblockButtonClicked: {
|
||
|
root.contactsStore.unblockContact(userPublicKey)
|
||
|
unblockContactConfirmationDialog.close();
|
||
|
root.contactUnblocked(userPublicKey)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BlockContactConfirmationDialog {
|
||
|
id: blockContactConfirmationDialog
|
||
|
onBlockButtonClicked: {
|
||
|
root.contactsStore.blockContact(userPublicKey)
|
||
|
blockContactConfirmationDialog.close();
|
||
|
root.contactBlocked(userPublicKey)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ConfirmationDialog {
|
||
|
id: removeContactConfirmationDialog
|
||
|
header.title: qsTr("Remove contact")
|
||
|
confirmationText: qsTr("Are you sure you want to remove this contact?")
|
||
|
onConfirmButtonClicked: {
|
||
|
if (isAddedContact) {
|
||
|
root.contactsStore.removeContact(userPublicKey);
|
||
|
}
|
||
|
removeContactConfirmationDialog.close();
|
||
|
root.contactRemoved(userPublicKey)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
NicknamePopup {
|
||
|
id: nicknamePopup
|
||
|
nickname: root.userNickname
|
||
|
header.subTitle: d.subTitle
|
||
|
header.subTitleElide: d.subTitleElide
|
||
|
onEditDone: {
|
||
|
if (root.userNickname !== newNickname)
|
||
|
{
|
||
|
root.userNickname = newNickname;
|
||
|
root.contactsStore.changeContactNickname(userPublicKey, newNickname);
|
||
|
}
|
||
|
root.nicknameEdited(userPublicKey)
|
||
|
}
|
||
|
}
|
||
|
}
|