status-desktop/ui/app/AppLayouts/Profile/views/EnsDetailsView.qml

225 lines
7.7 KiB
QML
Raw Normal View History

2020-08-06 19:45:57 +00:00
import QtQuick 2.14
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.14
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1 as StatusQControls
import StatusQ.Components 0.1
import utils 1.0
import shared.status 1.0
import shared.popups 1.0
import shared.popups.send 1.0
import shared.stores.send 1.0
2020-08-06 19:45:57 +00:00
import AppLayouts.Profile.stores 1.0
2020-08-06 19:45:57 +00:00
Item {
id: root
property EnsUsernamesStore ensUsernamesStore
property ContactsStore contactsStore
required property TransactionStore transactionStore
2020-08-06 19:45:57 +00:00
property string username: ""
2023-01-11 16:10:13 +00:00
property string chainId: ""
2020-08-06 19:45:57 +00:00
property string walletAddress: "-"
property string key: "-"
2020-08-07 16:27:41 +00:00
signal backBtnClicked();
2023-01-11 16:10:13 +00:00
signal usernameReleased()
2020-08-07 16:27:41 +00:00
2022-12-06 21:12:09 +00:00
QtObject {
id: d
property double expirationTimestamp: 0
2022-12-06 21:12:09 +00:00
}
StatusBaseText {
2020-08-06 19:45:57 +00:00
id: sectionTitle
text: username
anchors.left: parent.left
anchors.leftMargin: 24
anchors.top: parent.top
anchors.topMargin: 24
font.weight: Font.Bold
font.pixelSize: 20
color: Theme.palette.directColor1
2020-08-06 19:45:57 +00:00
}
Component {
id: loadingImageComponent
StatusLoadingIndicator {}
2020-08-06 19:45:57 +00:00
}
Loader {
id: loadingImg
active: false
sourceComponent: loadingImageComponent
anchors.right: parent.right
anchors.rightMargin: Style.current.padding
anchors.top: parent.top
anchors.topMargin: Style.currentPadding
}
Connections {
target: root.ensUsernamesStore.ensUsernamesModule
function onDetailsObtained(ensName: string, address: string, pubkey: string, isStatus: bool, expirationTime: int) {
2022-07-18 08:34:11 +00:00
if(username != (isStatus ? ensName + ".stateofus.eth" : ensName))
return;
walletAddressLbl.subTitle = address;
keyLbl.subTitle = pubkey.substring(0, 20) + "..." + pubkey.substring(pubkey.length - 20);
walletAddressLbl.visible = true;
keyLbl.visible = true;
releaseBtn.visible = isStatus
2022-12-06 21:12:09 +00:00
removeButton.visible = true
releaseBtn.enabled = expirationTime > 0
&& (Date.now() / 1000) > expirationTime
&& root.ensUsernamesStore.preferredUsername !== username
d.expirationTimestamp = expirationTime * 1000
2020-08-06 19:45:57 +00:00
}
function onLoading(isLoading: bool) {
2020-08-06 19:45:57 +00:00
loadingImg.active = isLoading
2022-12-06 21:12:09 +00:00
if (!isLoading)
return;
2020-08-06 19:45:57 +00:00
walletAddressLbl.visible = false;
keyLbl.visible = false;
2021-08-09 22:23:52 +00:00
releaseBtn.visible = false;
2022-12-06 21:12:09 +00:00
removeButton.visible = false;
d.expirationTimestamp = 0;
2020-08-06 19:45:57 +00:00
}
}
StatusDescriptionListItem {
2020-08-06 19:45:57 +00:00
id: walletAddressLbl
title: qsTr("Wallet address")
2020-08-06 19:45:57 +00:00
visible: false
anchors.top: sectionTitle.bottom
anchors.topMargin: 24
asset.name: "copy"
tooltip.text: qsTr("Copied to clipboard!")
iconButton.onClicked: {
root.ensUsernamesStore.copyToClipboard(subTitle)
tooltip.visible = !tooltip.visible
}
2020-08-06 19:45:57 +00:00
}
StatusDescriptionListItem {
2020-08-06 19:45:57 +00:00
id: keyLbl
title: qsTr("Key")
2020-08-06 19:45:57 +00:00
visible: false
anchors.top: walletAddressLbl.bottom
anchors.topMargin: 24
asset.name: "copy"
tooltip.text: qsTr("Copied to clipboard!")
iconButton.onClicked: {
root.ensUsernamesStore.copyToClipboard(subTitle)
tooltip.visible = !tooltip.visible
}
2020-08-06 19:45:57 +00:00
}
2021-08-09 22:23:52 +00:00
Component {
id: transactionDialogComponent
SendModal {
id: releaseEnsModal
modalHeader: qsTr("Release your username")
interactive: false
store: root.transactionStore
preSelectedSendType: Constants.SendType.ENSRelease
preSelectedRecipient: root.ensUsernamesStore.getEnsRegisteredAddress()
preDefinedAmountToSend: LocaleUtils.numberToLocaleString(0)
preSelectedHoldingID: Constants.ethToken
preSelectedHoldingType: Constants.TokenType.ERC20
publicKey: root.contactsStore.myPublicKey
ensName: root.username
sendTransaction: function() {
if(bestRoutes.count === 1) {
let path = bestRoutes.firstItem()
let eip1559Enabled = path.gasFees.eip1559Enabled
let maxFeePerGas = path.gasFees.maxFeePerGasM
root.ensUsernamesStore.authenticateAndReleaseEns(
2023-01-11 16:10:13 +00:00
root.chainId,
root.username,
store.selectedSenderAccountAddress,
path.gasAmount,
eip1559Enabled ? "" : path.gasFees.gasPrice,
eip1559Enabled ? path.gasFees.maxPriorityFeePerGas : "",
eip1559Enabled ? maxFeePerGas: path.gasFees.gasPrice,
eip1559Enabled,
)
}
2021-08-09 22:23:52 +00:00
}
Connections {
target: root.ensUsernamesStore.ensUsernamesModule
function onTransactionWasSent(chainId: int, txHash: string, error: string) {
if (!!error) {
if (error.includes(Constants.walletSection.cancelledMessage)) {
return
}
releaseEnsModal.sendingError.text = error
return releaseEnsModal.sendingError.open()
}
usernameReleased()
let url = "%1/%2".arg(releaseEnsModal.store.getEtherscanLink(chainId)).arg(txHash)
Global.displayToastMessage(qsTr("Transaction pending..."),
qsTr("View on etherscan"),
"",
true,
Constants.ephemeralNotificationType.normal,
url)
releaseEnsModal.close()
}
2021-08-09 22:23:52 +00:00
}
}
}
2022-12-06 21:12:09 +00:00
RowLayout {
id: actionsLayout
2021-08-09 22:23:52 +00:00
anchors.top: keyLbl.bottom
anchors.topMargin: 24
anchors.left: parent.left
anchors.leftMargin: 24
2022-12-06 21:12:09 +00:00
StatusQControls.StatusButton {
id: removeButton
visible: false
type: StatusQControls.StatusBaseButton.Type.Danger
text: qsTr("Remove username")
onClicked: {
2023-01-11 16:10:13 +00:00
root.ensUsernamesStore.removeEnsUsername(root.chainId, root.username)
2022-12-06 21:12:09 +00:00
root.backBtnClicked()
}
}
StatusQControls.StatusButton {
id: releaseBtn
visible: false
enabled: false
text: qsTr("Release username")
onClicked: {
Global.openPopup(transactionDialogComponent)
}
2021-08-09 22:23:52 +00:00
}
}
Text {
visible: releaseBtn.visible && !releaseBtn.enabled
2022-12-06 21:12:09 +00:00
anchors.top: actionsLayout.bottom
2021-08-09 22:23:52 +00:00
anchors.topMargin: 2
anchors.left: parent.left
anchors.leftMargin: 24
2022-12-06 21:12:09 +00:00
text: {
const formattedDate = LocaleUtils.formatDate(d.expirationTimestamp, Locale.ShortFormat)
2022-12-06 21:12:09 +00:00
return qsTr("Username locked. You won't be able to release it until %1").arg(formattedDate)
}
2021-08-09 22:23:52 +00:00
color: Style.current.darkGrey
}
StatusQControls.StatusButton {
2020-08-06 19:45:57 +00:00
anchors.bottom: parent.bottom
anchors.bottomMargin: Style.current.padding
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("Back")
2020-08-07 16:27:41 +00:00
onClicked: backBtnClicked()
2020-08-06 19:45:57 +00:00
}
}