210 lines
5.3 KiB
QML
210 lines
5.3 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 AppLayouts.Wallet.services.dapps.types 1.0
|
|
|
|
import shared.stores 1.0
|
|
import utils 1.0
|
|
|
|
ConnectedDappsButton {
|
|
id: root
|
|
|
|
required property WalletConnectService wcService
|
|
|
|
signal dappsListReady()
|
|
signal pairWCReady()
|
|
signal displayToastMessage(string message, bool error)
|
|
|
|
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: root.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: root.wcService.validAccounts
|
|
flatNetworks: root.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)
|
|
}
|
|
}
|
|
}
|
|
|
|
Loader {
|
|
id: sessionRequestLoader
|
|
|
|
active: false
|
|
|
|
onLoaded: item.open()
|
|
|
|
property SessionRequestResolved request: null
|
|
|
|
sourceComponent: DAppRequestModal {
|
|
account: request.account
|
|
network: request.network
|
|
|
|
dappName: request.dappName
|
|
dappUrl: request.dappUrl
|
|
dappIcon: request.dappIcon
|
|
|
|
signContent: request.data.message
|
|
method: request.method
|
|
maxFeesText: request.maxFeesText
|
|
estimatedTimeText: request.estimatedTimeText
|
|
|
|
visible: true
|
|
|
|
onClosed: sessionRequestLoader.active = false
|
|
|
|
onSign: {
|
|
if (!request) {
|
|
console.error("Error signing: request is null")
|
|
return
|
|
}
|
|
root.wcService.requestHandler.authenticate(request)
|
|
}
|
|
|
|
onReject: {
|
|
let userRejected = true
|
|
root.wcService.requestHandler.rejectSessionRequest(request, userRejected)
|
|
close()
|
|
}
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target: root.wcService ? root.wcService.requestHandler : null
|
|
|
|
function onSessionRequestResult(request, payload, isSuccess) {
|
|
if (isSuccess) {
|
|
sessionRequestLoader.active = false
|
|
} else {
|
|
// TODO #14762 handle the error case
|
|
}
|
|
}
|
|
}
|
|
|
|
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)
|
|
}
|
|
}
|
|
}
|
|
|
|
function onSessionRequest(request) {
|
|
sessionRequestLoader.request = request
|
|
sessionRequestLoader.active = true
|
|
}
|
|
|
|
function onDisplayToastMessage(message, err) {
|
|
root.displayToastMessage(message, err)
|
|
}
|
|
}
|
|
}
|