chore: remove unused components
This commit is contained in:
parent
a53eb6001f
commit
3e9e8bfe07
|
@ -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
|
|
|
@ -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 '<img class="emoji" draggable="false" alt="??" src="' + Theme.emoji("1f61b") + '?72x72" width="16" height="16" style="vertical-align: top"/>'
|
|
||||||
}
|
|
||||||
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
|
|
|
@ -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 '<img class="emoji" draggable="false" alt="??" src="' + Theme.emoji("1f61b") + '?72x72" width="16" height="16" style="vertical-align: top"/>'
|
|
||||||
}
|
|
||||||
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
|
|
|
@ -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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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) : ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -12,5 +12,3 @@ SignInfoBox 1.0 SignInfoBox.qml
|
||||||
SwapInputPanel 1.0 SwapInputPanel.qml
|
SwapInputPanel 1.0 SwapInputPanel.qml
|
||||||
TokenSelectorPanel 1.0 TokenSelectorPanel.qml
|
TokenSelectorPanel 1.0 TokenSelectorPanel.qml
|
||||||
WalletHeader 1.0 WalletHeader.qml
|
WalletHeader 1.0 WalletHeader.qml
|
||||||
WalletNftPreview 1.0 WalletNftPreview.qml
|
|
||||||
WalletTxProgressBlock 1.0 WalletTxProgressBlock.qml
|
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -43,9 +43,6 @@ StyledTextEdit 1.0 StyledTextEdit.qml
|
||||||
StyledTextEditWithLoadingState 1.0 StyledTextEditWithLoadingState.qml
|
StyledTextEditWithLoadingState 1.0 StyledTextEditWithLoadingState.qml
|
||||||
Timer 1.0 Timer.qml
|
Timer 1.0 Timer.qml
|
||||||
TokenDelegate 1.0 TokenDelegate.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
|
TransactionDelegate 1.0 TransactionDelegate.qml
|
||||||
TransactionDetailsHeader.qml 1.0 TransactionDetailsHeader.qml
|
TransactionDetailsHeader.qml 1.0 TransactionDetailsHeader.qml
|
||||||
WalletAccountListItem 1.0 WalletAccountListItem.qml
|
WalletAccountListItem 1.0 WalletAccountListItem.qml
|
||||||
|
|
Loading…
Reference in New Issue