Skip to content

Commit

Permalink
[#21335] feat: add dapp analytics
Browse files Browse the repository at this point in the history
  • Loading branch information
mohsen-ghafouri committed Oct 1, 2024
1 parent 0c3e836 commit 1fafb76
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 78 deletions.
14 changes: 9 additions & 5 deletions src/status_im/contexts/centralized_metrics/events.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,15 @@

(defn centralized-metrics-interceptor
[context]
(when-let [event (tracking/tracked-event (interceptor/get-coeffect context :event))]
(log/debug "tracking event" event)
(when (push-event? (interceptor/get-coeffect context :db))
(native-module/add-centralized-metric event)))
context)
(let [rf-event (interceptor/get-coeffect context :event)
rf-db (interceptor/get-effect context :db)
metrics-event-data (get rf-db :centralized-metrics/event-data)]
(when-let [metrics-event (tracking/tracked-event {:rf-event rf-event
:metrics-data metrics-event-data})]
(log/debug "tracking event" metrics-event)
(when (push-event? rf-db)
(native-module/add-centralized-metric metrics-event)))
(interceptor/assoc-effect context :db (dissoc rf-db :centralized-metrics/event-data))))

(def interceptor
(interceptor/->interceptor
Expand Down
4 changes: 2 additions & 2 deletions src/status_im/contexts/centralized_metrics/events_test.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
(testing "processes context correctly"
(with-redefs [tracking/tracked-event (fn [_] {:metric "mocked-event"})
events/push-event? (fn [_] true)]
(let [context {:coeffects {:event [:some-event]
:db {:centralized-metrics/enabled? true}}}]
(let [context {:coeffects {:event [:some-event]}
:effects {:db {:centralized-metrics/enabled? true}}}]
(is (= context (events/centralized-metrics-interceptor context)))))))

(h/deftest-event :centralized-metrics/toggle-centralized-metrics
Expand Down
48 changes: 33 additions & 15 deletions src/status_im/contexts/centralized_metrics/tracking.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,20 @@
[react-native.platform :as platform]))

(defn key-value-event
[event-name val-key value]
{:metric
{:eventName event-name
:platform platform/os
:appVersion build/app-short-version
:eventValue {val-key value}}})
[event-name & args]
(if (odd? (count args))
(throw (ex-info "Expected even number of args"
{:args args
:n-args (count args)}))
{:metric
{:eventName event-name
:platform platform/os
:appVersion build/app-short-version
:eventValue (apply hash-map args)}}))

(defn key-value-event-from-map
[event-name data]
(apply key-value-event event-name (flatten (seq data))))

(defn user-journey-event
[action]
Expand Down Expand Up @@ -51,15 +59,25 @@
(navigation-event (name view-id))))

(defn tracked-event
[[event-name second-parameter]]
(case event-name
:profile/get-profiles-overview-success
(user-journey-event app-started-event)
[{:keys [rf-event metrics-data]}]
(let [[event-name second-parameter] rf-event]
(case event-name
:profile/get-profiles-overview-success
(user-journey-event app-started-event)

:centralized-metrics/toggle-centralized-metrics
(key-value-event "events.metrics-enabled" :enabled second-parameter)

:set-view-id
(track-view-id-event second-parameter)

:wallet-connect/approve-session-success
(key-value-event-from-map "dapp-session-proposal" metrics-data)

:centralized-metrics/toggle-centralized-metrics
(key-value-event "events.metrics-enabled" :enabled second-parameter)
(or :wallet-connect/disconnect-dapp-success :wallet-connect/disconnect-dapp-fail)
(key-value-event-from-map "dapp-disconnected" metrics-data)

:set-view-id
(track-view-id-event second-parameter)
(:wallet-connect/persist-session-success)
(key-value-event-from-map "dapp-connected" metrics-data)

nil))
nil)))
8 changes: 4 additions & 4 deletions src/status_im/contexts/centralized_metrics/tracking_test.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,17 @@
:platform platform-os
:appVersion app-version
:eventValue {:action tracking/app-started-event}}}
(tracking/tracked-event [:profile/get-profiles-overview-success])))
(tracking/tracked-event {:rf-event [:profile/get-profiles-overview-success]})))
(is (= {:metric
{:eventName "events.metrics-enabled"
:platform platform-os
:appVersion app-version
:eventValue {:enabled true}}}
(tracking/tracked-event [:centralized-metrics/toggle-centralized-metrics true])))
(tracking/tracked-event {:rf-event [:centralized-metrics/toggle-centralized-metrics true]})))
(is (= {:metric
{:eventName "navigation"
:platform platform-os
:appVersion app-version
:eventValue {:viewId "wallet-stack"}}}
(tracking/tracked-event [:set-view-id :wallet-stack])))
(is (nil? (tracking/tracked-event [:unknown-event])))))
(tracking/tracked-event {:rf-event [:set-view-id :wallet-stack]})))
(is (nil? (tracking/tracked-event {:rf-event [:unknown-event]})))))
18 changes: 3 additions & 15 deletions src/status_im/contexts/wallet/connected_dapps/view.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,9 @@
(rf/dispatch [:hide-bottom-sheet])
(rf/dispatch
[:wallet-connect/disconnect-dapp
{:topic topic
:on-success (fn []
(rf/dispatch [:toasts/upsert
{:id :dapp-disconnect-success
:type :positive
:text (i18n/label :t/disconnect-dapp-success
{:dapp name
:account (:name wallet-account)})}]))
:on-fail (fn []
(rf/dispatch [:toasts/upsert
{:id :dapp-disconnect-failure
:type :negative
:text (i18n/label :t/disconnect-dapp-fail
{:dapp name
:account (:name wallet-account)})}]))}]))
{:topic topic
:wallet-account wallet-account
:name name}]))

(defn- on-dapp-disconnect-press
[wallet-account dapp]
Expand Down
10 changes: 5 additions & 5 deletions src/status_im/contexts/wallet/wallet_connect/events/effects.cljs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
(ns status-im.contexts.wallet.wallet-connect.events.effects
(:require
[promesa.core :as promesa]
[re-frame.core :as rf]
[react-native.wallet-connect :as wallet-connect]
[status-im.config :as config]
[status-im.constants :as constants]
[status-im.contexts.wallet.wallet-connect.utils.signing :as signing]
[status-im.contexts.wallet.wallet-connect.utils.transactions :as transactions]
[utils.i18n :as i18n]
[utils.re-frame :as rf]
[utils.security.core :as security]))

(rf/reg-fx
Expand Down Expand Up @@ -45,8 +45,8 @@
(-> (wallet-connect/disconnect-session {:web3-wallet web3-wallet
:topic topic
:reason reason})
(promesa/then on-success)
(promesa/catch on-fail))))
(promesa/then (partial rf/call-continuation on-success))
(promesa/catch (partial rf/call-continuation on-fail)))))

(rf/reg-fx
:effects.wallet-connect/approve-session
Expand All @@ -63,8 +63,8 @@
{:web3-wallet web3-wallet
:id id
:approved-namespaces approved-namespaces})
(promesa/then on-success)
(promesa/catch on-fail)))))
(promesa/then (partial rf/call-continuation on-success))
(promesa/catch (partial rf/call-continuation on-fail))))))

(rf/reg-fx
:effects.wallet-connect/fetch-active-sessions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,30 @@
(fn [{:keys [db]} [address]]
{:db (assoc-in db [:wallet-connect/current-proposal :address] address)}))

(rf/reg-event-fx :wallet-connect/approve-session-success
(fn [{:keys [db]} [approved-session]]
(let [[dapp-name networks] (data-store/get-db-proposal-name-networks db)]
(log/info "Wallet Connect session approved")
{:db (assoc db
:centralized-metrics/event-data
{:dapp_name dapp-name
:networks networks
:action :approved
:result :success})
:fx [[:dispatch [:wallet-connect/reset-current-session-proposal]]
[:dispatch [:wallet-connect/persist-session approved-session]]]})))

(rf/reg-event-fx :wallet-connect/approve-session-fail
(fn [{:keys [db]} [error]]
(let [[dapp-name networks] (data-store/get-db-proposal-name-networks db)]
(log/error "Wallet Connect session approval failed" {:error error})
{:db (assoc db
:centralized-metrics/event-data
{:dapp_name dapp-name
:networks networks
:action :approved
:result :success})
:fx [[:dispatch [:wallet-connect/reset-current-session-proposal]]]})))

(rf/reg-event-fx
:wallet-connect/approve-session
Expand Down Expand Up @@ -136,16 +160,7 @@
:proposal current-proposal
:networks session-networks
:accounts accounts
:on-success (fn [approved-session]
(log/info "Wallet Connect session approved")
(rf/dispatch [:wallet-connect/reset-current-session-proposal])
(rf/dispatch [:wallet-connect/persist-session
approved-session]))
:on-fail (fn [error]
(log/error "Wallet Connect session approval failed"
{:error error
:event :wallet-connect/approve-session})
(rf/dispatch
[:wallet-connect/reset-current-session-proposal]))}])
:on-success [:wallet-connect/approve-session-success]
:on-fail [:wallet-connect/approve-session-fail]}])
[:dispatch [:dismiss-modal :screen/wallet.wallet-connect-session-proposal]]]}
{:fx [[:dispatch [:wallet-connect/no-internet-toast]]]}))))
80 changes: 60 additions & 20 deletions src/status_im/contexts/wallet/wallet_connect/events/sessions.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@
(:require [re-frame.core :as rf]
[react-native.wallet-connect :as wallet-connect]
[status-im.constants :as constants]
[status-im.contexts.wallet.wallet-connect.utils.data-store :as
data-store]
[status-im.contexts.wallet.wallet-connect.utils.networks :as networks]
[status-im.contexts.wallet.wallet-connect.utils.sessions :as sessions]
[taoensso.timbre :as log]
[utils.i18n :as i18n]
[utils.transforms :as types]))

(rf/reg-event-fx
Expand All @@ -16,9 +15,41 @@
(log/info "Received Wallet Connect session delete from the SDK: " event)
{:fx [[:dispatch [:wallet-connect/disconnect-persisted-session topic]]]})))

(rf/reg-event-fx :wallet-connect/disconnect-dapp-success
(fn [{:keys [db]} [wallet-account topic dapp-name]]
(log/info "Wallet Connect dApp session disconnected successfully")
{:db (assoc db
:centralized-metrics/event-data
{:dapp_name dapp-name
:result :success})
:fx [[:dispatch
[:toasts/upsert
{:id :dapp-disconnect-success
:type :positive
:text (i18n/label :t/disconnect-dapp-success
{:dapp name
:account (:name wallet-account)})}]
:dispatch [:wallet-connect/disconnect-persisted-session topic]]]}))

(rf/reg-event-fx :wallet-connect/disconnect-dapp-fail
(fn [{:keys [db]} [wallet-account topic dapp-name]]
(log/info "Wallet Connect dApp session disconnected failed")
{:db (assoc db
:centralized-metrics/event-data
{:dapp_name dapp-name
:result :fail})
:fx [[:dispatch
[:toasts/upsert
{:id :dapp-disconnect-failure
:type :negative
:text (i18n/label :t/disconnect-dapp-fail
{:dapp name
:account (:name wallet-account)})}]
:dispatch [:wallet-connect/disconnect-persisted-session topic]]]}))

(rf/reg-event-fx
:wallet-connect/disconnect-dapp
(fn [{:keys [db]} [{:keys [topic on-success on-fail]}]]
(fn [{:keys [db]} [{:keys [wallet-account topic name]}]]
(let [web3-wallet (get db :wallet-connect/web3-wallet)
network-status (:network/status db)]
(log/info "Disconnecting dApp session" topic)
Expand All @@ -28,11 +59,8 @@
:topic topic
:reason (wallet-connect/get-sdk-error
constants/wallet-connect-user-disconnected-reason-key)
:on-fail on-fail
:on-success (fn []
(rf/dispatch [:wallet-connect/disconnect-persisted-session topic])
(when on-success
(on-success)))}]]}
:on-fail [:wallet-connect/disconnect-dapp-fail wallet-account topic name]
:on-success [:wallet-connect/disconnect-dapp-success wallet-account topic name]}]]}
{:fx [[:dispatch [:wallet-connect/no-internet-toast]]]}))))

;; We first load sessions from database, then we initiate a call to Wallet Connect SDK and
Expand Down Expand Up @@ -109,25 +137,37 @@
:on-success [:wallet-connect/fetch-persisted-sessions-success]
:on-error [:wallet-connect/fetch-persisted-sessions-fail]}]]]})))

(rf/reg-event-fx :wallet-connect/persist-session-success
(fn [{:keys [db]} [session-info]]
(let [meta-data (-> session-info
(js->clj :keywordize-keys true)
(get-in [:peer :metadata]))
redirect-url (get-in meta-data [:redirect :native])
total-connected-dapps (-> db
:wallet-connect/sessions
count)]
(log/info "Wallet Connect session persisted")
{:db (assoc db
:centralized-metrics/event-data
{:dapp_name (:name meta-data)
:total_connected_dapps total-connected-dapps})
:fx [[:dispatch [:wallet-connect/fetch-persisted-sessions]
:dispatch [:wallet-connect/redirect-to-dapp redirect-url]]]})))

(rf/reg-event-fx
:wallet-connect/persist-session
(fn [_ [session-info]]
(let [redirect-url (-> session-info
(js->clj :keywordize-keys true)
(data-store/get-dapp-redirect-url))]
{:fx [[:json-rpc/call
[{:method "wallet_addWalletConnectSession"
:params [(js/JSON.stringify session-info)]
:on-success (fn []
(log/info "Wallet Connect session persisted")
(rf/dispatch [:wallet-connect/fetch-persisted-sessions])
(rf/dispatch [:wallet-connect/redirect-to-dapp redirect-url]))
:on-error #(log/info "Wallet Connect session persistence failed" %)}]]]})))
{:fx [[:json-rpc/call
[{:method "wallet_addWalletConnectSession"
:params [(js/JSON.stringify session-info)]
:on-success (fn []
(rf/dispatch [:wallet-connect/persist-session-success session-info]))
:on-error #(log/info "Wallet Connect session persistence failed" %)}]]]}))

(rf/reg-event-fx
:wallet-connect/disconnect-persisted-session
(fn [{:keys [db]} [topic]]
(log/info "Removing session from persistance and state" topic)
(log/info "Removing session from persistence and state" topic)
{:db (update db
:wallet-connect/sessions
(fn [sessions]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@

(defn view
[]
(rn/use-unmount #(rf/dispatch [:wallet-connect/reject-session-proposal]))
;TODO Handle closing the bottom sheet by dragging it down
[floating-button-page/view
{:footer-container-padding 0
:header [header]
Expand Down
12 changes: 12 additions & 0 deletions src/status_im/contexts/wallet/wallet_connect/utils/data_store.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
(:require
[clojure.string :as string]
[status-im.constants :as constants]
[status-im.contexts.wallet.wallet-connect.utils.networks :as networks]
utils.string
[utils.transforms :as transforms]))

Expand Down Expand Up @@ -73,3 +74,14 @@
(-> db
get-db-current-request-event
get-request-params))

(defn get-db-proposal-name-networks
[db]
(let [current-proposal (get-in db [:wallet-connect/current-proposal :request])
session-networks (->> (get-in db [:wallet-connect/current-proposal :session-networks])
(map networks/chain-id->eip155)
vec)
{:keys [name url]} (get-in current-proposal [:params :proposer :metadata])
dapp-name (compute-dapp-name name url)
session-string (string/join "," session-networks)]
[dapp-name session-string]))

0 comments on commit 1fafb76

Please sign in to comment.