Skip to content

Commit 595807e

Browse files
Khushboo-dev-cppKhushboo mehta
authored and
Khushboo mehta
committed
feat(@desktop/wallet): Integrates the new sign model into the simple send
fixes #17060
1 parent 30009b2 commit 595807e

15 files changed

+403
-103
lines changed

storybook/pages/SendSignModalPage.qml

+8-3
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ SplitView {
7878
formatBigNumber: (number, symbol, noSymbolOption) => parseFloat(number).toLocaleString(Qt.locale(), 'f', 2)
7979
+ (noSymbolOption ? "" : " " + (symbol || Qt.locale().currencySymbol(Locale.CurrencyIsoCode)))
8080

81-
fromTokenSymbol: ctrlFromSymbol.text
82-
fromTokenAmount: ctrlFromAmount.text
83-
fromTokenContractAddress: "0x6B175474E89094C44Da98b954EedeAC495271d0F"
81+
tokenSymbol: ctrlFromSymbol.text
82+
tokenAmount: ctrlFromAmount.text
83+
tokenContractAddress: "0x6B175474E89094C44Da98b954EedeAC495271d0F"
8484

8585
accountName: priv.selectedAccount.name
8686
accountAddress: priv.selectedAccount.address
@@ -98,6 +98,7 @@ SplitView {
9898
cryptoFees: formatBigNumber(0.06, "ETH")
9999
estimatedTime: qsTr("> 5 minutes")
100100

101+
isCollectibleLoading: isCollectibleLoadingCheckbox.checked
101102
isCollectible: isCollectibleCheckbox.checked
102103
collectibleContractAddress: !!collectibleComboBox.currentCollectible ?
103104
collectibleComboBox.currentCollectible.contractAddress: ""
@@ -152,6 +153,10 @@ SplitView {
152153
id: isCollectibleCheckbox
153154
text:"is collectible"
154155
}
156+
CheckBox {
157+
id: isCollectibleLoadingCheckbox
158+
text:"is collectible loading"
159+
}
155160
ComboBox {
156161
id: collectibleComboBox
157162
property var currentCollectible

storybook/qmlTests/tests/tst_SendSignModal.qml

+22-22
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ Item {
2424

2525
formatBigNumber: (number, symbol, noSymbolOption) => parseFloat(number).toLocaleString(Qt.locale(), 'f', 2) + (noSymbolOption ? "" : " " + symbol)
2626

27-
fromTokenSymbol: "DAI"
28-
fromTokenAmount: "100.07"
29-
fromTokenContractAddress: "0x6B175474E89094C44Da98b954EedeAC495271d0F"
27+
tokenSymbol: "DAI"
28+
tokenAmount: "100.07"
29+
tokenContractAddress: "0x6B175474E89094C44Da98b954EedeAC495271d0F"
3030

3131
accountName: "Hot wallet (generated)"
3232
accountAddress: "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8881"
@@ -101,15 +101,15 @@ Item {
101101

102102
function test_fromToProps() {
103103
verify(!!controlUnderTest)
104-
controlUnderTest.fromTokenSymbol = "DAI"
105-
controlUnderTest.fromTokenAmount = "1000.123456789"
106-
controlUnderTest.fromTokenContractAddress = "Oxdeadbeef"
104+
controlUnderTest.tokenSymbol = "DAI"
105+
controlUnderTest.tokenAmount = "1000.123456789"
106+
controlUnderTest.tokenContractAddress = "Oxdeadbeef"
107107

108108
// title
109109
compare(controlUnderTest.title, qsTr("Sign Send"))
110110

111111
// subtitle
112-
compare(controlUnderTest.subtitle, qsTr("%1 to %2").arg(controlUnderTest.formatBigNumber(controlUnderTest.fromTokenAmount, controlUnderTest.fromTokenSymbol))
112+
compare(controlUnderTest.subtitle, qsTr("%1 %2 to %3").arg(controlUnderTest.tokenAmount).arg(controlUnderTest.tokenSymbol)
113113
.arg(SQUtils.Utils.elideAndFormatWalletAddress(controlUnderTest.recipientAddress)))
114114

115115
compare(controlUnderTest.gradientColor, controlUnderTest.accountColor)
@@ -120,8 +120,8 @@ Item {
120120
// info box
121121
const headerText = findChild(controlUnderTest.contentItem, "headerText")
122122
verify(!!headerText)
123-
compare(headerText.text, qsTr("Send %1 to %2 on %3").
124-
arg(controlUnderTest.formatBigNumber(controlUnderTest.fromTokenAmount, controlUnderTest.fromTokenSymbol)).
123+
compare(headerText.text, qsTr("Send %1 %2 to %3 on %4").
124+
arg(controlUnderTest.tokenAmount).arg(controlUnderTest.tokenSymbol).
125125
arg(SQUtils.Utils.elideAndFormatWalletAddress(controlUnderTest.recipientAddress)).arg(controlUnderTest.networkName))
126126
const fromImage = findChild(controlUnderTest.contentItem, "fromImageIdenticon")
127127
verify(!!fromImage)
@@ -132,14 +132,14 @@ Item {
132132

133133
const toImage = findChild(controlUnderTest.contentItem, "toImageIdenticon")
134134
verify(!!toImage)
135-
compare(toImage.asset.name, Constants.tokenIcon(controlUnderTest.fromTokenSymbol))
135+
compare(toImage.asset.name, Constants.tokenIcon(controlUnderTest.tokenSymbol))
136136

137137
// send box
138138
const sendBox = findChild(controlUnderTest.contentItem, "sendAssetBox")
139139
verify(!!sendBox)
140140
compare(sendBox.caption, qsTr("Send"))
141-
compare(sendBox.primaryText, "1,000.12 DAI")
142-
compare(sendBox.secondaryText, SQUtils.Utils.elideAndFormatWalletAddress(controlUnderTest.fromTokenContractAddress))
141+
compare(sendBox.primaryText, "1000.123456789 DAI")
142+
compare(sendBox.secondaryText, SQUtils.Utils.elideAndFormatWalletAddress(controlUnderTest.tokenContractAddress))
143143
}
144144

145145
function test_tokenContextmenu() {
@@ -165,14 +165,14 @@ Item {
165165

166166
const externalLink = findChild(contextMenu, "externalLink")
167167
verify(!!externalLink)
168-
compare(externalLink.text, !!controlUnderTest.fromTokenSymbol ?
169-
qsTr("View %1 %2 contract address on %3").arg(controlUnderTest.networkName).arg(controlUnderTest.fromTokenSymbol).arg("Etherscan")
168+
compare(externalLink.text, !!controlUnderTest.tokenSymbol ?
169+
qsTr("View %1 %2 contract address on %3").arg(controlUnderTest.networkName).arg(controlUnderTest.tokenSymbol).arg("Etherscan")
170170
: qsTr("View %1 contract address on %2").arg(controlUnderTest.networkName).arg("Etherscan"))
171171
compare(externalLink.icon.name, "external-link")
172172
externalLink.triggered()
173173
tryCompare(signalSpyOpenLink, "count", 1)
174174
compare(signalSpyOpenLink.signalArguments[0][0],
175-
"%1/%2/%3".arg(controlUnderTest.networkBlockExplorerUrl).arg(Constants.networkExplorerLinks.addressPath).arg(controlUnderTest.fromTokenContractAddress))
175+
"%1/%2/%3".arg(controlUnderTest.networkBlockExplorerUrl).arg(Constants.networkExplorerLinks.addressPath).arg(controlUnderTest.tokenContractAddress))
176176
verify(!contextMenu.opened)
177177

178178
contractInfoButtonWithMenu.clicked(0)
@@ -274,12 +274,12 @@ Item {
274274
verify(!!loadingComponent)
275275
verify(loadingComponent.visible)
276276

277-
const fromAccountSmartIdenticon = findChild(controlUnderTest.contentItem, "fromAccountSmartIdenticon")
278-
verify(!!fromAccountSmartIdenticon)
279-
compare(fromAccountSmartIdenticon.asset.name, "filled-account")
280-
compare(fromAccountSmartIdenticon.asset.emoji, controlUnderTest.accountEmoji)
281-
compare(fromAccountSmartIdenticon.asset.color, controlUnderTest.accountColor)
282-
compare(fromAccountSmartIdenticon.asset.isLetterIdenticon, !!controlUnderTest.accountEmoji)
277+
const accountSmartIdenticon = findChild(controlUnderTest.contentItem, "accountSmartIdenticon")
278+
verify(!!accountSmartIdenticon)
279+
compare(accountSmartIdenticon.asset.name, "filled-account")
280+
compare(accountSmartIdenticon.asset.emoji, controlUnderTest.accountEmoji)
281+
compare(accountSmartIdenticon.asset.color, controlUnderTest.accountColor)
282+
compare(accountSmartIdenticon.asset.isLetterIdenticon, !!controlUnderTest.accountEmoji)
283283

284284
// send collectible box
285285
const collectibleCaption = findChild(controlUnderTest.contentItem, "collectibleCaption")
@@ -325,7 +325,7 @@ Item {
325325
blockchainExternalLink.triggered()
326326
tryCompare(signalSpyOpenLink, "count", 2)
327327
compare(signalSpyOpenLink.signalArguments[1][0],
328-
"%1/nft/%2/%3".arg("Etherscan").arg(data.contractAddress).arg(data.tokenId))
328+
"%1/nft/%2/%3".arg("https://etherscan.io/").arg(data.contractAddress).arg(data.tokenId))
329329

330330
const copyButton = findChild(moreMenu, "copyButton")
331331
verify(!!copyButton)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import QtQuick 2.15
2+
3+
import StatusQ 0.1
4+
import StatusQ.Core.Utils 0.1
5+
6+
/**
7+
Adaptor transforming selected data from send to a format that
8+
can be used in the sign modal
9+
**/
10+
QObject {
11+
id: root
12+
13+
/** Account key used for filtering **/
14+
required property string accountKey
15+
/** network chainId used for filtering **/
16+
required property int chainId
17+
/** token key used for filtering **/
18+
required property string tokenKey
19+
/** amount selected in send modal for sending **/
20+
required property string selectedAmountInBaseUnit
21+
/**
22+
Expected model structure:
23+
24+
name [int] - name of account
25+
address [string] - address of account
26+
emoji [string] - emoji of account
27+
colorId [string] - colorId of account
28+
**/
29+
required property var accountsModel
30+
/**
31+
Expected model structure:
32+
33+
chainId [int] - network chain id
34+
chainName [string] - name of network
35+
iconUrl [string] - network icon url
36+
**/
37+
required property var networksModel
38+
/**
39+
Expected model structure:
40+
41+
key [int] - unique id of token
42+
symbol [int] - symbol of token
43+
decimals [string] - decimals of token
44+
**/
45+
required property var tokenBySymbolModel
46+
47+
/** output property of the account selected **/
48+
readonly property var selectedAccount: selectedAccountEntry.item
49+
/** output property of the network selected **/
50+
readonly property var selectedNetwork: selectedNetworkEntry.item
51+
/** output property of the asset (ERC20) selected **/
52+
readonly property var selectedAsset: selectedAssetEntry.item
53+
/** output property of the localised amount to send **/
54+
readonly property string selectedAmount: {
55+
const decimals = !!root.selectedAsset ? root.selectedAsset.decimals: 0
56+
const divisor = AmountsArithmetic.fromExponent(decimals)
57+
let amount = AmountsArithmetic.div(
58+
AmountsArithmetic.fromString(root.selectedAmountInBaseUnit),
59+
divisor).toFixed(decimals)
60+
// removeDecimalTrailingZeros
61+
amount = Utils.stripTrailingZeros(amount)
62+
// localize
63+
return amount.replace(".", Qt.locale().decimalPoint)
64+
}
65+
/** output property of the selected asset contract address on selected chainId **/
66+
readonly property string selectedAssetContractAddress: selectedAssetContractEntry.available &&
67+
!!selectedAssetContractEntry.item ?
68+
selectedAssetContractEntry.item.address: ""
69+
70+
ModelEntry {
71+
id: selectedAccountEntry
72+
sourceModel: root.accountsModel
73+
value: root.accountKey
74+
key: "address"
75+
}
76+
77+
ModelEntry {
78+
id: selectedNetworkEntry
79+
sourceModel: root.networksModel
80+
value: root.chainId
81+
key: "chainId"
82+
}
83+
84+
ModelEntry {
85+
id: selectedAssetEntry
86+
sourceModel: root.tokenBySymbolModel
87+
value: root.tokenKey
88+
key: "key"
89+
}
90+
91+
ModelEntry {
92+
id: selectedAssetContractEntry
93+
sourceModel: selectedAssetEntry.available &&
94+
!!selectedAssetEntry.item ?
95+
selectedAssetEntry.item.addressPerChain: null
96+
value: root.chainId
97+
key: "chainId"
98+
}
99+
}
+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
CollectiblesSelectionAdaptor 1.0 CollectiblesSelectionAdaptor.qml
22
TokenSelectorViewAdaptor 1.0 TokenSelectorViewAdaptor.qml
33
WalletAccountsSelectorAdaptor 1.0 WalletAccountsSelectorAdaptor.qml
4+
SignSendAdaptor 1.0 SignSendAdaptor.qml

ui/app/AppLayouts/Wallet/controls/RouterErrorTag.qml

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ Control {
5151

5252
color: Theme.palette.dangerColor1
5353
font.pixelSize: Theme.additionalTextSize
54+
elide: Text.ElideRight
5455
}
5556
StatusButton {
5657
id: addBalanceButton

ui/app/AppLayouts/Wallet/panels/RecipientInfoButtonWithMenu.qml

+15-6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import QtQuick 2.15
12

23
import StatusQ 0.1
34
import StatusQ.Core.Theme 0.1
@@ -9,31 +10,39 @@ import utils 1.0
910
StatusFlatButton {
1011
id: root
1112

13+
/** Input property holding selected recipient address **/
1214
required property string recipientAddress
15+
/** Input property holding selected network name **/
1316
required property string networkName
17+
/** Input property holding selected network short name **/
1418
required property string networkShortName
19+
/** Input property holding selected network explorer url **/
1520
required property string networkBlockExplorerUrl
1621

22+
/** Signal to launch link **/
1723
signal openLink(string link)
1824

25+
QtObject {
26+
id: d
27+
28+
function getExplorerName() {
29+
return Utils.getChainExplorerName(root.networkShortName)
30+
}
31+
}
32+
1933
icon.name: "more"
2034
icon.color: highlighted ? Theme.palette.directColor1 : Theme.palette.directColor5
21-
2235
highlighted: moreMenu.opened
2336
onClicked: moreMenu.popup(root, 0, height + 4)
2437

25-
function getExplorerName() {
26-
return Utils.getChainExplorerName(root.networkShortName)
27-
}
28-
2938
StatusMenu {
3039
id: moreMenu
3140
objectName: "moreMenu"
3241

3342
StatusAction {
3443
objectName: "externalLink"
3544
//: e.g. "View receiver address on Etherscan"
36-
text: qsTr("View receiver address on %1").arg(getExplorerName())
45+
text: qsTr("View receiver address on %1").arg(d.getExplorerName())
3746
icon.name: "external-link"
3847
onTriggered: {
3948
var link = "%1/%2/%3".arg(root.networkBlockExplorerUrl).arg(Constants.networkExplorerLinks.addressPath).arg(root.recipientAddress)

ui/app/AppLayouts/Wallet/panels/SignCollectibleInfoBox.qml

+17-4
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,30 @@ import AppLayouts.Wallet.views.collectibles 1.0
1515
Control {
1616
id: root
1717

18+
/** Input property holding collectible name **/
1819
required property string name
19-
20-
required property string backgroundColor
20+
/** Input property holding collectible background color **/
21+
required property color backgroundColor
22+
/** Input property holding if collectible has valid metadata **/
2123
required property bool isMetadataValid
24+
/** Input property holding collectible fallback image url **/
2225
required property string fallbackImageUrl
26+
/** Input property holding collectible contract address **/
2327
required property string contractAddress
28+
/** Input property holding collectible tokenId **/
2429
required property string tokenId
30+
/** Input property holding if collectible is loading **/
31+
required property bool loading
2532

33+
/** Input property holding network short name **/
2634
required property string networkShortName
35+
/** Input property holding network explorer url **/
2736
required property string networkBlockExplorerUrl
37+
38+
/** Input property holding openSea explorer url **/
2839
required property string openSeaExplorerUrl
2940

41+
/** Signal to launch link **/
3042
signal openLink(string link)
3143

3244
QtObject {
@@ -38,10 +50,10 @@ Control {
3850

3951
readonly property string collectibleBlockExplorerLink: {
4052
if (root.networkShortName === Constants.networkShortChainNames.mainnet) {
41-
return "%1/nft/%2/%3".arg(getExplorerName()).arg(root.contractAddress).arg(root.tokenId)
53+
return "%1/nft/%2/%3".arg(root.networkBlockExplorerUrl).arg(root.contractAddress).arg(root.tokenId)
4254
}
4355
else {
44-
return "%1/token/%2?a=%3".arg(getExplorerName()).arg(root.contractAddress).arg(root.tokenId)
56+
return "%1/token/%2?a=%3".arg(root.networkBlockExplorerUrl).arg(root.contractAddress).arg(root.tokenId)
4557
}
4658
}
4759
}
@@ -73,6 +85,7 @@ Control {
7385
Layout.preferredWidth: 40
7486
Layout.preferredHeight: 40
7587
radius: 4
88+
isCollectibleLoading: root.loading
7689
}
7790

7891
ColumnLayout {

0 commit comments

Comments
 (0)