refactor events and fns to dedicated namespaces

- move init events and fns to dedicated namespace
- move web3 events and fns to dedicated namespaces
- move signal events and fns to dedicated namespace
- move notifications events and fns to dedicated namespace
- cosmetic fixes
- remove print statements
- fix formating
- remove unused imports
This commit is contained in:
Eric Dvorsak 2018-08-26 02:45:03 +02:00
parent 002f3e73d1
commit dacfe97a58
No known key found for this signature in database
GPG Key ID: 932AC1CE5F05DE0C
28 changed files with 642 additions and 556 deletions

View File

@ -9,7 +9,7 @@
[status-im.ui.screens.views :as views]
[status-im.ui.components.react :as react]
[status-im.native-module.core :as status]
[status-im.utils.notifications :as notifications]
[status-im.notifications.core :as notifications]
[status-im.core :as core]
[status-im.utils.snoopy :as snoopy]))

View File

@ -12,7 +12,7 @@
[status-im.utils.clocks :as utils.clocks]
[status-im.utils.handlers-macro :as handlers-macro]
[status-im.utils.money :as money]
[status-im.utils.notifications :as notifications]
[status-im.notifications.core :as notifications]
[status-im.transport.utils :as transport.utils]
[status-im.transport.message.core :as transport]
[status-im.transport.message.v1.protocol :as protocol]
@ -142,10 +142,10 @@
current-chat-id (get-in cofx [:db :current-chat-id])]
(when-not (and (= :chat view-id)
(= current-chat-id chat-id))
{:display-notification-fx {:title (i18n/label :notifications-new-message-title)
:body (i18n/label :notifications-new-message-body)
:to chat-id
:from from}}))))
{:notifications/display-notification {:title (i18n/label :notifications-new-message-title)
:body (i18n/label :notifications-new-message-body)
:to chat-id
:from from}}))))
(defn- add-received-message
[batch?

View File

@ -15,7 +15,7 @@
(defn init [app-root]
(log/set-level! config/log-level)
(error-handler/register-exception-handler!)
(re-frame/dispatch [:initialize-keychain])
(re-frame/dispatch [:init/initialize-keychain])
(when config/testfairy-enabled?
(.begin js-dependencies/testfairy config/testfairy-token))
(.registerComponent react/app-registry "StatusIm" #(reagent/reactify-component app-root)))

View File

@ -0,0 +1,188 @@
(ns status-im.init.core
(:require [re-frame.core :as re-frame]
[status-im.constants :as constants]
[status-im.models.account :as models.account]
[status-im.models.browser :as browser]
[status-im.models.chat :as chat]
[status-im.models.contacts :as models.contacts]
[status-im.utils.keychain.core :as keychain]
[status-im.models.protocol :as models.protocol]
[status-im.models.transactions :as transactions]
[status-im.models.wallet :as models.wallet]
[status-im.transport.inbox :as inbox]
[status-im.data-store.realm.core :as realm]
[status-im.ui.screens.accounts.models :as accounts.models]
[status-im.ui.screens.contacts.events :as contacts]
[status-im.i18n :as i18n]
[status-im.ui.screens.db :refer [app-db]]
[status-im.utils.ethereum.core :as ethereum]
[status-im.utils.handlers-macro :as handlers-macro]
[status-im.utils.platform :as platform]
[taoensso.timbre :as log]
[status-im.utils.universal-links.core :as universal-links]))
;; TODO (yenda) move keychain functions to dedicated namespace
(defn- reset-keychain []
(.. (keychain/reset)
(then
#(re-frame/dispatch [:init/initialize-keychain]))))
(defn- handle-reset-data []
(.. (realm/delete-realms)
(then reset-keychain)
(catch reset-keychain)))
(defn handle-invalid-key-parameters [encryption-key]
{:title (i18n/label :invalid-key-title)
:content (i18n/label :invalid-key-content)
:confirm-button-text (i18n/label :invalid-key-confirm)
;; On cancel we initialize the app with the invalid key, to allow the user
;; to recover the seed phrase
:on-cancel #(do
(log/warn "initializing app with invalid key")
(re-frame/dispatch [:init/initialize-app encryption-key]))
:on-accept handle-reset-data})
(defn handle-decryption-failed-parameters [encryption-key]
{:title (i18n/label :decryption-failed-title)
:content (i18n/label :decryption-failed-content)
:confirm-button-text (i18n/label :decryption-failed-confirm)
;; On cancel we initialize the app with the same key, in case the error was
;; not related/fs error
:on-cancel #(do
(log/warn "initializing app with same key after decryption failed")
(re-frame/dispatch [:init/initialize-app encryption-key]))
:on-accept handle-reset-data})
(defn initialize-keychain [cofx]
{:keychain/get-encryption-key [:init/initialize-app]})
(defn set-device-uuid [device-uuid {:keys [db]}]
{:db (assoc db :device-UUID device-uuid)})
(defn initialize-views [{{:accounts/keys [accounts]
:push-notifications/keys [initial?]
:as db} :db}]
{:db (if (empty? accounts)
(assoc db :view-id :intro :navigation-stack (list :intro))
(let [{:keys [address photo-path name]} (first (sort-by :last-sign-in > (vals accounts)))]
(-> db
(assoc :view-id :login
:navigation-stack (list :login))
(update :accounts/login assoc
:address address
:photo-path photo-path
:name name))))
:notifications/handle-initial-push-notification initial?})
(defn initialize-geth [{:keys [db]}]
(when-not (:status-node-started? db)
(let [default-networks (:networks/networks db)
default-network (:network db)]
{:init/initialize-geth (get-in default-networks [default-network :config])})))
(defn initialize-db
"Initialize db to the initial state"
[{{:universal-links/keys [url]
:push-notifications/keys [initial?]
:keys [status-module-initialized? status-node-started?
network-status network peers-count peers-summary device-UUID]
:or {network (get app-db :network)}} :db}]
{:db (assoc app-db
:contacts/contacts {}
:network-status network-status
:peers-count (or peers-count 0)
:peers-summary (or peers-summary [])
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
:status-node-started? status-node-started?
:network network
:universal-links/url url
:push-notifications/initial? initial?
:device-UUID device-UUID)})
(defn initialize-app [encryption-key error cofx]
(cond
(= :invalid-key error)
{:show-confirmation (handle-invalid-key-parameters encryption-key)}
(= :decryption-failed error)
{:show-confirmation (handle-decryption-failed-parameters encryption-key)}
:else
(handlers-macro/merge-fx cofx
{:init/init-device-UUID nil
:init/init-store encryption-key
:ui/listen-to-window-dimensions-change nil
:init/testfairy-alert nil}
(initialize-db))))
(defn after-decryption [cofx]
(handlers-macro/merge-fx cofx
{:network/listen-to-network-status
[#(re-frame/dispatch [:network/update-connection-status %])
#(re-frame/dispatch [:network/update-network-status %])]}
(initialize-geth)
(accounts.models/load-accounts)
(initialize-views)))
(defn initialize-account-db [address {:keys [db web3]}]
(let [{:keys [accounts/accounts accounts/create contacts/contacts networks/networks
network network-status peers-count peers-summary view-id navigation-stack
status-module-initialized? status-node-started? device-UUID
push-notifications/initial? semaphores]
:or {network (get app-db :network)}} db
console-contact (get contacts constants/console-chat-id)
current-account (accounts address)
account-network-id (get current-account :network network)
account-network (get-in current-account [:networks account-network-id])]
{:db (cond-> (assoc app-db
:current-public-key (:public-key current-account)
:view-id view-id
:navigation-stack navigation-stack
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
:status-node-started? status-node-started?
:accounts/create create
:networks/networks networks
:account/account current-account
:network-status network-status
:network network
:chain (ethereum/network->chain-name account-network)
:push-notifications/initial? initial?
:peers-summary peers-summary
:peers-count peers-count
:device-UUID device-UUID
:semaphores semaphores
:web3 web3)
console-contact
(assoc :contacts/contacts {constants/console-chat-id console-contact}))}))
(defn initialize-account [address events-after {:keys [web3] :as cofx}]
(handlers-macro/merge-fx cofx
{:web3/set-default-account [web3 address]
:web3/fetch-node-version web3
:notifications/get-fcm-token nil
:dispatch-n (or events-after [])}
(initialize-account-db address)
(models.protocol/initialize-protocol address)
(models.contacts/load-contacts)
(chat/initialize-chats)
(chat/process-pending-messages)
(browser/initialize-browsers)
(browser/initialize-dapp-permissions)
(models.wallet/update-wallet)
(transactions/run-update)
(transactions/start-sync)
(models.account/update-sign-in-time)))
(defn status-node-started [{{:node/keys [after-start] :as db} :db}]
;;TODO (yenda) instead of passing events we can pass effects here and simply return them
(merge {:db (assoc db :status-node-started? true)}
(when after-start {:dispatch-n [after-start]})))
(defn status-node-stopped [{{:node/keys [after-stop]} :db}]
;;TODO (yenda) instead of passing events we can pass effects here and simply return them
(when after-stop {:dispatch-n [after-stop]}))
(defn status-module-initialized [{:keys [db]}]
{:db (assoc db :status-module-initialized? true)
:init/status-module-initialized-fx nil})

View File

@ -0,0 +1,96 @@
(ns status-im.init.events
(:require [re-frame.core :as re-frame]
[status-im.data-store.core :as data-store]
[status-im.i18n :as i18n]
[status-im.init.core :as init]
status-im.web3.events
[status-im.native-module.core :as status]
[status-im.utils.config :as config]
[status-im.utils.handlers :as handlers]
[status-im.utils.types :as types]
[status-im.utils.utils :as utils]
[taoensso.timbre :as log]))
;; Try to decrypt the database, move on if successful otherwise go back to
;; initial state
(re-frame/reg-fx
:init/init-store
(fn [encryption-key]
(.. (data-store/init encryption-key)
(then #(re-frame/dispatch [:init/after-decryption]))
(catch (fn [error]
(log/warn "Could not decrypt database" error)
(re-frame/dispatch [:init/initialize-app encryption-key :decryption-failed]))))))
(re-frame/reg-fx
:init/initialize-geth
(fn [config]
(status/start-node (types/clj->json config) config/fleet)))
(re-frame/reg-fx
:init/status-module-initialized
(fn [_]
(status/module-initialized!)))
(re-frame/reg-fx
:init/testfairy-alert
(fn [_]
(when config/testfairy-enabled?
(utils/show-popup
(i18n/label :testfairy-title)
(i18n/label :testfairy-message)))))
(re-frame/reg-fx
:init/init-device-UUID
(fn []
(status/get-device-UUID #(re-frame/dispatch [:init/set-device-UUID %]))))
;; Entrypoint, fetches the key from the keychain and initialize the app
(handlers/register-handler-fx
:init/initialize-keychain
(fn [cofx _]
(init/initialize-keychain cofx)))
;; Check the key is valid, shows options if not, otherwise continues loading
;; the database
(handlers/register-handler-fx
:init/initialize-app
(fn [cofx [_ encryption-key error]]
(init/initialize-app encryption-key error cofx)))
;; DB has been decrypted, load accounts, initialize geth, etc
(handlers/register-handler-fx
:init/after-decryption
[(re-frame/inject-cofx :data-store/get-all-accounts)]
(fn [cofx _]
(init/after-decryption cofx)))
(handlers/register-handler-fx
:init/initialize-account
[(re-frame/inject-cofx :web3/get-web3)
(re-frame/inject-cofx :get-default-contacts)
(re-frame/inject-cofx :get-default-dapps)
(re-frame/inject-cofx :data-store/all-chats)
(re-frame/inject-cofx :data-store/get-messages)
(re-frame/inject-cofx :data-store/get-user-statuses)
(re-frame/inject-cofx :data-store/unviewed-messages)
(re-frame/inject-cofx :data-store/message-ids)
(re-frame/inject-cofx :data-store/get-unanswered-requests)
(re-frame/inject-cofx :data-store/get-local-storage-data)
(re-frame/inject-cofx :data-store/get-all-contacts)
(re-frame/inject-cofx :data-store/get-all-mailservers)
(re-frame/inject-cofx :data-store/transport)
(re-frame/inject-cofx :data-store/all-browsers)
(re-frame/inject-cofx :data-store/all-dapp-permissions)]
(fn [cofx [_ address events-after]]
(init/initialize-account address events-after cofx)))
(handlers/register-handler-fx
:init/initialize-geth
(fn [cofx _]
(init/initialize-geth cofx)))
(handlers/register-handler-fx
:init/set-device-UUID
(fn [cofx [_ device-uuid]]
(init/set-device-uuid device-uuid cofx)))

View File

@ -8,7 +8,7 @@
status-im.data-store.core
[status-im.ui.screens.views :as views]
[status-im.ui.components.react :as react]
[status-im.utils.notifications :as notifications]
[status-im.notifications.core :as notifications]
[status-im.core :as core]
[status-im.utils.instabug :as instabug]
[status-im.utils.snoopy :as snoopy]))

View File

@ -1,6 +1,5 @@
(ns status-im.models.protocol
(:require [re-frame.core :as re-frame]
[status-im.constants :as constants]
(:require [status-im.constants :as constants]
[status-im.transport.core :as transport]
[status-im.transport.inbox :as transport.inbox]
[status-im.utils.ethereum.core :as ethereum]
@ -30,7 +29,7 @@
(defn check-sync-state
[{{:keys [web3] :as db} :db :as cofx}]
(if (:account/account db)
{:protocol/web3-get-syncing web3
{:web3/get-syncing web3
:dispatch-later [{:ms 10000 :dispatch [:check-sync-state]}]}
(semaphores/free :check-sync-state? cofx)))

View File

@ -7,7 +7,7 @@
[status-im.transport.inbox :as inbox]))
(re-frame/reg-fx
::listen-to-network-status
:network/listen-to-network-status
(fn [[connection-listener net-info-listener]]
(net-info/is-connected? connection-listener)
(net-info/net-info net-info-listener)
@ -20,22 +20,14 @@
(status/connection-change data)))
(handlers/register-handler-fx
:listen-to-network-status
(fn []
{::listen-to-network-status [#(re-frame/dispatch [::update-connection-status %])
#(re-frame/dispatch [::update-network-status %])]}))
(handlers/register-handler-fx
::update-connection-status
[re-frame/trim-v]
(fn [{db :db :as cofx} [is-connected?]]
:network/update-connection-status
(fn [{db :db :as cofx} [_ is-connected?]]
(handlers-macro/merge-fx
cofx
{:db (assoc db :network-status (if is-connected? :online :offline))}
(inbox/request-messages))))
(handlers/register-handler-fx
::update-network-status
[re-frame/trim-v]
(fn [_ [data]]
:network/update-network-status
(fn [_ [_ data]]
{::notify-status-go data}))

View File

@ -1,4 +1,4 @@
(ns status-im.utils.notifications
(ns status-im.notifications.core
(:require [goog.object :as object]
[re-frame.core :as re-frame]
[status-im.utils.handlers-macro :as handlers-macro]
@ -13,47 +13,32 @@
(when-not platform/desktop?
(handlers/register-handler-db
:update-fcm-token
(fn [db [_ fcm-token]]
(assoc-in db [:notifications :fcm-token] fcm-token)))
(handlers/register-handler-fx
:request-notifications-granted
(fn [_ _]
(re-frame/dispatch [:show-mainnet-is-default-alert])))
(handlers/register-handler-fx
:request-notifications-denied
(fn [_ _]
(re-frame/dispatch [:show-mainnet-is-default-alert])))
(def firebase (object/get rn/react-native-firebase "default"))
;; NOTE: Only need to explicitly request permissions on iOS.
(defn request-permissions []
(if platform/desktop?
(re-frame/dispatch [:request-notifications-granted {}])
(re-frame/dispatch [:notifications/request-notifications-granted {}])
(-> (.requestPermission (.messaging firebase))
(.then
(fn [_]
(log/debug "notifications-granted")
(re-frame/dispatch [:request-notifications-granted {}]))
(re-frame/dispatch [:notifications/request-notifications-granted {}]))
(fn [_]
(log/debug "notifications-denied")
(re-frame/dispatch [:request-notifications-denied {}]))))))
(re-frame/dispatch [:notifications/request-notifications-denied {}]))))))
(defn get-fcm-token []
(-> (.getToken (.messaging firebase))
(.then (fn [x]
(log/debug "get-fcm-token: " x)
(re-frame/dispatch [:update-fcm-token x])))))
(re-frame/dispatch [:notifications/update-fcm-token x])))))
(defn on-refresh-fcm-token []
(.onTokenRefresh (.messaging firebase)
(fn [x]
(log/debug "on-refresh-fcm-token: " x)
(re-frame/dispatch [:update-fcm-token x]))))
(re-frame/dispatch [:notifications/update-fcm-token x]))))
;; TODO(oskarth): Only called in background on iOS right now.
;; NOTE(oskarth): Hardcoded data keys :sum and :msg in status-go right now.
@ -108,7 +93,8 @@
:dispatch [:navigate-to-chat from]})
(store-event event cofx))))
(defn handle-push-notification [cofx [_ event]]
(defn handle-push-notification
[cofx [_ event]]
(handlers-macro/merge-fx cofx
(process-initial-push-notification event)
(process-push-notification event)))
@ -117,8 +103,8 @@
(let [to (get-in cofx [:db :accounts/accounts address :public-key])
from (get-in cofx [:db :push-notifications/stored to])]
(when from
[:handle-push-notification {:from from
:to to}])))
[:notification/handle-push-notification {:from from
:to to}])))
(defn parse-notification-payload [s]
(try
@ -133,9 +119,19 @@
to (object/get data "to")]
(log/debug "on notification" (pr-str msg))
(when (and from to)
(re-frame/dispatch [:handle-push-notification {:from from
:to to
:initial? initial?}]))))
(re-frame/dispatch [:notification/handle-push-notification {:from from
:to to
:initial? initial?}]))))
(defn handle-initial-push-notification
[initial?]
(when-not initial?
(.. firebase
notifications
getInitialNotification
(then (fn [event]
(when event
(handle-notification-event event {:initial? true})))))))
(defn on-notification-opened []
(.. firebase
@ -164,21 +160,6 @@
(then #(log/debug "Display Notification" title body))
(then #(log/debug "Display Notification error" title body))))
(re-frame/reg-fx :display-notification-fx display-notification)
(handlers/register-handler-fx :handle-push-notification handle-push-notification)
(re-frame/reg-fx
:handle-initial-push-notification-fx
(fn [{:keys [push-notifications/initial?]}]
(when-not initial?
(.. firebase
notifications
getInitialNotification
(then (fn [event]
(when event
(handle-notification-event event {:initial? true}))))))))
(defn init []
(on-refresh-fcm-token)
(on-notification)

View File

@ -0,0 +1,44 @@
(ns status-im.notifications.events
(:require [re-frame.core :as re-frame]
[status-im.notifications.core :as notifications]
[status-im.ui.screens.accounts.models :as accounts]
[status-im.utils.handlers :as handlers]
[status-im.utils.platform :as platform]))
(re-frame/reg-fx
:notifications/display-notification
notifications/display-notification)
(re-frame/reg-fx
:notifications/handle-initial-push-notification
notifications/handle-initial-push-notification)
(re-frame/reg-fx
:notifications/get-fcm-token
(fn [_]
(when platform/mobile?
(notifications/get-fcm-token))))
(re-frame/reg-fx
:notifications/request-notifications
(fn [_]
(notifications/request-permissions)))
(handlers/register-handler-fx
:notifications/handle-push-notification
notifications/handle-push-notification)
(handlers/register-handler-db
:notifications/update-fcm-token
(fn [db [_ fcm-token]]
(assoc-in db [:notifications :fcm-token] fcm-token)))
(handlers/register-handler-fx
:notifications/request-notifications-granted
(fn [cofx _]
(accounts/show-mainnet-is-default-alert cofx)))
(handlers/register-handler-fx
:notifications/request-notifications-denied
(fn [cofx _]
(accounts/show-mainnet-is-default-alert cofx)))

View File

@ -1,34 +1,10 @@
(ns status-im.protocol.handlers
(:require [re-frame.core :as re-frame]
[status-im.models.protocol :as models]
[status-im.utils.ethereum.core :as ethereum]
[status-im.utils.handlers :as handlers]
[status-im.utils.utils :as utils]
[status-im.utils.web3-provider :as web3-provider]))
;;;; COFX
(re-frame/reg-cofx
:protocol/get-web3
(fn [cofx _]
(let [web3 (web3-provider/make-internal-web3)]
(assoc cofx :web3 web3))))
;;; FX
(re-frame/reg-fx
:protocol/web3-get-syncing
(fn [web3]
(when web3
(.getSyncing
(.-eth web3)
(fn [error sync]
(re-frame/dispatch [:update-sync-state error sync]))))))
(re-frame/reg-fx
:protocol/set-default-account
(fn [[web3 address]]
(set! (.-defaultAccount (.-eth web3))
(ethereum/normalized-address address))))
[status-im.utils.utils :as utils]))
;;;; FX
(re-frame/reg-fx
:protocol/assert-correct-network
(fn [{:keys [web3 network-id]}]

View File

@ -0,0 +1,28 @@
(ns status-im.signals.core
(:require [status-im.init.core :as init]
[status-im.transport.handlers :as transport.handlers]
[status-im.transport.inbox :as inbox]
[status-im.utils.handlers-macro :as handlers-macro]
[status-im.utils.types :as types]
[taoensso.timbre :as log]))
(defn summary [peers-summary {:keys [db] :as cofx}]
(let [previous-summary (:peers-summary db)
peers-count (count peers-summary)]
(handlers-macro/merge-fx cofx
{:db (assoc db
:peers-summary peers-summary
:peers-count peers-count)}
(transport.handlers/resend-contact-messages previous-summary)
(inbox/peers-summary-change-fx previous-summary))))
(defn process [event-str cofx]
(let [{:keys [type event]} (types/json->clj event-str)]
(case type
"node.started" (init/status-node-started cofx)
"node.stopped" (init/status-node-stopped cofx)
"module.initialized" (init/status-module-initialized cofx)
"envelope.sent" (transport.handlers/update-envelope-status (:hash event) :sent cofx)
"envelope.expired" (transport.handlers/update-envelope-status (:hash event) :sent cofx)
"discovery.summary" (summary event cofx)
(log/debug "Event " type " not handled"))))

View File

@ -0,0 +1,12 @@
(ns status-im.signals.events
(:require [status-im.signals.core :as signals]
[status-im.utils.handlers :as handlers]
[status-im.utils.instabug :as instabug]
[taoensso.timbre :as log]))
(handlers/register-handler-fx
:signal-event
(fn [cofx [_ event-str]]
(log/debug :event-str event-str)
(instabug/log (str "Signal event: " event-str))
(signals/process event-str cofx)))

View File

@ -220,25 +220,23 @@
:data-store/tx [(transport-store/save-transport-tx {:chat-id chat-id
:chat updated-chat})]}))
(handlers/register-handler-fx
:signals/envelope-status
[re-frame/trim-v]
(fn [{:keys [db] :as cofx} [envelope-hash status]]
(let [{:keys [chat-id message-type message-id]}
(get-in db [:transport/message-envelopes envelope-hash])]
(case message-type
:contact-message
(when (= :sent status)
(handlers-macro/merge-fx cofx
(remove-hash envelope-hash)
(update-resend-contact-message chat-id)))
(defn update-envelope-status
[envelope-hash status {:keys [db] :as cofx}]
(let [{:keys [chat-id message-type message-id]}
(get-in db [:transport/message-envelopes envelope-hash])]
(case message-type
:contact-message
(when (= :sent status)
(handlers-macro/merge-fx cofx
(remove-hash envelope-hash)
(update-resend-contact-message chat-id)))
(when-let [message (get-in db [:chats chat-id :messages message-id])]
(let [{:keys [fcm-token]} (get-in db [:contacts/contacts chat-id])]
(handlers-macro/merge-fx cofx
(remove-hash envelope-hash)
(models.message/update-message-status message status)
(models.message/send-push-notification fcm-token status))))))))
(when-let [message (get-in db [:chats chat-id :messages message-id])]
(let [{:keys [fcm-token]} (get-in db [:contacts/contacts chat-id])]
(handlers-macro/merge-fx cofx
(remove-hash envelope-hash)
(models.message/update-message-status message status)
(models.message/send-push-notification fcm-token status)))))))
(defn- own-info [db]
(let [{:keys [name photo-path address]} (:account/account db)

View File

@ -6,8 +6,7 @@
[status-im.native-module.core :as status]
[status-im.utils.config :as config]
[status-im.utils.keychain.core :as keychain]
[status-im.utils.notifications :as notifications]
[taoensso.timbre :as log]
[status-im.notifications.core :as notifications]
[status-im.utils.platform :as platform]
[status-im.utils.universal-links.core :as universal-links]))
@ -33,7 +32,7 @@
(then (partial change-account! address))
(catch (fn [error]
;; If all else fails we fallback to showing initial error
(re-frame/dispatch [:initialize-app "" :decryption-failed])))))
(re-frame/dispatch [:init/initialize-app "" :decryption-failed])))))
;;;; Handlers
@ -85,15 +84,15 @@
:network network
:config config}))
(defn- wrap-with-initialize-geth-fx [db address password save-password]
(defn- wrap-with-initialize-geth [db address password save-password]
(let [{:keys [network config]} (get-network-by-address db address)]
{:initialize-geth-fx config
{:init/initialize-geth config
:db (assoc db
:network network
:node/after-start [:login-account-internal address password save-password])}))
(defn start-node [address password save-password {db :db}]
(wrap-with-initialize-geth-fx
(wrap-with-initialize-geth
(assoc db :node/after-stop nil)
address password save-password))
@ -112,7 +111,7 @@
db' (-> db
(assoc-in [:accounts/login :processing] true))
wrap-fn (cond (not status-node-started?)
wrap-with-initialize-geth-fx
wrap-with-initialize-geth
(not (restart-node? account-network
network
@ -142,7 +141,7 @@
{:db (cond-> (dissoc db :accounts/login)
(= view-id :create-account)
(assoc-in [:accounts/create :step] :enter-name))
:dispatch [:initialize-account address
:dispatch [:init/initialize-account address
(when (not= view-id :create-account)
[[:navigate-to-clean :home]
(universal-links/stored-url-event cofx)

View File

@ -88,9 +88,9 @@
(defn account-set-name [{{:accounts/keys [create] :as db} :db :as cofx}]
(handlers-macro/merge-fx cofx
{:db (assoc db :accounts/create {:show-welcome? true})
:dispatch-n [[:navigate-to-clean :home]
[:request-notifications]]}
{:db (assoc db :accounts/create {:show-welcome? true})
:notifications/request-notifications nil
:dispatch [:navigate-to-clean :home]}
(accounts.utils/account-update {:name (:name create)})))
(defn account-set-input-text [input-key text {db :db}]

View File

@ -10,7 +10,6 @@
(re-frame/reg-fx
:resolve-whisper-identity
(fn [{:keys [web3 registry ens-name cb]}]
(println registry ens-name)
(stateofus/text web3 registry ens-name cb)))
(handlers/register-handler-fx

View File

@ -1,6 +1,5 @@
(ns status-im.ui.screens.events
(:require status-im.chat.events
[status-im.models.chat :as chat]
status-im.network.events
[status-im.transport.handlers :as transport.handlers]
status-im.protocol.handlers
@ -10,15 +9,17 @@
status-im.ui.screens.accounts.login.events
[status-im.ui.screens.accounts.login.models :as login]
status-im.ui.screens.accounts.recover.events
[status-im.ui.screens.contacts.events :as contacts]
[status-im.models.contacts :as models.contacts]
status-im.ui.screens.add-new.new-chat.events
status-im.ui.screens.group.chat-settings.events
status-im.ui.screens.group.events
[status-im.ui.screens.navigation :as navigation]
[status-im.utils.universal-links.core :as universal-links]
[status-im.utils.dimensions :as dimensions]
status-im.utils.universal-links.events
status-im.init.events
status-im.signals.events
status-im.web3.events
status-im.notifications.events
status-im.ui.screens.add-new.new-chat.navigation
status-im.ui.screens.network-settings.events
status-im.ui.screens.profile.events
@ -29,13 +30,11 @@
status-im.ui.screens.wallet.send.events
status-im.ui.screens.wallet.settings.events
status-im.ui.screens.wallet.transactions.events
[status-im.models.transactions :as transactions]
status-im.ui.screens.wallet.choose-recipient.events
status-im.ui.screens.wallet.collectibles.cryptokitties.events
status-im.ui.screens.wallet.collectibles.cryptostrikers.events
status-im.ui.screens.wallet.collectibles.etheremon.events
status-im.ui.screens.browser.events
[status-im.models.browser :as browser]
status-im.ui.screens.offline-messaging-settings.events
status-im.ui.screens.privacy-policy.events
status-im.ui.screens.bootnodes-settings.events
@ -44,27 +43,14 @@
[re-frame.core :as re-frame]
[status-im.native-module.core :as status]
[status-im.ui.components.permissions :as permissions]
[status-im.constants :as constants]
[status-im.data-store.core :as data-store]
[status-im.data-store.realm.core :as realm]
[status-im.utils.keychain.core :as keychain]
[status-im.i18n :as i18n]
[status-im.js-dependencies :as dependencies]
[status-im.ui.components.react :as react]
[status-im.transport.core :as transport]
[status-im.transport.inbox :as inbox]
[status-im.ui.screens.db :refer [app-db]]
[status-im.utils.datetime :as time]
[status-im.utils.ethereum.core :as ethereum]
[status-im.utils.random :as random]
[status-im.utils.config :as config]
[status-im.utils.notifications :as notifications]
[status-im.utils.handlers :as handlers]
[status-im.utils.handlers-macro :as handlers-macro]
[status-im.utils.http :as http]
[status-im.utils.instabug :as instabug]
[status-im.utils.platform :as platform]
[status-im.utils.types :as types]
[status-im.utils.utils :as utils]
[taoensso.timbre :as log]))
@ -104,69 +90,16 @@
(doseq [call calls]
(http-get call))))
(re-frame/reg-fx
:fetch-web3-node-version
(fn [web3 _]
(.. web3 -version (getNode (fn [err resp]
(when-not err
(re-frame/dispatch [:fetch-web3-node-version-callback resp])))))
nil))
;; Try to decrypt the database, move on if successful otherwise go back to
;; initial state
(re-frame/reg-fx
::init-store
(fn [encryption-key]
(.. (data-store/init encryption-key)
(then #(re-frame/dispatch [:after-decryption]))
(catch (fn [error]
(log/warn "Could not decrypt database" error)
(re-frame/dispatch [:initialize-app encryption-key :decryption-failed]))))))
(re-frame/reg-fx
:initialize-geth-fx
(fn [config]
(status/start-node (types/clj->json config) config/fleet)))
(re-frame/reg-fx
::status-module-initialized-fx
(fn [_]
(status/module-initialized!)))
(re-frame/reg-fx
:request-permissions-fx
(fn [options]
(permissions/request-permissions options)))
(re-frame/reg-fx
::request-notifications-fx
(fn [_]
(notifications/request-permissions)))
(re-frame/reg-fx
::testfairy-alert
(fn [_]
(when config/testfairy-enabled?
(utils/show-popup
(i18n/label :testfairy-title)
(i18n/label :testfairy-message)))))
(re-frame/reg-fx
::init-device-UUID
(fn []
(status/get-device-UUID #(re-frame/dispatch [:set :device-UUID %]))))
(re-frame/reg-fx
::listen-to-window-dimensions-change
:ui/listen-to-window-dimensions-change
(fn []
(dimensions/add-event-listener)))
(re-frame/reg-fx
::get-fcm-token-fx
(fn [_]
(when platform/mobile?
(notifications/get-fcm-token))))
(re-frame/reg-fx
:show-error
(fn [content]
@ -199,262 +132,37 @@
(fn [db [_ path v]]
(assoc-in db path v)))
(defn- reset-keychain []
(.. (keychain/reset)
(then
#(re-frame/dispatch [:initialize-keychain]))))
(defn- handle-reset-data []
(.. (realm/delete-realms)
(then reset-keychain)
(catch reset-keychain)))
(defn handle-invalid-key-parameters [encryption-key]
{:title (i18n/label :invalid-key-title)
:content (i18n/label :invalid-key-content)
:confirm-button-text (i18n/label :invalid-key-confirm)
;; On cancel we initialize the app with the invalid key, to allow the user
;; to recover the seed phrase
:on-cancel #(do
(log/warn "initializing app with invalid key")
(re-frame/dispatch [:initialize-app encryption-key]))
:on-accept handle-reset-data})
(defn handle-decryption-failed-parameters [encryption-key]
{:title (i18n/label :decryption-failed-title)
:content (i18n/label :decryption-failed-content)
:confirm-button-text (i18n/label :decryption-failed-confirm)
;; On cancel we initialize the app with the same key, in case the error was
;; not related/fs error
:on-cancel #(do
(log/warn "initializing app with same key after decryption failed")
(re-frame/dispatch [:initialize-app encryption-key]))
:on-accept handle-reset-data})
(defn initialize-views [cofx]
(let [{{:accounts/keys [accounts] :as db} :db} cofx
{:keys [address photo-path name]} (first (sort-by :last-sign-in > (vals accounts)))
default-fx {:handle-initial-push-notification-fx db}]
(if (nil? address)
(handlers-macro/merge-fx cofx
default-fx
(navigation/navigate-to-clean :intro))
(handlers-macro/merge-fx cofx
default-fx
(login/open-login address photo-path name)))))
(defn initialize-db
"Initialize db to the initial state"
[{{:universal-links/keys [url]
:push-notifications/keys [initial?]
:keys [status-module-initialized? status-node-started?
network-status network peers-count peers-summary device-UUID]
:or {network (get app-db :network)}} :db}]
{:db (assoc app-db
:contacts/contacts {}
:network-status network-status
:peers-count (or peers-count 0)
:peers-summary (or peers-summary [])
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
:status-node-started? status-node-started?
:network network
:universal-links/url url
:push-notifications/initial? initial?
:device-UUID device-UUID)})
;; Entrypoint, fetches the key from the keychain and initialize the app
(handlers/register-handler-fx
:initialize-keychain
(fn [_ _]
{:get-encryption-key [:initialize-app]}))
;; Check the key is valid, shows options if not, otherwise continues loading
;; the database
(handlers/register-handler-fx
:initialize-app
(fn [cofx [_ encryption-key error]]
(cond
(= :invalid-key error)
{:show-confirmation (handle-invalid-key-parameters encryption-key)}
(= :decryption-failed error)
{:show-confirmation (handle-decryption-failed-parameters encryption-key)}
:else
(handlers-macro/merge-fx cofx
{::init-device-UUID nil
::init-store encryption-key
::listen-to-window-dimensions-change nil
::testfairy-alert nil}
(initialize-db)))))
;; DB has been decrypted, load accounts, initialize geth, etc
(handlers/register-handler-fx
:after-decryption
[(re-frame/inject-cofx :data-store/get-all-accounts)]
(fn [cofx _]
(handlers-macro/merge-fx cofx
{:dispatch-n
[[:listen-to-network-status]
[:initialize-geth]]}
(accounts.models/load-accounts)
(initialize-views))))
(defn logout
[{:keys [db] :as cofx}]
(let [{:transport/keys [chats]} db]
(handlers-macro/merge-fx cofx
{:dispatch [:init/initialize-keychain]
:clear-user-password [(get-in db [:account/account :address])]}
(navigation/navigate-to-clean nil)
(transport/stop-whisper))))
(handlers/register-handler-fx
:logout
(fn [{:keys [db] :as cofx} _]
(let [{:transport/keys [chats]} db]
(handlers-macro/merge-fx cofx
{:dispatch [:initialize-keychain]
:clear-user-password [(get-in db [:account/account :address])]}
(navigation/navigate-to-clean nil)
(transport/stop-whisper)))))
(fn [cofx _]
(logout cofx)))
(defn initialize-account-db [address {:keys [db web3]}]
(let [{:keys [accounts/accounts accounts/create contacts/contacts networks/networks
network network-status peers-count peers-summary view-id navigation-stack
status-module-initialized? status-node-started? device-UUID
push-notifications/initial? semaphores]
:or {network (get app-db :network)}} db
console-contact (get contacts constants/console-chat-id)
current-account (accounts address)
account-network-id (get current-account :network network)
account-network (get-in current-account [:networks account-network-id])]
{:db (cond-> (assoc app-db
:current-public-key (:public-key current-account)
:view-id view-id
:navigation-stack navigation-stack
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
:status-node-started? status-node-started?
:accounts/create create
:networks/networks networks
:account/account current-account
:network-status network-status
:network network
:chain (ethereum/network->chain-name account-network)
:push-notifications/initial? initial?
:peers-summary peers-summary
:peers-count peers-count
:device-UUID device-UUID
:semaphores semaphores
:web3 web3)
console-contact
(assoc :contacts/contacts {constants/console-chat-id console-contact}))}))
(handlers/register-handler-fx
:initialize-account
[(re-frame/inject-cofx :protocol/get-web3)
(re-frame/inject-cofx :get-default-contacts)
(re-frame/inject-cofx :get-default-dapps)
(re-frame/inject-cofx :data-store/all-chats)
(re-frame/inject-cofx :data-store/get-messages)
(re-frame/inject-cofx :data-store/get-user-statuses)
(re-frame/inject-cofx :data-store/unviewed-messages)
(re-frame/inject-cofx :data-store/message-ids)
(re-frame/inject-cofx :data-store/get-unanswered-requests)
(re-frame/inject-cofx :data-store/get-local-storage-data)
(re-frame/inject-cofx :data-store/get-all-contacts)
(re-frame/inject-cofx :data-store/get-all-mailservers)
(re-frame/inject-cofx :data-store/transport)
(re-frame/inject-cofx :data-store/all-browsers)
(re-frame/inject-cofx :data-store/all-dapp-permissions)]
(fn [{:keys [web3] :as cofx} [_ address events-after]]
(handlers-macro/merge-fx cofx
{:protocol/set-default-account [web3 address]
:fetch-web3-node-version web3
::get-fcm-token-fx nil
:dispatch-n (or events-after [])}
(initialize-account-db address)
(models.protocol/initialize-protocol address)
(models.contacts/load-contacts)
(chat/initialize-chats)
(chat/process-pending-messages)
(browser/initialize-browsers)
(browser/initialize-dapp-permissions)
(models.wallet/update-wallet)
(transactions/run-update)
(transactions/start-sync)
(models.account/update-sign-in-time))))
(handlers/register-handler-fx
:initialize-geth
(fn [{db :db} _]
(when-not (:status-node-started? db)
(let [default-networks (:networks/networks db)
default-network (:network db)]
{:initialize-geth-fx (get-in default-networks [default-network :config])}))))
(handlers/register-handler-fx
:fetch-web3-node-version-callback
(fn [{:keys [db]} [_ resp]]
(when-let [git-commit (nth (re-find #"-([0-9a-f]{7,})/" resp) 1)]
{:db (assoc db :web3-node-version git-commit)})))
(handlers/register-handler-fx
:discovery/summary
(fn [{:keys [db] :as cofx} [_ peers-summary]]
(let [previous-summary (:peers-summary db)
peers-count (count peers-summary)]
(handlers-macro/merge-fx cofx
{:db (assoc db
:peers-summary peers-summary
:peers-count peers-count)}
(transport.handlers/resend-contact-messages previous-summary)
(inbox/peers-summary-change-fx previous-summary)))))
(handlers/register-handler-fx
:signal-event
(fn [_ [_ event-str]]
(log/debug :event-str event-str)
(instabug/log (str "Signal event: " event-str))
(let [{:keys [type event]} (types/json->clj event-str)
to-dispatch (case type
"node.started" [:status-node-started]
"node.stopped" [:status-node-stopped]
"module.initialized" [:status-module-initialized]
"envelope.sent" [:signals/envelope-status (:hash event) :sent]
"envelope.expired" [:signals/envelope-status (:hash event) :not-sent]
"discovery.summary" [:discovery/summary event]
(log/debug "Event " type " not handled"))]
(when to-dispatch
{:dispatch to-dispatch}))))
(handlers/register-handler-fx
:status-module-initialized
(fn [{:keys [db]} _]
{:db (assoc db :status-module-initialized? true)
::status-module-initialized-fx nil}))
(handlers/register-handler-fx
:status-node-started
(fn [{{:node/keys [after-start] :as db} :db} _]
(merge {:db (assoc db :status-node-started? true)}
(when after-start {:dispatch-n [after-start]}))))
(handlers/register-handler-fx
:status-node-stopped
(fn [{{:node/keys [after-stop]} :db} _]
(when after-stop {:dispatch-n [after-stop]})))
(defn app-state-change [state {:keys [db] :as cofx}]
(let [app-coming-from-background? (= state "active")]
(handlers-macro/merge-fx cofx
{::app-state-change-fx state
:db (assoc db :app-state state)}
(inbox/request-messages app-coming-from-background?))))
(handlers/register-handler-fx
:app-state-change
(fn [{:keys [db] :as cofx} [_ state]]
(let [app-coming-from-background? (= state "active")]
(handlers-macro/merge-fx cofx
{::app-state-change-fx state
:db (assoc db :app-state state)}
(inbox/request-messages app-coming-from-background?)))))
(fn [cofx [_ state]]
(app-state-change state cofx)))
(handlers/register-handler-fx
:request-permissions
(fn [_ [_ options]]
{:request-permissions-fx options}))
(handlers/register-handler-fx
:request-notifications
(fn [_ _]
{::request-notifications-fx {}}))
(handlers/register-handler-db
:set-swipe-position
[re-frame/trim-v]

View File

@ -12,7 +12,7 @@
(or error :invalid-key)]))))
(re-frame/reg-fx
:get-encryption-key
:keychain/get-encryption-key
(fn [event]
(when platform/desktop? (keychain/set-username))
(.. (keychain/get-encryption-key)

View File

@ -1,17 +0,0 @@
(ns status-im.utils.web3-provider
(:require [taoensso.timbre :as log]
[status-im.native-module.core :as status]
[status-im.js-dependencies :as dependencies]))
;; This Web3 object will allow access to private RPC calls
;; It should be only used for internal application needs and never provided to any
;; 3rd parties (DApps, etc)
(defn make-internal-web3 []
(dependencies/Web3.
#js {:sendAsync (fn [payload callback]
(status/call-private-rpc
(.stringify js/JSON payload)
(fn [response]
(if (= "" response)
(log/warn :web3-response-error)
(callback nil (.parse js/JSON response))))))}))

View File

@ -0,0 +1,53 @@
(ns status-im.web3.core
(:require [re-frame.core :as re-frame]
[status-im.js-dependencies :as dependencies]
[status-im.utils.ethereum.core :as ethereum]
[taoensso.timbre :as log]
[status-im.native-module.core :as status]))
(defn make-internal-web3
"This Web3 object will allow access to private RPC calls
It should be only used for internal application needs and never provided to any
3rd parties (DApps, etc)"
[]
(dependencies/Web3.
#js {:sendAsync (fn [payload callback]
(status/call-private-rpc
(.stringify js/JSON payload)
(fn [response]
(if (= "" response)
(log/warn :web3-response-error)
(callback nil (.parse js/JSON response))))))}))
(defn get-web3 [cofx]
(let [web3 (make-internal-web3)]
(assoc cofx :web3 web3)))
;;; FX
(defn get-syncing [web3]
(when web3
(.getSyncing
(.-eth web3)
(fn [error sync]
(re-frame/dispatch [:update-sync-state error sync])))))
(defn set-default-account
[web3 address]
(set! (.-defaultAccount (.-eth web3))
(ethereum/normalized-address address)))
(defn fetch-node-version
[web3]
(.. web3
-version
(getNode
(fn [err resp]
(when-not err
(re-frame/dispatch [:web3/fetch-node-version-callback resp]))))))
(defn fetch-node-version-callback
[resp {:keys [db]}]
(when-let [git-commit (nth (re-find #"-([0-9a-f]{7,})/" resp) 1)]
{:db (assoc db :web3-node-version git-commit)}))

View File

@ -0,0 +1,29 @@
(ns status-im.web3.events
(:require [re-frame.core :as re-frame]
[status-im.utils.handlers :as handlers]
[status-im.web3.core :as web3]))
;;;; COFX
(re-frame/reg-cofx
:web3/get-web3
web3/get-web3)
;;;; FX
(re-frame/reg-fx
:web3/get-syncing
web3/get-syncing)
(re-frame/reg-fx
:web3/set-default-account
(fn [[web3 address]]
(web3/set-default-account web3 address)))
(re-frame/reg-fx
:web3/fetch-node-version
web3/fetch-node-version)
;;;; Events
(handlers/register-handler-fx
:web3/fetch-node-version-callback
(fn [cofx [_ resp]]
(web3/fetch-node-version-callback resp cofx)))

View File

@ -1,7 +1,7 @@
(ns status-im.test.browser.events
(:require [cljs.test :refer-macros [deftest is testing]]
[day8.re-frame.test :refer-macros [run-test-sync]]
[status-im.ui.screens.events :as events]
[status-im.init.core :as init]
status-im.ui.screens.db
status-im.ui.screens.subs
[re-frame.core :as re-frame]
@ -13,7 +13,7 @@
(defn test-fixtures []
(re-frame/reg-fx ::events/init-store #())
(re-frame/reg-fx :init/init-store #())
(re-frame/reg-fx :browse #())
(re-frame/reg-fx :data-store/tx #())
@ -43,7 +43,7 @@
:initialize-test
(fn [cofx [_]]
(handlers-macro/merge-fx cofx
(events/initialize-db)
(init/initialize-db)
(browser/initialize-browsers)
(browser/initialize-dapp-permissions)))))
@ -54,15 +54,13 @@
(test-fixtures)
(re-frame/dispatch [:initialize-test])
(println :app-db @re-frame.db/app-db)
(let [browsers (re-frame/subscribe [:browsers])
dapp1-url "cryptokitties.co"
dapp2-url "http://test2.com"]
(testing "open and remove dapps"
(println :browsers @browsers)
(is (do (println :browser @browsers)
(zero? (count @browsers))))
(is (zero? (count @browsers)))
(re-frame/dispatch [:open-url-in-browser dapp1-url])

View File

@ -0,0 +1,9 @@
(ns status-im.test.init.core
(:require [cljs.test :refer-macros [deftest is testing]]
[status-im.init.core :as init]))
(deftest initialize-db
(testing "it preserves universal-links/url"
(is (= "some-url" (get-in (init/initialize-db {:db
{:universal-links/url "some-url"}})
[:db :universal-links/url])))))

View File

@ -1,6 +1,6 @@
(ns status-im.test.utils.notifications
(ns status-im.test.notifications.core
(:require [cljs.test :refer-macros [deftest is testing]]
[status-im.utils.notifications :as notifications]))
[status-im.notifications.core :as notifications]))
(deftest test-handle-push-notification
(testing "user's signed in"

View File

@ -47,7 +47,7 @@
[status-im.test.utils.keychain.core]
[status-im.test.utils.universal-links.core]
[status-im.test.utils.http]
[status-im.test.ui.screens.events]
[status-im.test.init.core]
[status-im.test.ui.screens.accounts.login.models]
[status-im.test.ui.screens.accounts.recover.models]
[status-im.test.ui.screens.wallet.db]))
@ -69,6 +69,7 @@
'status-im.test.contacts.events
'status-im.test.contacts.subs
'status-im.test.profile.events
'status-im.test.init.core
'status-im.test.data-store.realm.core
'status-im.test.models.mailserver
'status-im.test.models.bootnode
@ -107,7 +108,6 @@
'status-im.test.utils.keychain.core
'status-im.test.utils.universal-links.core
'status-im.test.utils.http
'status-im.test.ui.screens.events
'status-im.test.ui.screens.accounts.login.models
'status-im.test.ui.screens.accounts.recover.models
'status-im.test.ui.screens.wallet.db

View File

@ -28,105 +28,108 @@
(testing "save password: status-go not started"
(let [actual (models/login-account "testnet" "password" true initial-db)]
(testing "it starts status-node if it has not started"
(is (= {:NetworkId 3} (:initialize-geth-fx actual))))
(is (= {:NetworkId 3}
(:init/initialize-geth
actual))))
(testing "it logins the user after the node started"
(is (= [:login-account-internal "testnet" "password" true] (get-in actual [:db :node/after-start]))))))
(testing "status-go has started & the user is on mainnet"
(let [db (assoc-in initial-db [:db :status-node-started?] true)
actual (models/login-account "mainnet" "password" false db)]
(testing "it does not start status-node if it has already started"
(is (not (:initialize-geth-fx actual))))
(is (not (:init/initialize-geth actual))))
(testing "it logs in the user"
(is (= ["mainnet" "password" false] (:login actual))))))
(is (= ["mainnet" "password" false] (:login actual)))))))
(testing "the user has selected a different network"
(testing "status-go has started"
(let [db (assoc-in initial-db [:db :status-node-started?] true)
actual (models/login-account "testnet" "password" false db)]
(testing "it dispatches start-node"
(is (get-in actual [:db :node/after-stop] [:start-node "testnet" "password" true])))
(testing "it stops status-node"
(is (contains? actual :stop-node))))))
(testing "the user has selected a different network"
(testing "status-go has started"
(let [db (assoc-in initial-db [:db :status-node-started?] true)
actual (models/login-account "testnet" "password" false db)]
(testing "it dispatches start-node"
(is (get-in actual [:db :node/after-stop] [:start-node "testnet" "password" true])))
(testing "it stops status-node"
(is (contains? actual :stop-node))))))
(testing "status-go has not started"
(let [actual (models/login-account "testnet" "password" false initial-db)]
(testing "it starts status-node"
(is (= {:NetworkId 3} (:init/initialize-geth actual))))
(testing "it logins the user after the node started"
(is (= [:login-account-internal "testnet" "password" false] (get-in actual [:db :node/after-start]))))))
(testing "status-go has started & the user is on mainnet"
(let [db (assoc-in initial-db [:db :status-node-started?] true)
actual (models/login-account "mainnet" "password" false db)]
(testing "it does not start status-node if it has already started"
(is (not (:init/initialize-geth actual))))
(testing "it logs in the user"
(is (= ["mainnet" "password" false] (:login actual))))))
(testing "the user has selected a different network"
(testing "status-go has started"
(let [db (assoc-in initial-db [:db :status-node-started?] true)
actual (models/login-account "testnet" "password" false db)]
(testing "it dispatches start-node"
(is (get-in actual [:db :node/after-stop] [:start-node "testnet" "password" false])))
(testing "it stops status-node"
(is (contains? actual :stop-node)))))
(testing "status-go has not started"
(let [actual (models/login-account "testnet" "password" false initial-db)]
(testing "it starts status-node if it has not started"
(is (= {:NetworkId 3} (:initialize-geth-fx actual))))
(testing "it starts status-node"
(is (= {:NetworkId 3} (:init/initialize-geth actual))))
(testing "it logins the user after the node started"
(is (= [:login-account-internal "testnet" "password" false] (get-in actual [:db :node/after-start]))))))
(is (= [:login-account-internal "testnet" "password" false] (get-in actual [:db :node/after-start])))))))
(testing "status-go has started & the user is on mainnet"
(let [db (assoc-in initial-db [:db :status-node-started?] true)
actual (models/login-account "mainnet" "password" false db)]
(testing "it does not start status-node if it has already started"
(is (not (:initialize-geth-fx actual))))
(testing "it logs in the user"
(is (= ["mainnet" "password" false] (:login actual))))))
(testing "custom bootnodes"
(let [custom-bootnodes {"a" {:id "a"
:name "name-a"
:address "address-a"}
"b" {:id "b"
:name "name-b"
:address "address-b"}}
bootnodes-db (assoc-in
initial-db
[:db :accounts/accounts "mainnet" :bootnodes]
{"mainnet_rpc" custom-bootnodes})]
(testing "the user has selected a different network"
(testing "status-go has started"
(let [db (assoc-in initial-db [:db :status-node-started?] true)
actual (models/login-account "testnet" "password" false db)]
(testing "it dispatches start-node"
(is (get-in actual [:db :node/after-stop] [:start-node "testnet" "password" false])))
(testing "it stops status-node"
(is (contains? actual :stop-node)))))
(testing "status-go has not started"
(let [actual (models/login-account "testnet" "password" false initial-db)]
(testing "it starts status-node"
(is (= {:NetworkId 3} (:initialize-geth-fx actual))))
(testing "it logins the user after the node started"
(is (= [:login-account-internal "testnet" "password" false] (get-in actual [:db :node/after-start])))))))
(testing "custom bootnodes"
(let [custom-bootnodes {"a" {:id "a"
:name "name-a"
:address "address-a"}
"b" {:id "b"
:name "name-b"
:address "address-b"}}
bootnodes-db (assoc-in
initial-db
[:db :accounts/accounts "mainnet" :bootnodes]
{"mainnet_rpc" custom-bootnodes})]
(testing "custom bootnodes enabled"
(let [bootnodes-enabled-db (assoc-in
bootnodes-db
[:db :accounts/accounts "mainnet" :settings]
{:bootnodes {"mainnet_rpc" true}})
actual (models/login-account "mainnet" "password" false bootnodes-enabled-db)]
(testing "status-node has started"
(let [db (assoc-in bootnodes-enabled-db [:db :status-node-started?] true)
actual (models/login-account "mainnet" "password" false db)]
(testing "it dispatches start-node"
(is (get-in actual [:db :node/after-stop] [:start-node "testnet" "password" false])))
(testing "it stops status-node"
(is (contains? actual :stop-node)))))
(testing "status-node has not started"
(let [actual (models/login-account "mainnet" "password" false bootnodes-enabled-db)]
(testing "it adds bootnodes to the config"
(is (= {:ClusterConfig {:Enabled true
:BootNodes ["address-a" "address-b"]}
:NetworkId 1} (:initialize-geth-fx actual))))
(testing "it logins the user after the node started"
(is (= [:login-account-internal "mainnet" "password" false] (get-in actual [:db :node/after-start]))))))))
(testing "custom bootnodes not enabled"
(testing "custom bootnodes enabled"
(let [bootnodes-enabled-db (assoc-in
bootnodes-db
[:db :accounts/accounts "mainnet" :settings]
{:bootnodes {"mainnet_rpc" true}})
actual (models/login-account "mainnet" "password" false bootnodes-enabled-db)]
(testing "status-node has started"
(let [db (assoc-in bootnodes-db [:db :status-node-started?] true)
(let [db (assoc-in bootnodes-enabled-db [:db :status-node-started?] true)
actual (models/login-account "mainnet" "password" false db)]
(testing "it does not start status-node if it has already started"
(is (not (:initialize-geth-fx actual))))
(testing "it logs in the user"
(is (= ["mainnet" "password" false] (:login actual))))))
(testing "it dispatches start-node"
(is (get-in actual [:db :node/after-stop] [:start-node "testnet" "password" false])))
(testing "it stops status-node"
(is (contains? actual :stop-node)))))
(testing "status-node has not started"
(let [actual (models/login-account "mainnet" "password" false bootnodes-db)]
(testing "it starts status-node without custom bootnodes"
(is (= {:NetworkId 1} (:initialize-geth-fx actual))))
(let [actual (models/login-account "mainnet" "password" false bootnodes-enabled-db)]
(testing "it adds bootnodes to the config"
(is (= {:ClusterConfig {:Enabled true
:BootNodes ["address-a" "address-b"]}
:NetworkId 1} (:init/initialize-geth actual))))
(testing "it logins the user after the node started"
(is (= [:login-account-internal "mainnet" "password" false] (get-in actual [:db :node/after-start]))))))))))))
(is (= [:login-account-internal "mainnet" "password" false] (get-in actual [:db :node/after-start]))))))))
(testing "custom bootnodes not enabled"
(testing "status-node has started"
(let [db (assoc-in bootnodes-db [:db :status-node-started?] true)
actual (models/login-account "mainnet" "password" false db)]
(testing "it does not start status-node if it has already started"
(is (not (:init/initialize-geth actual))))
(testing "it logs in the user"
(is (= ["mainnet" "password" false] (:login actual))))))
(testing "status-node has not started"
(let [actual (models/login-account "mainnet" "password" false bootnodes-db)]
(testing "it starts status-node without custom bootnodes"
(is (= {:NetworkId 1} (:init/initialize-geth actual))))
(testing "it logins the user after the node started"
(is (= [:login-account-internal "mainnet" "password" false] (get-in actual [:db :node/after-start])))))))))))
(deftest restart-node?
(testing "custom bootnodes is toggled off"

View File

@ -1,9 +0,0 @@
(ns status-im.test.ui.screens.events
(:require [cljs.test :refer-macros [deftest is testing]]
[status-im.ui.screens.events :as events]))
(deftest initialize-db
(testing "it preserves universal-links/url"
(is (= "some-url" (get-in (events/initialize-db {:db
{:universal-links/url "some-url"}})
[:db :universal-links/url])))))