feat: Card fixes

This commit is contained in:
Emil Sawicki 2024-12-02 08:37:54 +01:00
parent 7c844964e6
commit fa85173e0a
12 changed files with 120 additions and 23 deletions

View File

@ -32,6 +32,7 @@ SplitView {
linkPreviewModel: mockedLinkPreviewModel linkPreviewModel: mockedLinkPreviewModel
gifLinks: [ "https://media.tenor.com/qN_ytiwLh24AAAAC/cold.gif" ] gifLinks: [ "https://media.tenor.com/qN_ytiwLh24AAAAC/cold.gif" ]
paymentRequestModel: mockedPaymentRequestModel paymentRequestModel: mockedPaymentRequestModel
areTestNetworksEnabled: false
senderName: "Alice" senderName: "Alice"
@ -77,6 +78,11 @@ SplitView {
checked: linksMessageView.isOnline checked: linksMessageView.isOnline
onToggled: linksMessageView.isOnline = !linksMessageView.isOnline onToggled: linksMessageView.isOnline = !linksMessageView.isOnline
} }
CheckBox {
text: qsTr("Testnet enabled")
checked: linksMessageView.areTestNetworksEnabled
onToggled: linksMessageView.areTestNetworksEnabled = !linksMessageView.areTestNetworksEnabled
}
} }
} }
} }

View File

@ -200,6 +200,14 @@ Item {
// Call later to make sure activeUsersStore and activeMessagesStore bindings are updated // Call later to make sure activeUsersStore and activeMessagesStore bindings are updated
Qt.callLater(d.restoreInputState, preservedText) Qt.callLater(d.restoreInputState, preservedText)
} }
function formatBalance(amount, symbol) {
let asset = ModelUtils.getByKey(WalletStore.RootStore.tokensStore.flatTokensModel, "symbol", symbol)
if (!asset)
return "0"
const num = AmountsArithmetic.toNumber(amount, asset.decimals)
return root.rootStore.currencyStore.formatCurrencyAmount(num, symbol, {noSynbol: true})
}
} }
EmptyChatPanel { EmptyChatPanel {
@ -238,11 +246,13 @@ Item {
utilsStore: root.utilsStore utilsStore: root.utilsStore
rootStore: root.rootStore rootStore: root.rootStore
contactsStore: root.contactsStore contactsStore: root.contactsStore
formatBalance: d.formatBalance
emojiPopup: root.emojiPopup emojiPopup: root.emojiPopup
stickersPopup: root.stickersPopup stickersPopup: root.stickersPopup
stickersLoaded: root.stickersLoaded stickersLoaded: root.stickersLoaded
isBlocked: model.blocked isBlocked: model.blocked
sendViaPersonalChatEnabled: root.sendViaPersonalChatEnabled sendViaPersonalChatEnabled: root.sendViaPersonalChatEnabled
areTestNetworksEnabled: root.areTestNetworksEnabled
onOpenStickerPackPopup: { onOpenStickerPackPopup: {
root.openStickerPackPopup(stickerPackId) root.openStickerPackPopup(stickerPackId)
} }
@ -294,6 +304,8 @@ Item {
sharedStore: root.sharedRootStore sharedStore: root.sharedRootStore
linkPreviewModel: !!d.activeChatContentModule ? d.activeChatContentModule.inputAreaModule.linkPreviewModel : null linkPreviewModel: !!d.activeChatContentModule ? d.activeChatContentModule.inputAreaModule.linkPreviewModel : null
paymentRequestModel: !!d.activeChatContentModule ? d.activeChatContentModule.inputAreaModule.paymentRequestModel : null
formatBalance: d.formatBalance
urlsList: d.urlsList urlsList: d.urlsList
askToEnableLinkPreview: { askToEnableLinkPreview: {
if(!d.activeChatContentModule || !d.activeChatContentModule.inputAreaModule || !d.activeChatContentModule.inputAreaModule.preservedProperties) if(!d.activeChatContentModule || !d.activeChatContentModule.inputAreaModule || !d.activeChatContentModule.inputAreaModule.preservedProperties)
@ -391,7 +403,7 @@ Item {
d.activeChatContentModule.inputAreaModule.setLinkPreviewEnabledForCurrentMessage(false) d.activeChatContentModule.inputAreaModule.setLinkPreviewEnabledForCurrentMessage(false)
} }
onDismissLinkPreview: (index) => d.activeChatContentModule.inputAreaModule.removeLinkPreviewData(index) onDismissLinkPreview: (index) => d.activeChatContentModule.inputAreaModule.removeLinkPreviewData(index)
onRemovePaymentRequestPreviewRequested: (index) => d.activeChatContentModule.inputAreaModule.removePaymentRequestPreviewData(index) onRemovePaymentRequestPreview: (index) => d.activeChatContentModule.inputAreaModule.removePaymentRequestPreviewData(index)
} }
ChatPermissionQualificationPanel { ChatPermissionQualificationPanel {

View File

@ -38,8 +38,10 @@ ColumnLayout {
property ContactsStore contactsStore property ContactsStore contactsStore
property string chatId property string chatId
property int chatType: Constants.chatType.unknown property int chatType: Constants.chatType.unknown
property var formatBalance
readonly property alias chatMessagesLoader: chatMessagesLoader readonly property alias chatMessagesLoader: chatMessagesLoader
property bool areTestNetworksEnabled
property var emojiPopup property var emojiPopup
property var stickersPopup property var stickersPopup
@ -94,6 +96,7 @@ ColumnLayout {
rootStore: root.rootStore rootStore: root.rootStore
contactsStore: root.contactsStore contactsStore: root.contactsStore
messageStore: root.messageStore messageStore: root.messageStore
formatBalance: root.formatBalance
emojiPopup: root.emojiPopup emojiPopup: root.emojiPopup
stickersPopup: root.stickersPopup stickersPopup: root.stickersPopup
usersStore: root.usersStore usersStore: root.usersStore
@ -103,6 +106,7 @@ ColumnLayout {
isChatBlocked: root.isBlocked || !root.isUserAllowedToSendMessage isChatBlocked: root.isBlocked || !root.isUserAllowedToSendMessage
channelEmoji: !chatContentModule ? "" : (chatContentModule.chatDetails.emoji || "") channelEmoji: !chatContentModule ? "" : (chatContentModule.chatDetails.emoji || "")
sendViaPersonalChatEnabled: root.sendViaPersonalChatEnabled sendViaPersonalChatEnabled: root.sendViaPersonalChatEnabled
areTestNetworksEnabled: root.areTestNetworksEnabled
onShowReplyArea: (messageId, senderId) => { onShowReplyArea: (messageId, senderId) => {
root.showReplyArea(messageId) root.showReplyArea(messageId)
} }

View File

@ -39,9 +39,11 @@ Item {
property UsersStore usersStore property UsersStore usersStore
property ContactsStore contactsStore property ContactsStore contactsStore
property string channelEmoji property string channelEmoji
property var formatBalance
property var emojiPopup property var emojiPopup
property var stickersPopup property var stickersPopup
property bool areTestNetworksEnabled
property string chatId: "" property string chatId: ""
property bool stickersLoaded: false property bool stickersLoaded: false
@ -283,10 +285,12 @@ Item {
stickersPopup: root.stickersPopup stickersPopup: root.stickersPopup
chatLogView: ListView.view chatLogView: ListView.view
chatContentModule: root.chatContentModule chatContentModule: root.chatContentModule
formatBalance: root.formatBalance
isChatBlocked: root.isChatBlocked isChatBlocked: root.isChatBlocked
sendViaPersonalChatEnabled: root.sendViaPersonalChatEnabled sendViaPersonalChatEnabled: root.sendViaPersonalChatEnabled
areTestNetworksEnabled: root.areTestNetworksEnabled
chatId: root.chatId chatId: root.chatId
messageId: model.id messageId: model.id

View File

@ -713,7 +713,7 @@ Item {
sendModal.preSelectedHoldingType = Constants.TokenType.ERC20 sendModal.preSelectedHoldingType = Constants.TokenType.ERC20
} }
if (!!amount) { if (!!amount) {
sendModal.preDefinedAmountToSend = amount sendModal.preDefinedRawAmountToSend = amount
} }
if (!!chainId) { if (!!chainId) {
sendModal.preSelectedChainId = chainId sendModal.preSelectedChainId = chainId
@ -1882,6 +1882,7 @@ Item {
property int preSelectedHoldingType: Constants.TokenType.Unknown property int preSelectedHoldingType: Constants.TokenType.Unknown
property int preSelectedSendType: Constants.SendType.Unknown property int preSelectedSendType: Constants.SendType.Unknown
property string preDefinedAmountToSend property string preDefinedAmountToSend
property string preDefinedRawAmountToSend
property int preSelectedChainId: 0 property int preSelectedChainId: 0
property bool onlyAssets: false property bool onlyAssets: false
@ -1910,6 +1911,7 @@ Item {
sendModal.preSelectedAccountAddress = "" sendModal.preSelectedAccountAddress = ""
sendModal.preSelectedRecipient = undefined sendModal.preSelectedRecipient = undefined
sendModal.preDefinedAmountToSend = "" sendModal.preDefinedAmountToSend = ""
sendModal.preDefinedRawAmountToSend = ""
sendModal.preSelectedChainId = 0 sendModal.preSelectedChainId = 0
sendModal.stickersPackId = "" sendModal.stickersPackId = ""
@ -1936,6 +1938,9 @@ Item {
if (sendModal.preDefinedAmountToSend != "") { if (sendModal.preDefinedAmountToSend != "") {
item.preDefinedAmountToSend = sendModal.preDefinedAmountToSend item.preDefinedAmountToSend = sendModal.preDefinedAmountToSend
} }
if (sendModal.preDefinedRawAmountToSend != "") {
item.preDefinedRawAmountToSend = sendModal.preDefinedRawAmountToSend
}
if (!!sendModal.preSelectedChainId) { if (!!sendModal.preSelectedChainId) {
item.preSelectedChainId = sendModal.preSelectedChainId item.preSelectedChainId = sendModal.preSelectedChainId
} }

View File

@ -39,6 +39,8 @@ Control {
*/ */
required property var paymentRequestModel required property var paymentRequestModel
property var formatBalance: null
readonly property alias hoveredUrl: d.hoveredUrl readonly property alias hoveredUrl: d.hoveredUrl
readonly property bool hasContent: imagePreviewArray.length > 0 || showLinkPreviewSettings || linkPreviewRepeater.count > 0 || paymentRequestRepeater.count > 0 readonly property bool hasContent: imagePreviewArray.length > 0 || showLinkPreviewSettings || linkPreviewRepeater.count > 0 || paymentRequestRepeater.count > 0
@ -47,7 +49,7 @@ Control {
signal linkReload(string link) signal linkReload(string link)
signal linkClicked(string link) signal linkClicked(string link)
signal removePaymentRequestPreviewRequested(int index) signal removePaymentRequestPreview(int index)
signal enableLinkPreview() signal enableLinkPreview()
signal enableLinkPreviewForThisMessage() signal enableLinkPreviewForThisMessage()
@ -110,9 +112,13 @@ Control {
delegate: PaymentRequestMiniCardDelegate { delegate: PaymentRequestMiniCardDelegate {
required property var model required property var model
amount: model.amount amount: {
if (!root.formatBalance)
return model.amount
return root.formatBalance(model.amount, model.symbol)
}
symbol: model.symbol symbol: model.symbol
onClose: root.removePaymentRequestPreviewRequested(model.index) onClose: root.removePaymentRequestPreview(model.index)
} }
} }
Repeater { Repeater {

View File

@ -7,6 +7,7 @@ import QtGraphicalEffects 1.15
import StatusQ.Core.Theme 0.1 import StatusQ.Core.Theme 0.1
import StatusQ.Components 0.1 import StatusQ.Components 0.1
import StatusQ.Controls 0.1
import shared.controls.chat 1.0 import shared.controls.chat 1.0
@ -19,6 +20,8 @@ CalloutCard {
required property string symbol required property string symbol
required property string address required property string address
required property bool areTestNetworksEnabled
property string senderName property string senderName
property string senderThumbnailImage property string senderThumbnailImage
property int senderColorId property int senderColorId
@ -42,9 +45,8 @@ CalloutCard {
QtObject { QtObject {
id: d id: d
property real bannerImageMargins: 1 / Screen.devicePixelRatio // image size isn't pixel perfect.. readonly property bool highlight: (root.highlight || root.hovered) && isAvailable
property bool highlight: root.highlight || root.hovered readonly property bool isAvailable: !root.areTestNetworksEnabled
property string bannerImageSource: ""
} }
contentItem: ColumnLayout { contentItem: ColumnLayout {
@ -132,11 +134,22 @@ CalloutCard {
} }
} }
StatusToolTip {
text: qsTr("Not available in the testnet mode")
visible: !d.isAvailable && root.hovered
y: -height
}
MouseArea { MouseArea {
id: ma
anchors.fill: root anchors.fill: root
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: root.clicked(mouse) onClicked: {
if (!d.isAvailable)
return
root.clicked(mouse)
}
} }
} }

View File

@ -41,6 +41,7 @@ StatusDialog {
property alias preSelectedRecipientType: recipientInputLoader.selectedRecipientType property alias preSelectedRecipientType: recipientInputLoader.selectedRecipientType
property string preDefinedAmountToSend property string preDefinedAmountToSend
property string preDefinedRawAmountToSend
property int preSelectedChainId: 0 property int preSelectedChainId: 0
property string stickersPackId property string stickersPackId
@ -99,8 +100,8 @@ StatusDialog {
return Constants.NoError return Constants.NoError
} }
readonly property double maxFiatBalance: isSelectedHoldingValidAsset ? selectedHolding.currencyBalance : 0 readonly property double maxFiatBalance: isSelectedHoldingValidAsset && !!selectedHolding.currencyBalance ? selectedHolding.currencyBalance : 0
readonly property double maxCryptoBalance: isSelectedHoldingValidAsset ? selectedHolding.currentBalance : 0 readonly property double maxCryptoBalance: isSelectedHoldingValidAsset && !!selectedHolding.currencyBalance ? selectedHolding.currentBalance : 0
readonly property double maxInputBalance: amountToSend.fiatMode ? maxFiatBalance : maxCryptoBalance readonly property double maxInputBalance: amountToSend.fiatMode ? maxFiatBalance : maxCryptoBalance
readonly property string tokenSymbol: !!d.selectedHolding && !!d.selectedHolding.symbol ? d.selectedHolding.symbol: "" readonly property string tokenSymbol: !!d.selectedHolding && !!d.selectedHolding.symbol ? d.selectedHolding.symbol: ""
@ -234,13 +235,24 @@ StatusDialog {
if (popup.preSelectedHoldingType === Constants.TokenType.Native if (popup.preSelectedHoldingType === Constants.TokenType.Native
|| popup.preSelectedHoldingType === Constants.TokenType.ERC20) { || popup.preSelectedHoldingType === Constants.TokenType.ERC20) {
const entry = SQUtils.ModelUtils.getByKey( let iconSource = ""
let entry = SQUtils.ModelUtils.getByKey(
assetsAdaptor.outputAssetsModel, "tokensKey", assetsAdaptor.outputAssetsModel, "tokensKey",
popup.preSelectedHoldingID) popup.preSelectedHoldingID)
if (entry) {
iconSource = entry.iconSource
} else {
entry = SQUtils.ModelUtils.getByKey(
popup.store.walletAssetStore.renamedTokensBySymbolModel, "tokensKey",
popup.preSelectedHoldingID)
iconSource = Constants.tokenIcon(entry.symbol)
}
d.selectedHoldingType = Constants.TokenType.ERC20 d.selectedHoldingType = Constants.TokenType.ERC20
d.selectedHolding = entry d.selectedHolding = entry
holdingSelector.setSelection(entry.symbol, entry.iconSource, holdingSelector.setSelection(entry.symbol, iconSource,
popup.preSelectedHoldingID) popup.preSelectedHoldingID)
holdingSelector.selectedItem = entry holdingSelector.selectedItem = entry
} else { } else {
@ -260,6 +272,7 @@ StatusDialog {
holdingSelector.currentTab = TokenSelectorPanel.Tabs.Collectibles holdingSelector.currentTab = TokenSelectorPanel.Tabs.Collectibles
} }
} }
if(!!popup.preDefinedAmountToSend) { if(!!popup.preDefinedAmountToSend) {
// TODO: At this stage the number should not be localized. However // TODO: At this stage the number should not be localized. However
// in many places when initializing popup the number is provided // in many places when initializing popup the number is provided
@ -267,9 +280,12 @@ StatusDialog {
// number consistently. Only the displaying component should apply // number consistently. Only the displaying component should apply
// final localized formatting. // final localized formatting.
const delocalized = popup.preDefinedAmountToSend.replace(LocaleUtils.userInputLocale.decimalPoint, ".") const delocalized = popup.preDefinedAmountToSend.replace(LocaleUtils.userInputLocale.decimalPoint, ".")
amountToSend.setValue(delocalized) amountToSend.setValue(delocalized)
} }
if (!!popup.preDefinedRawAmountToSend) {
amountToSend.setRawValue(popup.preDefinedRawAmountToSend)
}
if (!!popup.preSelectedChainId) { if (!!popup.preSelectedChainId) {
popup.preDefinedAmountToSend = popup.preDefinedAmountToSend.replace(Qt.locale().decimalPoint, '.') popup.preDefinedAmountToSend = popup.preDefinedAmountToSend.replace(Qt.locale().decimalPoint, '.')

View File

@ -107,6 +107,22 @@ Control {
textField.text = d.localize(trimmed) textField.text = d.localize(trimmed)
} }
function setRawValue(valueString) {
if (!valueString)
valueString = "0"
if (d.fiatMode) {
setValue(valueString)
return
}
const divisor = SQUtils.AmountsArithmetic.fromExponent(root.multiplierIndex)
const stringNumber = SQUtils.AmountsArithmetic.div(SQUtils.AmountsArithmetic.fromString(valueString), divisor).toFixed(root.multiplierIndex)
const trimmed = d.removeDecimalTrailingZeros(stringNumber)
textField.text = d.localize(trimmed)
}
function clear() { function clear() {
textField.clear() textField.clear()
} }

View File

@ -37,7 +37,7 @@ Rectangle {
signal disableLinkPreview() signal disableLinkPreview()
signal dismissLinkPreviewSettings() signal dismissLinkPreviewSettings()
signal dismissLinkPreview(int index) signal dismissLinkPreview(int index)
signal removePaymentRequestPreviewRequested(int index) signal removePaymentRequestPreview(int index)
property var usersModel property var usersModel
property SharedStores.RootStore sharedStore property SharedStores.RootStore sharedStore
@ -69,6 +69,8 @@ Rectangle {
property var linkPreviewModel: null property var linkPreviewModel: null
property var formatBalance: null
property var urlsList: [] property var urlsList: []
property bool askToEnableLinkPreview: false property bool askToEnableLinkPreview: false
@ -1226,6 +1228,7 @@ Rectangle {
imagePreviewArray: control.fileUrlsAndSources imagePreviewArray: control.fileUrlsAndSources
linkPreviewModel: control.linkPreviewModel linkPreviewModel: control.linkPreviewModel
paymentRequestModel: control.paymentRequestModel paymentRequestModel: control.paymentRequestModel
formatBalance: control.formatBalance
showLinkPreviewSettings: control.askToEnableLinkPreview showLinkPreviewSettings: control.askToEnableLinkPreview
onImageRemoved: (index) => { onImageRemoved: (index) => {
//Just do a copy and replace the whole thing because it's a plain JS array and thre's no signal when a single item is removed //Just do a copy and replace the whole thing because it's a plain JS array and thre's no signal when a single item is removed
@ -1244,7 +1247,7 @@ Rectangle {
onDisableLinkPreview: () => control.disableLinkPreview() onDisableLinkPreview: () => control.disableLinkPreview()
onDismissLinkPreviewSettings: () => control.dismissLinkPreviewSettings() onDismissLinkPreviewSettings: () => control.dismissLinkPreviewSettings()
onDismissLinkPreview: (index) => control.dismissLinkPreview(index) onDismissLinkPreview: (index) => control.dismissLinkPreview(index)
onRemovePaymentRequestPreviewRequested: (index) => control.removePaymentRequestPreviewRequested(index) onRemovePaymentRequestPreview: (index) => control.removePaymentRequestPreview(index)
} }
RowLayout { RowLayout {

View File

@ -6,6 +6,7 @@ import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1 import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1 import StatusQ.Controls 0.1
import StatusQ.Components 0.1 import StatusQ.Components 0.1
import StatusQ.Core.Utils 0.1 as SQUtils
import shared.controls 1.0 import shared.controls 1.0
import shared.panels 1.0 import shared.panels 1.0
@ -30,6 +31,10 @@ Flow {
required property bool gifUnfurlingEnabled required property bool gifUnfurlingEnabled
required property bool canAskToUnfurlGifs required property bool canAskToUnfurlGifs
required property bool areTestNetworksEnabled
property var formatBalance: null
property string senderName property string senderName
property string senderThumbnailImage property string senderThumbnailImage
property int senderColorId property int senderColorId
@ -69,7 +74,12 @@ Flow {
delegate: PaymentRequestCardDelegate { delegate: PaymentRequestCardDelegate {
required property var model required property var model
objectName: "PaymentRequestDelegate_" + model.index objectName: "PaymentRequestDelegate_" + model.index
amount: model.amount areTestNetworksEnabled: root.areTestNetworksEnabled
amount: {
if (!root.formatBalance)
return model.amount
return root.formatBalance(model.amount, model.symbol)
}
symbol: model.symbol symbol: model.symbol
address: model.receiver address: model.receiver
senderName: root.senderName senderName: root.senderName
@ -81,7 +91,7 @@ Flow {
Repeater { Repeater {
id: tempRepeater id: tempRepeater
visible: root.canAskToUnfurlGifs visible: root.cankToUnfurlGifs
model: root.gifUnfurlingEnabled ? gifLinks : [] model: root.gifUnfurlingEnabled ? gifLinks : []
delegate: LinkPreviewGifDelegate { delegate: LinkPreviewGifDelegate {

View File

@ -74,6 +74,7 @@ Loader {
property string messageAttachments: "" property string messageAttachments: ""
property var transactionParams property var transactionParams
property var emojiReactionsModel property var emojiReactionsModel
property var formatBalance
// These 2 properties can be dropped when the new unfurling flow supports GIFs // These 2 properties can be dropped when the new unfurling flow supports GIFs
property var links property var links
@ -138,6 +139,8 @@ Loader {
property bool sendViaPersonalChatEnabled property bool sendViaPersonalChatEnabled
property bool areTestNetworksEnabled
property bool stickersLoaded: false property bool stickersLoaded: false
property string sticker property string sticker
property int stickerPack: -1 property int stickerPack: -1
@ -982,6 +985,8 @@ Loader {
playAnimations: root.Window.active && root.messageStore.isChatActive playAnimations: root.Window.active && root.messageStore.isChatActive
isOnline: root.rootStore.mainModuleInst.isOnline isOnline: root.rootStore.mainModuleInst.isOnline
highlightLink: delegate.hoveredLink highlightLink: delegate.hoveredLink
areTestNetworksEnabled: root.areTestNetworksEnabled
formatBalance: root.formatBalance
onImageClicked: (image, mouse, imageSource, url) => { onImageClicked: (image, mouse, imageSource, url) => {
d.onImageClicked(image, mouse, imageSource, url) d.onImageClicked(image, mouse, imageSource, url)
} }
@ -993,11 +998,8 @@ Loader {
canAskToUnfurlGifs: !root.sharedRootStore.neverAskAboutUnfurlingAgain canAskToUnfurlGifs: !root.sharedRootStore.neverAskAboutUnfurlingAgain
onSetNeverAskAboutUnfurlingAgain: root.sharedRootStore.setNeverAskAboutUnfurlingAgain(neverAskAgain) onSetNeverAskAboutUnfurlingAgain: root.sharedRootStore.setNeverAskAboutUnfurlingAgain(neverAskAgain)
onPaymentRequestClicked: (index) => { onPaymentRequestClicked: (index) => {
const receiver = StatusQUtils.ModelUtils.get(paymentRequestModel, index, "receiver") const request = StatusQUtils.ModelUtils.get(paymentRequestModel, index)
const amount = StatusQUtils.ModelUtils.get(paymentRequestModel, index, "amount") Global.paymentRequestClicked(request.receiver, request.symbol, request.amount, request.chainId)
const symbol = StatusQUtils.ModelUtils.get(paymentRequestModel, index, "symbol")
const chainId = StatusQUtils.ModelUtils.get(paymentRequestModel, index, "chainId")
Global.paymentRequestClicked(receiver, symbol, amount, chainId)
} }
Component.onCompleted: { Component.onCompleted: {