From b26b6ee5e0c07f96b3f215d4b2c59fa96fd09f01 Mon Sep 17 00:00:00 2001 From: Andrea Maria Piana Date: Fri, 1 Mar 2019 10:36:49 +0100 Subject: [PATCH] Add unpinning of mailservers Signed-off-by: Igor Mandrigin --- STATUS_GO_VERSION | 2 +- src/status_im/events.cljs | 10 ++++ src/status_im/mailserver/core.cljs | 57 +++++++++++++++---- src/status_im/mailserver/subs.cljs | 9 ++- .../desktop/main/tabs/profile/views.cljs | 22 ++++--- .../offline_messaging_settings/styles.cljs | 19 ++++++- .../offline_messaging_settings/views.cljs | 34 ++++++++--- test/cljs/status_im/test/mailserver/core.cljs | 30 +++++++++- translations/en.json | 1 + 9 files changed, 149 insertions(+), 35 deletions(-) diff --git a/STATUS_GO_VERSION b/STATUS_GO_VERSION index 479250e7d6..d15acbbe90 100644 --- a/STATUS_GO_VERSION +++ b/STATUS_GO_VERSION @@ -1 +1 @@ -0.23.0-beta.5 +0.23.0-beta.7 diff --git a/src/status_im/events.cljs b/src/status_im/events.cljs index 1315acac3b..ec9bfd5b57 100644 --- a/src/status_im/events.cljs +++ b/src/status_im/events.cljs @@ -393,6 +393,16 @@ (fn [cofx _] (mailserver/connect-to-mailserver cofx))) +(handlers/register-handler-fx + :mailserver.ui/unpin-pressed + (fn [cofx _] + (mailserver/unpin cofx))) + +(handlers/register-handler-fx + :mailserver.ui/pin-pressed + (fn [cofx _] + (mailserver/pin cofx))) + (handlers/register-handler-fx :mailserver.ui/request-error-pressed (fn [cofx _] diff --git a/src/status_im/mailserver/core.cljs b/src/status_im/mailserver/core.cljs index 8081c0bc2c..2575a00553 100644 --- a/src/status_im/mailserver/core.cljs +++ b/src/status_im/mailserver/core.cljs @@ -38,7 +38,7 @@ (def seven-days (* 7 one-day)) (def maximum-number-of-attempts 2) (def request-timeout 30) -(def min-limit 200) +(def min-limit 100) (def max-limit 2000) (def backoff-interval-ms 3000) (def default-limit max-limit) @@ -46,6 +46,7 @@ "Time after which mailserver connection is considered to have failed" 10000) (def limit (atom default-limit)) +(def success-counter (atom 0)) (defn connected? [{:keys [db]} id] (= (:mailserver/current-id db) id)) @@ -143,17 +144,30 @@ (fn [enodes] (update-mailservers! enodes))) -(re-frame/reg-fx - :mailserver/set-limit - (fn [n] - (reset! limit n))) - (defn decrease-limit [] (max min-limit (/ @limit 2))) (defn increase-limit [] (min max-limit (* @limit 2))) +(re-frame/reg-fx + :mailserver/set-limit + (fn [n] + (reset! limit n))) + +(re-frame/reg-fx + :mailserver/increase-limit + (fn [] + (if (>= @success-counter 2) + (reset! limit (increase-limit)) + (swap! success-counter inc)))) + +(re-frame/reg-fx + :mailserver/decrease-limit + (fn [] + (reset! limit (decrease-limit)) + (reset! success-counter 0))) + (defn mark-trusted-peer! [web3 enode] (.markTrustedPeer (transport.utils/shh web3) enode @@ -262,7 +276,7 @@ (log/debug "Adjusting mailserver request" "from:" from "adjusted-from:" adjusted-from) adjusted-from)) -(fx/defn handle-request-success [{:keys [db]} request-id] +(fx/defn handle-request-success [{:keys [db]} {:keys [request-id]}] (when (:mailserver/current-request db) {:db (assoc-in db [:mailserver/current-request :request-id] request-id)})) @@ -527,7 +541,7 @@ (if (empty? error) (fx/merge cofx - {:mailserver/set-limit (increase-limit)} + {:mailserver/increase-limit []} (update-mailserver-topics {:request-id (:requestID event) :cursor (:cursor event)})) @@ -603,11 +617,11 @@ web3 (:web3 db)] (log/info "mailserver: message request " request-id "expired for mailserver topic" topics "from" from "to" to "cursor" cursor "limit" (decrease-limit)) {:db (update-in db [:mailserver/current-request :attempts] inc) - :mailserver/set-limit (decrease-limit) + :mailserver/decrease-limit [] :mailserver/request-messages {:web3 web3 :mailserver mailserver :request (assoc request :limit (decrease-limit))}}) - {:mailserver/set-limit (decrease-limit)}))))) + {:mailserver/decrease-limit []}))))) (fx/defn initialize-mailserver [cofx custom-mailservers] @@ -733,10 +747,31 @@ (fx/defn save-settings [{:keys [db] :as cofx} current-fleet mailserver-id] (let [{:keys [address]} (fetch-current cofx) - settings (get-in db [:account/account :settings])] + settings (get-in db [:account/account :settings]) + ;; Check if previous mailserver was pinned + pinned? (get-in settings [:mailserver current-fleet])] (fx/merge cofx {:db (assoc db :mailserver/current-id mailserver-id) :mailserver/remove-peer address} (connect-to-mailserver) + (when pinned? + (accounts.update/update-settings (assoc-in settings [:mailserver current-fleet] mailserver-id) + {}))))) + +(fx/defn unpin + [{:keys [db] :as cofx}] + (let [current-fleet (fleet/current-fleet db) + settings (get-in db [:account/account :settings])] + (fx/merge cofx + (accounts.update/update-settings (update settings :mailserver dissoc current-fleet) + {}) + (change-mailserver)))) + +(fx/defn pin + [{:keys [db] :as cofx}] + (let [current-fleet (fleet/current-fleet db) + mailserver-id (:mailserver/current-id db) + settings (get-in db [:account/account :settings])] + (fx/merge cofx (accounts.update/update-settings (assoc-in settings [:mailserver current-fleet] mailserver-id) {})))) diff --git a/src/status_im/mailserver/subs.cljs b/src/status_im/mailserver/subs.cljs index c45030dba6..99db9916c8 100644 --- a/src/status_im/mailserver/subs.cljs +++ b/src/status_im/mailserver/subs.cljs @@ -1,5 +1,7 @@ (ns status-im.mailserver.subs - (:require [re-frame.core :as re-frame])) + (:require + [status-im.mailserver.core :as mailserver] + [re-frame.core :as re-frame])) (re-frame/reg-sub :mailserver/state @@ -46,6 +48,11 @@ (fn [db] (:mailserver/current-id db))) +(re-frame/reg-sub + :mailserver/preferred-id + (fn [db] + (mailserver/preferred-mailserver-id {:db db}))) + (re-frame/reg-sub :mailserver/mailservers (fn [db] diff --git a/src/status_im/ui/screens/desktop/main/tabs/profile/views.cljs b/src/status_im/ui/screens/desktop/main/tabs/profile/views.cljs index 32cec1f481..29c5d0b064 100644 --- a/src/status_im/ui/screens/desktop/main/tabs/profile/views.cljs +++ b/src/status_im/ui/screens/desktop/main/tabs/profile/views.cljs @@ -156,15 +156,18 @@ (i18n/label :t/send-logs)]]]])) (views/defview advanced-settings [] - (views/letsubs [current-mailserver-id [:mailserver/current-id] - {:keys [settings]} [:account/account] - mailservers [:mailserver/fleet-mailservers] - mailserver-state [:mailserver/state] - node-status [:node-status] - peers-count [:peers-count] - connection-stats [:connection-stats] - disconnected [:disconnected?]] - (let [render-fn (offline-messaging.views/render-row current-mailserver-id) + (views/letsubs [current-mailserver-id [:mailserver/current-id] + {:keys [settings]} [:account/account] + mailservers [:mailserver/fleet-mailservers] + mailserver-state [:mailserver/state] + preferred-mailserver-id [:mailserver/preferred-id] + node-status [:node-status] + peers-count [:peers-count] + connection-stats [:connection-stats] + disconnected [:disconnected?]] + (let [render-fn (offline-messaging.views/render-row + current-mailserver-id + preferred-mailserver-id) pfs? (:pfs? settings) connection-message (connection-status peers-count node-status mailserver-state disconnected)] [react/scroll-view @@ -182,6 +185,7 @@ [react/view {:style styles/title-separator}] [react/text {:style styles/adv-settings-subtitle} (i18n/label :offline-messaging)] + [offline-messaging.views/pinned-state preferred-mailserver-id] [react/view (for [mailserver (vals mailservers)] ^{:key (:id mailserver)} diff --git a/src/status_im/ui/screens/offline_messaging_settings/styles.cljs b/src/status_im/ui/screens/offline_messaging_settings/styles.cljs index 603b3c3d29..d466baa597 100644 --- a/src/status_im/ui/screens/offline_messaging_settings/styles.cljs +++ b/src/status_im/ui/screens/offline_messaging_settings/styles.cljs @@ -1,7 +1,8 @@ (ns status-im.ui.screens.offline-messaging-settings.styles (:require [status-im.ui.components.colors :as colors] [status-im.utils.platform :as platform]) - (:require-macros [status-im.utils.styles :refer [defstyle]])) + (:require-macros [status-im.utils.styles :refer [defnstyle + defstyle]])) (def wrapper {:flex 1 @@ -10,10 +11,13 @@ (def mailserver-item-inner {:padding-horizontal 16}) -(defstyle mailserver-item +(defnstyle mailserver-item [pinned?] {:flex-direction :row :background-color :white :align-items :center + :opacity (if pinned? + 1 + 0.4) :padding-horizontal 16 :ios {:height 64} :android {:height 56}}) @@ -46,3 +50,14 @@ (defn mailserver-icon [connected?] (hash-map (if platform/desktop? :tint-color :color) (if connected? :white :gray))) + +(def mailserver-pinned + {:padding-horizontal 16 + :flex-direction :row + :padding-vertical 5}) + +(def mailserver-pinned-text + {:color colors/black}) + +(def mailserver-pinned-text-container + {:margin-top 15}) diff --git a/src/status_im/ui/screens/offline_messaging_settings/views.cljs b/src/status_im/ui/screens/offline_messaging_settings/views.cljs index 7c0a891e43..cb3ea7fecf 100644 --- a/src/status_im/ui/screens/offline_messaging_settings/views.cljs +++ b/src/status_im/ui/screens/offline_messaging_settings/views.cljs @@ -3,6 +3,7 @@ (:require [re-frame.core :as re-frame] [status-im.i18n :as i18n] [status-im.utils.config :as config] + [status-im.ui.components.checkbox.view :as checkbox.views] [status-im.ui.components.icons.vector-icons :as vector-icons] [status-im.ui.components.list.views :as list] [status-im.ui.components.react :as react] @@ -20,23 +21,38 @@ (if platform/desktop? {:style (styles/mailserver-icon connected?)} (styles/mailserver-icon connected?))]]) -(defn render-row [current-mailserver-id] +(defn pinned-state [pinned?] + [react/touchable-highlight {:on-press (if pinned? + #(re-frame/dispatch [:mailserver.ui/unpin-pressed]) + #(re-frame/dispatch [:mailserver.ui/pin-pressed]))} + [react/view {:style styles/mailserver-pinned} + [checkbox.views/checkbox + {:checked? (not pinned?) + :on-value-change (if pinned? + #(re-frame/dispatch [:mailserver.ui/unpin-pressed]) + #(re-frame/dispatch [:mailserver.ui/pin-pressed]))}] + [react/view {:style styles/mailserver-pinned-text-container} + [react/text {:style styles/mailserver-pinned-text} + (i18n/label :t/mailserver-automatic)]]]]) + +(defn render-row [current-mailserver-id pinned?] (fn [{:keys [name id user-defined]}] (let [connected? (= id current-mailserver-id)] [react/touchable-highlight - {:on-press #(if user-defined - (re-frame/dispatch [:mailserver.ui/user-defined-mailserver-selected id]) - (re-frame/dispatch [:mailserver.ui/default-mailserver-selected id])) + {:on-press (when pinned? #(if user-defined + (re-frame/dispatch [:mailserver.ui/user-defined-mailserver-selected id]) + (re-frame/dispatch [:mailserver.ui/default-mailserver-selected id]))) :accessibility-label :mailserver-item} - [react/view styles/mailserver-item + [react/view (styles/mailserver-item pinned?) [mailserver-icon connected?] [react/view styles/mailserver-item-inner [react/text {:style styles/mailserver-item-name-text} name]]]]))) (views/defview offline-messaging-settings [] - (views/letsubs [current-mailserver-id [:mailserver/current-id] - mailservers [:mailserver/fleet-mailservers]] + (views/letsubs [current-mailserver-id [:mailserver/current-id] + preferred-mailserver-id [:mailserver/preferred-id] + mailservers [:mailserver/fleet-mailservers]] [react/view {:flex 1} [status-bar/status-bar] [toolbar/toolbar {} @@ -45,7 +61,9 @@ [toolbar/actions [(toolbar.actions/add false #(re-frame/dispatch [:mailserver.ui/add-pressed]))]]] [react/view styles/wrapper + [pinned-state preferred-mailserver-id] [list/flat-list {:data (vals mailservers) :default-separator? false :key-fn :name - :render-fn (render-row current-mailserver-id)}]]])) + :render-fn (render-row current-mailserver-id + preferred-mailserver-id)}]]])) diff --git a/test/cljs/status_im/test/mailserver/core.cljs b/test/cljs/status_im/test/mailserver/core.cljs index b55faa3b5c..f0ed57d34b 100644 --- a/test/cljs/status_im/test/mailserver/core.cljs +++ b/test/cljs/status_im/test/mailserver/core.cljs @@ -354,9 +354,9 @@ (testing "it did not reach the maximum number of attempts" (testing "it reached the maximum number of attempts" (testing "it decrease the limit") - (is (= {:mailserver/set-limit 1000} (mailserver/resend-request {:db {:mailserver/current-request - {}}} - {}))))))) + (is (= {:mailserver/decrease-limit []} (mailserver/resend-request {:db {:mailserver/current-request + {}}} + {}))))))) (deftest test-resend-request-request-id (testing "request-id passed is nil" @@ -398,6 +398,30 @@ (is (= (into #{} (keys (peers-summary-change-result true false false))) #{})))) +(deftest unpin-test + (testing "it removes the preference" + (let [db {:mailserver/current-id "mailserverid" + :mailserver/mailservers + {:eth.beta {"mailserverid" {:address "mailserver-address" + :password "mailserver-password"}}} + :account/account + {:settings {:fleet :eth.beta + :mailserver {:eth.beta "mailserverid"}}}}] + (is (not (get-in (mailserver/unpin {:db db}) + [:db :account/account :settings :mailserver :eth.beta])))))) + +(deftest pin-test + (testing "it removes the preference" + (let [db {:mailserver/current-id "mailserverid" + :mailserver/mailservers + {:eth.beta {"mailserverid" {:address "mailserver-address" + :password "mailserver-password"}}} + :account/account + {:settings {:fleet :eth.beta + :mailserver {}}}}] + (is (= "mailserverid" (get-in (mailserver/pin {:db db}) + [:db :account/account :settings :mailserver :eth.beta])))))) + (deftest connect-to-mailserver (let [db {:mailserver/current-id "mailserverid" :mailserver/mailservers diff --git a/translations/en.json b/translations/en.json index 56056d70d8..90aba19b35 100644 --- a/translations/en.json +++ b/translations/en.json @@ -263,6 +263,7 @@ "update-status": "Update your status...", "errors": "Errors", "mailserver-connection-error": "Could not connect to mailserver", + "mailserver-automatic": "Automatic selection", "currency-display-name-kzt": "Kazakhstan Tenge", "no-recent-chats": "Your Home screen will house your recent chats and DApp history. Tap the plus (+) button to get started.", "install": "Install",