fix login after logout when opening app from a notification

moves most of the fx that are suppose to happen only at app startup
to an init/start-app fn so that init/initialize-app which is also
called after logout doesn't repeat unecessary fxs
This commit is contained in:
yenda 2018-09-28 16:48:59 +02:00 committed by Roman Volosovskyi
parent c36a0657e6
commit f98e013cff
No known key found for this signature in database
GPG Key ID: 0238A4B5ECEE70DE
3 changed files with 30 additions and 34 deletions

View File

@ -56,7 +56,7 @@
(handlers/register-handler-fx (handlers/register-handler-fx
:init/app-started :init/app-started
(fn [cofx _] (fn [cofx _]
(init/initialize-keychain cofx))) (init/start-app cofx)))
(handlers/register-handler-fx (handlers/register-handler-fx
:init.callback/get-encryption-key-success :init.callback/get-encryption-key-success
@ -665,11 +665,6 @@
(fn [cofx [_ event]] (fn [cofx [_ event]]
(notifications/handle-push-notification cofx event))) (notifications/handle-push-notification cofx event)))
(handlers/register-handler-fx
:notifications.callback/notification-stored
(fn [cofx _]
(accounts.login/user-login cofx)))
(handlers/register-handler-fx (handlers/register-handler-fx
:notifications.callback/get-fcm-token-success :notifications.callback/get-fcm-token-success
(fn [{:keys [db]} [_ fcm-token]] (fn [{:keys [db]} [_ fcm-token]]

View File

@ -54,9 +54,20 @@
[cofx] [cofx]
{:keychain/get-encryption-key [:init.callback/get-encryption-key-success]}) {:keychain/get-encryption-key [:init.callback/get-encryption-key-success]})
(fx/defn start-app [cofx]
(fx/merge cofx
{:init/get-device-UUID nil
:ui/listen-to-window-dimensions-change nil
:notifications/handle-initial-push-notification nil
:network/listen-to-network-status nil
:network/listen-to-connection-status nil
:hardwallet/check-nfc-support nil
:hardwallet/check-nfc-enabled nil}
(initialize-keychain)))
(fx/defn initialize-app-db (fx/defn initialize-app-db
"Initialize db to initial state" "Initialize db to initial state"
[{{:keys [status-module-initialized? view-id [{{:keys [status-module-initialized? view-id hardwallet
network-status network peers-count peers-summary device-UUID] network-status network peers-count peers-summary device-UUID]
:node/keys [status] :node/keys [status]
:or {network (get app-db :network)}} :db}] :or {network (get app-db :network)}} :db}]
@ -69,19 +80,13 @@
:node/status status :node/status status
:network network :network network
:device-UUID device-UUID :device-UUID device-UUID
:view-id view-id)}) :view-id view-id
:hardwallet (select-keys hardwallet [:nfc-enabled? :nfc-supported?]))})
(fx/defn initialize-app (fx/defn initialize-app
[cofx encryption-key] [cofx encryption-key]
(fx/merge cofx (fx/merge cofx
{:init/get-device-UUID nil {:init/init-store encryption-key}
:init/init-store encryption-key
:ui/listen-to-window-dimensions-change nil
:notifications/handle-initial-push-notification nil
:network/listen-to-network-status nil
:network/listen-to-connection-status nil
:hardwallet/check-nfc-support nil
:hardwallet/check-nfc-enabled nil}
(initialize-app-db) (initialize-app-db)
(node/initialize nil))) (node/initialize nil)))
@ -123,7 +128,14 @@
(let [{{:accounts/keys [accounts] :as db} :db} cofx] (let [{{:accounts/keys [accounts] :as db} :db} cofx]
(if (empty? accounts) (if (empty? accounts)
(navigation/navigate-to-clean cofx :intro nil) (navigation/navigate-to-clean cofx :intro nil)
(let [{:keys [address photo-path name]} (first (sort-by :last-sign-in > (vals accounts)))] (let [account-with-notification (first (keys (:push-notifications/stored db)))
selection-fn (if (not-empty account-with-notification)
#(filter (fn [account]
(= account-with-notification
(:public-key account)))
%)
#(sort-by :last-sign-in > %))
{:keys [address photo-path name]} (first (selection-fn (vals accounts)))]
(accounts.login/open-login cofx address photo-path name))))) (accounts.login/open-login cofx address photo-path name)))))
(fx/defn load-accounts-and-initialize-views (fx/defn load-accounts-and-initialize-views

View File

@ -3,6 +3,7 @@
[re-frame.core :as re-frame] [re-frame.core :as re-frame]
[status-im.react-native.js-dependencies :as rn] [status-im.react-native.js-dependencies :as rn]
[taoensso.timbre :as log] [taoensso.timbre :as log]
[status-im.accounts.login.core :as accounts.login]
[status-im.chat.models :as chat-model] [status-im.chat.models :as chat-model]
[status-im.utils.platform :as platform] [status-im.utils.platform :as platform]
[status-im.utils.fx :as fx])) [status-im.utils.fx :as fx]))
@ -73,26 +74,14 @@
(then #(log/debug "Notification channel created:" channel-id) (then #(log/debug "Notification channel created:" channel-id)
#(log/error "Notification channel creation error:" channel-id %))))) #(log/error "Notification channel creation error:" channel-id %)))))
(fx/defn store-event [{:keys [db] :as cofx} {:keys [from to]}]
(let [{:keys [address photo-path name]} (->> (get-in cofx [:db :accounts/accounts])
vals
(filter #(= (:public-key %) to))
first)]
(when address
{:db (assoc-in db [:push-notifications/stored to] from)
:dispatch [:notifications.callback/notification-stored address photo-path name]})))
(fx/defn handle-push-notification (fx/defn handle-push-notification
[{:keys [db] :as cofx} {:keys [from to] :as event}] [{:keys [db] :as cofx} {:keys [from to] :as event}]
(let [current-public-key (get-in cofx [:db :current-public-key])] (let [current-public-key (get-in cofx [:db :current-public-key])]
(if current-public-key (if (= to current-public-key)
;; TODO(yenda) why do we ignore the notification if
;; it is not for the current account ?
(when (= to current-public-key)
(fx/merge cofx (fx/merge cofx
{:db (update db :push-notifications/stored dissoc to)} {:db (update db :push-notifications/stored dissoc to)}
(chat-model/navigate-to-chat from nil))) (chat-model/navigate-to-chat from nil))
(store-event cofx event)))) {:db (assoc-in db [:push-notifications/stored to] from)})))
(defn parse-notification-payload [s] (defn parse-notification-payload [s]
(try (try