status-desktop/ui/imports/shared/popups/ImportCommunityPopup.qml
Pascal Precht b510b33730 feat(communities): allow community import via public key
Status allows for importing communities via their private keys.

There's a requested feature that users should be able to import a community via
its public key as well.

This will behave differently as private keys won't give users ownership
of the communities. When importing via a (compressed) public key, Status
will try to fetch information about the community from the network. If it
finds such information, it'll load it into the app and create
a communitiy view from which users can then request access.

If it can't find a community or community information in the network,
the user will get a dedicated error message.

This commit also refactors the `ImportCommunityPopup` such that it uses
`StatusDialog` and updates the copy accordingly since importing via
public key is now possible as well.

Closes #8339
2022-12-07 14:18:08 +01:00

136 lines
4.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
width: 640
title: qsTr("Import Community")
QtObject {
id: d
property string importErrorMessage
readonly property string inputErrorMessage: isInputValid ? "" : qsTr("Invalid key")
readonly property string errorMessage: importErrorMessage || inputErrorMessage
readonly property bool isPrivateKey: Utils.isPrivateKey(keyInput.text)
readonly property bool isPublicKey: Utils.isChatKey(keyInput.text)
readonly property bool isInputValid: isPrivateKey || isPublicKey
}
footer: StatusDialogFooter {
rightButtons: ObjectModel {
StatusFlatButton {
text: qsTr("Cancel")
onClicked: root.reject()
}
StatusButton {
id: importButton
enabled: d.isInputValid
text: d.isPrivateKey ? qsTr("Make this an Owner Node") : qsTr("Import")
onClicked: {
let communityKey = keyInput.text.trim();
if (d.isPrivateKey) {
if (!communityKey.startsWith("0x")) {
communityKey = "0x" + communityKey;
}
root.store.importCommunity(communityKey);
root.close();
}
if (d.isPublicKey) {
importButton.loading = true
root.store.requestCommunityInfo(communityKey)
}
}
}
}
}
ColumnLayout {
anchors.fill: parent
spacing: Style.current.padding
StatusBaseText {
id: infoText1
Layout.fillWidth: true
text: qsTr("Enter the public key of the community you wish to access, or enter the private key of a community you own. Remember to always keep any private key safe and never share a private key with anyone else.")
wrapMode: Text.WordWrap
font.pixelSize: 13
color: Theme.palette.baseColor1
}
StatusBaseText {
id: inputLabel
text: qsTr("Community key")
color: Theme.palette.directColor1
font.pixelSize: 15
}
StatusTextArea {
id: keyInput
placeholderText: "0x0..."
height: 110
Layout.fillWidth: true
onTextChanged: d.importErrorMessage = ""
}
StatusBaseText {
id: detectionLabel
Layout.fillWidth: true
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
font.pixelSize: 13
visible: keyInput.text.trim() !== ""
text: {
if (d.errorMessage !== "") {
return d.errorMessage
}
if (d.isPrivateKey) {
return qsTr("Private key detected")
}
if (d.isPublicKey) {
return qsTr("Public key detected")
}
}
color: d.errorMessage === "" ? Theme.palette.successColor1 : Theme.palette.dangerColor1
}
}
Connections {
target: root.store
function onImportingCommunityStateChanged(communityId, state, errorMsg) {
let communityKey = keyInput.text.trim();
if (d.isPublicKey) {
let currentCommunityKey = Utils.isCompressedPubKey(communityKey) ?
Utils.changeCommunityKeyCompression(communityKey) :
communityKey
if (communityId == currentCommunityKey) {
importButton.loading = false
if (state === Constants.communityImported && root.opened) {
root.close()
return
}
}
if (state === Constants.communityImportingError) {
d.importErrorMessage = errorMsg
importButton.loading = false
}
}
}
}
}