chore: refactor screens definitions and add more navigation events for screens (#21328)
This change refactors the navigation-screens namespace to organise each screen definition into a group based on the app features. It also adds some metrics tracking to all the of the screens defined in the navigation-screens namespace. Additionally, in this change we've introduced a new build configuration for shadow-cljs which allows us to conditionally include code for certain shadow-cljs builds. In this case, we've decided to only exclude the metrics re-frame interceptor from being required when running the component-tests build. This is due to a complication with the metrics interceptor depending on the navigation-screens namespace, which would eventually require many other third-party dependencies that do not have mocks defined for the component tests. To avoid defining more mocks, we've avoided requiring the metrics interceptor for now.
This commit is contained in:
parent
ea18966f33
commit
65cdb0dfe7
|
@ -95,7 +95,8 @@
|
||||||
;; otherwise sometimes you'll get weird errors when
|
;; otherwise sometimes you'll get weird errors when
|
||||||
;; instrumenting functions.
|
;; instrumenting functions.
|
||||||
:static-fns false
|
:static-fns false
|
||||||
:infer-externs true}
|
:infer-externs true
|
||||||
|
:reader-features #{:mobile}}
|
||||||
;; if you want to use a real device, set your local ip
|
;; if you want to use a real device, set your local ip
|
||||||
;; in the SHADOW_HOST env variable to make sure that
|
;; in the SHADOW_HOST env variable to make sure that
|
||||||
;; it will use the right interface
|
;; it will use the right interface
|
||||||
|
@ -129,7 +130,8 @@
|
||||||
:static-fns true
|
:static-fns true
|
||||||
:fn-invoke-direct true
|
:fn-invoke-direct true
|
||||||
:optimizations :advanced
|
:optimizations :advanced
|
||||||
:js-options {:js-provider :closure}}}}
|
:js-options {:js-provider :closure}
|
||||||
|
:reader-features #{:mobile}}}}
|
||||||
;; the tests are ran with node, react-native dependencies are mocked
|
;; the tests are ran with node, react-native dependencies are mocked
|
||||||
;; by using node --require override.js, which uses the node-library
|
;; by using node --require override.js, which uses the node-library
|
||||||
;; produced by the target :mocks below and redefines node require
|
;; produced by the target :mocks below and redefines node require
|
||||||
|
@ -169,12 +171,13 @@
|
||||||
{;; needed because we override require and it
|
{;; needed because we override require and it
|
||||||
;; messes with source-map which reports callstack
|
;; messes with source-map which reports callstack
|
||||||
;; exceeded exceptions instead of real issues
|
;; exceeded exceptions instead of real issues
|
||||||
:source-map false
|
:source-map false
|
||||||
;; needed because we use deref in tests
|
;; needed because we use deref in tests
|
||||||
:static-fns false
|
:static-fns false
|
||||||
:optimizations :simple
|
:optimizations :simple
|
||||||
:warnings {:fn-deprecated false}
|
:warnings {:fn-deprecated false}
|
||||||
:infer-externs true}}
|
:infer-externs true
|
||||||
|
:reader-features #{:mobile}}}
|
||||||
|
|
||||||
;; mock.js-dependencies is mocking the react-native libraries
|
;; mock.js-dependencies is mocking the react-native libraries
|
||||||
;; we build it as a node library so that it can be required by
|
;; we build it as a node library so that it can be required by
|
||||||
|
|
|
@ -14,10 +14,13 @@
|
||||||
|
|
||||||
(defn centralized-metrics-interceptor
|
(defn centralized-metrics-interceptor
|
||||||
[context]
|
[context]
|
||||||
(when-let [event (tracking/metrics-event (interceptor/get-coeffect context :event))]
|
(when (push-event? (interceptor/get-coeffect context :db))
|
||||||
(log/debug "tracking event" event)
|
(when-let [event (tracking/metrics-event (interceptor/get-coeffect context :event))]
|
||||||
(when (push-event? (interceptor/get-coeffect context :db))
|
(log/debug "tracking event" event)
|
||||||
(native-module/add-centralized-metric event)))
|
(if (or (seq? event) (vector? event))
|
||||||
|
(doseq [e event]
|
||||||
|
(native-module/add-centralized-metric e))
|
||||||
|
(native-module/add-centralized-metric event))))
|
||||||
context)
|
context)
|
||||||
|
|
||||||
(def interceptor
|
(def interceptor
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
(ns status-im.contexts.centralized-metrics.tracking
|
(ns status-im.contexts.centralized-metrics.tracking
|
||||||
(:require
|
(:require
|
||||||
|
[clojure.string]
|
||||||
[legacy.status-im.utils.build :as build]
|
[legacy.status-im.utils.build :as build]
|
||||||
[react-native.platform :as platform]))
|
[react-native.platform :as platform]
|
||||||
|
[status-im.navigation.screens :as screens]))
|
||||||
|
|
||||||
(defn key-value-event
|
(defn key-value-event
|
||||||
[event-name event-value]
|
[event-name event-value]
|
||||||
|
@ -19,39 +21,31 @@
|
||||||
[view-id]
|
[view-id]
|
||||||
(key-value-event "navigation" {:viewId view-id}))
|
(key-value-event "navigation" {:viewId view-id}))
|
||||||
|
|
||||||
|
(defn screen-event
|
||||||
|
[screen event-data]
|
||||||
|
(let [screen-id (:name screen)
|
||||||
|
view-id (get-in screen [:metrics :alias-id] screen-id)]
|
||||||
|
{:metric
|
||||||
|
{:eventName "navigation"
|
||||||
|
:platform platform/os
|
||||||
|
:appVersion build/app-short-version
|
||||||
|
:eventValue (assoc event-data :viewId (name view-id))}}))
|
||||||
|
|
||||||
(def ^:const app-started-event "app-started")
|
(def ^:const app-started-event "app-started")
|
||||||
|
|
||||||
(def ^:const view-ids-to-track
|
(def ^:const view-ids-to-track
|
||||||
#{;; Tabs
|
#{;; Tabs
|
||||||
:communities-stack
|
:communities-stack
|
||||||
:chats-stack
|
:chats-stack
|
||||||
:wallet-stack
|
:wallet-stack})
|
||||||
|
|
||||||
;; Onboarding
|
|
||||||
:screen/onboarding.intro
|
|
||||||
:screen/onboarding.new-to-status
|
|
||||||
:screen/onboarding.sync-or-recover-profile
|
|
||||||
:screen/onboarding.enter-seed-phrase
|
|
||||||
:screen/onboarding.create-profile
|
|
||||||
:screen/onboarding.create-profile-password
|
|
||||||
:screen/onboarding.enable-biometrics
|
|
||||||
:screen/onboarding.generating-keys
|
|
||||||
:screen/onboarding.enable-notifications
|
|
||||||
:screen/onboarding.preparing-status
|
|
||||||
:screen/onboarding.sign-in-intro
|
|
||||||
:screen/onboarding.sign-in
|
|
||||||
:screen/onboarding.syncing-progress
|
|
||||||
:screen/onboarding.syncing-progress-intro
|
|
||||||
:screen/onboarding.syncing-results
|
|
||||||
:screen/onboarding.welcome
|
|
||||||
|
|
||||||
;; Collectibles
|
|
||||||
:screen/wallet.collectible})
|
|
||||||
|
|
||||||
(defn track-view-id-event
|
(defn track-view-id-event
|
||||||
[view-id]
|
[view-id]
|
||||||
(when (contains? view-ids-to-track view-id)
|
(if-let [screen (get screens/screens-by-name view-id)]
|
||||||
(navigation-event (name view-id))))
|
(when (get-in screen [:metrics :track?])
|
||||||
|
(screen-event screen {}))
|
||||||
|
(when (contains? view-ids-to-track view-id)
|
||||||
|
(navigation-event (name view-id)))))
|
||||||
|
|
||||||
(defn navigated-to-collectibles-tab-event
|
(defn navigated-to-collectibles-tab-event
|
||||||
[location]
|
[location]
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
{:eventName "navigation"
|
{:eventName "navigation"
|
||||||
:platform platform-os
|
:platform platform-os
|
||||||
:appVersion app-version
|
:appVersion app-version
|
||||||
:eventValue {:viewId "onboarding.create-profile"}}}
|
:eventValue {:viewId "onboarding.create-profile-info"}}}
|
||||||
(tracking/track-view-id-event :screen/onboarding.create-profile)))
|
(tracking/track-view-id-event :screen/onboarding.create-profile)))
|
||||||
(is (nil? (tracking/track-view-id-event :unknown-stack)))))
|
(is (nil? (tracking/track-view-id-event :unknown-stack)))))
|
||||||
|
|
||||||
|
@ -76,4 +76,10 @@
|
||||||
:appVersion app-version
|
:appVersion app-version
|
||||||
:eventValue {:viewId "wallet-stack"}}}
|
:eventValue {:viewId "wallet-stack"}}}
|
||||||
(tracking/metrics-event [:set-view-id :wallet-stack])))
|
(tracking/metrics-event [:set-view-id :wallet-stack])))
|
||||||
(is (nil? (tracking/metrics-event [:unknown-event])))))
|
(is (nil? (tracking/metrics-event [:unknown-event])))
|
||||||
|
(is (= {:metric
|
||||||
|
{:eventName "navigation"
|
||||||
|
:platform platform-os
|
||||||
|
:appVersion app-version
|
||||||
|
:eventValue {:viewId "onboarding.intro"}}}
|
||||||
|
(tracking/metrics-event [:set-view-id :screen/onboarding.intro])))))
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,10 @@
|
||||||
|
(ns status-im.setup.interceptor-metrics
|
||||||
|
(:require
|
||||||
|
#?@(:mobile
|
||||||
|
[[re-frame.core :as re-frame]
|
||||||
|
[status-im.contexts.centralized-metrics.events :as centralized-metrics]])))
|
||||||
|
|
||||||
|
(defn setup-centralized-metrics-interceptor
|
||||||
|
[]
|
||||||
|
#?(:mobile
|
||||||
|
(re-frame/reg-global-interceptor centralized-metrics/interceptor)))
|
|
@ -2,13 +2,13 @@
|
||||||
(:require
|
(:require
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[re-frame.std-interceptors :as std-interceptors]
|
[re-frame.std-interceptors :as std-interceptors]
|
||||||
[status-im.contexts.centralized-metrics.events :as centralized-metrics]
|
[status-im.setup.interceptor-metrics :as interceptor-metrics]
|
||||||
[utils.re-frame :as rf]))
|
[utils.re-frame :as rf]))
|
||||||
|
|
||||||
(defn register-global-interceptors
|
(defn register-global-interceptors
|
||||||
[]
|
[]
|
||||||
(re-frame/reg-global-interceptor rf/debug-handlers-names)
|
(re-frame/reg-global-interceptor rf/debug-handlers-names)
|
||||||
(re-frame/reg-global-interceptor centralized-metrics/interceptor)
|
(interceptor-metrics/setup-centralized-metrics-interceptor)
|
||||||
(re-frame/reg-global-interceptor (re-frame/inject-cofx :now))
|
(re-frame/reg-global-interceptor (re-frame/inject-cofx :now))
|
||||||
|
|
||||||
;; Interceptor `trim-v` removes the first element of the event vector.
|
;; Interceptor `trim-v` removes the first element of the event vector.
|
||||||
|
|
Loading…
Reference in New Issue