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()
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|