Skip to content

Commit cbe17cb

Browse files
committed
[status-im#8940] Redesign Back, swipe-to-the-left and hardware device Back buttons to align the behavior
Signed-off-by: Andrey Shovkoplyas <motor4ik@gmail.com>
1 parent 8fc823f commit cbe17cb

7 files changed

Lines changed: 70 additions & 109 deletions

File tree

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ allprojects {
6868

6969
// for geth, function, and status-go
7070
flatDir { dirs "libs", System.env.STATUS_GO_ANDROID_LIBDIR }
71-
maven { url "https://jitpack.io" }
71+
maven { url "https://www.jitpack.io" }
7272
}
7373
}

src/status_im/android/core.cljs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
[status-im.core :as core]
1212
[status-im.react-native.js-dependencies :as rn-dependencies]
1313
[status-im.utils.snoopy :as snoopy]
14-
[status-im.i18n :as i18n]))
14+
[status-im.i18n :as i18n]
15+
[status-im.ui.screens.routing.core :as routing]))
1516

1617
(defn app-state-change-handler [state]
1718
(dispatch [:app-state-change state]))

src/status_im/multiaccounts/create/core.cljs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
[status-im.utils.utils :as utils]
2020
[status-im.utils.platform :as platform]))
2121

22-
(defn get-signing-phrase [cofx]
23-
(assoc cofx :signing-phrase (signing-phrase/generate)))
24-
2522
(def step-kw-to-num
2623
{:generate-key 1
2724
:choose-key 2
@@ -66,8 +63,7 @@
6663
:back-action :intro-wizard/navigate-back
6764
:forward-action :intro-wizard/step-forward-pressed
6865
:encrypt-with-password? true
69-
:first-time-setup? first-time-setup?})
70-
::navigation/add-wizard-back-event [:intro-wizard/step-back-pressed]}
66+
:first-time-setup? first-time-setup?})}
7167
(navigation/navigate-to-cofx :create-multiaccount-generate-key nil)))
7268

7369
(fx/defn dec-step
@@ -82,16 +78,10 @@
8278
(= step :confirm-code)
8379
(assoc-in [:intro-wizard :confirm-failure?] false))})
8480
(when (= :generate-key-step)
85-
{:db (dissoc db :intro-wizard)
86-
::navigation/remove-wizard-back-event nil}))))
87-
88-
(fx/defn navigate-back
89-
{:events [:intro-wizard/navigate-back]}
90-
[cofx]
91-
{::navigation/navigate-back nil})
81+
{:db (dissoc db :intro-wizard)}))))
9282

9383
(fx/defn intro-step-back
94-
{:events [:intro-wizard/step-back-pressed]}
84+
{:events [:intro-wizard/navigate-back]}
9585
[{:keys [db] :as cofx} skip-alert?]
9686
(let [step (get-in db [:intro-wizard :step])]
9787
;; Cannot go back after account has been created
@@ -101,16 +91,14 @@
10191
(utils/show-question
10292
(i18n/label :t/are-you-sure-to-cancel)
10393
(i18n/label :t/you-will-start-from-scratch)
104-
#(re-frame/dispatch [:intro-wizard/step-back-pressed true])
105-
#(re-frame/dispatch [:navigation/reset-processing-flag]))
94+
#(re-frame/dispatch [:intro-wizard/navigate-back true]))
10695
(fx/merge cofx
10796
dec-step
10897
navigation/navigate-back)))))
10998

11099
(fx/defn exit-wizard [{:keys [db] :as cofx}]
111100
(fx/merge cofx
112-
{:db (dissoc db :intro-wizard)
113-
::navigation/remove-wizard-back-event nil}
101+
{:db (dissoc db :intro-wizard)}
114102
(navigation/navigate-to-cofx :home nil)))
115103

116104
(fx/defn init-key-generation
@@ -331,7 +319,7 @@
331319
(re-frame/reg-cofx
332320
::get-signing-phrase
333321
(fn [cofx _]
334-
(get-signing-phrase cofx)))
322+
(assoc cofx :signing-phrase (signing-phrase/generate))))
335323

336324
(fx/defn create-multiaccount-success
337325
{:events [::store-multiaccount-success]

src/status_im/multiaccounts/recover/core.cljs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@
129129
:first-time-setup? false
130130
:back-action :intro-wizard/navigate-back
131131
:forward-action :multiaccounts.recover/enter-phrase-next-pressed})
132-
::navigation/add-wizard-back-event [:multiaccounts.recover/cancel-pressed]
133132
:dispatch [:bottom-sheet/hide-sheet]}
134133
(navigation/navigate-to-cofx :recover-multiaccount-enter-phrase nil)))
135134

@@ -157,8 +156,7 @@
157156
[{:keys [db] :as cofx}]
158157
(let [step (get-in db [:intro-wizard :step])]
159158
(if (= step :enter-phrase)
160-
{:db (dissoc db :intro-wizard)
161-
::navigation/remove-wizard-back-event nil}
159+
{:db (dissoc db :intro-wizard)}
162160
{:db (update db :intro-wizard assoc :step
163161
(case step
164162
:recovery-success :enter-phrase
@@ -180,8 +178,7 @@
180178
(utils/show-question
181179
(i18n/label :t/are-you-sure-to-cancel)
182180
(i18n/label :t/you-will-start-from-scratch)
183-
#(re-frame/dispatch [:multiaccounts.recover/cancel-pressed true])
184-
#(re-frame/dispatch [:navigation/reset-processing-flag]))
181+
#(re-frame/dispatch [:multiaccounts.recover/cancel-pressed true]))
185182
(fx/merge cofx
186183
dec-step
187184
navigation/navigate-back)))))

src/status_im/ui/screens/navigation.cljs

Lines changed: 7 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,10 @@
11
(ns status-im.ui.screens.navigation
22
(:require [re-frame.core :as re-frame]
3-
[status-im.react-native.js-dependencies :as js-dependencies]
43
[status-im.utils.handlers :as handlers]
54
[status-im.utils.navigation :as navigation]
6-
[status-im.utils.platform :as platform]
75
[taoensso.timbre :as log]
86
[status-im.utils.fx :as fx]))
97

10-
;; private helper fns
11-
12-
(defn- push-view [db view-id]
13-
(-> db
14-
(update :navigation-stack conj view-id)
15-
(assoc :view-id view-id)))
16-
17-
;; public fns
18-
19-
(fx/defn navigate-forget
20-
[{:keys [db]} view-id]
21-
{:db (assoc db :view-id view-id)})
22-
238
(defmulti unload-data!
249
(fn [db] (:view-id db)))
2510

@@ -32,7 +17,7 @@
3217

3318
(defn- -preload-data! [{:keys [was-modal?] :as db} & args]
3419
(if was-modal?
35-
(dissoc db :was-modal?) ;;TODO check how it worked with this bug
20+
(dissoc db :was-modal?)
3621
(apply preload-data! db args)))
3722

3823
(fx/defn navigate-to-cofx
@@ -44,7 +29,9 @@
4429
screen-params))]
4530
{:db (if (= view-id go-to-view-id)
4631
db
47-
(push-view db go-to-view-id))
32+
(-> db
33+
(update :navigation-stack conj go-to-view-id)
34+
(assoc :view-id go-to-view-id)))
4835
::navigate-to [go-to-view-id screen-params]}))
4936

5037
(fx/defn navigate-reset
@@ -69,8 +56,6 @@
6956
(def navigation-interceptors
7057
[unload-data-interceptor (re-frame/enrich preload-data!)])
7158

72-
;; effects
73-
7459
(re-frame/reg-fx
7560
::navigate-to
7661
(fn [[view-id params]]
@@ -89,8 +74,6 @@
8974
(log/debug :navigate-reset config)
9075
(navigation/navigate-reset config)))
9176

92-
;; event handlers
93-
9477
(handlers/register-handler-fx
9578
:navigate-to
9679
navigation-interceptors
@@ -105,15 +88,14 @@
10588

10689
(fx/defn navigate-back
10790
[{{:keys [navigation-stack view-id] :as db} :db}]
108-
(assoc
109-
{::navigate-back nil}
91+
{::navigate-back nil
11092
:db (let [[previous-view-id :as navigation-stack'] (pop navigation-stack)
11193
first-in-stack (first navigation-stack)]
11294
(if (= view-id first-in-stack)
11395
(-> db
11496
(assoc :view-id previous-view-id)
11597
(assoc :navigation-stack navigation-stack'))
116-
(assoc db :view-id first-in-stack)))))
98+
(assoc db :view-id first-in-stack)))})
11799

118100
(handlers/register-handler-fx
119101
:navigate-back
@@ -140,38 +122,4 @@
140122
{:db (-> db
141123
(assoc :prev-tab-view-id (:view-id db))
142124
(assoc :prev-view-id (:view-id db)))}
143-
(navigate-to-cofx view-id {}))))
144-
145-
;; This atom stores event vector
146-
;; to be dispatched when a react-navigation's BACK
147-
;; actions is invoked
148-
(def wizard-back-event (atom nil))
149-
150-
;; This atom exists in order to avoid
151-
;; endless loop when processing NavigationActions/BACK
152-
;; in react-navigation's getStateForAction fn
153-
(def processing-back-event? (atom false))
154-
155-
(fx/defn reset-processing-flag
156-
{:events [:navigation/reset-processing-flag]}
157-
[{:keys [db] :as cofx}]
158-
{::reset-processing-flag nil})
159-
160-
(re-frame/reg-fx
161-
::reset-processing-flag
162-
(fn []
163-
(reset! processing-back-event? false)))
164-
165-
;; Below two effects are added when we need
166-
;; to override default react-navigation's BACK action
167-
;; processing
168-
(re-frame/reg-fx
169-
::add-wizard-back-event
170-
(fn [event]
171-
(reset! wizard-back-event event)))
172-
173-
(re-frame/reg-fx
174-
::remove-wizard-back-event
175-
(fn [event]
176-
(reset! processing-back-event? false)
177-
(reset! wizard-back-event nil)))
125+
(navigate-to-cofx view-id {}))))
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
(ns status-im.ui.screens.routing.back-actions)
2+
3+
(def back-actions {:chat :default
4+
:login :default
5+
:recover-multiaccount-enter-phrase :default
6+
:create-multiaccount-generate-key :default
7+
:new-chat :default
8+
:new-public-chat :default
9+
:wallet-account :default
10+
:add-new-account :default
11+
:add-new-account-password :default
12+
:about-app :default
13+
:help-center :default
14+
:advanced-settings :default
15+
:sync-settings :default
16+
:mobile-network-settings :default
17+
:offline-messaging-settings :default
18+
:edit-mailserver :default
19+
:installations :default
20+
:privacy-and-security :default
21+
:dapps-permissions :default
22+
:contacts-list :default
23+
:blocked-users-list :default
24+
:ens-main :default
25+
:ens-register :default
26+
:wallet-settings-assets :default
27+
:wallet-add-custom-token :default
28+
:currency-settings :default
29+
:backup-seed :default})

src/status_im/ui/screens/routing/core.cljs

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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]
@@ -22,6 +22,7 @@
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
@@ -36,12 +37,22 @@
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]
@@ -118,6 +129,13 @@
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
@@ -139,24 +157,8 @@
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]
@@ -218,11 +220,7 @@
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
@@ -267,4 +265,4 @@
267265
:onTransitionStart (fn [])})}]])
268266
{:initialRouteName (if (= view-id :intro)
269267
:intro-stack
270-
:login-stack)})))
268+
:login-stack)})))

0 commit comments

Comments
 (0)