197 lines
6.6 KiB
QML
197 lines
6.6 KiB
QML
import QtQuick 2.15
|
|
import QtQuick.Controls 2.15
|
|
import QtQuick.Layouts 1.15
|
|
import QtGraphicalEffects 1.15
|
|
import QtQml.Models 2.15
|
|
|
|
import utils 1.0
|
|
import shared.controls 1.0
|
|
import shared.stores 1.0
|
|
|
|
import StatusQ.Core 0.1
|
|
import StatusQ.Core.Theme 0.1
|
|
import StatusQ.Popups.Dialog 0.1
|
|
import StatusQ.Controls 0.1
|
|
|
|
import AppLayouts.Communities.stores 1.0 as CommunitiesStores
|
|
|
|
StatusDialog {
|
|
id: root
|
|
|
|
property CommunitiesStores.CommunitiesStore store
|
|
property UtilsStore utilsStore
|
|
|
|
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 (!root.utilsStore.isCommunityPublicKey(inputKey))
|
|
return ""
|
|
if (!root.utilsStore.isCompressedPubKey(inputKey))
|
|
return inputKey
|
|
return root.utilsStore.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: Theme.halfPadding
|
|
contentWidth: (root.width-Theme.bigPadding-Theme.padding)
|
|
padding: 0
|
|
|
|
ColumnLayout {
|
|
width: (scrollContent.width-Theme.padding)
|
|
spacing: Theme.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: Theme.additionalTextSize
|
|
color: Theme.palette.baseColor1
|
|
}
|
|
|
|
StatusBaseText {
|
|
id: inputLabel
|
|
text: qsTr("Community key")
|
|
color: Theme.palette.directColor1
|
|
}
|
|
StatusScrollView {
|
|
padding: 0 // use our own (StatusTextArea) padding
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: 108
|
|
StatusTextArea {
|
|
id: keyInput
|
|
anchors.fill: parent
|
|
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: Theme.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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|