fix(WalletConnect): dApp connection state presented in the UI is out-of sync
1. The DAppsListProvider needs to receive all the user accounts so that it can process all dapps the user is connected to (the dapps filtering based on selected account is an internal impl. detail)
2. Call `revokeSession` on disconnect only if the dapp cannot be found in the WC active sessions. There is some overlapping between Browser connector and Wallet connect because both operate on the same data stored in the DB. If Browser connector controller removes WC data, the WC disconnect flows cannot be successfully completed.
3. Reuse the same notification flow for Browser connector as it's used for WC
4. Fix dapp filtering when processing the dapps that will be displayed in the UI.
(cherry picked from commit 21227893c2
)
This commit is contained in:
parent
3c18ac0f7a
commit
8d78f0fab2
|
@ -60,19 +60,15 @@ QObject {
|
||||||
let dappsList = JSON.parse(dappsJson);
|
let dappsList = JSON.parse(dappsJson);
|
||||||
for (let i = 0; i < dappsList.length; i++) {
|
for (let i = 0; i < dappsList.length; i++) {
|
||||||
const cachedEntry = dappsList[i];
|
const cachedEntry = dappsList[i];
|
||||||
let accountAddresses = cachedEntry.accountAddresses
|
// TODO #15075: on SDK dApps refresh update the model that has data source from persistence instead of using reset
|
||||||
if (!accountAddresses) {
|
|
||||||
accountAddresses = [{address: ''}];
|
|
||||||
}
|
|
||||||
|
|
||||||
const dappEntryWithRequiredRoles = {
|
const dappEntryWithRequiredRoles = {
|
||||||
description: cachedEntry.description,
|
description: "",
|
||||||
url: cachedEntry.url,
|
url: cachedEntry.url,
|
||||||
name: cachedEntry.name,
|
name: cachedEntry.name,
|
||||||
iconUrl: cachedEntry.url,
|
iconUrl: cachedEntry.iconUrl,
|
||||||
accountAddresses: cachedEntry.accountAddresses
|
accountAddresses: [{address: ''}]
|
||||||
}
|
}
|
||||||
dapps.append(dappsList[i]);
|
dapps.append(dappEntryWithRequiredRoles);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
root.store.dappsListReceived.connect(dappsListReceivedFn);
|
root.store.dappsListReceived.connect(dappsListReceivedFn);
|
||||||
|
@ -103,7 +99,7 @@ QObject {
|
||||||
if (existingDApp) {
|
if (existingDApp) {
|
||||||
// In Qt5.15.2 this is the way to make a "union" of two arrays
|
// In Qt5.15.2 this is the way to make a "union" of two arrays
|
||||||
// more modern syntax (ES-6) is not available yet
|
// more modern syntax (ES-6) is not available yet
|
||||||
const combinedAddresses = new Set(existingDApp.accountAddresses.concat(dapp.accountAddresses));
|
const combinedAddresses = new Set(existingDApp.accountAddresses.concat(accounts));
|
||||||
existingDApp.accountAddresses = Array.from(combinedAddresses);
|
existingDApp.accountAddresses = Array.from(combinedAddresses);
|
||||||
} else {
|
} else {
|
||||||
dapp.accountAddresses = accounts
|
dapp.accountAddresses = accounts
|
||||||
|
|
|
@ -503,7 +503,6 @@ WalletConnectSDKBase {
|
||||||
controller.recallDAppPermission(dAppUrl)
|
controller.recallDAppPermission(dAppUrl)
|
||||||
const session = { url: dAppUrl, name: "", icon: "" }
|
const session = { url: dAppUrl, name: "", icon: "" }
|
||||||
root.wcService.connectorDAppsProvider.revokeSession(JSON.stringify(session))
|
root.wcService.connectorDAppsProvider.revokeSession(JSON.stringify(session))
|
||||||
root.wcService.displayToastMessage(qsTr("Disconnected from %1").arg(dAppUrl), false)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -128,6 +128,7 @@ QObject {
|
||||||
function disconnectDapp(url) {
|
function disconnectDapp(url) {
|
||||||
wcSDK.getActiveSessions((allSessionsAllProfiles) => {
|
wcSDK.getActiveSessions((allSessionsAllProfiles) => {
|
||||||
const sessions = DAppsHelpers.filterActiveSessionsForKnownAccounts(allSessionsAllProfiles, validAccounts)
|
const sessions = DAppsHelpers.filterActiveSessionsForKnownAccounts(allSessionsAllProfiles, validAccounts)
|
||||||
|
let dappFoundInWcSessions = false
|
||||||
for (const sessionID in sessions) {
|
for (const sessionID in sessions) {
|
||||||
const session = sessions[sessionID]
|
const session = sessions[sessionID]
|
||||||
const accountsInSession = DAppsHelpers.getAccountsInSession(session)
|
const accountsInSession = DAppsHelpers.getAccountsInSession(session)
|
||||||
|
@ -137,13 +138,19 @@ QObject {
|
||||||
if (!dappsProvider.selectedAddress ||
|
if (!dappsProvider.selectedAddress ||
|
||||||
(accountsInSession.includes(dappsProvider.selectedAddress)))
|
(accountsInSession.includes(dappsProvider.selectedAddress)))
|
||||||
{
|
{
|
||||||
|
dappFoundInWcSessions = true
|
||||||
wcSDK.disconnectSession(topic)
|
wcSDK.disconnectSession(topic)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
root.revokeSession(url)
|
// TODO: #16044 - Refactor Wallet connect service to handle multiple SDKs
|
||||||
|
if (!dappFoundInWcSessions) {
|
||||||
|
// Revoke browser plugin session
|
||||||
|
root.revokeSession(url)
|
||||||
|
d.notifyDappDisconnect(url, false)
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDApp(dAppUrl) {
|
function getDApp(dAppUrl) {
|
||||||
|
@ -332,18 +339,7 @@ QObject {
|
||||||
|
|
||||||
sdk: root.wcSDK
|
sdk: root.wcSDK
|
||||||
store: root.store
|
store: root.store
|
||||||
supportedAccountsModel: SortFilterProxyModel {
|
supportedAccountsModel: d.supportedAccountsModel
|
||||||
objectName: "SelectedAddressModelForDAppsListProvider"
|
|
||||||
sourceModel: d.supportedAccountsModel
|
|
||||||
filters: FastExpressionFilter {
|
|
||||||
enabled: !root.walletRootStore.showAllAccounts
|
|
||||||
|
|
||||||
expression: root.walletRootStore.selectedAddress.toLowerCase() === model.address.toLowerCase()
|
|
||||||
|
|
||||||
expectedRoles: ["address"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
selectedAddress: root.walletRootStore.selectedAddress
|
selectedAddress: root.walletRootStore.selectedAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue