status-desktop/ui/app/AppLayouts/Wallet/panels/DAppsWorkflow.qml

143 lines
3.5 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import AppLayouts.Wallet.controls 1.0
import shared.popups.walletconnect 1.0
import AppLayouts.Wallet.services.dapps 1.0
import shared.stores 1.0
ConnectedDappsButton {
id: root
required property WalletConnectService wcService
signal dappsListReady()
signal pairWCReady()
onClicked: {
dappsListLoader.active = true
}
highlighted: dappsListLoader.active
Loader {
id: pairWCLoader
active: false
onLoaded: {
item.open()
root.pairWCReady()
}
sourceComponent: PairWCModal {
visible: true
onClosed: pairWCLoader.active = false
onPair: (uri) => {
root.wcService.pair(uri)
this.isPairing = true
}
}
}
Loader {
id: dappsListLoader
active: false
onLoaded: {
item.open()
root.dappsListReady()
}
sourceComponent: DAppsListPopup {
visible: true
model: wcService.dappsModel
onPairWCDapp: {
pairWCLoader.active = true
this.close()
}
onOpened: {
this.x = root.width - this.contentWidth - 2 * this.padding
this.y = root.height + 4
}
onClosed: dappsListLoader.active = false
}
}
Loader {
id: connectDappLoader
active: false
onLoaded: item.openWithFilter(dappChains, sessionProposal.params.proposer)
property var dappChains: []
property var sessionProposal: null
property var availableNamespaces: null
property var sessionTopic: null
sourceComponent: ConnectDAppModal {
visible: true
onClosed: connectDappLoader.active = false
accounts: wcService.validAccounts
flatNetworks: wcService.flatNetworks
onConnect: {
root.wcService.approvePairSession(sessionProposal, dappChains, selectedAccount)
}
onDecline: {
connectDappLoader.active = false
root.wcService.rejectPairSession(sessionProposal.id)
}
onDisconnect: {
connectDappLoader.active = false
root.wcService.disconnectDapp(sessionTopic)
}
}
}
Connections {
target: root.wcService
function onConnectDApp(dappChains, sessionProposal, availableNamespaces) {
connectDappLoader.dappChains = dappChains
connectDappLoader.sessionProposal = sessionProposal
connectDappLoader.availableNamespaces = availableNamespaces
connectDappLoader.sessionTopic = null
if (pairWCLoader.item) {
pairWCLoader.item.close()
}
connectDappLoader.active = true
}
function onApproveSessionResult(session, err) {
connectDappLoader.dappChains = []
connectDappLoader.sessionProposal = null
connectDappLoader.availableNamespaces = null
connectDappLoader.sessionTopic = session.topic
let modal = connectDappLoader.item
if (!!modal) {
if (err) {
modal.pairFailed(session, err)
} else {
modal.pairSuccessful(session)
}
}
}
}
}