diff --git a/src/react_native/wallet_connect.cljs b/src/react_native/wallet_connect.cljs index 609a23823d..e9f5e6b45c 100644 --- a/src/react_native/wallet_connect.cljs +++ b/src/react_native/wallet_connect.cljs @@ -87,3 +87,11 @@ event #(-> (bean/->clj %) handler))) + +(defn unregister-handler + [{:keys [web3-wallet event handler]}] + (oops/ocall web3-wallet + "off" + event + #(-> (bean/->clj %) + handler))) diff --git a/src/status_im/common/universal_links.cljs b/src/status_im/common/universal_links.cljs index 730b6c5af1..b1830834fd 100644 --- a/src/status_im/common/universal_links.cljs +++ b/src/status_im/common/universal_links.cljs @@ -108,8 +108,7 @@ (rf/defn handle-wallet-connect [_ uri] (log/info "universal-links: handle-wallet-connect" uri) - {:dispatch-later {:ms 1500 - :dispatch [:wallet-connect/on-scan-connection uri]}}) + {:dispatch [:wallet-connect/process-deeplink uri]}) (defn dispatch-url "Dispatch url so we can get access to re-frame/db" diff --git a/src/status_im/contexts/profile/logout/events.cljs b/src/status_im/contexts/profile/logout/events.cljs index 35b4559e18..d92274fe80 100644 --- a/src/status_im/contexts/profile/logout/events.cljs +++ b/src/status_im/contexts/profile/logout/events.cljs @@ -44,6 +44,7 @@ {:db (assoc db :profile/logging-out? true) ;; We need to disable notifications before starting the logout process :fx [[:dispatch [:profile.logout/disable-notifications]] + [:dispatch [:wallet-connect/unregister-event-listeners]] [:dispatch-later {:ms 100 :dispatch [:profile.logout/reset-state]}]]})) diff --git a/src/status_im/contexts/wallet/wallet_connect/events/core.cljs b/src/status_im/contexts/wallet/wallet_connect/events/core.cljs index de501c8ff1..643656f6a3 100644 --- a/src/status_im/contexts/wallet/wallet_connect/events/core.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/events/core.cljs @@ -30,7 +30,8 @@ (log/info "WalletConnect SDK initialisation successful") {:db (assoc db :wallet-connect/web3-wallet web3-wallet) :fx [[:dispatch [:wallet-connect/register-event-listeners]] - [:dispatch [:wallet-connect/get-sessions]]]})) + [:dispatch [:wallet-connect/get-sessions]] + [:dispatch [:wallet-connect/pair-with-pending-deeplink]]]})) (rf/reg-event-fx :wallet-connect/reload-on-network-change @@ -40,6 +41,19 @@ (log/info "Re-Initialising WalletConnect SDK due to network change") {:fx [[:dispatch [:wallet-connect/init]]]})))) +(defn- on-session-proposal + [data] + (rf/dispatch [:wallet-connect/on-session-proposal data])) + +(defn- on-session-request + [data] + (rf/dispatch [:wallet-connect/on-session-request data])) + +(defn- on-session-delete + [data] + (rf/dispatch [:wallet-connect/on-session-delete data])) + + (rf/reg-event-fx :wallet-connect/register-event-listeners (fn [{:keys [db]}] @@ -47,15 +61,32 @@ {:fx [[:effects.wallet-connect/register-event-listener [web3-wallet constants/wallet-connect-session-proposal-event - #(rf/dispatch [:wallet-connect/on-session-proposal %])]] + on-session-proposal]] [:effects.wallet-connect/register-event-listener [web3-wallet constants/wallet-connect-session-request-event - #(rf/dispatch [:wallet-connect/on-session-request %])]] + on-session-request]] [:effects.wallet-connect/register-event-listener [web3-wallet constants/wallet-connect-session-delete-event - #(rf/dispatch [:wallet-connect/on-session-delete %])]]]}))) + on-session-delete]]]}))) + +(rf/reg-event-fx + :wallet-connect/unregister-event-listeners + (fn [{:keys [db]}] + (let [web3-wallet (get db :wallet-connect/web3-wallet)] + {:fx [[:effects.wallet-connect/unregister-event-listener + [web3-wallet + constants/wallet-connect-session-proposal-event + on-session-proposal]] + [:effects.wallet-connect/unregister-event-listener + [web3-wallet + constants/wallet-connect-session-request-event + on-session-request]] + [:effects.wallet-connect/unregister-event-listener + [web3-wallet + constants/wallet-connect-session-delete-event + on-session-delete]]]}))) (rf/reg-event-fx :wallet-connect/on-init-fail diff --git a/src/status_im/contexts/wallet/wallet_connect/events/effects.cljs b/src/status_im/contexts/wallet/wallet_connect/events/effects.cljs index cd1761459a..7b18145e58 100644 --- a/src/status_im/contexts/wallet/wallet_connect/events/effects.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/events/effects.cljs @@ -34,6 +34,14 @@ :event wc-event :handler handler}))) +(rf/reg-fx + :effects.wallet-connect/unregister-event-listener + (fn [[web3-wallet wc-event handler]] + (wallet-connect/unregister-handler + {:web3-wallet web3-wallet + :event wc-event + :handler handler}))) + (rf/reg-fx :effects.wallet-connect/pair (fn [{:keys [web3-wallet url on-success on-fail]}] diff --git a/src/status_im/contexts/wallet/wallet_connect/events/session_proposals.cljs b/src/status_im/contexts/wallet/wallet_connect/events/session_proposals.cljs index 01dc8ab803..ae868a2860 100644 --- a/src/status_im/contexts/wallet/wallet_connect/events/session_proposals.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/events/session_proposals.cljs @@ -21,6 +21,21 @@ :on-fail #(log/error "Failed to pair with dApp" {:error %}) :on-success #(log/info "dApp paired successfully")}]]}))) +(rf/reg-event-fx + :wallet-connect/process-deeplink + (fn [{:keys [db]} [url]] + (let [web3-wallet (get db :wallet-connect/web3-wallet)] + (if web3-wallet + {:fx [[:dispatch [:wallet-connect/on-scan-connection url]]]} + {:db (assoc db :wallet-connect/pending-url url)})))) + +(rf/reg-event-fx + :wallet-connect/pair-with-pending-deeplink + (fn [{:keys [db]}] + (when-let [pending-url (get db :wallet-connect/pending-url)] + {:db (dissoc db :wallet-connect/pending-url) + :fx [[:dispatch [:wallet-connect/on-scan-connection pending-url]]]}))) + (rf/reg-event-fx :wallet-connect/on-scan-connection (fn [{:keys [db]} [scanned-text]]