status-desktop/ui/imports/shared/popups/ImportCommunityPopup.qml

190 lines
6.3 KiB
QML

import QtQuick 2.12
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.14
import QtGraphicalEffects 1.13
import QtQuick.Dialogs 1.3
import QtQml.Models 2.14
import utils 1.0
import shared.controls 1.0
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Popups.Dialog 0.1
import StatusQ.Controls 0.1
StatusDialog {
id: root
property var store
property alias text: keyInput.text
signal joinCommunityRequested(string communityId, var communityDetails)
width: 640
title: qsTr("Import Community")
QtObject {
id: d
property string importErrorMessage
readonly property bool communityFound: !!d.communityDetails && !!d.communityDetails.name
property var communityDetails: null
property var requestedCommunityDetails: null
readonly property string inputErrorMessage: isInputValid ? "" : qsTr("Invalid key")
readonly property string errorMessage: importErrorMessage || inputErrorMessage
readonly property string inputKey: keyInput.text.trim()
property int shardCluster: -1
property int shardIndex: -1
readonly property string publicKey: {
if (Utils.isStatusDeepLink(inputKey)) {
d.shardCluster = -1
d.shardIndex = -1
const linkData = Utils.getCommunityDataFromSharedLink(inputKey)
if (!linkData) {
return ""
}
if (linkData.shardCluster != undefined && linkData.shardIndex != undefined) {
d.shardCluster = linkData.shardCluster
d.shardIndex = linkData.shardIndex
}
return linkData.communityId
}
if (!Utils.isCommunityPublicKey(inputKey))
return ""
if (!Utils.isCompressedPubKey(inputKey))
return inputKey
return Utils.changeCommunityKeyCompression(inputKey)
}
readonly property bool isInputValid: publicKey !== ""
property bool communityInfoRequested: false
function updateCommunityDetails(requestIfNotFound) {
if (!isInputValid) {
d.communityInfoRequested = false
d.communityDetails = null
return
}
const details = root.store.getCommunityDetails(publicKey)
if (!!details) {
d.communityInfoRequested = false
d.communityDetails = details
return
}
if (requestIfNotFound) {
root.store.requestCommunityInfo(publicKey, shardCluster, shardIndex, false)
d.communityInfoRequested = true
d.communityDetails = null
}
}
onPublicKeyChanged: {
// call later to make sure all proeprties used by `updateCommunityDetails` are udpated
Qt.callLater(() => { d.updateCommunityDetails(true) })
}
}
Connections {
target: root.store
function onCommunityInfoRequestCompleted(communityId, errorMsg) {
if (!d.communityInfoRequested)
return
d.communityInfoRequested = false
if (errorMsg !== "") {
d.importErrorMessage = qsTr("Couldn't find community")
return
}
d.updateCommunityDetails(false)
d.importErrorMessage = ""
}
}
footer: StatusDialogFooter {
rightButtons: ObjectModel {
StatusButton {
enabled: d.isInputValid && d.communityFound
loading: d.isInputValid && !d.communityFound && d.communityInfoRequested
text: qsTr("Import")
onClicked: {
root.joinCommunityRequested(d.publicKey, d.communityDetails)
}
}
}
}
StatusScrollView {
id: scrollContent
anchors.fill: parent
anchors.leftMargin: Style.current.halfPadding
contentWidth: (root.width-Style.current.bigPadding-Style.current.padding)
padding: 0
ColumnLayout {
width: (scrollContent.width-Style.current.padding)
spacing: Style.current.halfPadding
StatusBaseText {
id: infoText1
Layout.fillWidth: true
text: qsTr("Enter the public key of the community you wish to access")
wrapMode: Text.WordWrap
font.pixelSize: Style.current.additionalTextSize
color: Theme.palette.baseColor1
}
StatusBaseText {
id: inputLabel
text: qsTr("Community key")
color: Theme.palette.directColor1
}
StatusTextArea {
id: keyInput
Layout.fillWidth: true
Layout.preferredHeight: 108
placeholderText: "0x0..."
wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere
onTextChanged: d.importErrorMessage = ""
}
RowLayout {
Layout.fillWidth: true
Layout.minimumHeight: 46
Layout.maximumHeight: 46
StatusChatInfoButton {
visible: d.communityFound
title: visible ? d.communityDetails.name : ""
subTitle: visible ? qsTr("%n member(s)", "", d.communityDetails.nbMembers) : ""
asset.name: visible ? d.communityDetails.image : ""
asset.isImage: (asset.name !== "")
asset.color: visible ? d.communityDetails.color : ""
}
Item { Layout.fillWidth: true }
StatusBaseText {
id: detectionLabel
Layout.alignment: Qt.AlignRight
font.pixelSize: Style.current.additionalTextSize
visible: !!d.inputKey
text: {
if (d.errorMessage !== "")
return d.errorMessage
if (d.isInputValid)
return qsTr("Public key detected")
return ""
}
color: d.errorMessage === "" ? Theme.palette.successColor1 : Theme.palette.dangerColor1
}
}
}
}
}