11(ns status-im.ui.screens.routing.core
22 (:require
33 [status-im.ui.components.react :as react]
4- [status-im.ui.screens.navigation :as screens.navigation ]
4+ [status-im.ui.screens.routing.back-actions :as back-actions ]
55 [status-im.ui.components.styles :as common-styles]
66 [status-im.utils.navigation :as navigation]
77 [cljs-react-navigation.reagent :as nav-reagent]
2222 [status-im.react-native.js-dependencies :as js-dependencies]))
2323
2424(defonce view-id (reagent.core/atom nil ))
25+ (defonce back-button-listener (atom nil ))
2526
2627(defn navigation-events [current-view-id modal? screen-focused?]
2728 [:> navigation/navigation-events
3637 (re-frame/dispatch [:screens/on-will-focus current-view-id]))
3738 :on-did-focus
3839 (fn []
40+ (reset!
41+ back-button-listener
42+ (.addEventListener
43+ js-dependencies/back-handler
44+ " hardwareBackPress"
45+ (fn []
46+ (not (get back-actions/back-actions current-view-id)))))
3947 (when-not modal?
4048 (status-bar/set-status-bar current-view-id)))
4149 :on-will-blur
4250 (fn [payload]
4351 (reset! screen-focused? false )
4452 (log/debug :on-will-blur current-view-id)
53+ (when @back-button-listener
54+ (.remove @back-button-listener)
55+ (reset! back-button-listener nil ))
4556 ; ; Reset currently mounted text inputs to their default values
4657 ; ; on navigating away; this is a privacy measure
4758 (doseq [[text-input default-value ] @react/text-input-refs]
118129 (utils/update-if-present :initialRouteName name)
119130 (utils/update-if-present :mode name)))
120131
132+ (defn new-get-state-for-action [default-get-state-for-action ]
133+ (fn [action state]
134+ (let [event (get back-actions/back-actions @view-id)]
135+ (when (and (= (.-type action) (.-BACK navigation/navigation-actions)) event (not= :default event))
136+ (re-frame/dispatch [event]))
137+ (default-get-state-for-action action state ))))
138+
121139(defn stack-navigator [routes config]
122140 (let [res (nav-reagent/stack-navigator
123141 routes
139157 (let [route (aget routes idx)
140158 route-name (keyword (.-routeName route))]
141159 (tabbar/minimize-bar route-name)))))}
142- (prepare-config config)))
143- default-get-state-for-action (.-getStateForAction (.-router res))
144- new-get-state-for-action (fn [action state]
145- ; ; Override default getStateForAction on this stack navigator
146- ; ; if we have a custom event set in wizard-back-event atom
147- (if (and (= (.-type action) (.-BACK navigation/navigation-actions))
148- @screens.navigation/wizard-back-event)
149- (if @screens.navigation/processing-back-event?
150- (do
151- (reset! screens.navigation/processing-back-event? false )
152- (default-get-state-for-action action state ))
153- (do
154- (reset! screens.navigation/processing-back-event? true )
155- (re-frame/dispatch @screens.navigation/wizard-back-event)
156- ; ; Return nil so that BACK event processing ends here
157- nil ))
158- (default-get-state-for-action action state )))]
159- (set! (-> res .-router .-getStateForAction) new-get-state-for-action)
160+ (prepare-config config)))]
161+ (set! (-> res .-router .-getStateForAction) (new-get-state-for-action (.-getStateForAction (.-router res))))
160162 res))
161163
162164(defn twopane-navigator [routes config]
218220 :else
219221 (nav-reagent/stack-screen (wrap screen-name screen-config)))]
220222 [screen-name (cond-> {:screen res}
221- ; ; TODO issue #8947
222- ; ; replace this hack with configuration
223- (#{:create-multiaccount-choose-key
224- :recover-multiaccount-select-storage }
225- screen-name)
223+ (not (get back-actions/back-actions screen-name))
226224 (assoc :navigationOptions {:gesturesEnabled false })
227225 (:navigation screen-config)
228226 (assoc :navigationOptions
267265 :onTransitionStart (fn [])})}]])
268266 {:initialRouteName (if (= view-id :intro )
269267 :intro-stack
270- :login-stack )})))
268+ :login-stack )})))
0 commit comments