refactor :initialize-account into single event
fix tests for :initialize-account refactoring fix destructuring typo
This commit is contained in:
parent
198596d5e6
commit
002f3e73d1
|
@ -1,29 +1,23 @@
|
||||||
(ns status-im.chat.events
|
(ns status-im.chat.events
|
||||||
(:require [clojure.set :as set]
|
(:require status-im.chat.events.input
|
||||||
|
status-im.chat.events.requests
|
||||||
|
status-im.chat.events.send-message
|
||||||
|
status-im.chat.events.receive-message
|
||||||
[clojure.string :as string]
|
[clojure.string :as string]
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[status-im.constants :as constants]
|
|
||||||
[status-im.i18n :as i18n]
|
|
||||||
[status-im.chat.models :as models]
|
[status-im.chat.models :as models]
|
||||||
[status-im.chat.models.message :as models.message]
|
[status-im.chat.models.message :as models.message]
|
||||||
[status-im.chat.commands.core :as commands]
|
[status-im.constants :as constants]
|
||||||
|
[status-im.data-store.user-statuses :as user-statuses-store]
|
||||||
|
[status-im.i18n :as i18n]
|
||||||
|
[status-im.transport.message.core :as transport.message]
|
||||||
|
[status-im.transport.message.v1.group-chat :as group-chat]
|
||||||
|
[status-im.transport.message.v1.protocol :as protocol]
|
||||||
|
[status-im.transport.message.v1.public-chat :as public-chat]
|
||||||
[status-im.ui.screens.navigation :as navigation]
|
[status-im.ui.screens.navigation :as navigation]
|
||||||
[status-im.utils.handlers :as handlers]
|
[status-im.utils.handlers :as handlers]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.handlers-macro :as handlers-macro]
|
||||||
[status-im.utils.contacts :as utils.contacts]
|
[status-im.utils.utils :as utils]))
|
||||||
[status-im.utils.utils :as utils]
|
|
||||||
[status-im.transport.message.core :as transport.message]
|
|
||||||
[status-im.transport.message.v1.protocol :as protocol]
|
|
||||||
[status-im.transport.message.v1.public-chat :as public-chat]
|
|
||||||
[status-im.transport.message.v1.group-chat :as group-chat]
|
|
||||||
[status-im.data-store.chats :as chats-store]
|
|
||||||
[status-im.data-store.messages :as messages-store]
|
|
||||||
[status-im.data-store.user-statuses :as user-statuses-store]
|
|
||||||
[status-im.data-store.contacts :as contacts-store]
|
|
||||||
status-im.chat.events.input
|
|
||||||
status-im.chat.events.requests
|
|
||||||
status-im.chat.events.send-message
|
|
||||||
status-im.chat.events.receive-message))
|
|
||||||
|
|
||||||
;;;; Effects
|
;;;; Effects
|
||||||
|
|
||||||
|
@ -84,105 +78,6 @@
|
||||||
new-status)
|
new-status)
|
||||||
:data-store/tx [(user-statuses-store/save-status-tx new-status)]})))
|
:data-store/tx [(user-statuses-store/save-status-tx new-status)]})))
|
||||||
|
|
||||||
;; Change status of own messages which are still in "sending" status to "not-sent"
|
|
||||||
;; (If signal from status-go has not been received)
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:process-pending-messages
|
|
||||||
[re-frame/trim-v]
|
|
||||||
(fn [{:keys [db]} []]
|
|
||||||
(let [me (:current-public-key db)
|
|
||||||
pending-statuses (->> (vals (:chats db))
|
|
||||||
(mapcat :message-statuses)
|
|
||||||
(mapcat (fn [[_ user-id->status]]
|
|
||||||
(filter (comp (partial = :sending) :status)
|
|
||||||
(get user-id->status me)))))
|
|
||||||
updated-statuses (map #(assoc % :status :not-sent) pending-statuses)]
|
|
||||||
{:data-store/tx [(user-statuses-store/save-statuses-tx updated-statuses)]
|
|
||||||
:db (reduce
|
|
||||||
(fn [acc {:keys [chat-id message-id status whisper-identity]}]
|
|
||||||
(assoc-in acc
|
|
||||||
[:chats chat-id :message-status message-id
|
|
||||||
whisper-identity :status]
|
|
||||||
status))
|
|
||||||
db
|
|
||||||
updated-statuses)})))
|
|
||||||
|
|
||||||
(defn- add-default-contacts
|
|
||||||
[{:keys [db default-contacts] :as cofx}]
|
|
||||||
(let [new-contacts (-> {}
|
|
||||||
(into (map (fn [[id props]]
|
|
||||||
(let [contact-id (name id)]
|
|
||||||
[contact-id {:whisper-identity contact-id
|
|
||||||
:address (utils.contacts/public-key->address contact-id)
|
|
||||||
:name (-> props :name :en)
|
|
||||||
:photo-path (:photo-path props)
|
|
||||||
:public-key (:public-key props)
|
|
||||||
:unremovable? (-> props :unremovable? boolean)
|
|
||||||
:hide-contact? (-> props :hide-contact? boolean)
|
|
||||||
:pending? (-> props :pending? boolean)
|
|
||||||
:dapp? (:dapp? props)
|
|
||||||
:dapp-url (-> props :dapp-url :en)
|
|
||||||
:bot-url (:bot-url props)
|
|
||||||
:description (:description props)}])))
|
|
||||||
default-contacts))
|
|
||||||
existing-contacts (:contacts/contacts db)
|
|
||||||
contacts-to-add (select-keys new-contacts (set/difference (set (keys new-contacts))
|
|
||||||
(set (keys existing-contacts))))]
|
|
||||||
{:db (update db :contacts/contacts merge contacts-to-add)
|
|
||||||
:data-store/tx [(contacts-store/save-contacts-tx (vals contacts-to-add))]}))
|
|
||||||
|
|
||||||
(defn- group-chat-messages
|
|
||||||
[{:keys [db]}]
|
|
||||||
(reduce-kv (fn [fx chat-id {:keys [messages]}]
|
|
||||||
(models.message/group-messages chat-id (vals messages) fx))
|
|
||||||
{:db db}
|
|
||||||
(:chats db)))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:initialize-chats
|
|
||||||
[(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)]
|
|
||||||
(fn [{:keys [db
|
|
||||||
default-dapps
|
|
||||||
all-stored-chats
|
|
||||||
stored-unanswered-requests
|
|
||||||
get-stored-messages
|
|
||||||
get-stored-user-statuses
|
|
||||||
stored-unviewed-messages
|
|
||||||
stored-message-ids] :as cofx} _]
|
|
||||||
(let [chat->message-id->request (reduce (fn [acc {:keys [chat-id message-id] :as request}]
|
|
||||||
(assoc-in acc [chat-id message-id] request))
|
|
||||||
{}
|
|
||||||
stored-unanswered-requests)
|
|
||||||
chats (reduce (fn [acc {:keys [chat-id] :as chat}]
|
|
||||||
(let [chat-messages (index-messages (get-stored-messages chat-id))
|
|
||||||
message-ids (keys chat-messages)
|
|
||||||
unviewed-ids (get stored-unviewed-messages chat-id)]
|
|
||||||
(assoc acc chat-id
|
|
||||||
(assoc chat
|
|
||||||
:unviewed-messages unviewed-ids
|
|
||||||
:requests (get chat->message-id->request chat-id)
|
|
||||||
:messages chat-messages
|
|
||||||
:message-statuses (get-stored-user-statuses chat-id message-ids)
|
|
||||||
:not-loaded-message-ids (set/difference (get stored-message-ids chat-id)
|
|
||||||
(set message-ids))))))
|
|
||||||
{}
|
|
||||||
all-stored-chats)]
|
|
||||||
(handlers-macro/merge-fx cofx
|
|
||||||
{:db (assoc db
|
|
||||||
:chats chats
|
|
||||||
:contacts/dapps default-dapps)}
|
|
||||||
(group-chat-messages)
|
|
||||||
(add-default-contacts)
|
|
||||||
(commands/index-commands commands/register)))))
|
|
||||||
|
|
||||||
(defn- send-messages-seen [chat-id message-ids {:keys [db] :as cofx}]
|
(defn- send-messages-seen [chat-id message-ids {:keys [db] :as cofx}]
|
||||||
(when (and (not (get-in db [:chats chat-id :public?]))
|
(when (and (not (get-in db [:chats chat-id :public?]))
|
||||||
(not (models/bot-only-chat? db chat-id)))
|
(not (models/bot-only-chat? db chat-id)))
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
(ns status-im.chat.models
|
(ns status-im.chat.models
|
||||||
(:require [status-im.ui.components.styles :as styles]
|
(:require [status-im.data-store.chats :as chats-store]
|
||||||
[status-im.utils.gfycat.core :as gfycat]
|
[status-im.data-store.messages :as messages-store]
|
||||||
[status-im.transport.utils :as transport.utils]
|
|
||||||
[status-im.utils.platform :as platform]
|
|
||||||
[status-im.utils.clocks :as utils.clocks]
|
|
||||||
[status-im.transport.message.core :as transport.message]
|
[status-im.transport.message.core :as transport.message]
|
||||||
[status-im.data-store.chats :as chats-store]
|
|
||||||
[status-im.transport.message.v1.group-chat :as transport.group-chat]
|
[status-im.transport.message.v1.group-chat :as transport.group-chat]
|
||||||
|
[status-im.transport.utils :as transport.utils]
|
||||||
|
[status-im.ui.components.styles :as styles]
|
||||||
|
[status-im.utils.clocks :as utils.clocks]
|
||||||
|
[status-im.utils.gfycat.core :as gfycat]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.handlers-macro :as handlers-macro]
|
||||||
[status-im.data-store.messages :as messages-store]))
|
[status-im.utils.platform :as platform]))
|
||||||
|
|
||||||
(defn multi-user-chat? [chat-id cofx]
|
(defn multi-user-chat? [chat-id cofx]
|
||||||
(get-in cofx [:db :chats chat-id :group-chat]))
|
(get-in cofx [:db :chats chat-id :group-chat]))
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
(ns status-im.models.account)
|
(ns status-im.models.account
|
||||||
|
(:require [status-im.ui.screens.accounts.utils :as accounts.utils]))
|
||||||
|
|
||||||
(defn logged-in? [cofx]
|
(defn logged-in? [cofx]
|
||||||
(boolean
|
(boolean
|
||||||
(get-in cofx [:db :account/account])))
|
(get-in cofx [:db :account/account])))
|
||||||
|
|
||||||
|
(defn update-sign-in-time
|
||||||
|
[{db :db now :now :as cofx}]
|
||||||
|
(accounts.utils/account-update {:last-sign-in now} cofx))
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
(ns status-im.models.bootnode
|
(ns status-im.models.bootnode
|
||||||
(:require
|
(:require [clojure.string :as string]
|
||||||
[clojure.string :as string]
|
[status-im.ui.screens.accounts.utils :as accounts.utils]
|
||||||
[status-im.ui.screens.accounts.utils :as accounts.utils]
|
[status-im.utils.handlers-macro :as handlers-macro]))
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
|
||||||
[status-im.utils.ethereum.core :as ethereum]))
|
|
||||||
|
|
||||||
(def address-regex #"enode://[a-zA-Z0-9]+:?(.*)\@\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b:(\d{1,5})")
|
(def address-regex #"enode://[a-zA-Z0-9]+:?(.*)\@\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b:(\d{1,5})")
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
(ns status-im.models.browser
|
(ns status-im.models.browser
|
||||||
(:require [status-im.data-store.browser :as browser-store]
|
(:require [re-frame.core :as re-frame]
|
||||||
|
[status-im.constants :as constants]
|
||||||
|
[status-im.data-store.browser :as browser-store]
|
||||||
[status-im.data-store.dapp-permissions :as dapp-permissions]
|
[status-im.data-store.dapp-permissions :as dapp-permissions]
|
||||||
[status-im.i18n :as i18n]
|
[status-im.i18n :as i18n]
|
||||||
[status-im.constants :as constants]
|
|
||||||
[status-im.ui.screens.browser.default-dapps :as default-dapps]
|
[status-im.ui.screens.browser.default-dapps :as default-dapps]
|
||||||
[status-im.utils.http :as http]
|
[status-im.utils.http :as http]))
|
||||||
[re-frame.core :as re-frame]))
|
|
||||||
|
|
||||||
(defn get-current-url [{:keys [history history-index]}]
|
(defn get-current-url [{:keys [history history-index]}]
|
||||||
(when (and history-index history)
|
(when (and history-index history)
|
||||||
|
@ -108,3 +108,13 @@
|
||||||
:messageId message-id
|
:messageId message-id
|
||||||
:error %1
|
:error %1
|
||||||
:result %2}])]}))
|
:result %2}])]}))
|
||||||
|
|
||||||
|
(defn initialize-browsers
|
||||||
|
[{:keys [db all-stored-browsers]}]
|
||||||
|
(let [browsers (into {} (map #(vector (:browser-id %) %) all-stored-browsers))]
|
||||||
|
{:db (assoc db :browser/browsers browsers)}))
|
||||||
|
|
||||||
|
(defn initialize-dapp-permissions
|
||||||
|
[{:keys [db all-dapp-permissions]}]
|
||||||
|
(let [dapp-permissions (into {} (map #(vector (:dapp %) %) all-dapp-permissions))]
|
||||||
|
{:db (assoc db :dapps/permissions dapp-permissions)}))
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
(ns status-im.models.chat
|
||||||
|
(:require [clojure.set :as set]
|
||||||
|
[status-im.chat.commands.core :as commands]
|
||||||
|
[status-im.chat.models.message :as models.message]
|
||||||
|
[status-im.data-store.contacts :as contacts-store]
|
||||||
|
[status-im.data-store.user-statuses :as user-statuses-store]
|
||||||
|
[status-im.utils.contacts :as utils.contacts]
|
||||||
|
[status-im.utils.handlers-macro :as handlers-macro]))
|
||||||
|
|
||||||
|
(def index-messages (partial into {} (map (juxt :message-id identity))))
|
||||||
|
|
||||||
|
(defn- add-default-contacts
|
||||||
|
[{:keys [db default-contacts] :as cofx}]
|
||||||
|
(let [new-contacts (-> {}
|
||||||
|
(into (map (fn [[id props]]
|
||||||
|
(let [contact-id (name id)]
|
||||||
|
[contact-id {:whisper-identity contact-id
|
||||||
|
:address (utils.contacts/public-key->address contact-id)
|
||||||
|
:name (-> props :name :en)
|
||||||
|
:photo-path (:photo-path props)
|
||||||
|
:public-key (:public-key props)
|
||||||
|
:unremovable? (-> props :unremovable? boolean)
|
||||||
|
:hide-contact? (-> props :hide-contact? boolean)
|
||||||
|
:pending? (-> props :pending? boolean)
|
||||||
|
:dapp? (:dapp? props)
|
||||||
|
:dapp-url (-> props :dapp-url :en)
|
||||||
|
:bot-url (:bot-url props)
|
||||||
|
:description (:description props)}])))
|
||||||
|
default-contacts))
|
||||||
|
existing-contacts (:contacts/contacts db)
|
||||||
|
contacts-to-add (select-keys new-contacts (set/difference (set (keys new-contacts))
|
||||||
|
(set (keys existing-contacts))))]
|
||||||
|
{:db (update db :contacts/contacts merge contacts-to-add)
|
||||||
|
:data-store/tx [(contacts-store/save-contacts-tx (vals contacts-to-add))]}))
|
||||||
|
|
||||||
|
(defn- group-chat-messages
|
||||||
|
[{:keys [db]}]
|
||||||
|
(reduce-kv (fn [fx chat-id {:keys [messages]}]
|
||||||
|
(models.message/group-messages chat-id (vals messages) fx))
|
||||||
|
{:db db}
|
||||||
|
(:chats db)))
|
||||||
|
|
||||||
|
(defn initialize-chats [{:keys [db
|
||||||
|
default-dapps
|
||||||
|
all-stored-chats
|
||||||
|
stored-unanswered-requests
|
||||||
|
get-stored-messages
|
||||||
|
get-stored-user-statuses
|
||||||
|
stored-unviewed-messages
|
||||||
|
stored-message-ids] :as cofx}]
|
||||||
|
(let [chat->message-id->request (reduce (fn [acc {:keys [chat-id message-id] :as request}]
|
||||||
|
(assoc-in acc [chat-id message-id] request))
|
||||||
|
{}
|
||||||
|
stored-unanswered-requests)
|
||||||
|
chats (reduce (fn [acc {:keys [chat-id] :as chat}]
|
||||||
|
(let [chat-messages (index-messages (get-stored-messages chat-id))
|
||||||
|
message-ids (keys chat-messages)
|
||||||
|
unviewed-ids (get stored-unviewed-messages chat-id)]
|
||||||
|
(assoc acc chat-id
|
||||||
|
(assoc chat
|
||||||
|
:unviewed-messages unviewed-ids
|
||||||
|
:requests (get chat->message-id->request chat-id)
|
||||||
|
:messages chat-messages
|
||||||
|
:message-statuses (get-stored-user-statuses chat-id message-ids)
|
||||||
|
:not-loaded-message-ids (set/difference (get stored-message-ids chat-id)
|
||||||
|
(set message-ids))))))
|
||||||
|
{}
|
||||||
|
all-stored-chats)]
|
||||||
|
(handlers-macro/merge-fx cofx
|
||||||
|
{:db (assoc db
|
||||||
|
:chats chats
|
||||||
|
:contacts/dapps default-dapps)}
|
||||||
|
(group-chat-messages)
|
||||||
|
(add-default-contacts)
|
||||||
|
(commands/index-commands commands/register))))
|
||||||
|
|
||||||
|
(defn process-pending-messages
|
||||||
|
"Change status of own messages which are still in `sending` status to `not-sent`
|
||||||
|
(If signal from status-go has not been received)"
|
||||||
|
[{:keys [db]}]
|
||||||
|
(let [me (:current-public-key db)
|
||||||
|
pending-statuses (->> (vals (:chats db))
|
||||||
|
(mapcat :message-statuses)
|
||||||
|
(mapcat (fn [[_ user-id->status]]
|
||||||
|
(filter (comp (partial = :sending) :status)
|
||||||
|
(get user-id->status me)))))
|
||||||
|
updated-statuses (map #(assoc % :status :not-sent) pending-statuses)]
|
||||||
|
{:data-store/tx [(user-statuses-store/save-statuses-tx updated-statuses)]
|
||||||
|
:db (reduce
|
||||||
|
(fn [acc {:keys [chat-id message-id status whisper-identity]}]
|
||||||
|
(assoc-in acc
|
||||||
|
[:chats chat-id :message-status message-id
|
||||||
|
whisper-identity :status]
|
||||||
|
status))
|
||||||
|
db
|
||||||
|
updated-statuses)}))
|
|
@ -1,10 +1,9 @@
|
||||||
(ns status-im.models.contact
|
(ns status-im.models.contact
|
||||||
(:require
|
(:require [status-im.data-store.contacts :as contacts-store]
|
||||||
[status-im.utils.contacts :as utils.contacts]
|
[status-im.transport.message.core :as transport]
|
||||||
[status-im.data-store.contacts :as contacts-store]
|
[status-im.transport.message.v1.contact :as message.v1.contact]
|
||||||
[status-im.transport.message.core :as transport]
|
[status-im.utils.contacts :as utils.contacts]
|
||||||
[status-im.transport.message.v1.contact :as message.v1.contact]
|
[status-im.utils.handlers-macro :as handlers-macro]))
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]))
|
|
||||||
|
|
||||||
(defn can-add-to-contacts? [{:keys [pending? dapp?]}]
|
(defn can-add-to-contacts? [{:keys [pending? dapp?]}]
|
||||||
(and (not dapp?)
|
(and (not dapp?)
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
(ns status-im.models.contacts)
|
||||||
|
|
||||||
|
(defn load-contacts
|
||||||
|
[{:keys [db all-contacts]}]
|
||||||
|
(let [contacts-list (map #(vector (:whisper-identity %) %) all-contacts)
|
||||||
|
contacts (into {} contacts-list)]
|
||||||
|
{:db (update db :contacts/contacts #(merge contacts %))}))
|
|
@ -1,10 +1,9 @@
|
||||||
(ns status-im.models.mailserver
|
(ns status-im.models.mailserver
|
||||||
(:require
|
(:require [clojure.string :as string]
|
||||||
[clojure.string :as string]
|
[status-im.data-store.mailservers :as data-store.mailservers]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.models.network :as models.network]
|
||||||
[status-im.utils.ethereum.core :as ethereum]
|
[status-im.utils.ethereum.core :as ethereum]
|
||||||
[status-im.models.network :as models.network]
|
[status-im.utils.handlers-macro :as handlers-macro]))
|
||||||
[status-im.data-store.mailservers :as data-store.mailservers]))
|
|
||||||
|
|
||||||
(def enode-address-regex #"enode://[a-zA-Z0-9]+\@\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b:(\d{1,5})")
|
(def enode-address-regex #"enode://[a-zA-Z0-9]+\@\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b:(\d{1,5})")
|
||||||
(def enode-url-regex #"enode://[a-zA-Z0-9]+:(.+)\@\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b:(\d{1,5})")
|
(def enode-url-regex #"enode://[a-zA-Z0-9]+:(.+)\@\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b:(\d{1,5})")
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
(ns status-im.models.network
|
(ns status-im.models.network
|
||||||
(:require [clojure.string :as string]
|
(:require [clojure.string :as string]
|
||||||
|
[status-im.ui.screens.accounts.utils :as accounts.utils]
|
||||||
[status-im.utils.ethereum.core :as ethereum]
|
[status-im.utils.ethereum.core :as ethereum]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.handlers-macro :as handlers-macro]))
|
||||||
[status-im.ui.screens.accounts.utils :as accounts.utils]))
|
|
||||||
|
|
||||||
(def url-regex
|
(def url-regex
|
||||||
#"https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,6})?\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)")
|
#"https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,6})?\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)")
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
(ns status-im.protocol.models
|
(ns status-im.models.protocol
|
||||||
(:require [status-im.constants :as constants]
|
(:require [re-frame.core :as re-frame]
|
||||||
[status-im.utils.semaphores :as semaphores]
|
[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]
|
[status-im.utils.ethereum.core :as ethereum]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]))
|
[status-im.utils.handlers-macro :as handlers-macro]
|
||||||
|
[status-im.utils.semaphores :as semaphores]))
|
||||||
|
|
||||||
(defn update-sync-state
|
(defn update-sync-state
|
||||||
[{:keys [sync-state sync-data] :as db} error sync]
|
[{:keys [sync-state sync-data] :as db} error sync]
|
||||||
|
@ -27,7 +30,7 @@
|
||||||
(defn check-sync-state
|
(defn check-sync-state
|
||||||
[{{:keys [web3] :as db} :db :as cofx}]
|
[{{:keys [web3] :as db} :db :as cofx}]
|
||||||
(if (:account/account db)
|
(if (:account/account db)
|
||||||
{::web3-get-syncing web3
|
{:protocol/web3-get-syncing web3
|
||||||
:dispatch-later [{:ms 10000 :dispatch [:check-sync-state]}]}
|
:dispatch-later [{:ms 10000 :dispatch [:check-sync-state]}]}
|
||||||
(semaphores/free :check-sync-state? cofx)))
|
(semaphores/free :check-sync-state? cofx)))
|
||||||
|
|
||||||
|
@ -38,3 +41,17 @@
|
||||||
(handlers-macro/merge-fx cofx
|
(handlers-macro/merge-fx cofx
|
||||||
{:dispatch [:check-sync-state]}
|
{:dispatch [:check-sync-state]}
|
||||||
(semaphores/lock :check-sync-state?))))
|
(semaphores/lock :check-sync-state?))))
|
||||||
|
|
||||||
|
(defn initialize-protocol
|
||||||
|
[address {:data-store/keys [transport mailservers] :keys [db web3] :as cofx}]
|
||||||
|
(let [network (get-in db [:account/account :network])
|
||||||
|
network-id (str (get-in db [:account/account :networks network :config :NetworkId]))]
|
||||||
|
(handlers-macro/merge-fx cofx
|
||||||
|
{:db (assoc db
|
||||||
|
:rpc-url constants/ethereum-rpc-url
|
||||||
|
:transport/chats transport)
|
||||||
|
:protocol/assert-correct-network {:web3 web3
|
||||||
|
:network-id network-id}}
|
||||||
|
(start-check-sync-state)
|
||||||
|
(transport.inbox/initialize-offline-inbox mailservers)
|
||||||
|
(transport/init-whisper address))))
|
|
@ -1,8 +1,8 @@
|
||||||
(ns status-im.models.transactions
|
(ns status-im.models.transactions
|
||||||
(:require [clojure.set :as set]
|
(:require [clojure.set :as set]
|
||||||
[status-im.utils.datetime :as time]
|
[status-im.utils.datetime :as time]
|
||||||
[status-im.utils.ethereum.tokens :as tokens]
|
|
||||||
[status-im.utils.ethereum.core :as ethereum]
|
[status-im.utils.ethereum.core :as ethereum]
|
||||||
|
[status-im.utils.ethereum.tokens :as tokens]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.handlers-macro :as handlers-macro]
|
||||||
[status-im.utils.semaphores :as semaphores]
|
[status-im.utils.semaphores :as semaphores]
|
||||||
[taoensso.timbre :as log]))
|
[taoensso.timbre :as log]))
|
||||||
|
@ -55,10 +55,10 @@
|
||||||
chat-transactions
|
chat-transactions
|
||||||
(wallet-transactions-set db))))
|
(wallet-transactions-set db))))
|
||||||
|
|
||||||
; Find missing chat transactions
|
(defn load-missing-chat-transactions
|
||||||
; and store them at [:wallet :chat-transactions]
|
"Find missing chat transactions and store them at [:wallet :chat-transactions]
|
||||||
; to be used later by have-missing-chat-transactions? on every sync request
|
to be used later by have-missing-chat-transactions? on every sync request"
|
||||||
(defn load-missing-chat-transactions [{:keys [db] :as cofx}]
|
[{:keys [db] :as cofx}]
|
||||||
(when (nil? (get-in db [:wallet :chat-transactions]))
|
(when (nil? (get-in db [:wallet :chat-transactions]))
|
||||||
{:db (assoc-in db
|
{:db (assoc-in db
|
||||||
[:wallet :chat-transactions]
|
[:wallet :chat-transactions]
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
(ns status-im.models.wallet
|
(ns status-im.models.wallet
|
||||||
(:require [status-im.utils.money :as money]
|
(:require [clojure.set :as set]
|
||||||
[status-im.i18n :as i18n]
|
|
||||||
[status-im.utils.ethereum.core :as ethereum]
|
|
||||||
[status-im.constants :as constants]
|
[status-im.constants :as constants]
|
||||||
[status-im.utils.ethereum.tokens :as tokens]
|
[status-im.i18n :as i18n]
|
||||||
|
[status-im.transport.utils :as transport.utils]
|
||||||
[status-im.ui.screens.navigation :as navigation]
|
[status-im.ui.screens.navigation :as navigation]
|
||||||
|
[status-im.utils.ethereum.core :as ethereum]
|
||||||
|
[status-im.utils.ethereum.tokens :as tokens]
|
||||||
[status-im.utils.hex :as utils.hex]
|
[status-im.utils.hex :as utils.hex]
|
||||||
[status-im.transport.utils :as transport.utils]))
|
[status-im.utils.money :as money]))
|
||||||
|
|
||||||
(def min-gas-price-wei (money/bignumber 1))
|
(def min-gas-price-wei (money/bignumber 1))
|
||||||
|
|
||||||
|
@ -172,3 +173,39 @@
|
||||||
(cond-> transaction
|
(cond-> transaction
|
||||||
(= method constants/web3-personal-sign)
|
(= method constants/web3-personal-sign)
|
||||||
(update :data transport.utils/to-utf8)))
|
(update :data transport.utils/to-utf8)))
|
||||||
|
|
||||||
|
(defn clear-error-message [db error-type]
|
||||||
|
(update-in db [:wallet :errors] dissoc error-type))
|
||||||
|
|
||||||
|
(defn tokens-symbols [v chain]
|
||||||
|
(set/difference (set v) (set (map :symbol (tokens/nfts-for chain)))))
|
||||||
|
|
||||||
|
(defn update-wallet
|
||||||
|
[{{:keys [web3 network network-status] {:keys [address settings]} :account/account :as db} :db}]
|
||||||
|
(let [network (get-in db [:account/account :networks network])
|
||||||
|
chain (ethereum/network->chain-keyword network)
|
||||||
|
mainnet? (= :mainnet chain)
|
||||||
|
assets (get-in settings [:wallet :visible-tokens chain])
|
||||||
|
tokens (tokens-symbols (get-in settings [:wallet :visible-tokens chain]) chain)
|
||||||
|
currency-id (or (get-in settings [:wallet :currency]) :usd)
|
||||||
|
currency (get constants/currencies currency-id)]
|
||||||
|
(when (not= network-status :offline)
|
||||||
|
{:get-balance {:web3 web3
|
||||||
|
:account-id address
|
||||||
|
:success-event :update-balance-success
|
||||||
|
:error-event :update-balance-fail}
|
||||||
|
:get-tokens-balance {:web3 web3
|
||||||
|
:account-id address
|
||||||
|
:symbols assets
|
||||||
|
:chain chain
|
||||||
|
:success-event :update-token-balance-success
|
||||||
|
:error-event :update-token-balance-fail}
|
||||||
|
:get-prices {:from (if mainnet? (conj tokens "ETH") ["ETH"])
|
||||||
|
:to [(:code currency)]
|
||||||
|
:success-event :update-prices-success
|
||||||
|
:error-event :update-prices-fail}
|
||||||
|
:db (-> db
|
||||||
|
(clear-error-message :prices-update)
|
||||||
|
(clear-error-message :balance-update)
|
||||||
|
(assoc-in [:wallet :balance-loading?] true)
|
||||||
|
(assoc :prices-loading? true))})))
|
||||||
|
|
|
@ -1,30 +1,21 @@
|
||||||
(ns status-im.protocol.handlers
|
(ns status-im.protocol.handlers
|
||||||
(:require [cljs.core.async :as async]
|
(:require [re-frame.core :as re-frame]
|
||||||
[re-frame.core :as re-frame]
|
[status-im.models.protocol :as models]
|
||||||
[status-im.constants :as constants]
|
|
||||||
[status-im.native-module.core :as status]
|
|
||||||
[status-im.utils.utils :as utils]
|
|
||||||
[status-im.utils.datetime :as datetime]
|
|
||||||
[status-im.utils.handlers :as handlers]
|
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
|
||||||
[status-im.utils.web3-provider :as web3-provider]
|
|
||||||
[status-im.transport.core :as transport]
|
|
||||||
[status-im.transport.inbox :as transport.inbox]
|
|
||||||
[status-im.utils.ethereum.core :as ethereum]
|
[status-im.utils.ethereum.core :as ethereum]
|
||||||
[status-im.protocol.models :as models]))
|
[status-im.utils.handlers :as handlers]
|
||||||
|
[status-im.utils.utils :as utils]
|
||||||
|
[status-im.utils.web3-provider :as web3-provider]))
|
||||||
|
|
||||||
;;;; COFX
|
;;;; COFX
|
||||||
(re-frame/reg-cofx
|
(re-frame/reg-cofx
|
||||||
::get-web3
|
:protocol/get-web3
|
||||||
(fn [coeffects _]
|
(fn [cofx _]
|
||||||
(let [web3 (web3-provider/make-internal-web3)
|
(let [web3 (web3-provider/make-internal-web3)]
|
||||||
address (get-in coeffects [:db :account/account :address])]
|
(assoc cofx :web3 web3))))
|
||||||
(set! (.-defaultAccount (.-eth web3))
|
|
||||||
(ethereum/normalized-address address))
|
|
||||||
(assoc coeffects :web3 web3))))
|
|
||||||
|
|
||||||
|
;;; FX
|
||||||
(re-frame/reg-fx
|
(re-frame/reg-fx
|
||||||
::web3-get-syncing
|
:protocol/web3-get-syncing
|
||||||
(fn [web3]
|
(fn [web3]
|
||||||
(when web3
|
(when web3
|
||||||
(.getSyncing
|
(.getSyncing
|
||||||
|
@ -32,40 +23,25 @@
|
||||||
(fn [error sync]
|
(fn [error sync]
|
||||||
(re-frame/dispatch [:update-sync-state error sync]))))))
|
(re-frame/dispatch [:update-sync-state error sync]))))))
|
||||||
|
|
||||||
(defn- assert-correct-network
|
(re-frame/reg-fx
|
||||||
[{:keys [db]}]
|
:protocol/set-default-account
|
||||||
;; Assure that node was started correctly
|
(fn [[web3 address]]
|
||||||
(let [{:keys [web3]} db]
|
(set! (.-defaultAccount (.-eth web3))
|
||||||
(let [network (get-in db [:account/account :network])
|
(ethereum/normalized-address address))))
|
||||||
network-id (str (get-in db [:account/account :networks network :config :NetworkId]))]
|
|
||||||
(when (and network-id web3) ; necessary because of the unit tests
|
|
||||||
(.getNetwork (.-version web3)
|
|
||||||
(fn [error fetched-network-id]
|
|
||||||
(when (and (not error) ; error most probably means we are offline
|
|
||||||
(not= network-id fetched-network-id))
|
|
||||||
(utils/show-popup
|
|
||||||
"Ethereum node started incorrectly"
|
|
||||||
"Ethereum node was started with incorrect configuration, application will be stopped to recover from that condition."
|
|
||||||
#(re-frame/dispatch [:close-application])))))))))
|
|
||||||
|
|
||||||
(defn initialize-protocol
|
(re-frame/reg-fx
|
||||||
[{:data-store/keys [transport mailservers] :keys [db web3] :as cofx} [current-account-id ethereum-rpc-url]]
|
:protocol/assert-correct-network
|
||||||
(handlers-macro/merge-fx cofx
|
(fn [{:keys [web3 network-id]}]
|
||||||
{:db (assoc db
|
;; ensure that node was started correctly
|
||||||
:web3 web3
|
(when (and network-id web3) ; necessary because of the unit tests
|
||||||
:rpc-url (or ethereum-rpc-url constants/ethereum-rpc-url)
|
(.getNetwork (.-version web3)
|
||||||
:transport/chats transport)}
|
(fn [error fetched-network-id]
|
||||||
(assert-correct-network)
|
(when (and (not error) ; error most probably means we are offline
|
||||||
(transport.inbox/initialize-offline-inbox mailservers)
|
(not= network-id fetched-network-id))
|
||||||
(transport/init-whisper current-account-id)))
|
(utils/show-popup
|
||||||
;;; INITIALIZE PROTOCOL
|
"Ethereum node started incorrectly"
|
||||||
(handlers/register-handler-fx
|
"Ethereum node was started with incorrect configuration, application will be stopped to recover from that condition."
|
||||||
:initialize-protocol
|
#(re-frame/dispatch [:close-application]))))))))
|
||||||
[re-frame/trim-v
|
|
||||||
(re-frame/inject-cofx ::get-web3)
|
|
||||||
(re-frame/inject-cofx :data-store/get-all-mailservers)
|
|
||||||
(re-frame/inject-cofx :data-store/transport)]
|
|
||||||
initialize-protocol)
|
|
||||||
|
|
||||||
;;; NODE SYNC STATE
|
;;; NODE SYNC STATE
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
(ns ^{:doc "Contact request and update API"}
|
(ns ^{:doc "Contact request and update API"}
|
||||||
status-im.transport.message.v1.contact
|
status-im.transport.message.v1.contact
|
||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
|
[status-im.data-store.transport :as transport-store]
|
||||||
[status-im.transport.message.core :as message]
|
[status-im.transport.message.core :as message]
|
||||||
[status-im.transport.message.v1.protocol :as protocol]
|
[status-im.transport.message.v1.protocol :as protocol]
|
||||||
[status-im.transport.utils :as transport.utils]
|
[status-im.transport.utils :as transport.utils]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.handlers-macro :as handlers-macro]))
|
||||||
[status-im.utils.handlers :as handlers]
|
|
||||||
[status-im.data-store.transport :as transport-store]))
|
|
||||||
|
|
||||||
(defrecord ContactRequest [name profile-image address fcm-token]
|
(defrecord ContactRequest [name profile-image address fcm-token]
|
||||||
message/StatusMessage
|
message/StatusMessage
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
(ns status-im.ui.screens.accounts.events
|
(ns status-im.ui.screens.accounts.events
|
||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
[status-im.utils.handlers :as handlers]
|
|
||||||
status-im.ui.screens.accounts.create.navigation
|
status-im.ui.screens.accounts.create.navigation
|
||||||
|
[status-im.ui.screens.accounts.models :as models]
|
||||||
[status-im.ui.screens.accounts.utils :as accounts.utils]
|
[status-im.ui.screens.accounts.utils :as accounts.utils]
|
||||||
[status-im.ui.screens.accounts.models :as models]))
|
[status-im.utils.handlers :as handlers]))
|
||||||
|
|
||||||
;;;; COFX
|
;;;; COFX
|
||||||
|
|
||||||
|
@ -36,11 +36,6 @@
|
||||||
(fn [cofx [_ result password]]
|
(fn [cofx [_ result password]]
|
||||||
(models/on-account-created result password false cofx)))
|
(models/on-account-created result password false cofx)))
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:send-account-update-if-needed
|
|
||||||
(fn [cofx _]
|
|
||||||
(models/send-account-update-if-needed cofx)))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:account-set-name
|
:account-set-name
|
||||||
(fn [cofx _]
|
(fn [cofx _]
|
||||||
|
@ -51,11 +46,6 @@
|
||||||
(fn [cofx [_ input-key text]]
|
(fn [cofx [_ input-key text]]
|
||||||
(models/account-set-input-text input-key text cofx)))
|
(models/account-set-input-text input-key text cofx)))
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:update-sign-in-time
|
|
||||||
(fn [{db :db now :now :as cofx} _]
|
|
||||||
(accounts.utils/account-update {:last-sign-in now} cofx)))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:update-mainnet-warning-shown
|
:update-mainnet-warning-shown
|
||||||
(fn [cofx _]
|
(fn [cofx _]
|
||||||
|
|
|
@ -1,26 +1,24 @@
|
||||||
(ns status-im.ui.screens.accounts.models
|
(ns status-im.ui.screens.accounts.models
|
||||||
(:require [re-frame.core :as re-frame]
|
(:require [clojure.string :as str]
|
||||||
[taoensso.timbre :as log]
|
[re-frame.core :as re-frame]
|
||||||
[status-im.native-module.core :as status]
|
|
||||||
[status-im.utils.types :as types]
|
|
||||||
[status-im.utils.identicon :as identicon]
|
|
||||||
[clojure.string :as str]
|
|
||||||
[status-im.i18n :as i18n]
|
|
||||||
[status-im.utils.config :as config]
|
|
||||||
[status-im.utils.utils :as utils]
|
|
||||||
[status-im.utils.datetime :as time]
|
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
|
||||||
[status-im.ui.screens.accounts.statuses :as statuses]
|
|
||||||
[status-im.utils.signing-phrase.core :as signing-phrase]
|
|
||||||
[status-im.utils.gfycat.core :as gfycat]
|
|
||||||
[status-im.utils.hex :as utils.hex]
|
|
||||||
[status-im.constants :as constants]
|
[status-im.constants :as constants]
|
||||||
status-im.ui.screens.accounts.create.navigation
|
|
||||||
[status-im.ui.screens.accounts.utils :as accounts.utils]
|
|
||||||
[status-im.data-store.accounts :as accounts-store]
|
[status-im.data-store.accounts :as accounts-store]
|
||||||
|
[status-im.i18n :as i18n]
|
||||||
|
[status-im.native-module.core :as status]
|
||||||
|
[status-im.ui.screens.accounts.statuses :as statuses]
|
||||||
|
[status-im.ui.screens.accounts.utils :as accounts.utils]
|
||||||
[status-im.ui.screens.accounts.login.models :as login.models]
|
[status-im.ui.screens.accounts.login.models :as login.models]
|
||||||
[status-im.ui.screens.navigation :as navigation]
|
[status-im.ui.screens.navigation :as navigation]
|
||||||
[status-im.ui.screens.wallet.settings.models :as wallet.settings.models]))
|
[status-im.ui.screens.wallet.settings.models :as wallet.settings.models]
|
||||||
|
[status-im.utils.config :as config]
|
||||||
|
[status-im.utils.gfycat.core :as gfycat]
|
||||||
|
[status-im.utils.handlers-macro :as handlers-macro]
|
||||||
|
[status-im.utils.hex :as utils.hex]
|
||||||
|
[status-im.utils.identicon :as identicon]
|
||||||
|
[status-im.utils.signing-phrase.core :as signing-phrase]
|
||||||
|
[status-im.utils.types :as types]
|
||||||
|
[status-im.utils.utils :as utils]
|
||||||
|
[taoensso.timbre :as log]))
|
||||||
|
|
||||||
;;;; COFX
|
;;;; COFX
|
||||||
|
|
||||||
|
@ -88,15 +86,6 @@
|
||||||
:data-store/base-tx [{:transaction (accounts-store/save-account-tx new-account)
|
:data-store/base-tx [{:transaction (accounts-store/save-account-tx new-account)
|
||||||
:success-event success-event}]})))
|
:success-event success-event}]})))
|
||||||
|
|
||||||
(defn send-account-update-if-needed [{:keys [db now] :as cofx}]
|
|
||||||
(let [{:keys [last-updated]} (:account/account db)
|
|
||||||
needs-update? (> (- now last-updated) time/week)]
|
|
||||||
(log/info "Need to send account-update: " needs-update?)
|
|
||||||
(when needs-update?
|
|
||||||
;; TODO(janherich): this is very strange and misleading, need to figure out why it'd necessary to update
|
|
||||||
;; account with network update when last update was more then week ago
|
|
||||||
(accounts.utils/account-update nil cofx))))
|
|
||||||
|
|
||||||
(defn account-set-name [{{:accounts/keys [create] :as db} :db :as cofx}]
|
(defn account-set-name [{{:accounts/keys [create] :as db} :db :as cofx}]
|
||||||
(handlers-macro/merge-fx cofx
|
(handlers-macro/merge-fx cofx
|
||||||
{:db (assoc db :accounts/create {:show-welcome? true})
|
{:db (assoc db :accounts/create {:show-welcome? true})
|
||||||
|
|
|
@ -1,21 +1,19 @@
|
||||||
(ns status-im.ui.screens.browser.events
|
(ns status-im.ui.screens.browser.events
|
||||||
(:require status-im.ui.screens.browser.navigation
|
(:require [re-frame.core :as re-frame]
|
||||||
[status-im.utils.handlers :as handlers]
|
|
||||||
[re-frame.core :as re-frame]
|
|
||||||
[status-im.utils.random :as random]
|
|
||||||
[status-im.ui.components.list-selection :as list-selection]
|
|
||||||
[status-im.utils.universal-links.core :as utils.universal-links]
|
|
||||||
[status-im.data-store.browser :as browser-store]
|
|
||||||
[status-im.utils.http :as http]
|
|
||||||
[status-im.models.browser :as model]
|
|
||||||
[status-im.utils.platform :as platform]
|
|
||||||
[status-im.constants :as constants]
|
[status-im.constants :as constants]
|
||||||
|
[status-im.data-store.browser :as browser-store]
|
||||||
|
[status-im.models.browser :as model]
|
||||||
[status-im.native-module.core :as status]
|
[status-im.native-module.core :as status]
|
||||||
[taoensso.timbre :as log]
|
[status-im.ui.components.list-selection :as list-selection]
|
||||||
|
status-im.ui.screens.browser.navigation
|
||||||
|
[status-im.utils.handlers :as handlers]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.handlers-macro :as handlers-macro]
|
||||||
|
[status-im.utils.http :as http]
|
||||||
|
[status-im.utils.platform :as platform]
|
||||||
|
[status-im.utils.random :as random]
|
||||||
[status-im.utils.types :as types]
|
[status-im.utils.types :as types]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.universal-links.core :as utils.universal-links]
|
||||||
[status-im.constants :as constants]))
|
[taoensso.timbre :as log]))
|
||||||
|
|
||||||
(re-frame/reg-fx
|
(re-frame/reg-fx
|
||||||
:browse
|
:browse
|
||||||
|
@ -41,20 +39,6 @@
|
||||||
(fn [[message webview]]
|
(fn [[message webview]]
|
||||||
(.sendToBridge webview (types/clj->json message))))
|
(.sendToBridge webview (types/clj->json message))))
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:initialize-browsers
|
|
||||||
[(re-frame/inject-cofx :data-store/all-browsers)]
|
|
||||||
(fn [{:keys [db all-stored-browsers]} _]
|
|
||||||
(let [browsers (into {} (map #(vector (:browser-id %) %) all-stored-browsers))]
|
|
||||||
{:db (assoc db :browser/browsers browsers)})))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:initialize-dapp-permissions
|
|
||||||
[(re-frame/inject-cofx :data-store/all-dapp-permissions)]
|
|
||||||
(fn [{:keys [db all-dapp-permissions]} _]
|
|
||||||
(let [dapp-permissions (into {} (map #(vector (:dapp %) %) all-dapp-permissions))]
|
|
||||||
{:db (assoc db :dapps/permissions dapp-permissions)})))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:browse-link-from-message
|
:browse-link-from-message
|
||||||
(fn [_ [_ link]]
|
(fn [_ [_ link]]
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
(ns status-im.ui.screens.contacts.events
|
(ns status-im.ui.screens.contacts.events
|
||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
|
[status-im.chat.events :as chat.events]
|
||||||
[status-im.i18n :as i18n]
|
[status-im.i18n :as i18n]
|
||||||
|
[status-im.models.contact :as models.contact]
|
||||||
[status-im.ui.screens.add-new.new-chat.db :as new-chat.db]
|
[status-im.ui.screens.add-new.new-chat.db :as new-chat.db]
|
||||||
[status-im.ui.screens.browser.default-dapps :as default-dapps]
|
[status-im.ui.screens.browser.default-dapps :as default-dapps]
|
||||||
|
[status-im.ui.screens.navigation :as navigation]
|
||||||
[status-im.utils.handlers :as handlers]
|
[status-im.utils.handlers :as handlers]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.handlers-macro :as handlers-macro]
|
||||||
[status-im.utils.js-resources :as js-res]
|
[status-im.utils.js-resources :as js-res]
|
||||||
[status-im.chat.events :as chat.events]
|
[status-im.utils.utils :as utils]))
|
||||||
[status-im.ui.screens.navigation :as navigation]
|
|
||||||
[status-im.utils.utils :as utils]
|
|
||||||
[status-im.models.contact :as models.contact]))
|
|
||||||
|
|
||||||
(defn add-contact-and-open-chat [whisper-id cofx]
|
(defn add-contact-and-open-chat [whisper-id cofx]
|
||||||
(handlers-macro/merge-fx cofx
|
(handlers-macro/merge-fx cofx
|
||||||
|
@ -28,15 +28,6 @@
|
||||||
(assoc coeffects :default-dapps default-dapps/all)))
|
(assoc coeffects :default-dapps default-dapps/all)))
|
||||||
|
|
||||||
;;;; Handlers
|
;;;; Handlers
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:load-contacts
|
|
||||||
[(re-frame/inject-cofx :data-store/get-all-contacts)]
|
|
||||||
(fn [{:keys [db all-contacts]} _]
|
|
||||||
(let [contacts-list (map #(vector (:whisper-identity %) %) all-contacts)
|
|
||||||
contacts (into {} contacts-list)]
|
|
||||||
{:db (update db :contacts/contacts #(merge contacts %))})))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:add-contact
|
:add-contact
|
||||||
[(re-frame/inject-cofx :random-id)]
|
[(re-frame/inject-cofx :random-id)]
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
(ns status-im.ui.screens.currency-settings.events
|
(ns status-im.ui.screens.currency-settings.events
|
||||||
(:require [status-im.ui.screens.accounts.models :as accounts.models]
|
(:require [status-im.models.wallet :as wallet]
|
||||||
|
[status-im.ui.screens.accounts.models :as accounts.models]
|
||||||
[status-im.utils.handlers :as handlers]
|
[status-im.utils.handlers :as handlers]
|
||||||
[status-im.utils.handlers-macro :as handlers-macro]
|
[status-im.utils.handlers-macro :as handlers-macro]))
|
||||||
[status-im.ui.screens.wallet.events :as wallet.events]))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:wallet.settings/set-currency
|
:wallet.settings/set-currency
|
||||||
|
@ -11,4 +11,4 @@
|
||||||
new-settings (assoc-in settings [:wallet :currency] currency)]
|
new-settings (assoc-in settings [:wallet :currency] currency)]
|
||||||
(handlers-macro/merge-fx cofx
|
(handlers-macro/merge-fx cofx
|
||||||
(accounts.models/update-settings new-settings)
|
(accounts.models/update-settings new-settings)
|
||||||
(wallet.events/update-wallet)))))
|
(wallet/update-wallet)))))
|
||||||
|
|
|
@ -1,13 +1,17 @@
|
||||||
(ns status-im.ui.screens.events
|
(ns status-im.ui.screens.events
|
||||||
(:require status-im.chat.events
|
(:require status-im.chat.events
|
||||||
|
[status-im.models.chat :as chat]
|
||||||
status-im.network.events
|
status-im.network.events
|
||||||
[status-im.transport.handlers :as transport.handlers]
|
[status-im.transport.handlers :as transport.handlers]
|
||||||
status-im.protocol.handlers
|
status-im.protocol.handlers
|
||||||
|
[status-im.models.protocol :as models.protocol]
|
||||||
|
[status-im.models.account :as models.account]
|
||||||
[status-im.ui.screens.accounts.models :as accounts.models]
|
[status-im.ui.screens.accounts.models :as accounts.models]
|
||||||
status-im.ui.screens.accounts.login.events
|
status-im.ui.screens.accounts.login.events
|
||||||
[status-im.ui.screens.accounts.login.models :as login]
|
[status-im.ui.screens.accounts.login.models :as login]
|
||||||
status-im.ui.screens.accounts.recover.events
|
status-im.ui.screens.accounts.recover.events
|
||||||
[status-im.ui.screens.contacts.events :as contacts]
|
[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.add-new.new-chat.events
|
||||||
status-im.ui.screens.group.chat-settings.events
|
status-im.ui.screens.group.chat-settings.events
|
||||||
status-im.ui.screens.group.events
|
status-im.ui.screens.group.events
|
||||||
|
@ -20,15 +24,18 @@
|
||||||
status-im.ui.screens.profile.events
|
status-im.ui.screens.profile.events
|
||||||
status-im.ui.screens.qr-scanner.events
|
status-im.ui.screens.qr-scanner.events
|
||||||
status-im.ui.screens.wallet.events
|
status-im.ui.screens.wallet.events
|
||||||
|
[status-im.models.wallet :as models.wallet]
|
||||||
status-im.ui.screens.wallet.collectibles.events
|
status-im.ui.screens.wallet.collectibles.events
|
||||||
status-im.ui.screens.wallet.send.events
|
status-im.ui.screens.wallet.send.events
|
||||||
status-im.ui.screens.wallet.settings.events
|
status-im.ui.screens.wallet.settings.events
|
||||||
status-im.ui.screens.wallet.transactions.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.choose-recipient.events
|
||||||
status-im.ui.screens.wallet.collectibles.cryptokitties.events
|
status-im.ui.screens.wallet.collectibles.cryptokitties.events
|
||||||
status-im.ui.screens.wallet.collectibles.cryptostrikers.events
|
status-im.ui.screens.wallet.collectibles.cryptostrikers.events
|
||||||
status-im.ui.screens.wallet.collectibles.etheremon.events
|
status-im.ui.screens.wallet.collectibles.etheremon.events
|
||||||
status-im.ui.screens.browser.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.offline-messaging-settings.events
|
||||||
status-im.ui.screens.privacy-policy.events
|
status-im.ui.screens.privacy-policy.events
|
||||||
status-im.ui.screens.bootnodes-settings.events
|
status-im.ui.screens.bootnodes-settings.events
|
||||||
|
@ -97,6 +104,14 @@
|
||||||
(doseq [call calls]
|
(doseq [call calls]
|
||||||
(http-get call))))
|
(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
|
;; Try to decrypt the database, move on if successful otherwise go back to
|
||||||
;; initial state
|
;; initial state
|
||||||
(re-frame/reg-fx
|
(re-frame/reg-fx
|
||||||
|
@ -149,7 +164,8 @@
|
||||||
(re-frame/reg-fx
|
(re-frame/reg-fx
|
||||||
::get-fcm-token-fx
|
::get-fcm-token-fx
|
||||||
(fn [_]
|
(fn [_]
|
||||||
(notifications/get-fcm-token)))
|
(when platform/mobile?
|
||||||
|
(notifications/get-fcm-token))))
|
||||||
|
|
||||||
(re-frame/reg-fx
|
(re-frame/reg-fx
|
||||||
:show-error
|
:show-error
|
||||||
|
@ -231,20 +247,20 @@
|
||||||
"Initialize db to the initial state"
|
"Initialize db to the initial state"
|
||||||
[{{:universal-links/keys [url]
|
[{{:universal-links/keys [url]
|
||||||
:push-notifications/keys [initial?]
|
:push-notifications/keys [initial?]
|
||||||
:keys [status-module-initialized? status-node-started?
|
:keys [status-module-initialized? status-node-started?
|
||||||
network-status network peers-count peers-summary device-UUID]
|
network-status network peers-count peers-summary device-UUID]
|
||||||
:or {network (get app-db :network)}} :db}]
|
:or {network (get app-db :network)}} :db}]
|
||||||
{:db (assoc app-db
|
{:db (assoc app-db
|
||||||
:contacts/contacts {}
|
:contacts/contacts {}
|
||||||
:network-status network-status
|
:network-status network-status
|
||||||
:peers-count (or peers-count 0)
|
:peers-count (or peers-count 0)
|
||||||
:peers-summary (or peers-summary [])
|
:peers-summary (or peers-summary [])
|
||||||
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
|
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
|
||||||
:status-node-started? status-node-started?
|
:status-node-started? status-node-started?
|
||||||
:network network
|
:network network
|
||||||
:universal-links/url url
|
:universal-links/url url
|
||||||
:push-notifications/initial? initial?
|
:push-notifications/initial? initial?
|
||||||
:device-UUID device-UUID)})
|
:device-UUID device-UUID)})
|
||||||
|
|
||||||
;; Entrypoint, fetches the key from the keychain and initialize the app
|
;; Entrypoint, fetches the key from the keychain and initialize the app
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
|
@ -294,56 +310,71 @@
|
||||||
(navigation/navigate-to-clean nil)
|
(navigation/navigate-to-clean nil)
|
||||||
(transport/stop-whisper)))))
|
(transport/stop-whisper)))))
|
||||||
|
|
||||||
(handlers/register-handler-db
|
(defn initialize-account-db [address {:keys [db web3]}]
|
||||||
:initialize-account-db
|
(let [{:keys [accounts/accounts accounts/create contacts/contacts networks/networks
|
||||||
(fn [{:keys [accounts/accounts accounts/create contacts/contacts networks/networks
|
network network-status peers-count peers-summary view-id navigation-stack
|
||||||
network network-status peers-count peers-summary view-id navigation-stack
|
status-module-initialized? status-node-started? device-UUID
|
||||||
status-module-initialized? status-node-started? device-UUID
|
push-notifications/initial? semaphores]
|
||||||
push-notifications/initial? semaphores]
|
:or {network (get app-db :network)}} db
|
||||||
:or [network (get app-db :network)]} [_ address]]
|
console-contact (get contacts constants/console-chat-id)
|
||||||
(let [console-contact (get contacts constants/console-chat-id)
|
current-account (accounts address)
|
||||||
current-account (accounts address)
|
account-network-id (get current-account :network network)
|
||||||
account-network-id (get current-account :network network)
|
account-network (get-in current-account [:networks account-network-id])]
|
||||||
account-network (get-in current-account [:networks account-network-id])]
|
{:db (cond-> (assoc app-db
|
||||||
(cond-> (assoc app-db
|
:current-public-key (:public-key current-account)
|
||||||
:current-public-key (:public-key current-account)
|
:view-id view-id
|
||||||
:view-id view-id
|
:navigation-stack navigation-stack
|
||||||
:navigation-stack navigation-stack
|
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
|
||||||
:status-module-initialized? (or platform/ios? js/goog.DEBUG status-module-initialized?)
|
:status-node-started? status-node-started?
|
||||||
:status-node-started? status-node-started?
|
:accounts/create create
|
||||||
:accounts/create create
|
:networks/networks networks
|
||||||
:networks/networks networks
|
:account/account current-account
|
||||||
:account/account current-account
|
:network-status network-status
|
||||||
:network-status network-status
|
:network network
|
||||||
:network network
|
:chain (ethereum/network->chain-name account-network)
|
||||||
:chain (ethereum/network->chain-name account-network)
|
:push-notifications/initial? initial?
|
||||||
:push-notifications/initial? initial?
|
:peers-summary peers-summary
|
||||||
:peers-summary peers-summary
|
:peers-count peers-count
|
||||||
:peers-count peers-count
|
:device-UUID device-UUID
|
||||||
:device-UUID device-UUID
|
:semaphores semaphores
|
||||||
:semaphores semaphores)
|
:web3 web3)
|
||||||
console-contact
|
console-contact
|
||||||
(assoc :contacts/contacts {constants/console-chat-id console-contact})))))
|
(assoc :contacts/contacts {constants/console-chat-id console-contact}))}))
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:initialize-account
|
:initialize-account
|
||||||
(fn [cofx [_ address events-after]]
|
[(re-frame/inject-cofx :protocol/get-web3)
|
||||||
{:dispatch-n (cond-> [[:initialize-account-db address]
|
(re-frame/inject-cofx :get-default-contacts)
|
||||||
[:initialize-protocol address]
|
(re-frame/inject-cofx :get-default-dapps)
|
||||||
[:fetch-web3-node-version]
|
(re-frame/inject-cofx :data-store/all-chats)
|
||||||
[:start-check-sync-state]
|
(re-frame/inject-cofx :data-store/get-messages)
|
||||||
[:load-contacts]
|
(re-frame/inject-cofx :data-store/get-user-statuses)
|
||||||
[:initialize-chats]
|
(re-frame/inject-cofx :data-store/unviewed-messages)
|
||||||
[:initialize-browsers]
|
(re-frame/inject-cofx :data-store/message-ids)
|
||||||
[:initialize-dapp-permissions]
|
(re-frame/inject-cofx :data-store/get-unanswered-requests)
|
||||||
[:send-account-update-if-needed]
|
(re-frame/inject-cofx :data-store/get-local-storage-data)
|
||||||
[:process-pending-messages]
|
(re-frame/inject-cofx :data-store/get-all-contacts)
|
||||||
[:update-wallet]
|
(re-frame/inject-cofx :data-store/get-all-mailservers)
|
||||||
[:update-transactions]
|
(re-frame/inject-cofx :data-store/transport)
|
||||||
(when platform/mobile? [:get-fcm-token])
|
(re-frame/inject-cofx :data-store/all-browsers)
|
||||||
[:start-wallet-transactions-sync]
|
(re-frame/inject-cofx :data-store/all-dapp-permissions)]
|
||||||
[:update-sign-in-time]]
|
(fn [{:keys [web3] :as cofx} [_ address events-after]]
|
||||||
(seq events-after) (into 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
|
(handlers/register-handler-fx
|
||||||
:initialize-geth
|
:initialize-geth
|
||||||
|
@ -359,19 +390,6 @@
|
||||||
(when-let [git-commit (nth (re-find #"-([0-9a-f]{7,})/" resp) 1)]
|
(when-let [git-commit (nth (re-find #"-([0-9a-f]{7,})/" resp) 1)]
|
||||||
{:db (assoc db :web3-node-version git-commit)})))
|
{:db (assoc db :web3-node-version git-commit)})))
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:fetch-web3-node-version
|
|
||||||
(fn [{{:keys [web3] :as db} :db} _]
|
|
||||||
(.. web3 -version (getNode (fn [err resp]
|
|
||||||
(when-not err
|
|
||||||
(re-frame/dispatch [:fetch-web3-node-version-callback resp])))))
|
|
||||||
nil))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:get-fcm-token
|
|
||||||
(fn [_ _]
|
|
||||||
{::get-fcm-token-fx nil}))
|
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:discovery/summary
|
:discovery/summary
|
||||||
(fn [{:keys [db] :as cofx} [_ peers-summary]]
|
(fn [{:keys [db] :as cofx} [_ peers-summary]]
|
||||||
|
|
|
@ -1,21 +1,17 @@
|
||||||
(ns status-im.ui.screens.wallet.events
|
(ns status-im.ui.screens.wallet.events
|
||||||
(:require [clojure.set :as set]
|
(:require [re-frame.core :as re-frame]
|
||||||
[re-frame.core :as re-frame :refer [dispatch reg-fx]]
|
[status-im.models.transactions :as wallet.transactions]
|
||||||
[status-im.i18n :as i18n]
|
[status-im.models.wallet :as models]
|
||||||
[status-im.ui.screens.wallet.navigation]
|
[status-im.ui.screens.navigation :as navigation]
|
||||||
|
status-im.ui.screens.wallet.navigation
|
||||||
[status-im.utils.ethereum.core :as ethereum]
|
[status-im.utils.ethereum.core :as ethereum]
|
||||||
[status-im.utils.ethereum.erc20 :as erc20]
|
[status-im.utils.ethereum.erc20 :as erc20]
|
||||||
[status-im.utils.ethereum.tokens :as tokens]
|
[status-im.utils.ethereum.tokens :as tokens]
|
||||||
[status-im.utils.handlers :as handlers]
|
[status-im.utils.handlers :as handlers]
|
||||||
|
[status-im.utils.money :as money]
|
||||||
[status-im.utils.prices :as prices]
|
[status-im.utils.prices :as prices]
|
||||||
[status-im.utils.transactions :as transactions]
|
[status-im.utils.transactions :as transactions]
|
||||||
[status-im.models.wallet :as models.wallet]
|
[taoensso.timbre :as log]))
|
||||||
[taoensso.timbre :as log]
|
|
||||||
status-im.ui.screens.wallet.request.events
|
|
||||||
[status-im.constants :as constants]
|
|
||||||
[status-im.ui.screens.navigation :as navigation]
|
|
||||||
[status-im.utils.money :as money]
|
|
||||||
[status-im.models.transactions :as wallet.transactions]))
|
|
||||||
|
|
||||||
(defn get-balance [{:keys [web3 account-id on-success on-error]}]
|
(defn get-balance [{:keys [web3 account-id on-success on-error]}]
|
||||||
(if (and web3 account-id)
|
(if (and web3 account-id)
|
||||||
|
@ -43,12 +39,9 @@
|
||||||
(defn assoc-error-message [db error-type err]
|
(defn assoc-error-message [db error-type err]
|
||||||
(assoc-in db [:wallet :errors error-type] (or err :unknown-error)))
|
(assoc-in db [:wallet :errors error-type] (or err :unknown-error)))
|
||||||
|
|
||||||
(defn clear-error-message [db error-type]
|
|
||||||
(update-in db [:wallet :errors] dissoc error-type))
|
|
||||||
|
|
||||||
;; FX
|
;; FX
|
||||||
|
|
||||||
(reg-fx
|
(re-frame/reg-fx
|
||||||
:get-balance
|
:get-balance
|
||||||
(fn [{:keys [web3 account-id success-event error-event]}]
|
(fn [{:keys [web3 account-id success-event error-event]}]
|
||||||
(get-balance {:web3 web3
|
(get-balance {:web3 web3
|
||||||
|
@ -56,7 +49,7 @@
|
||||||
:on-success #(re-frame/dispatch [success-event %])
|
:on-success #(re-frame/dispatch [success-event %])
|
||||||
:on-error #(re-frame/dispatch [error-event %])})))
|
:on-error #(re-frame/dispatch [error-event %])})))
|
||||||
|
|
||||||
(reg-fx
|
(re-frame/reg-fx
|
||||||
:get-tokens-balance
|
:get-tokens-balance
|
||||||
(fn [{:keys [web3 symbols chain account-id success-event error-event]}]
|
(fn [{:keys [web3 symbols chain account-id success-event error-event]}]
|
||||||
(doseq [symbol symbols]
|
(doseq [symbol symbols]
|
||||||
|
@ -67,7 +60,7 @@
|
||||||
:on-success #(re-frame/dispatch [success-event symbol %])
|
:on-success #(re-frame/dispatch [success-event symbol %])
|
||||||
:on-error #(re-frame/dispatch [error-event symbol %])})))))
|
:on-error #(re-frame/dispatch [error-event symbol %])})))))
|
||||||
|
|
||||||
(reg-fx
|
(re-frame/reg-fx
|
||||||
:get-transactions
|
:get-transactions
|
||||||
(fn [{:keys [web3 chain account-id token-addresses success-event error-event]}]
|
(fn [{:keys [web3 chain account-id token-addresses success-event error-event]}]
|
||||||
(transactions/get-transactions chain
|
(transactions/get-transactions chain
|
||||||
|
@ -83,7 +76,7 @@
|
||||||
#(re-frame/dispatch [success-event % account-id])))))
|
#(re-frame/dispatch [success-event % account-id])))))
|
||||||
|
|
||||||
;; TODO(oskarth): At some point we want to get list of relevant assets to get prices for
|
;; TODO(oskarth): At some point we want to get list of relevant assets to get prices for
|
||||||
(reg-fx
|
(re-frame/reg-fx
|
||||||
:get-prices
|
:get-prices
|
||||||
(fn [{:keys [from to success-event error-event]}]
|
(fn [{:keys [from to success-event error-event]}]
|
||||||
(prices/get-prices from
|
(prices/get-prices from
|
||||||
|
@ -91,53 +84,21 @@
|
||||||
#(re-frame/dispatch [success-event %])
|
#(re-frame/dispatch [success-event %])
|
||||||
#(re-frame/dispatch [error-event %]))))
|
#(re-frame/dispatch [error-event %]))))
|
||||||
|
|
||||||
(reg-fx
|
(re-frame/reg-fx
|
||||||
:update-gas-price
|
:update-gas-price
|
||||||
(fn [{:keys [web3 success-event edit?]}]
|
(fn [{:keys [web3 success-event edit?]}]
|
||||||
(ethereum/gas-price web3 #(re-frame/dispatch [success-event %2 edit?]))))
|
(ethereum/gas-price web3 #(re-frame/dispatch [success-event %2 edit?]))))
|
||||||
|
|
||||||
(reg-fx
|
(re-frame/reg-fx
|
||||||
:update-estimated-gas
|
:update-estimated-gas
|
||||||
(fn [{:keys [web3 obj success-event]}]
|
(fn [{:keys [web3 obj success-event]}]
|
||||||
(ethereum/estimate-gas-web3 web3 (clj->js obj) #(re-frame/dispatch [success-event %2]))))
|
(ethereum/estimate-gas-web3 web3 (clj->js obj) #(re-frame/dispatch [success-event %2]))))
|
||||||
|
|
||||||
(defn tokens-symbols [v chain]
|
|
||||||
(set/difference (set v) (set (map :symbol (tokens/nfts-for chain)))))
|
|
||||||
|
|
||||||
(defn update-wallet [{{:keys [web3 network network-status] {:keys [address settings]} :account/account :as db} :db}]
|
|
||||||
(let [network (get-in db [:account/account :networks network])
|
|
||||||
chain (ethereum/network->chain-keyword network)
|
|
||||||
mainnet? (= :mainnet chain)
|
|
||||||
assets (get-in settings [:wallet :visible-tokens chain])
|
|
||||||
tokens (tokens-symbols (get-in settings [:wallet :visible-tokens chain]) chain)
|
|
||||||
currency-id (or (get-in settings [:wallet :currency]) :usd)
|
|
||||||
currency (get constants/currencies currency-id)]
|
|
||||||
(when (not= network-status :offline)
|
|
||||||
{:get-balance {:web3 web3
|
|
||||||
:account-id address
|
|
||||||
:success-event :update-balance-success
|
|
||||||
:error-event :update-balance-fail}
|
|
||||||
:get-tokens-balance {:web3 web3
|
|
||||||
:account-id address
|
|
||||||
:symbols assets
|
|
||||||
:chain chain
|
|
||||||
:success-event :update-token-balance-success
|
|
||||||
:error-event :update-token-balance-fail}
|
|
||||||
:get-prices {:from (if mainnet? (conj tokens "ETH") ["ETH"])
|
|
||||||
:to [(:code currency)]
|
|
||||||
:success-event :update-prices-success
|
|
||||||
:error-event :update-prices-fail}
|
|
||||||
:db (-> db
|
|
||||||
(clear-error-message :prices-update)
|
|
||||||
(clear-error-message :balance-update)
|
|
||||||
(assoc-in [:wallet :balance-loading?] true)
|
|
||||||
(assoc :prices-loading? true))})))
|
|
||||||
|
|
||||||
;; Handlers
|
;; Handlers
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:update-wallet
|
:update-wallet
|
||||||
(fn [cofx _]
|
(fn [cofx _]
|
||||||
(update-wallet cofx)))
|
(models/update-wallet cofx)))
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:update-transactions
|
:update-transactions
|
||||||
|
@ -257,7 +218,7 @@
|
||||||
:wallet/update-gas-price-success
|
:wallet/update-gas-price-success
|
||||||
(fn [db [_ price edit?]]
|
(fn [db [_ price edit?]]
|
||||||
(if edit?
|
(if edit?
|
||||||
(:db (models.wallet/edit-value
|
(:db (models/edit-value
|
||||||
:gas-price
|
:gas-price
|
||||||
(money/to-fixed
|
(money/to-fixed
|
||||||
(money/wei-> :gwei price))
|
(money/wei-> :gwei price))
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
(ns status-im.ui.screens.wallet.send.events
|
(ns status-im.ui.screens.wallet.send.events
|
||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
|
[status-im.chat.commands.sending :as commands-sending]
|
||||||
|
[status-im.chat.models.message :as models.message]
|
||||||
|
[status-im.constants :as constants]
|
||||||
[status-im.i18n :as i18n]
|
[status-im.i18n :as i18n]
|
||||||
|
[status-im.models.transactions :as wallet.transactions]
|
||||||
|
[status-im.models.wallet :as models.wallet]
|
||||||
[status-im.native-module.core :as status]
|
[status-im.native-module.core :as status]
|
||||||
|
[status-im.ui.screens.navigation :as navigation]
|
||||||
[status-im.ui.screens.wallet.db :as wallet.db]
|
[status-im.ui.screens.wallet.db :as wallet.db]
|
||||||
[status-im.utils.ethereum.core :as ethereum]
|
[status-im.utils.ethereum.core :as ethereum]
|
||||||
[status-im.utils.ethereum.erc20 :as erc20]
|
[status-im.utils.ethereum.erc20 :as erc20]
|
||||||
|
@ -11,13 +17,7 @@
|
||||||
[status-im.utils.money :as money]
|
[status-im.utils.money :as money]
|
||||||
[status-im.utils.security :as security]
|
[status-im.utils.security :as security]
|
||||||
[status-im.utils.types :as types]
|
[status-im.utils.types :as types]
|
||||||
[status-im.utils.utils :as utils]
|
[status-im.utils.utils :as utils]))
|
||||||
[status-im.models.wallet :as models.wallet]
|
|
||||||
[status-im.chat.models.message :as models.message]
|
|
||||||
[status-im.chat.commands.sending :as commands-sending]
|
|
||||||
[status-im.constants :as constants]
|
|
||||||
[status-im.ui.screens.navigation :as navigation]
|
|
||||||
[status-im.models.transactions :as wallet.transactions]))
|
|
||||||
|
|
||||||
;;;; FX
|
;;;; FX
|
||||||
|
|
||||||
|
@ -269,8 +269,3 @@
|
||||||
:sync-wallet-transactions
|
:sync-wallet-transactions
|
||||||
(fn [cofx _]
|
(fn [cofx _]
|
||||||
(wallet.transactions/sync cofx)))
|
(wallet.transactions/sync cofx)))
|
||||||
|
|
||||||
(handlers/register-handler-fx
|
|
||||||
:start-wallet-transactions-sync
|
|
||||||
(fn [cofx _]
|
|
||||||
(wallet.transactions/start-sync cofx)))
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
(ns status-im.utils.handlers-macro
|
(ns status-im.utils.handlers-macro
|
||||||
(:require-macros status-im.utils.handlers-macro)
|
(:require-macros status-im.utils.handlers-macro
|
||||||
|
[taoensso.timbre :as log])
|
||||||
(:require [clojure.set :as set]))
|
(:require [clojure.set :as set]))
|
||||||
|
|
||||||
(defn update-db [cofx fx]
|
(defn update-db [cofx fx]
|
||||||
|
@ -10,7 +11,7 @@
|
||||||
(def ^:private mergable-keys
|
(def ^:private mergable-keys
|
||||||
#{:data-store/tx :data-store/base-tx :chat-received-message/add-fx
|
#{:data-store/tx :data-store/base-tx :chat-received-message/add-fx
|
||||||
:shh/add-new-sym-keys :shh/get-new-sym-keys :shh/post
|
:shh/add-new-sym-keys :shh/get-new-sym-keys :shh/post
|
||||||
:confirm-messages-processed})
|
:confirm-messages-processed :utils/dispatch-later})
|
||||||
|
|
||||||
(defn safe-merge [fx new-fx]
|
(defn safe-merge [fx new-fx]
|
||||||
(if (:merging-fx-with-common-keys fx)
|
(if (:merging-fx-with-common-keys fx)
|
||||||
|
@ -23,7 +24,8 @@
|
||||||
(merge-with into
|
(merge-with into
|
||||||
(select-keys fx mergable-keys)
|
(select-keys fx mergable-keys)
|
||||||
(select-keys new-fx mergable-keys)))
|
(select-keys new-fx mergable-keys)))
|
||||||
{:merging-fx-with-common-keys common-keys}))))
|
(do (log/error "Merging fx with common-keys: " common-keys)
|
||||||
|
{:merging-fx-with-common-keys common-keys})))))
|
||||||
|
|
||||||
(defn merge-effects
|
(defn merge-effects
|
||||||
([{:keys [db] :as cofx} handler args]
|
([{:keys [db] :as cofx} handler args]
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
status-im.ui.screens.subs
|
status-im.ui.screens.subs
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[status-im.models.browser :as model]
|
[status-im.models.browser :as model]
|
||||||
[status-im.utils.types :as types]))
|
[status-im.utils.types :as types]
|
||||||
|
[status-im.utils.handlers :as handlers]
|
||||||
|
[status-im.utils.handlers-macro :as handlers-macro]
|
||||||
|
[status-im.models.browser :as browser]))
|
||||||
|
|
||||||
(defn test-fixtures []
|
(defn test-fixtures []
|
||||||
|
|
||||||
|
@ -32,7 +35,17 @@
|
||||||
(fn [[permission {:keys [dapp-name permissions-data index] :as params}]]
|
(fn [[permission {:keys [dapp-name permissions-data index] :as params}]]
|
||||||
(if (and (= dapp-name "test.com") (#{0 1} index))
|
(if (and (= dapp-name "test.com") (#{0 1} index))
|
||||||
(re-frame/dispatch [:next-dapp-permission params permission permissions-data])
|
(re-frame/dispatch [:next-dapp-permission params permission permissions-data])
|
||||||
(re-frame/dispatch [:next-dapp-permission params])))))
|
(re-frame/dispatch [:next-dapp-permission params]))))
|
||||||
|
|
||||||
|
(handlers/register-handler-fx
|
||||||
|
[(re-frame/inject-cofx :data-store/all-browsers)
|
||||||
|
(re-frame/inject-cofx :data-store/all-dapp-permissions)]
|
||||||
|
:initialize-test
|
||||||
|
(fn [cofx [_]]
|
||||||
|
(handlers-macro/merge-fx cofx
|
||||||
|
(events/initialize-db)
|
||||||
|
(browser/initialize-browsers)
|
||||||
|
(browser/initialize-dapp-permissions)))))
|
||||||
|
|
||||||
(deftest browser-events
|
(deftest browser-events
|
||||||
|
|
||||||
|
@ -40,16 +53,16 @@
|
||||||
|
|
||||||
(test-fixtures)
|
(test-fixtures)
|
||||||
|
|
||||||
(re-frame/dispatch [:initialize-db])
|
(re-frame/dispatch [:initialize-test])
|
||||||
(re-frame/dispatch [:initialize-browsers])
|
(println :app-db @re-frame.db/app-db)
|
||||||
|
|
||||||
(let [browsers (re-frame/subscribe [:browsers])
|
(let [browsers (re-frame/subscribe [:browsers])
|
||||||
dapp1-url "cryptokitties.co"
|
dapp1-url "cryptokitties.co"
|
||||||
dapp2-url "http://test2.com"]
|
dapp2-url "http://test2.com"]
|
||||||
|
|
||||||
(testing "open and remove dapps"
|
(testing "open and remove dapps"
|
||||||
|
(println :browsers @browsers)
|
||||||
(is (zero? (count @browsers)))
|
(is (do (println :browser @browsers)
|
||||||
|
(zero? (count @browsers))))
|
||||||
|
|
||||||
(re-frame/dispatch [:open-url-in-browser dapp1-url])
|
(re-frame/dispatch [:open-url-in-browser dapp1-url])
|
||||||
|
|
||||||
|
@ -120,8 +133,6 @@
|
||||||
(is (= 1 (:history-index @browser)))
|
(is (= 1 (:history-index @browser)))
|
||||||
(is (= [dapp2-url dapp2-url3] (:history @browser))))))
|
(is (= [dapp2-url dapp2-url3] (:history @browser))))))
|
||||||
|
|
||||||
(re-frame/dispatch [:initialize-dapp-permissions])
|
|
||||||
|
|
||||||
(let [dapps-permissions (re-frame/subscribe [:get :dapps/permissions])
|
(let [dapps-permissions (re-frame/subscribe [:get :dapps/permissions])
|
||||||
dapp-name "test.com"
|
dapp-name "test.com"
|
||||||
dapp-name2 "test2.org"]
|
dapp-name2 "test2.org"]
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
|
|
||||||
(def personal-request-command (transactions/PersonalRequestCommand.))
|
(def personal-request-command (transactions/PersonalRequestCommand.))
|
||||||
|
|
||||||
(deftest personal-send-command-test
|
(deftest personal-request-command-test
|
||||||
(testing "That correct parameters are defined"
|
(testing "That correct parameters are defined"
|
||||||
(is (= (into #{} (map :id) (protocol/parameters personal-request-command))
|
(is (= (into #{} (map :id) (protocol/parameters personal-request-command))
|
||||||
#{:asset :amount})))
|
#{:asset :amount})))
|
||||||
|
@ -72,4 +72,3 @@
|
||||||
:message-id "0xAA"
|
:message-id "0xAA"
|
||||||
:response "send"
|
:response "send"
|
||||||
:status "open"})))))
|
:status "open"})))))
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
(ns status-im.test.transport.core
|
(ns status-im.test.transport.core
|
||||||
(:require [cljs.test :refer-macros [deftest is testing]]
|
(:require [cljs.test :refer-macros [deftest is testing]]
|
||||||
[status-im.protocol.handlers :as protocol.handlers]
|
[status-im.models.protocol :as protocol]
|
||||||
[status-im.transport.core :as transport]))
|
[status-im.transport.core :as transport]))
|
||||||
|
|
||||||
(deftest init-whisper
|
(deftest init-whisper
|
||||||
(let [cofx {:db {:network "mainnet_rpc"
|
(let [cofx {:db {:network "mainnet_rpc"
|
||||||
:account/account
|
:account/account
|
||||||
{:networks {"mainnet_rpc" {:config {:NetworkId 1}}}
|
{:networks {"mainnet_rpc" {:config {:NetworkId 1}}}
|
||||||
:public-key "1"}}}]
|
:public-key "1"}
|
||||||
|
:semaphores #{}}}]
|
||||||
(testing "it adds the discover filter"
|
(testing "it adds the discover filter"
|
||||||
(is (= (:shh/add-discovery-filter (protocol.handlers/initialize-protocol cofx [])))))
|
(is (= (:shh/add-discovery-filter (protocol/initialize-protocol "user-address" cofx)))))
|
||||||
(testing "it restores the sym-keys"
|
(testing "it restores the sym-keys"
|
||||||
(is (= (:shh/restore-sym-keys (protocol.handlers/initialize-protocol cofx [])))))
|
(is (= (:shh/restore-sym-keys (protocol/initialize-protocol "user-address" cofx)))))
|
||||||
(testing "custom mailservers"
|
(testing "custom mailservers"
|
||||||
(let [ms-1 {:id "1"
|
(let [ms-1 {:id "1"
|
||||||
:chain "mainnet"
|
:chain "mainnet"
|
||||||
|
@ -44,5 +45,5 @@
|
||||||
ms-3])]
|
ms-3])]
|
||||||
(is (= expected-wnodes
|
(is (= expected-wnodes
|
||||||
(get-in
|
(get-in
|
||||||
(protocol.handlers/initialize-protocol cofx-with-ms [])
|
(protocol/initialize-protocol "user-address" cofx-with-ms)
|
||||||
[:db :inbox/wnodes])))))))
|
[:db :inbox/wnodes])))))))
|
||||||
|
|
Loading…
Reference in New Issue