diff --git a/src/status_im/multiaccounts/create/core.cljs b/src/status_im/multiaccounts/create/core.cljs index ec6c4dd34fba..884dd7734df3 100644 --- a/src/status_im/multiaccounts/create/core.cljs +++ b/src/status_im/multiaccounts/create/core.cljs @@ -19,9 +19,6 @@ [status-im.utils.utils :as utils] [status-im.utils.platform :as platform])) -(defn get-signing-phrase [cofx] - (assoc cofx :signing-phrase (signing-phrase/generate))) - (def step-kw-to-num {:generate-key 1 :choose-key 2 @@ -66,8 +63,7 @@ :back-action :intro-wizard/navigate-back :forward-action :intro-wizard/step-forward-pressed :encrypt-with-password? true - :first-time-setup? first-time-setup?}) - ::navigation/add-wizard-back-event [:intro-wizard/step-back-pressed]} + :first-time-setup? first-time-setup?})} (navigation/navigate-to-cofx :create-multiaccount-generate-key nil))) (fx/defn dec-step @@ -82,16 +78,10 @@ (= step :confirm-code) (assoc-in [:intro-wizard :confirm-failure?] false))}) (when (= :generate-key-step) - {:db (dissoc db :intro-wizard) - ::navigation/remove-wizard-back-event nil})))) - -(fx/defn navigate-back - {:events [:intro-wizard/navigate-back]} - [cofx] - {::navigation/navigate-back nil}) + {:db (dissoc db :intro-wizard)})))) (fx/defn intro-step-back - {:events [:intro-wizard/step-back-pressed]} + {:events [:intro-wizard/navigate-back]} [{:keys [db] :as cofx} skip-alert?] (let [step (get-in db [:intro-wizard :step])] ;; Cannot go back after account has been created @@ -101,16 +91,14 @@ (utils/show-question (i18n/label :t/are-you-sure-to-cancel) (i18n/label :t/you-will-start-from-scratch) - #(re-frame/dispatch [:intro-wizard/step-back-pressed true]) - #(re-frame/dispatch [:navigation/reset-processing-flag])) + #(re-frame/dispatch [:intro-wizard/navigate-back true])) (fx/merge cofx dec-step navigation/navigate-back))))) (fx/defn exit-wizard [{:keys [db] :as cofx}] (fx/merge cofx - {:db (dissoc db :intro-wizard) - ::navigation/remove-wizard-back-event nil} + {:db (dissoc db :intro-wizard)} (navigation/navigate-to-cofx :home nil))) (fx/defn init-key-generation @@ -331,7 +319,7 @@ (re-frame/reg-cofx ::get-signing-phrase (fn [cofx _] - (get-signing-phrase cofx))) + (assoc cofx :signing-phrase (signing-phrase/generate)))) (fx/defn create-multiaccount-success {:events [::store-multiaccount-success] diff --git a/src/status_im/multiaccounts/recover/core.cljs b/src/status_im/multiaccounts/recover/core.cljs index 41cb0198480f..08dbe5578f15 100644 --- a/src/status_im/multiaccounts/recover/core.cljs +++ b/src/status_im/multiaccounts/recover/core.cljs @@ -129,7 +129,6 @@ :first-time-setup? false :back-action :intro-wizard/navigate-back :forward-action :multiaccounts.recover/enter-phrase-next-pressed}) - ::navigation/add-wizard-back-event [:multiaccounts.recover/cancel-pressed] :dispatch [:bottom-sheet/hide-sheet]} (navigation/navigate-to-cofx :recover-multiaccount-enter-phrase nil))) @@ -157,8 +156,7 @@ [{:keys [db] :as cofx}] (let [step (get-in db [:intro-wizard :step])] (if (= step :enter-phrase) - {:db (dissoc db :intro-wizard) - ::navigation/remove-wizard-back-event nil} + {:db (dissoc db :intro-wizard)} {:db (update db :intro-wizard assoc :step (case step :recovery-success :enter-phrase @@ -180,8 +178,7 @@ (utils/show-question (i18n/label :t/are-you-sure-to-cancel) (i18n/label :t/you-will-start-from-scratch) - #(re-frame/dispatch [:multiaccounts.recover/cancel-pressed true]) - #(re-frame/dispatch [:navigation/reset-processing-flag])) + #(re-frame/dispatch [:multiaccounts.recover/cancel-pressed true])) (fx/merge cofx dec-step navigation/navigate-back))))) diff --git a/src/status_im/ui/screens/navigation.cljs b/src/status_im/ui/screens/navigation.cljs index 1668eba4579b..56526ccc1c7d 100644 --- a/src/status_im/ui/screens/navigation.cljs +++ b/src/status_im/ui/screens/navigation.cljs @@ -1,25 +1,10 @@ (ns status-im.ui.screens.navigation (:require [re-frame.core :as re-frame] - [status-im.react-native.js-dependencies :as js-dependencies] [status-im.utils.handlers :as handlers] [status-im.utils.navigation :as navigation] - [status-im.utils.platform :as platform] [taoensso.timbre :as log] [status-im.utils.fx :as fx])) -;; private helper fns - -(defn- push-view [db view-id] - (-> db - (update :navigation-stack conj view-id) - (assoc :view-id view-id))) - -;; public fns - -(fx/defn navigate-forget - [{:keys [db]} view-id] - {:db (assoc db :view-id view-id)}) - (defmulti unload-data! (fn [db] (:view-id db))) @@ -32,7 +17,7 @@ (defn- -preload-data! [{:keys [was-modal?] :as db} & args] (if was-modal? - (dissoc db :was-modal?) ;;TODO check how it worked with this bug + (dissoc db :was-modal?) (apply preload-data! db args))) (fx/defn navigate-to-cofx @@ -44,7 +29,9 @@ screen-params))] {:db (if (= view-id go-to-view-id) db - (push-view db go-to-view-id)) + (-> db + (update :navigation-stack conj go-to-view-id) + (assoc :view-id go-to-view-id))) ::navigate-to [go-to-view-id screen-params]})) (fx/defn navigate-reset @@ -69,8 +56,6 @@ (def navigation-interceptors [unload-data-interceptor (re-frame/enrich preload-data!)]) -;; effects - (re-frame/reg-fx ::navigate-to (fn [[view-id params]] @@ -89,8 +74,6 @@ (log/debug :navigate-reset config) (navigation/navigate-reset config))) -;; event handlers - (handlers/register-handler-fx :navigate-to navigation-interceptors @@ -105,15 +88,14 @@ (fx/defn navigate-back [{{:keys [navigation-stack view-id] :as db} :db}] - (assoc - {::navigate-back nil} + {::navigate-back nil :db (let [[previous-view-id :as navigation-stack'] (pop navigation-stack) first-in-stack (first navigation-stack)] (if (= view-id first-in-stack) (-> db (assoc :view-id previous-view-id) (assoc :navigation-stack navigation-stack')) - (assoc db :view-id first-in-stack))))) + (assoc db :view-id first-in-stack)))}) (handlers/register-handler-fx :navigate-back @@ -140,38 +122,4 @@ {:db (-> db (assoc :prev-tab-view-id (:view-id db)) (assoc :prev-view-id (:view-id db)))} - (navigate-to-cofx view-id {})))) - -;; This atom stores event vector -;; to be dispatched when a react-navigation's BACK -;; actions is invoked -(def wizard-back-event (atom nil)) - -;; This atom exists in order to avoid -;; endless loop when processing NavigationActions/BACK -;; in react-navigation's getStateForAction fn -(def processing-back-event? (atom false)) - -(fx/defn reset-processing-flag - {:events [:navigation/reset-processing-flag]} - [{:keys [db] :as cofx}] - {::reset-processing-flag nil}) - -(re-frame/reg-fx - ::reset-processing-flag - (fn [] - (reset! processing-back-event? false))) - -;; Below two effects are added when we need -;; to override default react-navigation's BACK action -;; processing -(re-frame/reg-fx - ::add-wizard-back-event - (fn [event] - (reset! wizard-back-event event))) - -(re-frame/reg-fx - ::remove-wizard-back-event - (fn [event] - (reset! processing-back-event? false) - (reset! wizard-back-event nil))) + (navigate-to-cofx view-id {})))) \ No newline at end of file diff --git a/src/status_im/ui/screens/routing/back_actions.cljs b/src/status_im/ui/screens/routing/back_actions.cljs new file mode 100644 index 000000000000..97c85999ce45 --- /dev/null +++ b/src/status_im/ui/screens/routing/back_actions.cljs @@ -0,0 +1,29 @@ +(ns status-im.ui.screens.routing.back-actions) + +(def back-actions {:chat :default + :login :default + :recover-multiaccount-enter-phrase :default + :create-multiaccount-generate-key :default + :new-chat :default + :new-public-chat :default + :wallet-account :default + :add-new-account :default + :add-new-account-password :default + :about-app :default + :help-center :default + :advanced-settings :default + :sync-settings :default + :mobile-network-settings :default + :offline-messaging-settings :default + :edit-mailserver :default + :installations :default + :privacy-and-security :default + :dapps-permissions :default + :contacts-list :default + :blocked-users-list :default + :ens-main :default + :ens-register :default + :wallet-settings-assets :default + :wallet-add-custom-token :default + :currency-settings :default + :backup-seed :default}) \ No newline at end of file diff --git a/src/status_im/ui/screens/routing/core.cljs b/src/status_im/ui/screens/routing/core.cljs index dd37b769bc95..f65ab9c163c0 100644 --- a/src/status_im/ui/screens/routing/core.cljs +++ b/src/status_im/ui/screens/routing/core.cljs @@ -1,7 +1,7 @@ (ns status-im.ui.screens.routing.core (:require [status-im.ui.components.react :as react] - [status-im.ui.screens.navigation :as screens.navigation] + [status-im.ui.screens.routing.back-actions :as back-actions] [status-im.ui.components.styles :as common-styles] [status-im.utils.navigation :as navigation] [cljs-react-navigation.reagent :as nav-reagent] @@ -118,6 +118,13 @@ (utils/update-if-present :initialRouteName name) (utils/update-if-present :mode name))) +(defn new-get-state-for-action [default-get-state-for-action] + (fn [action state] + (let [event (get back-actions/back-actions @view-id)] + (when (and (= (.-type action) (.-BACK navigation/navigation-actions)) event (not= :default event)) + (re-frame/dispatch [event])) + (default-get-state-for-action action state)))) + (defn stack-navigator [routes config] (let [res (nav-reagent/stack-navigator routes @@ -139,24 +146,8 @@ (let [route (aget routes idx) route-name (keyword (.-routeName route))] (tabbar/minimize-bar route-name)))))} - (prepare-config config))) - default-get-state-for-action (.-getStateForAction (.-router res)) - new-get-state-for-action (fn [action state] - ;; Override default getStateForAction on this stack navigator - ;; if we have a custom event set in wizard-back-event atom - (if (and (= (.-type action) (.-BACK navigation/navigation-actions)) - @screens.navigation/wizard-back-event) - (if @screens.navigation/processing-back-event? - (do - (reset! screens.navigation/processing-back-event? false) - (default-get-state-for-action action state)) - (do - (reset! screens.navigation/processing-back-event? true) - (re-frame/dispatch @screens.navigation/wizard-back-event) - ;; Return nil so that BACK event processing ends here - nil)) - (default-get-state-for-action action state)))] - (set! (-> res .-router .-getStateForAction) new-get-state-for-action) + (prepare-config config)))] + (set! (-> res .-router .-getStateForAction) (new-get-state-for-action (.-getStateForAction (.-router res)))) res)) (defn twopane-navigator [routes config] @@ -218,11 +209,7 @@ :else (nav-reagent/stack-screen (wrap screen-name screen-config)))] [screen-name (cond-> {:screen res} - ;; TODO issue #8947 - ;; replace this hack with configuration - (#{:create-multiaccount-choose-key - :recover-multiaccount-select-storage} - screen-name) + (not (get back-actions/back-actions screen-name)) (assoc :navigationOptions {:gesturesEnabled false}) (:navigation screen-config) (assoc :navigationOptions