From 6ed40c41fc8ddcd05662efd82289e175d02377b6 Mon Sep 17 00:00:00 2001 From: Stefan Date: Thu, 27 Jun 2024 17:15:17 +0300 Subject: [PATCH] feat(dapps) update persistance from the SDK on sessions refresh Updates: #15189 --- .../wallet_connect/controller.nim | 3 ++ .../service/wallet_connect/service.nim | 33 +++++++++++++++++-- src/backend/wallet_connect.nim | 33 +++++++++++++++++++ storybook/pages/DAppsWorkflowPage.qml | 14 ++++++++ .../services/dapps/DAppsListProvider.qml | 4 +++ ui/imports/shared/stores/DAppsStore.qml | 4 +++ vendor/status-go | 2 +- 7 files changed, 90 insertions(+), 3 deletions(-) diff --git a/src/app/modules/shared_modules/wallet_connect/controller.nim b/src/app/modules/shared_modules/wallet_connect/controller.nim index 0f19512ed6..302a05f263 100644 --- a/src/app/modules/shared_modules/wallet_connect/controller.nim +++ b/src/app/modules/shared_modules/wallet_connect/controller.nim @@ -30,6 +30,9 @@ QtObject: proc deactivateWalletConnectSession*(self: Controller, topic: string): bool {.slot.} = return self.service.deactivateSession(topic) + proc updateSessionsMarkedAsActive*(self: Controller, activeTopicsJson: string) {.slot.} = + self.service.updateSessionsMarkedAsActive(activeTopicsJson) + proc dappsListReceived*(self: Controller, dappsJson: string) {.signal.} # Emits signal dappsListReceived with the list of dApps diff --git a/src/app_service/service/wallet_connect/service.nim b/src/app_service/service/wallet_connect/service.nim index 5496ab9110..a5f26f573c 100644 --- a/src/app_service/service/wallet_connect/service.nim +++ b/src/app_service/service/wallet_connect/service.nim @@ -71,9 +71,38 @@ QtObject: # TODO #14588: call it async return status_go.addSession(session_json) - proc addSession*(self: Service, topic: string): bool = + proc deactivateSession*(self: Service, topic: string): bool = # TODO #14588: call it async - return status_go.deactivateSession(topic) + return status_go.disconnectSession(topic) + + proc updateSessionsMarkedAsActive*(self: Service, activeTopicsJson: string) = + # TODO #14588: call it async + let activeTopicsJN = parseJson(activeTopicsJson) + if activeTopicsJN.kind != JArray: + error "invalid array of json strings" + return + + var activeTopics = newSeq[string]() + for i in 0 ..< activeTopicsJN.len: + if activeTopicsJN[i].kind != JString: + error "bad topic entry at", i + return + activeTopics.add(activeTopicsJN[i].getStr()) + + let sessions = status_go.getActiveSessions(0) + if sessions.isNil: + error "failed to get active sessions" + return + + for session in sessions: + if session.kind != JObject or not session.hasKey("topic"): + error "unexpected session object" + continue + + let topic = session["topic"].getStr() + if not activeTopics.contains(topic): + if not status_go.disconnectSession(topic): + error "failed to mark session as disconnected", topic proc getDapps*(self: Service): string = let validAtEpoch = now().toTime().toUnix() diff --git a/src/backend/wallet_connect.nim b/src/backend/wallet_connect.nim index 0b4f4f886c..232b83ed4a 100644 --- a/src/backend/wallet_connect.nim +++ b/src/backend/wallet_connect.nim @@ -15,6 +15,12 @@ import app_service/common/utils rpc(addWalletConnectSession, "wallet"): sessionJson: string +rpc(disconnectWalletConnectSession, "wallet"): + topic: string + +rpc(getWalletConnectActiveSessions, "wallet"): + validAtTimestamp: int + rpc(signTypedDataV4, "wallet"): typedJson: string address: string @@ -31,6 +37,33 @@ proc addSession*(sessionJson: string): bool = warn "AddWalletConnectSession failed: ", "msg", e.msg return false +proc disconnectSession*(topic: string): bool = + try: + let rpcRes = disconnectWalletConnectSession(topic) + return isSuccessResponse(rpcRes): + except Exception as e: + warn "wallet_disconnectWalletConnectSession failed: ", "msg", e.msg + return false + +proc getActiveSessions*(validAtTimestamp: int): JsonNode = + try: + let rpcRes = getWalletConnectActiveSessions(validAtTimestamp) + if(not isSuccessResponse(rpcRes)): + return nil + + let jsonResultStr = rpcRes.result.getStr() + if jsonResultStr == "null": + return nil + + if rpcRes.result.kind != JArray: + error "Unexpected result kind: ", rpcRes.result.kind + return nil + + return rpcRes.result + except Exception as e: + warn "GetWalletConnectActiveSessions failed: ", "msg", e.msg + return nil + proc getDapps*(validAtEpoch: int64, testChains: bool): string = try: let params = %*[validAtEpoch, testChains] diff --git a/storybook/pages/DAppsWorkflowPage.qml b/storybook/pages/DAppsWorkflowPage.qml index 489065f46b..44a7591660 100644 --- a/storybook/pages/DAppsWorkflowPage.qml +++ b/storybook/pages/DAppsWorkflowPage.qml @@ -308,6 +308,20 @@ Item { return true } + function updateWalletConnectSessions(activeTopicsJson) { + console.info("Update Persisted Sessions", activeTopicsJson) + + let activeTopics = JSON.parse(activeTopicsJson) + let sessions = JSON.parse(settings.persistedSessions) + let newSessions = sessions.filter(function(session) { + return activeTopics.includes(session.topic) + }) + settings.persistedSessions = JSON.stringify(newSessions) + d.updateSessionsModelAndAddNewIfNotNull(null) + return true + } + + function getDapps() { let dappsJson = JSON.stringify(d.persistedDapps) this.dappsListReceived(dappsJson) diff --git a/ui/app/AppLayouts/Wallet/services/dapps/DAppsListProvider.qml b/ui/app/AppLayouts/Wallet/services/dapps/DAppsListProvider.qml index 5c62326bbd..2dfc42da45 100644 --- a/ui/app/AppLayouts/Wallet/services/dapps/DAppsListProvider.qml +++ b/ui/app/AppLayouts/Wallet/services/dapps/DAppsListProvider.qml @@ -50,6 +50,7 @@ QObject { root.store.dappsListReceived.disconnect(dappsListReceivedFn); let tmpMap = {} + var topics = [] for (let key in sessions) { let dapp = sessions[key].peer.metadata if (!!dapp.icons && dapp.icons.length > 0) { @@ -58,6 +59,7 @@ QObject { dapp.iconUrl = "" } tmpMap[dapp.url] = dapp; + topics.push(key) } // TODO #14755: on SDK dApps refresh update the model that has data source from persistence instead of using reset dapps.clear(); @@ -65,6 +67,8 @@ QObject { for (let key in tmpMap) { dapps.append(tmpMap[key]); } + + root.store.updateWalletConnectSessions(JSON.stringify(topics)) }); } diff --git a/ui/imports/shared/stores/DAppsStore.qml b/ui/imports/shared/stores/DAppsStore.qml index 2bed45fd98..41b9055de0 100644 --- a/ui/imports/shared/stores/DAppsStore.qml +++ b/ui/imports/shared/stores/DAppsStore.qml @@ -20,6 +20,10 @@ QObject { return controller.deactivateWalletConnectSession(topic) } + function updateWalletConnectSessions(activeTopicsJson) { + return controller.updateSessionsMarkedAsActive(activeTopicsJson) + } + function authenticateUser(topic, id, address) { let ok = controller.authenticateUser(topic, id, address) if(!ok) { diff --git a/vendor/status-go b/vendor/status-go index 2bc2099d55..85660e1740 160000 --- a/vendor/status-go +++ b/vendor/status-go @@ -1 +1 @@ -Subproject commit 2bc2099d55407af2c56bebe849ffed12929761ca +Subproject commit 85660e17405c56c86a737fae933a6b757abc06f6