Use go-waku's connection status updates

This commit is contained in:
Vitaliy Vlasov 2021-07-23 12:53:52 +03:00
parent 5c0102c27b
commit a0acdeca33
12 changed files with 340 additions and 19 deletions

View File

@ -277,9 +277,10 @@
(fx/defn get-node-config-callback
{:events [::get-node-config-callback]}
[{:keys [db] :as cofx} node-config]
{:db (assoc-in db [:multiaccount :wakuv2-config]
(get (types/json->clj node-config) :WakuV2Config))})
[{:keys [db] :as cofx} node-config-json]
(let [node-config (types/json->clj node-config-json)]
{:db (assoc-in db [:multiaccount :wakuv2-config]
(get node-config :WakuV2Config))}))
(fx/defn get-node-config
[_]

View File

@ -89,6 +89,7 @@
current-fleet-key (current-fleet-key db)
current-fleet (get-current-fleet db)
wakuv2-enabled (boolean (:waku current-fleet))
wakuv2-nodes (into (vals (:waku current-fleet)) (vals (get wakuv2-config :CustomNodes)))
rendezvous-nodes (pick-nodes 3 (vals (:rendezvous current-fleet)))
{:keys [installation-id log-level
waku-bloom-filter-mode
@ -112,8 +113,8 @@
(into (pick-nodes 2
(vals (:whisper current-fleet)))
(vals (:static current-fleet))))
:WakuNodes (vals (:waku current-fleet))
:WakuStoreNodes (vals (:waku current-fleet))
:WakuNodes wakuv2-nodes
:WakuStoreNodes wakuv2-nodes
:RendezvousNodes (if wakuv2-enabled [] rendezvous-nodes)})
:always

View File

@ -43,6 +43,12 @@
:peers-count peers-count)}
(mailserver/peers-summary-change previous-summary))))
(fx/defn wakuv2-peer-stats
[{:keys [db]} peer-stats]
(let [previous-stats (:peer-stats db)]
{:db (assoc db :peer-stats peer-stats
:peers-count (count (:Peers peer-stats)))}))
(fx/defn process
{:events [:signals/signal-received]}
[cofx event-str]
@ -59,6 +65,7 @@
"message.delivered" (let [{:keys [chatID messageID]} (js->clj event-js :keywordize-keys true)]
(models.message/update-db-message-status cofx chatID messageID :delivered))
"discovery.summary" (summary cofx (js->clj event-js :keywordize-keys true))
"wakuv2.peerstats" (wakuv2-peer-stats cofx (js->clj event-js :keywordize-keys true))
"subscriptions.data" (ethereum.subscriptions/handle-signal cofx (js->clj event-js :keywordize-keys true))
"subscriptions.error" (ethereum.subscriptions/handle-error cofx (js->clj event-js :keywordize-keys true))
"messages.new" (transport.message/sanitize-messages-and-process-response cofx event-js true)

View File

@ -71,6 +71,8 @@
(reg-root-key-sub :mobile-network/remember-choice? :mobile-network/remember-choice?)
(reg-root-key-sub :qr-modal :qr-modal)
(reg-root-key-sub :bootnodes/manage :bootnodes/manage)
(reg-root-key-sub :wakuv2-nodes/manage :wakuv2-nodes/manage)
(reg-root-key-sub :wakuv2-nodes/list :wakuv2-nodes/list)
(reg-root-key-sub :networks/current-network :networks/current-network)
(reg-root-key-sub :networks/networks :networks/networks)
(reg-root-key-sub :networks/manage :networks/manage)
@ -83,6 +85,7 @@
(reg-root-key-sub :link-previews-whitelist :link-previews-whitelist)
(reg-root-key-sub :app-state :app-state)
(reg-root-key-sub :home-items-show-number :home-items-show-number)
(reg-root-key-sub :waku/v2-peer-stats :peer-stats)
;;NOTE this one is not related to ethereum network
;; it is about cellular network/ wifi network
@ -464,11 +467,13 @@
:disconnected?
:<- [:peers-count]
:<- [:waku/v2-flag]
(fn [[peers-count wakuv2-flag]]
;; TODO Right now wakuv2 module in status-go
;; does not report peer counts properly,
;; so we always assume that we're connected
(if wakuv2-flag false (zero? peers-count))))
:<- [:waku/v2-peer-stats]
(fn [[peers-count wakuv2-flag peer-stats]]
;; If wakuv2 is enabled,
;; then fetch connectivity status from
;; peer-stats (populated from "wakuv2.peerstats" status-go signal)
;; Otherwise use peers-count fetched from "discovery.summary" signal
(if wakuv2-flag (not (:IsOnline peer-stats)) (zero? peers-count))))
(re-frame/reg-sub
:offline?
@ -1411,8 +1416,8 @@
manage))
(re-frame/reg-sub
:manage-bootnode-validation-errors
:<- [:get-manage-bootnode]
:wakuv2-nodes/validation-errors
:<- [:wakuv2-nodes/manage]
(fn [manage]
(set (keep
(fn [[k {:keys [error]}]]

View File

@ -12,6 +12,7 @@
waku-bloom-filter-mode
communities-enabled?
transactions-management-enabled?
wakuv2-flag
current-fleet
webview-debug]}]
(keep
@ -48,12 +49,19 @@
:accessory :text
:accessory-text current-fleet
:chevron true}
{:size :small
:title (i18n/label :t/bootnodes)
:accessibility-label :bootnodes-settings-button
:on-press
#(re-frame/dispatch [:navigate-to :bootnodes-settings])
:chevron true}
(if wakuv2-flag
{:size :small
:title (i18n/label :t/wakuv2-settings)
:accessibility-label :wakuv2-settings-button
:on-press
#(re-frame/dispatch [:wakuv2.ui/enter-settings-pressed])
:chevron true}
{:size :small
:title (i18n/label :t/bootnodes)
:accessibility-label :bootnodes-settings-button
:on-press
#(re-frame/dispatch [:navigate-to :bootnodes-settings])
:chevron true})
{:size :small
:title (i18n/label :t/rpc-usage-info)
:accessibility-label :rpc-usage-info
@ -68,7 +76,7 @@
:on-press
#(re-frame/dispatch [:navigate-to :notifications-advanced-settings])
:chevron true})
;; If it's enabled in the config, we don't show the option
;; If it's enabled in the config, we don't show the option
(when (not config/communities-enabled?)
{:size :small
:title (i18n/label :t/communities-enabled)
@ -119,6 +127,7 @@
(views/letsubs [{:keys [webview-debug]} [:multiaccount]
network-name [:network-name]
waku-bloom-filter-mode [:waku/bloom-filter-mode]
wakuv2-flag [:waku/v2-flag]
communities-enabled? [:communities/enabled?]
transactions-management-enabled? [:wallet/transactions-management-enabled?]
current-log-level [:log-level/current-log-level]
@ -131,6 +140,7 @@
:transactions-management-enabled? transactions-management-enabled?
:current-fleet current-fleet
:dev-mode? false
:wakuv2-flag wakuv2-flag
:waku-bloom-filter-mode waku-bloom-filter-mode
:webview-debug webview-debug})
:key-fn (fn [_ i] (str i))

View File

@ -66,6 +66,10 @@
:as
edit-bootnode]
[status-im.ui.screens.bootnodes-settings.views :as bootnodes-settings]
[status-im.ui.screens.wakuv2-settings.views :as wakuv2-settings]
[status-im.ui.screens.wakuv2-settings.edit-node.views
:as
edit-wakuv2-node]
[status-im.ui.screens.pairing.views :as pairing]
[status-im.ui.screens.offline-messaging-settings.edit-mailserver.views
:as
@ -420,6 +424,14 @@
{:name :blocked-users-list
:options {:topBar {:title {:text (i18n/label :t/blocked-users)}}}
:component contacts-list/blocked-users-list}
{:name :wakuv2-settings
;;TODO dynamic title
:options {:topBar {:visible false}}
:component wakuv2-settings/wakuv2-settings}
{:name :edit-wakuv2-node
;;TODO dynamic title
:options {:topBar {:visible false}}
:component edit-wakuv2-node/edit-node}
{:name :bootnodes-settings
;;TODO dynamic title
:options {:topBar {:visible false}}

View File

@ -0,0 +1,28 @@
(ns status-im.ui.screens.wakuv2-settings.edit-node.styles
(:require [quo.design-system.colors :as colors]
[status-im.utils.styles :as styles]))
(def edit-node-view
{:flex 1
:margin-horizontal 16
:margin-vertical 15})
(def button-container
{:margin-top 8
:margin-bottom 16
:margin-horizontal 16})
(styles/def button
{:height 52
:align-items :center
:justify-content :center
:border-radius 8
:ios {:opacity 0.9}})
(def button-label
{:color colors/white-persist
:font-size 17})
(def delete-button
(assoc button
:background-color colors/red))

View File

@ -0,0 +1,68 @@
(ns status-im.ui.screens.wakuv2-settings.edit-node.views
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.react :as react]
[status-im.ui.components.toolbar :as toolbar]
[quo.core :as quo]
[status-im.ui.components.topbar :as topbar]
[status-im.ui.screens.wakuv2-settings.edit-node.styles
:as
styles])
(:require-macros [status-im.utils.views :as views]))
(defn delete-button [id]
[react/touchable-highlight {:on-press #(re-frame/dispatch [:wakuv2.ui/delete-pressed id])}
[react/view styles/button-container
[react/view {:style styles/delete-button
:accessibility-label :wakuv2-delete-button}
[react/text {:style styles/button-label}
(i18n/label :t/delete)]]]])
(views/defview edit-node []
(views/letsubs [manage-node [:wakuv2-nodes/manage]
validation-errors [:wakuv2-nodes/validation-errors]]
(let [address (get-in manage-node [:address :value])
id (:id manage-node)
name (get-in manage-node [:name :value])
new-node? (:new? manage-node)
is-valid? (empty? validation-errors)
invalid-address? (contains? validation-errors :address)]
[react/keyboard-avoiding-view {:style {:flex 1}
:ignore-offset true}
[topbar/topbar {:title (i18n/label (if name :t/node-details :t/add-node))}]
[react/scroll-view {:keyboard-should-persist-taps :handled}
[react/view styles/edit-node-view
[react/view {:padding-vertical 8}
[quo/text-input
{:label (i18n/label :t/name)
:placeholder (i18n/label :t/specify-name)
:accessibility-label :node-name
:default-value name
:on-change-text #(re-frame/dispatch [:wakuv2.ui/input-changed :name %])
:auto-focus true}]]
[react/view
{:flex 1
:padding-vertical 8}
[quo/text-input
(merge
{:label (i18n/label :t/node-address)
:placeholder (i18n/label :t/wakuv2-node-format)
:accessibility-label :node-address
:default-value address
:show-cancel false
:on-change-text #(re-frame/dispatch [:wakuv2.ui/input-changed :address %])
:error (when (and (not (string/blank? address)) invalid-address?)
(i18n/label :t/invalid-format
{:format (i18n/label :t/wakuv2-node-format)}))
:bottom-value 0})]]
(when-not new-node?
[delete-button id])]]
[toolbar/toolbar
{:right
[quo/button
{:type :secondary
:after :main-icon/next
:disabled (not is-valid?)
:on-press #(re-frame/dispatch [:wakuv2.ui/save-node-pressed])}
(i18n/label :t/save)]}]])))

View File

@ -0,0 +1,22 @@
(ns status-im.ui.screens.wakuv2-settings.styles
(:require [status-im.utils.styles :as styles]))
(def wrapper
{:flex 1})
(def node-item-inner
{:padding-horizontal 16})
(styles/def node-item
{:flex-direction :row
:align-items :center
:padding-horizontal 16
:ios {:height 64}
:android {:height 56}})
(def node-item-name-text
{:font-size 17})
(def switch-container
{:height 50
:padding-left 15})

View File

@ -0,0 +1,50 @@
(ns status-im.ui.screens.wakuv2-settings.views
(:require-macros [status-im.utils.views :as views])
(:require [re-frame.core :as re-frame]
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.list.views :as list]
[status-im.ui.components.react :as react]
[status-im.ui.screens.wakuv2-settings.styles :as styles]
[quo.core :as quo]
[status-im.ui.components.toolbar :as toolbar]
[status-im.ui.components.topbar :as topbar]))
(defn navigate-to-add-node [id]
(re-frame/dispatch [:wakuv2.ui/add-node-pressed id]))
(defn render-row [[id {:keys [name]}]]
[react/touchable-highlight
{:on-press #(navigate-to-add-node id)
:accessibility-label :wakuv2-node-item}
[react/view styles/node-item
[react/view styles/node-item-inner
[react/text {:style styles/node-item-name-text}
name]]]])
(views/defview wakuv2-settings []
(views/letsubs [nodes [:wakuv2-nodes/list]]
[:<>
[topbar/topbar {:title (i18n/label :t/wakuv2-settings)
:navigation :none
:right-accessories
[{:icon :main-icons/add
:accessibility-label :add-wakuv2-node
:on-press #(navigate-to-add-node nil)}]}]
[react/view styles/wrapper
[list/flat-list {:data nodes
:default-separator? false
:key-fn :id
:render-fn render-row}]]
[toolbar/toolbar
{:left
[quo/button
{:type :secondary
:after :main-icon/close
:on-press #(re-frame/dispatch [:wakuv2.ui/discard-all-pressed])}
(i18n/label :t/cancel)]
:right
[quo/button
{:type :secondary
:after :main-icon/next
:on-press #(re-frame/dispatch [:wakuv2.ui/save-all-pressed])}
(i18n/label :t/save)]}]]))

View File

@ -1,7 +1,10 @@
(ns status-im.waku.core
(:require [re-frame.core :as re-frame]
[clojure.string :as string]
[status-im.i18n.i18n :as i18n]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.node.core :as node]
[status-im.navigation :as navigation]
[status-im.utils.fx :as fx]))
(fx/defn switch-waku-bloom-filter-mode
@ -13,3 +16,108 @@
{})
(node/prepare-new-config
{:on-success #(re-frame/dispatch [:logout])})))
(def address-regex #"/ip4/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/tcp/\d{1,5}/p2p/[a-zA-Z0-9]+")
(defn valid-address? [address]
(re-matches address-regex address))
(fx/defn set-input
{:events [:wakuv2.ui/input-changed]}
[{:keys [db] :as cofx} input-key value]
{:db (assoc-in db [:wakuv2-nodes/manage input-key]
{:value value
:error (case input-key
:name (string/blank? value)
:address (when value (not (valid-address? value))))})})
(fx/defn enter-settings
{:events [:wakuv2.ui/enter-settings-pressed]
:interceptors [(re-frame/inject-cofx :random-guid-generator)]}
[{:keys [db random-guid-generator] :as cofx}]
(let [custom-nodes (into {}
(map #(vector (random-guid-generator) {:name (name (first %1)) :address (second %1)}) (get-in db [:multiaccount :wakuv2-config :CustomNodes])))]
(fx/merge cofx
{:db (assoc db :wakuv2-nodes/list custom-nodes)
:dispatch [:navigate-to :wakuv2-settings]})))
(fx/defn edit
{:events [:wakuv2.ui/add-node-pressed]
:interceptors [(re-frame/inject-cofx :random-guid-generator)]}
[{:keys [db random-guid-generator] :as cofx} id]
(let [{:keys [name address]} (get-in db [:wakuv2-nodes/list id])
id (or id (random-guid-generator))
fxs (fx/merge cofx
{:db (update db :wakuv2-nodes/manage
assoc :new? (nil? name)
:id id)}
(set-input :name name)
(set-input :address address))]
(assoc fxs :dispatch [:navigate-to :edit-wakuv2-node])))
(fx/defn delete [{:keys [db] :as cofx} id]
(fx/merge cofx
{:db (-> db
(update :wakuv2-nodes/list dissoc id)
(dissoc :wakuv2-nodes/manage))}))
(fx/defn save-node
{:events [:wakuv2.ui/save-node-pressed]}
[{:keys [db] :as cofx}]
(let [manage (:wakuv2-nodes/manage db)
id (:id manage)]
(fx/merge cofx
{:db (-> db
(assoc-in [:wakuv2-nodes/list id]
{:name (get-in manage [:name :value])
:address (get-in manage [:address :value])})
(dissoc :wakuv2-nodes/manage))
:dispatch [:navigate-back]})))
(fx/defn discard-all
{:events [:wakuv2.ui/discard-all-pressed]}
[{:keys [db] :as cofx}]
(fx/merge cofx
{:db (dissoc db :wakuv2-nodes/manage :wakuv2-nodes/list)
:dispatch [:navigate-back]}))
(fx/defn save-all-pressed
{:events [:wakuv2.ui/save-all-pressed]}
[{:keys [db] :as cofx}]
{:ui/show-confirmation
{:title (i18n/label :t/close-app-title)
:content (i18n/label :t/wakuv2-change-nodes)
:confirm-button-text (i18n/label :t/close-app-button)
:on-accept
#(re-frame/dispatch [:wakuv2.ui/save-all-confirmed])
:on-cancel nil}})
(fx/defn save-all
{:events [:wakuv2.ui/save-all-confirmed]}
[{:keys [db] :as cofx}]
(let [new-nodes (->> (:wakuv2-nodes/list db)
vals
(map #(vector (:name %1) (:address %1)))
(into {}))]
(fx/merge cofx
{:db (-> db
(assoc-in [:multiaccount :wakuv2-config :CustomNodes] new-nodes)
(dissoc :wakuv2-nodes/manage :wakuv2-nodes/list))
:dispatch [:navigate-back]}
(node/prepare-new-config
{:on-success #(re-frame/dispatch [:logout])}))))
(fx/defn show-delete-node-confirmation
{:events [:wakuv2.ui/delete-pressed]}
[_ node-name]
{:ui/show-confirmation {:title (i18n/label :t/delete-node-title)
:content (i18n/label :t/delete-node-are-you-sure)
:confirm-button-text (i18n/label :t/delete-node)
:on-accept #(re-frame/dispatch [:wakuv2.ui/delete-confirmed node-name])}})
(fx/defn delete-node
{:events [:wakuv2.ui/delete-confirmed]}
[cofx id]
(fx/merge cofx
(delete id)
(navigation/navigate-back)))

View File

@ -29,6 +29,7 @@
"add-mailserver": "Add Status node",
"add-members": "Add members",
"add-network": "Add network",
"add-node": "Add node",
"add-to-contacts": "Add to contacts",
"add-to-contacts-text": "By adding a user to your contact list, you share your wallet address",
"address": "Address",
@ -410,6 +411,9 @@
"delete-network-confirmation": "Are you sure you want to delete this network?",
"delete-network-error": "Please connect to a different network before deleting this one",
"delete-network-title": "Delete network?",
"delete-node": "Delete node",
"delete-node-are-you-sure": "Are you sure you want to delete this node?",
"delete-node-title": "Delete node",
"delete-profile": "Delete profile",
"delete-my-profile": "Delete my profile",
"delete-profile-warning": "Warning: If you dont have your seed phrase written down, you will lose access to your funds after you delete your profile",
@ -921,6 +925,8 @@
"no-result": "No results",
"no-tokens-found": "No tokens found",
"node-info": "Node info",
"node-address": "Node address",
"node-details": "Node details",
"node-version": "Node version",
"nonce": "Nonce",
"none": "None",
@ -1379,6 +1385,9 @@
"add-private-key-account": "Add account from private key",
"profile-not-found": "Profile not found",
"waku-bloom-filter-mode": "Waku bloom filter mode",
"wakuv2-settings": "Waku v2 settings",
"wakuv2-node-format": "/ip4/{node-ip}/tcp/{port}/p2p/{id}",
"wakuv2-change-nodes": "Are you sure you want to change Wakuv2 nodes?",
"appearance": "Appearance",
"preference": "Preference",
"light": "Light",