208 lines
7.2 KiB
QML
208 lines
7.2 KiB
QML
import QtQuick 2.15
|
||
import QtQuick.Controls 2.15
|
||
import QtQuick.Layouts 1.15
|
||
import QtQml 2.15
|
||
import QtQml.Models 2.14
|
||
|
||
import StatusQ.Controls 0.1
|
||
import StatusQ.Core 0.1
|
||
import StatusQ.Popups.Dialog 0.1
|
||
import StatusQ.Core.Theme 0.1
|
||
|
||
import utils 1.0
|
||
|
||
StatusDialog {
|
||
id: root
|
||
|
||
required property var community
|
||
|
||
signal importControlNode(string privateKey)
|
||
signal requestCommunityInfo(string privateKey)
|
||
|
||
function setCommunityInfo(communityInfo) {
|
||
d.requestedCommunityInfo = communityInfo
|
||
d.privateKeyCheckInProgress = false
|
||
}
|
||
|
||
onRequestCommunityInfo: d.privateKeyCheckInProgress = true
|
||
|
||
width: 640
|
||
height: Math.max(552, implicitHeight)
|
||
title: qsTr("Make this device the control node for %1").arg(root.community.name)
|
||
|
||
closePolicy: Popup.NoAutoClose
|
||
|
||
component Paragraph: StatusBaseText {
|
||
Layout.fillWidth: true
|
||
Layout.preferredHeight: 40
|
||
font.pixelSize: Style.current.primaryTextFontSize
|
||
lineHeightMode: Text.FixedHeight
|
||
lineHeight: 22
|
||
wrapMode: Text.Wrap
|
||
verticalAlignment: Text.AlignVCenter
|
||
}
|
||
|
||
component PasteButton: StatusButton {
|
||
id: pasteButton
|
||
borderColor: textColor
|
||
text: qsTr("Paste")
|
||
size: StatusButton.Size.Tiny
|
||
}
|
||
|
||
component ChatDetails: Control {
|
||
verticalPadding: 6
|
||
horizontalPadding: 4
|
||
|
||
contentItem: RowLayout {
|
||
StatusChatInfoButton {
|
||
id: communityInfoButton
|
||
Layout.alignment: Qt.AlignVCenter
|
||
title: community.name
|
||
subTitle: qsTr("%n member(s)", "", community.members.count || 0)
|
||
asset.name: community.image
|
||
asset.color: community.color
|
||
asset.isImage: true
|
||
type: StatusChatInfoButton.Type.OneToOneChat
|
||
hoverEnabled: false
|
||
visible: false
|
||
}
|
||
Item { Layout.fillWidth: true }
|
||
StatusBaseText {
|
||
id: detectionLabel
|
||
Layout.alignment: Qt.AlignVCenter
|
||
horizontalAlignment: Text.AlignRight
|
||
verticalAlignment: Text.AlignVCenter
|
||
font.pixelSize: Style.current.additionalTextSize
|
||
visible: !!text
|
||
}
|
||
}
|
||
|
||
states: [
|
||
State {
|
||
name: "matchingPrivateKey"
|
||
when: d.isPrivateKeyMatching
|
||
PropertyChanges { target: detectionLabel; text: qsTr("Private key is valid") }
|
||
PropertyChanges { target: detectionLabel; color: Theme.palette.successColor1 }
|
||
PropertyChanges { target: communityInfoButton; visible: true }
|
||
},
|
||
State {
|
||
name: "mismatchingPrivateKey"
|
||
when: !d.isPrivateKeyMatching && d.isPrivateKey && !d.privateKeyCheckInProgress
|
||
PropertyChanges { target: detectionLabel; text: qsTr("This is not the correct private key for %1").arg(root.community.name) }
|
||
PropertyChanges { target: detectionLabel; color: Theme.palette.dangerColor1 }
|
||
},
|
||
State {
|
||
name: "checking"
|
||
when: d.privateKeyCheckInProgress
|
||
PropertyChanges { target: detectionLabel; text: qsTr("Checking private key...") }
|
||
PropertyChanges { target: detectionLabel; color: Theme.palette.baseColor1 }
|
||
},
|
||
State {
|
||
name: "invalidPrivateKey"
|
||
when: !d.isPrivateKey && d.isPrivateKeyInserted
|
||
PropertyChanges { target: detectionLabel; text: qsTr("This is not a private key") }
|
||
PropertyChanges { target: detectionLabel; color: Theme.palette.dangerColor1 }
|
||
}
|
||
]
|
||
}
|
||
|
||
QtObject {
|
||
id: d
|
||
readonly property bool isPrivateKey: Utils.isPrivateKey(privateKeyTextArea.text)
|
||
readonly property bool isPrivateKeyMatching: d.requestedCommunityInfo ? d.requestedCommunityInfo.id === community.id : false
|
||
readonly property bool isPrivateKeyInserted: privateKeyTextArea.text.length > 0
|
||
|
||
property bool privateKeyCheckInProgress: false
|
||
property var requestedCommunityInfo: undefined
|
||
|
||
onIsPrivateKeyChanged: {
|
||
if(!isPrivateKey) {
|
||
requestedCommunityInfo = undefined
|
||
privateKeyCheckInProgress = false
|
||
return
|
||
}
|
||
|
||
privateKeyCheckInProgress = true
|
||
requestedCommunityInfo = undefined
|
||
requestCommunityInfo(privateKeyTextArea.text)
|
||
}
|
||
}
|
||
|
||
ColumnLayout {
|
||
id: mainLayout
|
||
anchors.fill: parent
|
||
spacing: 0
|
||
Paragraph {
|
||
Layout.preferredHeight: 22
|
||
Layout.bottomMargin: Style.current.halfPadding
|
||
text: qsTr("To move the %1 control node to this device: ").arg(root.community.name)
|
||
}
|
||
Paragraph {
|
||
text: qsTr("1. Stop using any other devices as the control node for this Community")
|
||
}
|
||
Paragraph {
|
||
text: qsTr("2. Paste the Community’s private key below:")
|
||
}
|
||
StatusBaseInput {
|
||
id: privateKeyTextArea
|
||
Layout.fillWidth: true
|
||
Layout.preferredHeight: 86
|
||
rightPadding: Style.current.padding
|
||
multiline: true
|
||
valid: d.isPrivateKey || !d.isPrivateKeyInserted
|
||
placeholderText: qsTr("e.g. %1").arg("0x0454f2231543ba02583e4c55e513a75092a4f2c86c04d0796b195e964656d6cd94b8237c64ef668eb0fe268387adc3fe699bce97190a631563c82b718c19cf1fb8")
|
||
rightComponent: PasteButton {
|
||
onClicked: {
|
||
privateKeyTextArea.edit.clear()
|
||
privateKeyTextArea.edit.paste()
|
||
}
|
||
}
|
||
}
|
||
ChatDetails {
|
||
Layout.topMargin: Style.current.halfPadding
|
||
Layout.fillWidth: true
|
||
Layout.minimumHeight: 46
|
||
}
|
||
Item {
|
||
Layout.fillHeight: true
|
||
Layout.minimumHeight: Style.current.xlPadding
|
||
}
|
||
ColumnLayout {
|
||
id: agreementLayout
|
||
Layout.fillWidth: true
|
||
Layout.fillHeight: true
|
||
|
||
spacing: mainLayout.spacing
|
||
|
||
visible: d.isPrivateKeyMatching
|
||
|
||
StatusDialogDivider {
|
||
Layout.fillWidth: true
|
||
}
|
||
Paragraph {
|
||
Layout.topMargin: Style.current.padding
|
||
text: qsTr("I acknowledge that...")
|
||
}
|
||
StatusCheckBox {
|
||
id: agreementCheckBox
|
||
Layout.fillWidth: true
|
||
font.pixelSize: Style.current.primaryTextFontSize
|
||
text: qsTr("I must keep this device online and running Status for the Community to function")
|
||
}
|
||
}
|
||
}
|
||
|
||
footer: StatusDialogFooter {
|
||
rightButtons: ObjectModel {
|
||
StatusButton {
|
||
text: qsTr("Make this device the control node for %1").arg(root.community.name)
|
||
enabled: d.isPrivateKeyMatching && agreementCheckBox.checked
|
||
onClicked: {
|
||
root.importControlNode(privateKeyTextArea.text)
|
||
root.close()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|