lez-programs/apps/amm/qml/components/wallet/CreateWalletDialog.qml
2026-06-30 11:59:27 -03:00

119 lines
3.9 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import Logos.Theme
import Logos.Controls
// Password-only wallet creation modal. Storage/config live at the canonical
// LEZ wallet home (backend.walletHome), with no path picking. Opened from the
// navbar "Connect" button.
Popup {
id: root
// Where the wallet will be stored, shown for transparency.
property string walletHome: ""
property string createError: ""
readonly property real viewportMargin: Theme.spacing.large
signal createWallet(string password)
modal: true
dim: true
padding: Theme.spacing.large
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
// Center on the full-window overlay rather than the small navbar control
// this popup is declared inside.
parent: Overlay.overlay
anchors.centerIn: parent
width: Math.min(380, Math.max(0, parent ? parent.width - root.viewportMargin * 2 : 380))
onOpened: {
passwordField.text = ""
confirmField.text = ""
root.createError = ""
passwordField.forceActiveFocus()
}
background: Rectangle {
color: Theme.palette.backgroundSecondary
radius: Theme.spacing.radiusXlarge
border.color: Theme.palette.backgroundElevated
}
contentItem: ColumnLayout {
// Pin to the popup's padded width so long text wraps and fillWidth
// children don't push the layout wider than the modal.
width: root.availableWidth
spacing: Theme.spacing.large
LogosText {
text: qsTr("Create your wallet")
font.pixelSize: Theme.typography.titleText
font.weight: Theme.typography.weightBold
color: Theme.palette.text
}
LogosText {
text: qsTr("Secure your wallet with a password. It will be stored on this device at %1.")
.arg(root.walletHome || qsTr("the default location"))
font.pixelSize: Theme.typography.secondaryText
color: Theme.palette.textSecondary
wrapMode: Text.WordWrap
Layout.fillWidth: true
Layout.topMargin: -Theme.spacing.small
}
LogosTextField {
id: passwordField
Layout.fillWidth: true
placeholderText: qsTr("Password")
echoMode: TextInput.Password
Keys.onReturnPressed: createButton.tryCreate()
}
LogosTextField {
id: confirmField
Layout.fillWidth: true
placeholderText: qsTr("Confirm password")
echoMode: TextInput.Password
Keys.onReturnPressed: createButton.tryCreate()
}
LogosText {
Layout.fillWidth: true
font.pixelSize: Theme.typography.secondaryText
color: Theme.palette.error
wrapMode: Text.WordWrap
visible: text.length > 0
text: root.createError
}
RowLayout {
Layout.topMargin: Theme.spacing.small
Layout.fillWidth: true
spacing: Theme.spacing.medium
LogosButton {
text: qsTr("Cancel")
Layout.fillWidth: true
onClicked: root.close()
}
LogosButton {
id: createButton
Layout.fillWidth: true
text: qsTr("Create Wallet")
function tryCreate() {
if (passwordField.text.length === 0) {
root.createError = qsTr("Password cannot be empty.")
} else if (passwordField.text !== confirmField.text) {
root.createError = qsTr("Passwords do not match.")
} else {
root.createError = ""
root.createWallet(passwordField.text)
}
}
onClicked: tryCreate()
}
}
}
}