diff --git a/storybook/pages/StatusTxProgressBarPage.qml b/storybook/pages/StatusTxProgressBarPage.qml deleted file mode 100644 index 2e249cf0f1..0000000000 --- a/storybook/pages/StatusTxProgressBarPage.qml +++ /dev/null @@ -1,133 +0,0 @@ -import QtQuick 2.14 -import QtQuick.Controls 2.14 - -import utils 1.0 - -import AppLayouts.Wallet.controls 1.0 -import AppLayouts.Wallet.panels 1.0 -import StatusQ.Controls 0.1 -import StatusQ.Core.Theme 0.1 -import Storybook 1.0 - -import Models 1.0 - -SplitView { - id: root - - Logs { id: logs } - - orientation: Qt.Vertical - - QtObject { - id: d - - property var dummyTx: ({ - id: 0xb501e3042105c382a498819b07aba58de3422984e1150655c1583bd1aae144ef, - txType: "erc20", - address: 0x9d41ac74e7d1f981e98f4ec0d631cde0857a2b9c, - blockNumber: 0x7b7935, - blockHash: 0, - timestamp: 1670419848, - nonce: 0x36, - txStatus: 0x1, - chainId: 5, - txHash: 0x82de33a9e81f7c06ea03ad742bc666c4eacb7ec771bac4544ef70a12b2c46d04, - symbol: "ETH", - }) - } - - Item { - SplitView.fillWidth: true - SplitView.fillHeight: true - - Column { - anchors.centerIn: parent - spacing: 100 - StatusTxProgressBar { - id: progressBar - anchors.horizontalCenter: parent.horizontalCenter - width: 500 - error: failureCheckBox.checked - networkLayer: mainnetCheckbox.checked ? 1 : 2 - confirmations: confirmationsSlider.value - duration: durationSlider.to - progress: durationSlider.value - chainName: isLayer1 ? "Mainnet" : "Optimism" - } - - Rectangle { - width: root.width - height: 200 - border.width: 2 - WalletTxProgressBlock { - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: parent.top - anchors.topMargin: 20 - width: 500 - error: failureCheckBox.checked - inNetworkConfirmations: confirmationsSlider.value - outNetworkConfirmations: confirmationsSlider.value - inChainName: progressBar.isLayer1 ? "Mainnet" : "Optimism" - outChainName: inChainName - inNetworkTimestamp: 1670419847 - outNetworkTimestamp: 1670419848 - } - } - } - } - - LogsAndControlsPanel { - id: logsAndControlsPanel - - SplitView.minimumHeight: 100 - SplitView.preferredHeight: 250 - - logsView.logText: logs.logText - Column { - CheckBox { - id: mainnetCheckbox - text: "Mainnet" - checked: true - } - CheckBox { - id: failureCheckBox - text: "Failed" - } - Slider { - id: confirmationsSlider - width: 600 - value: 0 - from: 0 - to: 1000 - stepSize: 1 - Text { - anchors.left: parent.right - anchors.verticalCenter: parent.verticalCenter - text: "Confirmations = " + confirmationsSlider.value - } - } - TextField { - id: duration - placeholderText: "Duration for finalisation" - text: "7" - visible: !mainnetCheckbox.checked && !failureCheckBox.checked - } - Slider { - id: durationSlider - width: 600 - value: 0 - from: 0 - to: Number(duration.text)*24 - stepSize: 1 - Text { - anchors.left: parent.right - anchors.verticalCenter: parent.verticalCenter - text: "Finalisation = " + durationSlider.value - } - visible: !mainnetCheckbox.checked && !failureCheckBox.checked - } - } - } -} - -// category: Wallet diff --git a/storybook/pages/TransactionAddressPage.qml b/storybook/pages/TransactionAddressPage.qml deleted file mode 100644 index 20ce548fc8..0000000000 --- a/storybook/pages/TransactionAddressPage.qml +++ /dev/null @@ -1,213 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.15 - -import Storybook 1.0 - -import StatusQ.Core.Theme 0.1 - -import shared.controls 1.0 -import utils 1.0 - -SplitView { - id: root - - orientation: Qt.Vertical - - property bool globalUtilsReady: false - property bool mainModuleReady: false - - Item { - SplitView.fillWidth: true - SplitView.fillHeight: true - - Rectangle { - anchors.fill: loader - anchors.margins: -1 - color: "transparent" - border.width: 1 - border.color: "#20000000" - } - - // globalUtilsInst mock - QtObject { - function getCompressedPk(publicKey) { return "zx3sh" + publicKey } - function getColorHashAsJson(publicKey) { - return JSON.stringify([{"segmentLength":1,"colorId":12},{"segmentLength":5,"colorId":18}, - {"segmentLength":3,"colorId":25},{"segmentLength":3,"colorId":23}, - {"segmentLength":1,"colorId":10},{"segmentLength":3,"colorId":26}, - {"segmentLength":2,"colorId":30},{"segmentLength":1,"colorId":18}, - {"segmentLength":4,"colorId":28},{"segmentLength":1,"colorId":17}, - {"segmentLength":2,"colorId":2}]) - } - function isCompressedPubKey(publicKey) { return true } - function getColorId(publicKey) { return Math.floor(Math.random() * 10) } - - Component.onCompleted: { - Utils.globalUtilsInst = this - root.globalUtilsReady = true - } - Component.onDestruction: { - root.globalUtilsReady = false - Utils.globalUtilsInst = {} - } - } - - // mainModuleInst mock - QtObject { - function getContactDetailsAsJson(publicKey, getVerification) { - return JSON.stringify({ - displayName: "ArianaP", - displayIcon: "", - publicKey: publicKey, - name: "", - alias: "", - localNickname: "", - isContact: d.isContact - }) - } - function isEnsVerified(publicKey) { return false } - - Component.onCompleted: { - Utils.mainModuleInst = this - root.mainModuleReady = true - } - Component.onDestruction: { - root.mainModuleReady = false - Utils.mainModuleInst = {} - } - } - - QtObject { - id: d - property string addressName: "Ariana Pearlona" - property bool isContact: true - property bool isWallet: false - property bool isSavedAccount: false - readonly property string displayAddress: "0x29D7d1dd5B6f9C864d9db560D72a247c178aE86B" - } - - QtObject { - id: contactsStoreMockup - readonly property var myContactsModel: QtObject { - signal itemChanged(address: string) - } - - function getContactPublicKeyByAddress(address) { - return d.isContact ? "zQ3shWU7xpM5YoG19KP5JDRiSs1AdWtjpnrWEerMkxfQnYo7x" : "" - } - } - - QtObject { - id: rootStoreMockup - - readonly property var accounts: QtObject { - signal itemChanged(address: string) - } - - readonly property var savedAddresses: QtObject { - readonly property var sourceModel: QtObject { - signal itemChanged(address: string) - } - } - - function getNameForSavedWalletAddress(address) { - return d.isSavedAccount ? d.addressName : "" - } - function getEmojiForWalletAddress(address) { - return '??' - } - function getColorForWalletAddress(address) { - return "blue" - } - function getNameForWalletAddress(address) { - return d.isWallet ? d.addressName : "" - } - } - - Loader { - id: loader - anchors.centerIn: parent - width: 400 - active: root.globalUtilsReady && root.mainModuleReady - sourceComponent: TransactionAddress { - width: parent.width - address: d.displayAddress - rootStore: rootStoreMockup - contactsStore: contactsStoreMockup - } - } - } - - LogsAndControlsPanel { - SplitView.minimumHeight: 100 - SplitView.preferredHeight: 150 - - SplitView.fillWidth: true - - ColumnLayout { - spacing: 5 - Label { - text: "Account type" - } - RadioButton { - text: "contact" - checked: d.isContact - onClicked: { - d.isContact = true - d.isWallet = false - d.isSavedAccount = false - rootStoreMockup.accounts.itemChanged(d.displayAddress) - rootStoreMockup.savedAddresses.sourceModel.itemChanged(d.displayAddress) - contactsStoreMockup.myContactsModel.itemChanged(d.displayAddress) - } - } - RadioButton { - text: "wallet" - checked: d.isWallet - onClicked: { - d.isContact = false - d.isWallet = true - d.isSavedAccount = false - rootStoreMockup.accounts.itemChanged(d.displayAddress) - rootStoreMockup.savedAddresses.sourceModel.itemChanged(d.displayAddress) - contactsStoreMockup.myContactsModel.itemChanged(d.displayAddress) - } - } - RadioButton { - text: "saved address" - checked: d.isSavedAccount - onClicked: { - d.isContact = false - d.isWallet = false - d.isSavedAccount = true - rootStoreMockup.accounts.itemChanged(d.displayAddress) - rootStoreMockup.savedAddresses.sourceModel.itemChanged(d.displayAddress) - contactsStoreMockup.myContactsModel.itemChanged(d.displayAddress) - } - } - RadioButton { - text: "unkown" - onClicked: { - d.isContact = false - d.isWallet = false - d.isSavedAccount = false - rootStoreMockup.accounts.itemChanged(d.displayAddress) - rootStoreMockup.savedAddresses.sourceModel.itemChanged(d.displayAddress) - contactsStoreMockup.myContactsModel.itemChanged(d.displayAddress) - } - } - Label { - text: "Name:" - } - RowLayout { - TextField { - text: d.addressName - onTextChanged: d.addressName = text - } - } - } - } -} - -// category: Wallet diff --git a/storybook/pages/TransactionAddressTilePage.qml b/storybook/pages/TransactionAddressTilePage.qml deleted file mode 100644 index a4178ac5d3..0000000000 --- a/storybook/pages/TransactionAddressTilePage.qml +++ /dev/null @@ -1,160 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.15 - -import Storybook 1.0 - -import StatusQ.Core.Theme 0.1 - -import shared.controls 1.0 -import utils 1.0 - -import AppLayouts.Profile.stores 1.0 - -SplitView { - id: root - - orientation: Qt.Vertical - - property bool globalUtilsReady: false - property bool mainModuleReady: false - - Item { - SplitView.fillWidth: true - SplitView.fillHeight: true - - // globalUtilsInst mock - QtObject { - function getCompressedPk(publicKey) { return "zx3sh" + publicKey } - function getColorHashAsJson(publicKey) { - return JSON.stringify([{"segmentLength":1,"colorId":12},{"segmentLength":5,"colorId":18}, - {"segmentLength":3,"colorId":25},{"segmentLength":3,"colorId":23}, - {"segmentLength":1,"colorId":10},{"segmentLength":3,"colorId":26}, - {"segmentLength":2,"colorId":30},{"segmentLength":1,"colorId":18}, - {"segmentLength":4,"colorId":28},{"segmentLength":1,"colorId":17}, - {"segmentLength":2,"colorId":2}]) - } - function isCompressedPubKey(publicKey) { return true } - function getColorId(publicKey) { return Math.floor(Math.random() * 10) } - - Component.onCompleted: { - Utils.globalUtilsInst = this - root.globalUtilsReady = true - } - Component.onDestruction: { - root.globalUtilsReady = false - Utils.globalUtilsInst = {} - } - } - - // mainModuleInst mock - QtObject { - function getContactDetailsAsJson(publicKey, getVerification) { - return JSON.stringify({ - displayName: "ArianaP", - displayIcon: "", - publicKey: publicKey, - name: "", - alias: "", - localNickname: "", - isContact: true - }) - } - function isEnsVerified(publicKey) { return false } - - Component.onCompleted: { - Utils.mainModuleInst = this - root.mainModuleReady = true - } - Component.onDestruction: { - root.mainModuleReady = false - Utils.mainModuleInst = {} - } - } - - ContactsStore { - id: contactsStoreMockup - readonly property var myContactsModel: QtObject { - signal itemChanged(address: string) - } - - function getContactPublicKeyByAddress(address) { - return address.includes("0x29D7d1dd5B6f9C864d9db560D72a247c178aE86C") ? "zQ3shWU7xpM5YoG19KP5JDRiSs1AdWtjpnrWEerMkxfQnYo7x" : "" - } - } - - QtObject { - id: mockupRootStore - - function getNameForAddress(address) { - const nameList = [ 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve','Frank', 'Grace', 'Hank', 'Iris', 'Jack' ]; - const randomIndex = Math.floor(Math.random() * nameList.length); - return nameList[randomIndex]; - } - - function getNameForSavedWalletAddress(address) { - if (address.includes("0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc35")) { - return "" - } - - return getNameForAddress(address) - } - function getEmojiForWalletAddress(address) { - return '??' - } - function getColorForWalletAddress(address) { - return "blue" - } - function getNameForWalletAddress(address) { - if (address.includes("0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc35") || address.includes("0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc36")) { - return "" - } - return getNameForAddress(address) - } - } - - Loader { - id: loader - anchors.centerIn: parent - width: 500 - active: root.globalUtilsReady && root.mainModuleReady - sourceComponent: Column { - id: content - spacing: 0 - TransactionAddressTile { - title: "From" - width: parent.width - rootStore: mockupRootStore - contactsStore: contactsStoreMockup - addresses: [ - "0x29D7d1dd5B6f9C864d9db560D72a247c178aE86B" - ] - } - TransactionAddressTile { - title: "To" - width: parent.width - rootStore: mockupRootStore - contactsStore: contactsStoreMockup - addresses: [ - "0x29D7d1dd5B6f9C864d9db560D72a247c178aE86C", - "eth:arb1:oeth:0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc35", - "0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc35", - "eth:oeth:arb1:0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc35", - "eth:oeth:arb1:0x29D7d1dd5B6f9C864d9db560D72a247c178aE86B", - "0x29D7d1dd5B6f9C864d9db560D72a247c178aE86B", - "eth:oeth:arb1:0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc36" - ] - } - } - } - } - - LogsAndControlsPanel { - SplitView.minimumHeight: 100 - SplitView.preferredHeight: 150 - - SplitView.fillWidth: true - } -} - -// category: Wallet diff --git a/ui/app/AppLayouts/Wallet/panels/WalletNftPreview.qml b/ui/app/AppLayouts/Wallet/panels/WalletNftPreview.qml deleted file mode 100644 index 5dd3ba7ca7..0000000000 --- a/ui/app/AppLayouts/Wallet/panels/WalletNftPreview.qml +++ /dev/null @@ -1,116 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtGraphicalEffects 1.15 - -import StatusQ.Core.Theme 0.1 -import StatusQ.Core 0.1 -import StatusQ.Controls 0.1 -import StatusQ.Components 0.1 - -import shared.controls 1.0 -import utils 1.0 - -ColumnLayout { - id: root - - property string nftName - property string nftUrl - property string tokenId - property string tokenAddress - property bool strikethrough: false - property bool areTestNetworksEnabled: false - - spacing: Theme.padding - - StatusBaseText { - Layout.fillWidth: true - font.pixelSize: 15 - color: Theme.palette.directColor5 - text: qsTr("Preview") - elide: Text.ElideRight - } - - Rectangle { - radius: 8 - Layout.fillWidth: true - Layout.preferredHeight: nftPreviewColumn.height + Theme.bigPadding - color: nftPreviewSensor.hovered ? Theme.palette.baseColor2 : "transparent" - border.width: 1 - border.color: Theme.palette.separator - - HoverHandler { - id: nftPreviewSensor - target: parent - } - - Column { - // NOTE Using Column instead of Layout to handle image fill mode properly - id: nftPreviewColumn - spacing: Theme.padding - anchors { - left: parent.left - top: parent.top - right: parent.right - margins: Theme.bigPadding / 2 - } - height: childrenRect.height - - StatusRoundedMedia { - id: nftPreviewImage - width: parent.width - height: width - mediaUrl: root.nftUrl - mediaType: "image" - radius: 8 - } - - RowLayout { - width: parent.width - spacing: Theme.smallPadding - ColumnLayout { - Layout.fillWidth: true - Layout.rightMargin: button.visible ? 0 : button.width + parent.spacing - Layout.topMargin: Theme.smallPadding - Layout.alignment: Qt.AlignLeft - spacing: 4 - StatusBaseText { - Layout.fillWidth: true - font.pixelSize: 15 - font.strikeout: root.strikethrough - text: root.nftName - visible: !!text - elide: Text.ElideRight - } - - StatusBaseText { - Layout.fillWidth: true - font.pixelSize: 15 - color: Theme.palette.directColor5 - text: root.tokenId - visible: !!text - elide: Text.ElideRight - } - } - - StatusRoundButton { - id: button - implicitWidth: 32 - implicitHeight: 32 - Layout.alignment: Qt.AlignRight | Qt.AlignTop - icon.color: hovered ? Theme.palette.directColor1 : Theme.palette.baseColor1 - icon.name: "external" - type: StatusRoundButton.Type.Quinary - radius: 8 - visible: nftPreviewSensor.hovered && !!root.tokenId && !!root.tokenAddress - onClicked: { - let link = Constants.networkExplorerLinks.etherscan - if (areTestNetworksEnabled) { - link = Constants.networkExplorerLinks.sepoliaEtherscan - } - Global.openLink("%1/nft/%2/%3".arg(link).arg(root.tokenAddress).arg(root.tokenId)) - } - } - } - } - } -} diff --git a/ui/app/AppLayouts/Wallet/panels/WalletTxProgressBlock.qml b/ui/app/AppLayouts/Wallet/panels/WalletTxProgressBlock.qml deleted file mode 100644 index d56587ce4c..0000000000 --- a/ui/app/AppLayouts/Wallet/panels/WalletTxProgressBlock.qml +++ /dev/null @@ -1,116 +0,0 @@ -import QtQuick 2.13 -import QtQuick.Layouts 1.13 - -import StatusQ.Core 0.1 -import StatusQ.Core.Theme 0.1 - -import utils 1.0 -import shared.panels 1.0 - -import "../controls" - -ColumnLayout { - id: root - - property bool error: false - property bool pending: false - - property int outNetworkLayer: 0 - property int inNetworkLayer: 0 - - property double outNetworkTimestamp: 0 - property double inNetworkTimestamp: 0 - - property string outChainName - property string inChainName - - property int outNetworkConfirmations: 0 - property int inNetworkConfirmations: 0 - - spacing: 32 - - StatusTxProgressBar { - id: progressBarOut - Layout.topMargin: 8 - Layout.fillWidth: true - error: root.error - networkLayer: root.outNetworkLayer - confirmations: root.outNetworkConfirmations - timestamp: root.outNetworkTimestamp - chainName: root.outChainName - } - - TextColumn { - visible: progressBarOut.isValid && progressBarOut.error - text: qsTr("Failed on %1").arg(progressBarOut.chainName) - timestamp: progressBarOut.timestamp - } - - StatusTxProgressBar { - id: progressBarIn - Layout.topMargin: 8 - Layout.fillWidth: true - error: root.error - networkLayer: root.inNetworkLayer - confirmations: root.inNetworkConfirmations - timestamp: root.inNetworkTimestamp - chainName: root.inChainName - } - - TextColumn { - visible: progressBarOut.isValid && progressBarOut.confirmed - text: qsTr("Confirmed on %1").arg(progressBarOut.chainName) - timestamp: progressBarOut.confirmationTimeStamp - } - - TextColumn { - visible: progressBarIn.isValid && progressBarIn.confirmed - text: qsTr("Confirmed on %1").arg(progressBarIn.chainName) - timestamp: progressBarIn.confirmationTimeStamp - } - - TextColumn { - visible: progressBarOut.isValid && progressBarOut.finalized - text: qsTr("Finalised on %1").arg(progressBarOut.chainName) - timestamp: progressBarOut.finalisationTimeStamp - } - - TextColumn { - visible: progressBarIn.isValid && progressBarIn.finalized - text: qsTr("Finalised on %1").arg(progressBarIn.chainName) - timestamp: progressBarIn.finalisationTimeStamp - } - - TextColumn { - visible: progressBarIn.isValid && progressBarIn.error - text: qsTr("Failed on %1").arg(progressBarIn.chainName) - timestamp: progressBarIn.timestamp - } - - component TextColumn: Column { - id: textColumn - - property string text - property int timestamp - - spacing: 4 - StatusBaseText { - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.pixelSize: 13 - color: Theme.palette.baseColor1 - lineHeight: 18 - lineHeightMode: Text.FixedHeight - text: textColumn.text - } - StatusBaseText { - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.pixelSize: 13 - color: Theme.palette.directColor1 - lineHeight: 18 - lineHeightMode: Text.FixedHeight - text: textColumn.timestamp > 0 ? LocaleUtils.formatDateTime(textColumn.timestamp * 1000, Locale.LongFormat) : "" - } - } -} diff --git a/ui/app/AppLayouts/Wallet/panels/qmldir b/ui/app/AppLayouts/Wallet/panels/qmldir index a730350ed2..7ca46bedf6 100644 --- a/ui/app/AppLayouts/Wallet/panels/qmldir +++ b/ui/app/AppLayouts/Wallet/panels/qmldir @@ -12,5 +12,3 @@ SignInfoBox 1.0 SignInfoBox.qml SwapInputPanel 1.0 SwapInputPanel.qml TokenSelectorPanel 1.0 TokenSelectorPanel.qml WalletHeader 1.0 WalletHeader.qml -WalletNftPreview 1.0 WalletNftPreview.qml -WalletTxProgressBlock 1.0 WalletTxProgressBlock.qml diff --git a/ui/app/AppLayouts/Wallet/popups/TransactionAddressMenu.qml b/ui/app/AppLayouts/Wallet/popups/TransactionAddressMenu.qml deleted file mode 100644 index 6bebdd6731..0000000000 --- a/ui/app/AppLayouts/Wallet/popups/TransactionAddressMenu.qml +++ /dev/null @@ -1,354 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtQuick.Controls 2.15 -import QtQuick.Window 2.15 - -import StatusQ 0.1 -import StatusQ.Components 0.1 -import StatusQ.Core.Theme 0.1 -import StatusQ.Core 0.1 -import StatusQ.Controls 0.1 -import StatusQ.Popups 0.1 - -import shared.controls 1.0 -import utils 1.0 -import shared.stores 1.0 - -import "../stores" as WalletStores - -import AppLayouts.Profile.stores 1.0 as ProfileStores - -//////////////////////////////////////////////////////////////////////////////// -// NOTE: -// -// The address should be marked as shown (calling `mainModule.addressWasShown(address)`) if the user interacts with -// actions in the menu that reveals the address. -// -// That call is not added now, just because the only place where this menu is used is in the transaction details view -// and the address will be already marked as shown when the user opens the transaction details view. -// -// This note here is just to remember that if this menu is used in other places, the address should be marked as shown. -//////////////////////////////////////////////////////////////////////////////// - -StatusMenu { - id: root - - property ProfileStores.ContactsStore contactsStore - property NetworkConnectionStore networkConnectionStore - property bool areTestNetworksEnabled: false - - signal openSendModal(address: string) - - enum AddressType { - Address, - Sender, - Receiver, - Tx, - InputData, - Contract - } - - QtObject { - id: d - - property string selectedAddress: "" - property string cleanSelectedAddress: d.selectedAddress.split(":").pop() - - property string addressName: "" - property string addressEns: "" - property string colorId: "" - - property string contractName: "" - - property int addressType: TransactionAddressMenu.AddressType.Address - - readonly property QtObject exp: Constants.networkExplorerLinks - readonly property QtObject chains: Constants.networkShortChainNames - readonly property bool isAddress: d.addressType !== TransactionAddressMenu.Tx - - function getViewText(target) { - switch(d.addressType) { - case TransactionAddressMenu.AddressType.Contract: - if (d.contractName.length > 0) - return qsTr("View %1 contract address on %2").arg(d.contractName).arg(target) - return qsTr("View contract address on %1").arg(target) - case TransactionAddressMenu.AddressType.InputData: - return qsTr("View input data on %1").arg(target) - case TransactionAddressMenu.AddressType.Tx: - return qsTr("View transaction on %1").arg(target) - case TransactionAddressMenu.AddressType.Sender: - return qsTr("View sender address on %1").arg(target) - case TransactionAddressMenu.AddressType.Receiver: - return qsTr("View receiver address on %1").arg(target) - default: - return qsTr("View address on %1").arg(target) - } - } - - function refreshShowOnActionsVisiblity(shortChainNameList) { - for (let i = 0 ; i < shortChainNameList.length ; i++) { - switch(shortChainNameList[i].toLowerCase()) { - case d.chains.arbitrum: - showOnArbiscanAction.enabled = true - break - case d.chains.optimism: - showOnOptimismAction.enabled = true - break - default: - showOnEtherscanAction.enabled = true - break - } - } - } - - function openMenu(delegate) { - const x = delegate.width - 40 - const y = delegate.height / 2 + 20 - root.popup(delegate, x, y) - } - - readonly property TextMetrics contentMetrics: TextMetrics { - id: contentMetrics - font.pixelSize: root.fontSettings.pixelSize - font.family: Theme.baseFont.name - text: { - // Getting longest possible text - if (showOnEtherscanAction.enabled) { - return showOnEtherscanAction.text - } else if (showOnArbiscanAction.enabled) { - return showOnArbiscanAction.text - } - return showOnOptimismAction.text - } - } - } - - function openSenderMenu(delegate, address, chainShortNameList = []) { - d.addressType = TransactionAddressMenu.AddressType.Sender - openEthAddressMenu(delegate, address, chainShortNameList) - } - - function openReceiverMenu(delegate, address, chainShortNameList = []) { - d.addressType = TransactionAddressMenu.AddressType.Receiver - openEthAddressMenu(delegate, address, chainShortNameList) - } - - function openEthAddressMenu(delegate, address, chainShortNameList = []) { - d.selectedAddress = address - - address = address.toLowerCase() - const contactPubKey = "" // TODO retrive contact public key or contact data directly from address - let contactData = Utils.getContactDetailsAsJson(contactPubKey) - let isWalletAccount = false - const isContact = contactData.isContact - if (isContact) { - d.addressName = contactData.name - } else { - // Revisit here after this issue (resolving source for preferred chains...): - // https://github.com/status-im/status-desktop/issues/13109 - d.addressName = WalletStores.RootStore.getNameForWalletAddress(address) - isWalletAccount = d.addressName.length > 0 - if (!isWalletAccount) { - let savedAddress = WalletStores.RootStore.getSavedAddress(address) - d.addressName = savedAddress.name - d.addressEns = savedAddress.ens - d.colorId = savedAddress.colorId - } - } - - showOnEtherscanAction.enabled = true - showOnArbiscanAction.enabled = address.includes(d.chains.arbitrum + ":") - showOnOptimismAction.enabled = address.includes(d.chains.optimism + ":") - d.refreshShowOnActionsVisiblity(chainShortNameList) - saveAddressAction.enabled = d.addressName.length === 0 - editAddressAction.enabled = !isWalletAccount && !isContact && d.addressName.length > 0 - - if (root.networkConnectionStore.sendBuyBridgeEnabled) - sendToAddressAction.enabled = true - - showQrAction.enabled = true - - d.openMenu(delegate) - } - - function openTxMenu(delegate, address, chainShortNameList=[]) { - d.addressType = TransactionAddressMenu.AddressType.Tx - d.selectedAddress = address - d.refreshShowOnActionsVisiblity(chainShortNameList) - d.openMenu(delegate) - } - - function openContractMenu(delegate, address, chainShortNameList=[], name="") { - d.addressType = TransactionAddressMenu.AddressType.Contract - d.contractName = name - d.selectedAddress = address - d.refreshShowOnActionsVisiblity(chainShortNameList) - d.openMenu(delegate) - } - - function openInputDataMenu(delegate, address) { - d.addressType = TransactionAddressMenu.AddressType.InputData - d.selectedAddress = address - d.openMenu(delegate) - } - - onClosed: { - d.addressType = TransactionAddressMenu.AddressType.Address - d.contractName = "" - - showOnEtherscanAction.enabled = false - showOnArbiscanAction.enabled = false - showOnOptimismAction.enabled = false - showQrAction.enabled = false - saveAddressAction.enabled = false - editAddressAction.enabled = false - sendToAddressAction.enabled = false - } - - // Additional offset for menu icon - contentWidth: contentMetrics.width + 50 - hideDisabledItems: true - - StatusAction { - id: showOnEtherscanAction - enabled: false - text: d.getViewText(qsTr("Etherscan")) - icon.name: "link" - onTriggered: { - let url = Utils.getEtherscanUrl(d.chains.mainnet, root.areTestNetworksEnabled, d.cleanSelectedAddress, d.isAddress) - Global.openLink(url) - } - } - StatusAction { - id: showOnArbiscanAction - enabled: false - text: d.getViewText(qsTr("Arbiscan")) - icon.name: "link" - onTriggered: { - let url = Utils.getEtherscanUrl(d.chains.arbitrum, root.areTestNetworksEnabled, d.cleanSelectedAddress, d.isAddress) - Global.openLink(url) - } - } - StatusAction { - id: showOnOptimismAction - enabled: false - text: d.getViewText(qsTr("Optimism Explorer")) - icon.name: "link" - onTriggered: { - let url = Utils.getEtherscanUrl(d.chains.optimism, root.areTestNetworksEnabled, d.cleanSelectedAddress, d.isAddress) - Global.openLink(url) - } - } - StatusSuccessAction { - id: copyAddressAction - successText: { - switch(d.addressType) { - case TransactionAddressMenu.AddressType.Contract: - return qsTr("Contract address copied") - case TransactionAddressMenu.AddressType.InputData: - return qsTr("Input data copied") - case TransactionAddressMenu.AddressType.Tx: - return qsTr("Tx hash copied") - case TransactionAddressMenu.AddressType.Sender: - return qsTr("Sender address copied") - case TransactionAddressMenu.AddressType.Receiver: - return qsTr("Receiver address copied") - default: - return qsTr("Address copied") - } - } - text: { - switch(d.addressType) { - case TransactionAddressMenu.AddressType.Contract: - return qsTr("Copy contract address") - case TransactionAddressMenu.AddressType.InputData: - return qsTr("Copy input data") - case TransactionAddressMenu.AddressType.Tx: - return qsTr("Copy Tx hash") - case TransactionAddressMenu.AddressType.Sender: - return qsTr("Copy sender address") - case TransactionAddressMenu.AddressType.Receiver: - return qsTr("Copy receiver address") - default: - return qsTr("Copy address") - } - } - icon.name: "copy" - onTriggered: ClipboardUtils.setText(d.selectedAddress) - } - StatusAction { - id: showQrAction - enabled: false - text: { - switch(d.addressType) { - case TransactionAddressMenu.AddressType.Sender: - return qsTr("Show sender address QR") - case TransactionAddressMenu.AddressType.Receiver: - return qsTr("Show receiver address QR") - default: - return qsTr("Show address QR") - } - } - icon.name: "qr" - onTriggered: { - onTriggered: Global.openShowQRPopup({ - showSingleAccount: true, - switchingAccounsEnabled: false, - hasFloatingButtons: false, - name: d.addressName, - address: d.selectedAddress, - colorId: d.colorId, - }) - } - } - StatusAction { - id: saveAddressAction - enabled: false - text: { - switch(d.addressType) { - case TransactionAddressMenu.AddressType.Sender: - return qsTr("Save sender address") - case TransactionAddressMenu.AddressType.Receiver: - return qsTr("Save receiver address") - default: - return qsTr("Save address") - } - } - icon.name: "star-icon-outline" - onTriggered: { - Global.openAddEditSavedAddressesPopup({ - addAddress: true, - address: d.selectedAddress, - ens: d.addressEns - }) - } - } - StatusAction { - id: editAddressAction - enabled: false - text: qsTr("Edit saved address") - icon.name: "pencil-outline" - onTriggered: Global.openAddEditSavedAddressesPopup({ - edit: true, - name: d.addressName, - address: d.selectedAddress, - ens: d.addressEns, - colorId: d.colorId}) - } - StatusAction { - id: sendToAddressAction - enabled: false - text: { - switch(d.addressType) { - case TransactionAddressMenu.AddressType.Sender: - return qsTr("Send to sender address") - case TransactionAddressMenu.AddressType.Receiver: - return qsTr("Send to receiver address") - default: - return qsTr("Send to address") - } - } - icon.name: "send" - onTriggered: root.openSendModal(d.selectedAddress) - } -} diff --git a/ui/imports/shared/controls/TransactionAddress.qml b/ui/imports/shared/controls/TransactionAddress.qml deleted file mode 100644 index 1ac1d79342..0000000000 --- a/ui/imports/shared/controls/TransactionAddress.qml +++ /dev/null @@ -1,201 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.13 - -import StatusQ.Core 0.1 -import StatusQ.Components 0.1 -import StatusQ.Controls 0.1 -import StatusQ.Core.Theme 0.1 - -import AppLayouts.Wallet 1.0 -import AppLayouts.Wallet.stores 1.0 as WalletStores -import AppLayouts.Profile.stores 1.0 as ProfileStores - -import utils 1.0 - -/*! - \qmltype TransactionAddress - \inherits Item - \inqmlmodule shared.controls - \since shared.controls 1.0 - \brief It displays transaction address in depending on amount of data provided. - - The \c TransactionAddress should be used to display transaction activity data. - - \qml - TransactionAddress { - address: "0x29D7d1dd5B6f9C864d9db560D72a247c208aE86B" - } - \endqml -*/ - -Item { - id: root - - /*! - \qmlproperty string TransactionAddress::address - This property holds wallet address. - */ - property string address - - /* /internal Property hold reference to contacts store to refresh contact data on any change. */ - property ProfileStores.ContactsStore contactsStore - - /* /internal Property hold reference to root store to refresh wallet data on any change. */ - property WalletStores.RootStore rootStore - - /*! - \qmlproperty \l{StatusAssetSettings} TransactionAddress::asset - Property holds asset settings for contact icon. - */ - property StatusAssetSettings asset: StatusAssetSettings { - id: statusAssetSettings - width: 36 - height: 36 - color: d.isContact ? Utils.colorForPubkey(root.contactPubKey) : d.walletAddressColor - name: { - if (d.isContact) { - return isImage ? d.contactData.thumbnailImage : nameText.text - } else if (d.isWallet && !d.walletAddressEmoji) { - return "filled-account" - } - return "" - } - isImage: d.isContact && statusAssetSettings.isImgSrc(d.contactData.thumbnailImage) - emoji: d.isWallet && !!d.walletAddressEmoji ? d.walletAddressEmoji : "" - isLetterIdenticon: d.isContact && !isImage - charactersLen: 2 - } - - implicitHeight: Math.max(44, contentColumn.height) + 12 - - onAddressChanged: { - d.refresh() - } - - Component.onCompleted: { - d.refresh() - } - - QtObject { - id: d - - property string contactPubKey: !!root.contactsStore ? root.contactsStore.getContactPublicKeyByAddress(root.address) : "" - readonly property bool isContact: contactData.isContact - readonly property bool isWallet: !isContact && !!walletAddressName - property var contactData - property string savedAddressName - property string walletAddressName - property string walletAddressEmoji - property string walletAddressColor - - function refresh() { - refreshContactData() - refreshSavedAddressName() - refreshWalletAddress() - } - - function refreshContactData() { - d.contactData = Utils.getContactDetailsAsJson(d.contactPubKey) - } - - function refreshSavedAddressName() { - if (!root.rootStore) { - return - } - let savedAddress = root.rootStore.getSavedAddress(root.address) - d.savedAddressName = savedAddress.name - } - - function refreshWalletAddress() { - d.walletAddressName = !!root.rootStore ? root.rootStore.getNameForWalletAddress(root.address) : "" - if (!d.walletAddressName) - return // No need to query other if name not found - d.walletAddressEmoji = !!root.rootStore ? root.rootStore.getEmojiForWalletAddress(root.address) : "" - d.walletAddressColor = Utils.getColorForId(!!root.rootStore ? root.rootStore.getColorForWalletAddress(root.address) : "") - } - - - readonly property Connections walletAccountsConnection: Connections { - target: !!root.rootStore ? root.rootStore.accounts ?? null : null - function onItemChanged(address) { - if (address === root.address) - d.refreshWalletAddress() - } - } - - readonly property Connections myContactsModelConnection: Connections { - target: root.contactsStore.myContactsModel ?? null - function onItemChanged(pubKey) { - if (pubKey === root.contactPubKey) - d.refreshContactData() - } - } - - readonly property Connections receivedContactsReqModelConnection: Connections { - target: root.contactsStore.receivedContactRequestsModel ?? null - function onItemChanged(pubKey) { - if (pubKey === root.contactPubKey) - d.refreshContactData() - } - } - - readonly property Connections sentContactReqModelConnection: Connections { - target: root.contactsStore.sentContactRequestsModel ?? null - function onItemChanged(pubKey) { - if (pubKey === root.contactPubKey) - d.refreshContactData() - } - } - } - - RowLayout { - id: contentRow - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.right: parent.right - - StatusSmartIdenticon { - id: identicon - Layout.alignment: Qt.AlignTop - asset: root.asset - name: nameText.text - ringSettings { - ringSpecModel: d.isContact ? Utils.getColorHashAsJson(d.contactData.publicKey) : [] - ringPxSize: asset.width / 24 - } - visible: d.isContact || d.isWallet - } - - ColumnLayout { - id: contentColumn - Layout.fillWidth: true - spacing: 0 - - StatusBaseText { - id: nameText - Layout.fillWidth: true - font.pixelSize: 15 - color: Theme.palette.directColor1 - text: { - let name = "" - if (d.isContact) { - name = ProfileUtils.displayName(d.contactData.localNickname, d.contactData.name, d.contactData.displayName, d.contactData.alias) - } - return name || d.walletAddressName || d.savedAddressName - } - visible: !!text - elide: Text.ElideRight - } - StatusBaseText { - Layout.fillWidth: true - font.pixelSize: 15 - color: Theme.palette.directColor1 - wrapMode: Text.WrapAnywhere - enabled: false // Set to false to disable hover for rich text - text: root.address - visible: !!root.address - elide: Text.ElideRight - } - } - } -} diff --git a/ui/imports/shared/controls/TransactionAddressTile.qml b/ui/imports/shared/controls/TransactionAddressTile.qml deleted file mode 100644 index 471636c3db..0000000000 --- a/ui/imports/shared/controls/TransactionAddressTile.qml +++ /dev/null @@ -1,78 +0,0 @@ -import QtQuick 2.13 -import QtQuick.Layouts 1.15 -import QtQuick.Shapes 1.15 - -import StatusQ.Core 0.1 -import StatusQ.Controls 0.1 -import StatusQ.Components 0.1 -import StatusQ.Core.Theme 0.1 - -import AppLayouts.Profile.stores 1.0 as ProfileStores -import AppLayouts.Wallet.stores 1.0 as WalletStores - -/*! - \qmltype TransactionAddressTile - \inherits TransactionDataTile - \inqmlmodule shared.controls - \since shared.controls 1.0 - \brief It displays list of addresses for wallet activity. - - The \c TransactionAddressTile can display list of addresses formatted in specific way. - - \qml - TransactionAddressTile { - title: qsTr("From") - width: parent.width - rootStore: WalletStores.RootStore - addresses: [ - "eth:arb1:oeth:0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc35", - "0x4de3f6278C0DdFd3F29df9DcD979038F5c7bbc35", - ] - } - \endqml -*/ - -TransactionDataTile { - id: root - - /*! - \qmlproperty var TransactionAddressTile::addresses - This property holds list or model of addresses to display in the tile. - */ - property var addresses: [] - /*! - \qmlproperty var TransactionAddressTile::rootStore - This property holds rootStore object used to retrive data for each address. - */ - property WalletStores.RootStore rootStore - - /* /internal Property hold reference to contacts store to refresh contact data on any change. */ - property ProfileStores.ContactsStore contactsStore - - implicitHeight: transactionColumn.height + transactionColumn.spacing + root.topPadding + root.bottomPadding - buttonIconName: "more" - - Column { - id: transactionColumn - anchors { - left: parent.left - leftMargin: root.leftPadding - right: parent.right - rightMargin: root.statusListItemComponentsSlot.width + root.rightPadding * 2 - bottom: parent.bottom - bottomMargin: root.bottomPadding - } - height: childrenRect.height - spacing: 4 - - Repeater { - model: root.addresses - delegate: TransactionAddress { - width: parent.width - address: modelData - rootStore: root.rootStore - contactsStore: root.contactsStore - } - } - } -} diff --git a/ui/imports/shared/controls/TransactionDataTile.qml b/ui/imports/shared/controls/TransactionDataTile.qml deleted file mode 100644 index 903eba070c..0000000000 --- a/ui/imports/shared/controls/TransactionDataTile.qml +++ /dev/null @@ -1,136 +0,0 @@ -import QtQuick 2.15 -import QtGraphicalEffects 1.15 - -import StatusQ.Components 0.1 -import StatusQ.Core.Theme 0.1 -import StatusQ.Core 0.1 -import StatusQ.Controls 0.1 - -import utils 1.0 -import shared.panels 1.0 - -/*! - \qmltype TransactionDataTile - \inherits StatusListItem - \inqmlmodule shared.controls - \since shared.controls 1.0 - \brief It displays data for wallet activity. - - The \c TransactionDataTile can display wallet activity data as a tile. - To show button fill \l{buttonIcon} property. - - \qml - TransactionDataTile { - width: parent.width - title: qsTr("From") - buttonIcon: "more" - } - \endqml -*/ - -StatusListItem { - id: root - - /*! - \qmlproperty int TransactionDataTile::topPadding - This property holds spacing between top and content item in tile. - */ - property int topPadding: 12 - /*! - \qmlproperty int TransactionDataTile::bottomPadding - This property holds spacing between bottom and content item in tile. - */ - property int bottomPadding: 12 - - /*! - \qmlproperty bool TransactionDataTile::smallIcon - This property holds information about icon state. Setting it to true will display small icon before subtitle. - - Default value is false. - */ - property bool smallIcon: false - /*! - \qmlproperty string TransactionDataTile::buttonIconName - This property holds button icon source string. - To show button icon source must be filled - */ - property string buttonIconName - - property StatusAssetSettings iconSettings: StatusAssetSettings { - name: root.asset.name - color: "transparent" - width: root.smallIcon ? 20 : 36 - height: root.smallIcon ? 20 : 36 - bgWidth: width - bgHeight: height - } - - signal buttonClicked() - - leftPadding: 12 - rightPadding: 12 - height: visible ? implicitHeight + bottomPadding : 0 - radius: 0 - sensor.cursorShape: Qt.ArrowCursor - color: sensor.containsMouse || highlighted ? Theme.palette.baseColor5 : Theme.palette.transparent - - // Title - statusListItemTitle.customColor: Theme.palette.directColor5 - statusListItemTitle.enabled: false - statusListItemTitleArea.anchors { - left: statusListItemTitleArea.parent.left - top: statusListItemTitleArea.parent.top - topMargin: topPadding - right: statusListItemTitleArea.parent.right - verticalCenter: undefined - } - - // Subtitle - statusListItemTagsRowLayout.anchors.topMargin: 8 - statusListItemTagsRowLayout.width: statusListItemTagsRowLayout.parent.width - (!!root.buttonIconName ? 36 : 0) - statusListItemSubTitle.customColor: Theme.palette.directColor1 - - // Tertiary title - statusListItemTertiaryTitle.anchors.topMargin: -statusListItemTertiaryTitle.height - statusListItemTertiaryTitle.horizontalAlignment: Qt.AlignRight - - // Icon - asset.isImage: false - statusListItemTagsRowLayout.spacing: 8 - subTitleBadgeComponent: !!asset.name ? iconComponent : null - statusListItemIcon.asset: StatusAssetSettings {} - statusListItemIcon.name: "" - - Component { - id: iconComponent - StatusRoundIcon { - asset: root.iconSettings - layer.enabled: asset.bgRadius > 0 - layer.effect: OpacityMask { - maskSource: Rectangle { - width: root.iconSettings.bgWidth - height: root.iconSettings.bgHeight - radius: root.iconSettings.bgRadius - } - } - } - } - - components: Loader { - active: !!root.buttonIconName - sourceComponent: StatusRoundButton { - width: 32 - height: 32 - icon.color: hovered ? Theme.palette.directColor1 : Theme.palette.baseColor1 - icon.name: root.buttonIconName - type: StatusRoundButton.Type.Quinary - radius: 8 - visible: root.sensor.containsMouse - onClicked: root.buttonClicked() - } - } - - Separator { - anchors.bottom: parent.bottom - } -} diff --git a/ui/imports/shared/controls/qmldir b/ui/imports/shared/controls/qmldir index 561807f0f0..b982a625e8 100644 --- a/ui/imports/shared/controls/qmldir +++ b/ui/imports/shared/controls/qmldir @@ -43,9 +43,6 @@ StyledTextEdit 1.0 StyledTextEdit.qml StyledTextEditWithLoadingState 1.0 StyledTextEditWithLoadingState.qml Timer 1.0 Timer.qml TokenDelegate 1.0 TokenDelegate.qml -TransactionAddress 1.0 TransactionAddress.qml -TransactionAddressTile 1.0 TransactionAddressTile.qml -TransactionDataTile 1.0 TransactionDataTile.qml TransactionDelegate 1.0 TransactionDelegate.qml TransactionDetailsHeader.qml 1.0 TransactionDetailsHeader.qml WalletAccountListItem 1.0 WalletAccountListItem.qml