Compare commits

..
Author SHA1 Message Date
Parvesh Monu c33530acab show keycard is not empty in settings 2025-02-20 19:43:33 +05:30
Parvesh Monu 14d83fddff move error priority as per Alisher's message 2025-02-20 15:16:21 +05:30
Parvesh Monu d9973c8d0b Show different keycard screen when wrong keycard is used 2025-02-20 11:34:35 +05:30
Mohsen a98bbf6a71 [#22029] fix: bridge button when there is single account (#22031)
* [#22029] fix: bridge button when there is single account

* [#22029] fix: trigger start bridge if all condition met

* [#22029] docs: add clarification for bridge flow logic based on account selection
2025-02-19 21:58:11 +03:00
andrey 8116f7a7b1 [#21956] Biometrics are still active after profile migration to keycard 2025-02-19 17:40:27 +01:00
38 changed files with 305 additions and 557 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

-129
View File
@@ -1,129 +0,0 @@
(ns status-im.app.events
(:require
[status-im.app.use-case :as uc]
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
(def navigation-effects-tree
{:uc-view-saved-addresses
{:on-start [[:dispatch [:open-modal :screen/settings.saved-addresses]]]
:uc-add-saved-address {:on-start [[:dispatch [:open-modal :screen/settings.add-address-to-save]]]
:on-finish [[:dispatch [:navigate-back]]]}
:on-finish [[:dispatch [:navigate-back]]]}})
(def db-path-use-case-stack [:app :use-cases-stack])
(defn use-cases
[db]
(get-in db db-path-use-case-stack '()))
(defn current-use-case
[db]
(-> db
use-cases
first))
(defn- navigation-effects-for-key
[db last-key]
(let [path (-> db
use-cases
reverse
vec
(conj last-key))]
(tap> {:in :navigation-effects-for-key
:use-cases (use-cases db)})
(get-in navigation-effects-tree path)))
(defn start-use-case-navigation-effects
[db]
(navigation-effects-for-key db :on-start))
(defn finish-use-case-navigation-effects
[db]
(navigation-effects-for-key db :on-finish))
(rf/reg-event-fx :app/start-use-case
(fn [{:keys [db]} [use-case-id]]
(let [new-db (update-in db db-path-use-case-stack conj use-case-id)]
#_(tap> {:in :app/start-use-case
:effects (start-use-case-navigation-effects new-db)})
{:db new-db
:fx (start-use-case-navigation-effects new-db)})))
(rf/reg-event-fx :app/finish-use-case
(fn [{:keys [db]} [use-case-to-finish]]
(let [new-db (update-in db db-path-use-case-stack rest)]
(if (= (current-use-case db) use-case-to-finish)
{:db new-db
:fx (finish-use-case-navigation-effects db)}
;; TODO: kozieiev: replace with effect
(log/error "Attempt to finish use case that is not current:" use-case-to-finish)))))
(rf/reg-event-fx :app/clear-use-cases-stack
(fn [{:keys [db]}]
{:db (assoc-in db db-path-use-case-stack '())}))
(comment
(rf/dispatch [:app/start-use-case :uc-save-address])
(rf/dispatch [:app/start-use-case :uc-edit-address])
(rf/dispatch [:app/finish-use-case :uc-edit-address])
(rf/dispatch [:app/finish-use-case :uc-save-address])
(rf/dispatch [:app/clear-use-cases-stack])
(rf/sub [:app/use-case-active? :uc-edit-address])
(rf/sub [:app/use-case-active? :uc-save-address])
(rf/sub [:app/current-use-case])
(rf/dispatch [:navigate-back])
(start-use-case-navigation-effects {:app {:use-cases-stack
'(:uc-view-saved-addresses :uc-add-saved-address)}})
(finish-use-case-navigation-effects {:app {:use-cases-stack
'(:uc-view-saved-addresses :uc-add-saved-address)}})
(use-cases {:app {:use-cases-stack
'(:uc-view-saved-addresses :uc-add-saved-address)}})
(-> {:app {:use-cases-stack '(:uc-view-saved-addresses :uc-add-saved-address)}}
use-cases
reverse
vec
(conj :on-exit))
)
#_(rf/reg-event-fx
:app/notify-user
(fn [{:keys [db]} [{:keys [text type] :as message}]]
(let [notification-id (-> db
(get-in [:app :last-user-notification :id] 0)
inc)]
{;; whenever we need to publish notification we override the old and increment id
:db (assoc-in db
[:app :last-user-notification]
(merge message
{:id notification-id}))
;; TODO: toasts are part of ui layer and they shouldn't be published here. Instead some part
;; of ui should keep track of last user notification and generate toast
:fx [#_[:dispatch
[:toasts/upsert
{:type type
:text text}]]]})))
#_(comment
(rf/dispatch [:app/notify-user
{:type :positive
:text "This is a good news"}])
(rf/dispatch [:app/notify-user
{:type :negative
:text "This is a bad news"}])
(rf/dispatch [:toasts/upsert
{:type :positive
:text "This is a test notification3"}])
)
-97
View File
@@ -1,97 +0,0 @@
(ns status-im.app.use-case)
(defmulti initial-state
(fn [use-case-id]
use-case-id))
(defmethod initial-state :default
[_]
{:use-case-id :default})
(defn start
[use-case-id state-update]
(merge (initial-state use-case-id)
state-update))
(defn make-step
[current-state state-update]
(merge current-state state-update))
(defn finish
[use-case-id state-update]
(merge (initial-state use-case-id)
state-update))
;; -----------------------------------------------------
(defmethod initial-state :uc-view-saved-addresses
[_]
{:use-case-id :uc-view-saved-addresses})
(defmethod initial-state :uc-add-saved-address
[_]
{:use-case-id :uc-add-saved-address
:address nil
:ens nil
:ens? false
:name nil
:customization-color nil})
;; -----------------------------------------------------
(defmulti navigation-start
(fn [use-case-data]
(:use-case-id use-case-data)))
(defmulti navigation-step
(fn [use-case-data]
(:use-case-id use-case-data)))
(defmethod navigation-step :default
[]
nil)
(defmulti navigation-finish
(fn [use-case-data]
(:use-case-id use-case-data)))
;; -----------------------------------------------------
(defmethod navigation-start :uc-view-saved-addresses
[_]
[[:dispatch [:open-modal :screen/settings.saved-addresses]]])
(defmethod navigation-finish :uc-view-saved-addresses
[_]
[[:dispatch [:navigate-back]]])
;; -----------------------------------------------------
(defmethod navigation-start :uc-add-saved-address
[_]
[[:dispatch [:open-modal :screen/settings.add-address-to-save]]])
(defmethod navigation-step :uc-add-saved-address
[{:keys [address ens ens?] :as use-case-state}]
[[:dispatch [:open-modal :screen/settings.add-address-to-save]]])
(defmethod navigation-finish :uc-add-saved-address
[_]
[[:dispatch [:navigate-back]]])
;; -----------------------------------------------------
(comment
(initial-state :uc-add-saved-address)
(initial-state :uc-view-saved-addresses)
(initial-state :unknown)
(navigation-start {:use-case-id :uc-add-saved-address})
(navigation-finish {:use-case-id :uc-add-saved-address})
(navigation-start {:use-case-id :uc-add-saved-address})
(-> :uc-add-saved-address
initial-state
(make-step {:address "0xasdfas"})))
+1
View File
@@ -29,6 +29,7 @@
:keycard-migration (js/require "../resources/images/ui2/keycard-migration.png")
:keycard-migration-failed (js/require "../resources/images/ui2/keycard-migration-failed.png")
:keycard-migration-succeeded (js/require "../resources/images/ui2/keycard-migration-succeeded.png")
:keycard-not-same (js/require "../resources/images/ui2/keycard-not-same.png")
:not-keycard (js/require "../resources/images/ui2/not-keycard.png")
:discover (js/require "../resources/images/ui2/discover.png")
:invite-friends (js/require "../resources/images/ui2/invite-friends.png")
+6 -7
View File
@@ -3,13 +3,12 @@
(defn outmost-transparent-container
[]
{:elevation 2
:pointer-events :box-none
:padding-top (+ (safe-area/get-top) 6)
:flex-direction :column
:justify-content :center
:align-items :center
:background-color :yellow})
{:elevation 2
:pointer-events :box-none
:padding-top (+ (safe-area/get-top) 6)
:flex-direction :column
:justify-content :center
:align-items :center})
(def each-toast-container
{:width "100%"
@@ -21,7 +21,7 @@
[status-im.contexts.chat.messenger.messages.pin.events :as messages.pin]
[status-im.contexts.communities.events :as communities]
[status-im.contexts.shell.activity-center.events :as activity-center]
[status-im.infra.transform :as infra.transform]
[status-im.contexts.wallet.data-store :as wallet.data-store]
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
@@ -220,10 +220,10 @@
current-visibility-status-clj)))
(seq saved-addresses-js)
(let [saved-addresses (-> saved-addresses-js types/js->clj infra.transform/rpc->saved-addresses)]
(let [saved-addresses (-> saved-addresses-js types/js->clj wallet.data-store/rpc->saved-addresses)]
(js-delete response-js "savedAddresses")
(rf/merge cofx
{:fx [[:dispatch [:domain/reconcile-saved-addresses saved-addresses]]]}
{:fx [[:dispatch [:wallet/reconcile-saved-addresses saved-addresses]]]}
(process-next response-js sync-handler)))
(seq ens-username-details-js)
@@ -23,4 +23,7 @@
(do
(rf/dispatch [:keycard/disconnect])
(rf/dispatch [:open-modal :screen/keycard.empty]))
(rf/dispatch [:keycard/on-application-info-error error])))}]]]})))
(rf/dispatch [:keycard/on-application-info-error
(if (= error :keycard/error.keycard-wrong-profile)
:keycard/error.keycard-not-empty
error)])))}]]]})))
@@ -83,7 +83,7 @@
(fn [{:keys [db]} [error]]
(if (or (= error :keycard/error.keycard-empty)
(and (get-in db [:keycard :application-info :initialized?])
(= error :keycard/error.keycard-wrong-profile)))
(= error :keycard/error.keycard-not-empty)))
(rf/dispatch [:keycard/create.continue])
(rf/dispatch [:keycard/on-application-info-error error]))))
@@ -2,6 +2,7 @@
(:require [quo.core :as quo]
[react-native.core :as rn]
[status-im.common.events-helper :as events-helper]
[status-im.common.resources :as resources]
[utils.i18n :as i18n]))
(defn view
@@ -14,7 +15,10 @@
{:title (i18n/label :t/different-keycard)
:description :text
:description-text (i18n/label :t/scan-previous-keycard)}]
[rn/view {:style {:flex 1}}]
[rn/image
{:resize-mode :contain
:style {:flex 1 :width (:width (rn/get-window))}
:source (resources/get-image :keycard-not-same)}]
[rn/view {:style {:padding-horizontal 20}}
[quo/button {:on-press events-helper/navigate-back}
(i18n/label :t/try-again)]]])
+10 -10
View File
@@ -9,16 +9,16 @@
[utils.re-frame :as rf]))
(def titles
{:keycard/error.keycard-empty {:title (i18n/label :t/keycard-empty)
:description (i18n/label :t/no-key-pair-keycard)}
:keycard/error.keycard-wrong-profile {:title (i18n/label :t/keycard-not-empty)
:description (i18n/label :t/cant-store-new-keys)}
:keycard/error.keycard-unpaired {:title (i18n/label :t/keycard-full)
:description (i18n/label :t/pairing-slots-occupied)}
:keycard/error.keycard-frozen {:title (i18n/label :t/keycard-blocked)
:description (i18n/label :t/cant-use-right-now)}
:keycard/error.keycard-locked {:title (i18n/label :t/keycard-blocked)
:description (i18n/label :t/cant-use-right-now)}})
{:keycard/error.keycard-empty {:title (i18n/label :t/keycard-empty)
:description (i18n/label :t/no-key-pair-keycard)}
:keycard/error.keycard-not-empty {:title (i18n/label :t/keycard-not-empty)
:description (i18n/label :t/cant-store-new-keys)}
:keycard/error.keycard-unpaired {:title (i18n/label :t/keycard-full)
:description (i18n/label :t/pairing-slots-occupied)}
:keycard/error.keycard-frozen {:title (i18n/label :t/keycard-blocked)
:description (i18n/label :t/cant-use-right-now)}
:keycard/error.keycard-locked {:title (i18n/label :t/keycard-blocked)
:description (i18n/label :t/cant-use-right-now)}})
(defn view
[]
+3 -2
View File
@@ -132,8 +132,9 @@
:fx [[:dispatch [:keycard/disconnect]]
[:dispatch
[:open-modal
(if (= :keycard/error.not-keycard error)
:screen/keycard.not-keycard
(case error
:keycard/error.not-keycard :screen/keycard.not-keycard
:keycard/error.keycard-wrong-profile :screen/keycard.different-card
:screen/keycard.error)]]]}))
(rf/reg-event-fx :keycard/update-application-info
@@ -32,11 +32,7 @@
(reset-card)
(do
(rf/dispatch [:navigate-back])
(if (= error :keycard/error.keycard-wrong-profile)
(do
(rf/dispatch [:keycard/disconnect])
(rf/dispatch [:open-modal :screen/keycard.different-card]))
(rf/dispatch [:keycard/on-application-info-error error])))))}]))
(rf/dispatch [:keycard/on-application-info-error error]))))}]))
(defn success-view
[]
@@ -46,7 +46,7 @@
{:theme :dark
:on-error
(fn [error]
(if (= error :keycard/error.keycard-wrong-profile)
(if (= error :keycard/error.keycard-not-empty)
(do
(rf/dispatch [:keycard/disconnect])
(rf/dispatch [:open-modal :screen/keycard.pin.enter
@@ -27,5 +27,7 @@
:callback
(fn [{:keys [error]}]
(if (string/blank? error)
(rf/dispatch [:navigate-to :screen/keycard.migrate.success])
(do
(rf/dispatch [:biometric/disable])
(rf/dispatch [:navigate-to :screen/keycard.migrate.success]))
(rf/dispatch [:navigate-to :screen/keycard.migrate.fail])))}]]})))
@@ -80,8 +80,4 @@
:else
(do
(rf/dispatch [:navigate-back])
(if (= error :keycard/error.keycard-wrong-profile)
(do
(rf/dispatch [:keycard/disconnect])
(rf/dispatch [:open-modal :screen/keycard.different-card]))
(rf/dispatch [:keycard/on-application-info-error error])))))}]]]}))
(rf/dispatch [:keycard/on-application-info-error error]))))}]]]}))
+7 -3
View File
@@ -30,6 +30,13 @@
(not has-master-key?)
:keycard/error.keycard-empty
(and (nil? profile-key-uid)
(some? key-uid))
:keycard/error.keycard-not-empty
(not= profile-key-uid key-uid)
:keycard/error.keycard-wrong-profile
(and (zero? pin-retry-counter)
(or (nil? puk-retry-counter)
(pos? puk-retry-counter)))
@@ -41,9 +48,6 @@
(not paired?)
:keycard/error.keycard-unpaired
(not= profile-key-uid key-uid)
:keycard/error.keycard-wrong-profile
:else
nil))
@@ -256,6 +256,12 @@
(rf/dispatch
[:keycard/connect
{:key-uid key-uid
:on-error
(fn [error]
(rf/dispatch [:keycard/on-application-info-error
(if (= error :keycard/error.keycard-empty)
:keycard/error.keycard-wrong-profile
error)]))
:on-success
(fn []
(rf/dispatch
@@ -15,8 +15,7 @@
(defn- navigate-back
[]
(rf/dispatch [:app/finish-use-case :uc-add-saved-address])
#_(rf/dispatch [:navigate-back]))
(rf/dispatch [:navigate-back]))
(defn- validate-input
[account-addresses saved-addresses user-input]
@@ -165,16 +164,15 @@
on-press-continue (rn/use-callback
(fn []
(rf/dispatch
[:open-modal :screen/settings.save-address
[:wallet/set-address-to-save
{:address address
:ens (when ens-name? address-or-ens)
:ens? ens-name?}]))
:ens? ens-name?}])
(rf/dispatch
[:open-modal :screen/settings.save-address]))
[address ens-name? address-or-ens])]
(rn/use-unmount #(rf/dispatch [:wallet/clean-scanned-address]))
#_(rn/use-effect (fn []
(when (rf/sub [:app/use-case-active? :uc-add-saved-addresses])
(rf/dispatch [:navigate-back])))
[(rf/sub [:app/use-case-active? :uc-add-saved-addresses])])
(rn/use-mount #(rf/dispatch [:wallet/clear-address-to-save]))
[quo/overlay {:type :shell}
[floating-button-page/view
{:footer-container-padding 0
@@ -5,97 +5,164 @@
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(rf/reg-event-fx :app/save-address
(fn [{:keys [db]}
[{:keys [address name customization-color ens edit?]}]]
(let [on-success (if edit?
[:wallet/edit-saved-address-success]
[:wallet/add-saved-address-success])
test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?]))
address-to-save {:address address
:name name
:colorId customization-color
:ens ens
:isTest test-networks-enabled?}]
{:fx [[:json-rpc/call
[{:method "wakuext_upsertSavedAddress"
:params [address-to-save]
:on-success on-success
:on-error [:wallet/add-saved-address-failed]}]]]})))
(defn save-address
[{:keys [db]}
[{:keys [address name customization-color on-success on-error ens]}]]
(let [test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?]))
address-to-save {:address address
:name name
:colorId customization-color
:ens ens
:isTest test-networks-enabled?}]
{:fx [[:json-rpc/call
[{:method "wakuext_upsertSavedAddress"
:params [address-to-save]
:on-success on-success
:on-error on-error}]]]}))
(rf/reg-event-fx :wallet/delete-saved-address-success
(fn [{:keys [db]} [{:keys [address test-networks-enabled? toast-message]}]]
(let [db-key (if test-networks-enabled? :test :prod)
saved-address (get-in db [:wallet :saved-addresses db-key address])]
{:fx [[:dispatch [:domain/reconcile-saved-addresses [(assoc saved-address :removed? true)]]]
[:dispatch [:hide-bottom-sheet]]
[:dispatch-later
{:ms 100
:dispatch [:toasts/upsert
{:type :positive
:theme :dark
:text toast-message}]}]]})))
(rf/reg-event-fx :wallet/save-address save-address)
(rf/reg-event-fx :wallet/delete-saved-address-failed
(fn [_ [error]]
{:fx [[:dispatch [:hide-bottom-sheet]]
[:dispatch-later
{:ms 100
:dispatch [:toasts/upsert
{:type :negative
:theme :dark
:text error}]}]]}))
(defn- update-saved-addresses
[saved-addresses-db new-saved-addresses]
(reduce
(fn [acc {:keys [address removed? test?] :as saved-address}]
(let [db-key (if test? :test :prod)]
(if removed?
(update acc db-key dissoc address)
(assoc-in acc [db-key address] saved-address))))
(or saved-addresses-db
{:test {}
:prod {}})
new-saved-addresses))
(rf/reg-event-fx :wallet/delete-saved-address
(fn [{:keys [db]} [{:keys [address toast-message]}]]
(let [test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?]))]
{:fx [[:json-rpc/call
[{:method "wakuext_deleteSavedAddress"
:params [address test-networks-enabled?]
:on-success [:wallet/delete-saved-address-success
{:address address
:test-networks-enabled? test-networks-enabled?
:toast-message toast-message}]
:on-error [:wallet/delete-saved-address-failed]}]]]})))
(defn reconcile-saved-addresses
[{:keys [db]} [saved-addresses]]
{:db (update-in db [:wallet :saved-addresses] update-saved-addresses saved-addresses)})
(rf/reg-event-fx :wallet/add-saved-address-success
(fn [_]
{:fx [[:dispatch [:infra/get-saved-addresses]]
[:dispatch [:dismiss-modal :screen/settings.add-address-to-save]]
[:dispatch [:dismiss-modal :screen/settings.save-address]]
[:dispatch-later
{:ms 100
:dispatch [:toasts/upsert
{:type :positive
:theme :dark
:text (i18n/label :t/address-saved)}]}]]}))
(rf/reg-event-fx :wallet/reconcile-saved-addresses reconcile-saved-addresses)
(rf/reg-event-fx :wallet/edit-saved-address-success
(fn [_]
{:fx [[:dispatch [:infra/get-saved-addresses]]
[:dispatch [:dismiss-modal :screen/settings.edit-saved-address]]
[:dispatch-later
{:ms 100
:dispatch [:toasts/upsert
{:type :positive
:theme :dark
:text (i18n/label :t/address-edited)}]}]]}))
(defn get-saved-addresses-success
[_ [raw-saved-addresses]]
(let [saved-addresses (data-store/rpc->saved-addresses raw-saved-addresses)]
{:fx [[:dispatch [:wallet/reconcile-saved-addresses saved-addresses]]]}))
(rf/reg-event-fx :wallet/get-saved-addresses-success get-saved-addresses-success)
(rf/reg-event-fx :wallet/add-saved-address-failed
(fn [_ [error]]
{:fx [[:dispatch [:infra/saved-addresses-rpc-error :add-save-address error]]
[:dispatch
[:toasts/upsert
{:type :negative
:theme :dark
:text error}]]]}))
(defn saved-addresses-rpc-error
[_ [action error]]
(log/warn (str "[wallet] [saved-addresses] Failed to " action)
{:error error}))
(rf/reg-event-fx :wallet/saved-addresses-rpc-error saved-addresses-rpc-error)
(defn get-saved-addresses
[_]
{:fx [[:json-rpc/call
[{:method "wakuext_getSavedAddresses"
:on-success [:wallet/get-saved-addresses-success]
:on-error [:wallet/saved-addresses-rpc-error :get-saved-addresses]}]]]})
(rf/reg-event-fx :wallet/get-saved-addresses get-saved-addresses)
(defn delete-saved-address-success
[{:keys [db]} [{:keys [address test-networks-enabled? toast-message]}]]
(let [db-key (if test-networks-enabled? :test :prod)
saved-address (get-in db [:wallet :saved-addresses db-key address])]
{:fx [[:dispatch [:wallet/reconcile-saved-addresses [(assoc saved-address :removed? true)]]]
[:dispatch [:hide-bottom-sheet]]
[:dispatch-later
{:ms 100
:dispatch [:toasts/upsert
{:type :positive
:theme :dark
:text toast-message}]}]]}))
(rf/reg-event-fx :wallet/delete-saved-address-success delete-saved-address-success)
(defn delete-saved-address-failed
[_ [error]]
{:fx [[:dispatch [:hide-bottom-sheet]]
[:dispatch-later
{:ms 100
:dispatch [:toasts/upsert
{:type :negative
:theme :dark
:text error}]}]]})
(rf/reg-event-fx :wallet/delete-saved-address-failed delete-saved-address-failed)
(defn delete-saved-address
[{:keys [db]} [{:keys [address toast-message]}]]
(let [test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?]))]
{:fx [[:json-rpc/call
[{:method "wakuext_deleteSavedAddress"
:params [address test-networks-enabled?]
:on-success [:wallet/delete-saved-address-success
{:address address
:test-networks-enabled? test-networks-enabled?
:toast-message toast-message}]
:on-error [:wallet/delete-saved-address-failed]}]]]}))
(rf/reg-event-fx :wallet/delete-saved-address delete-saved-address)
(defn add-saved-address-success
[_ [toast-message]]
{:fx [[:dispatch [:wallet/get-saved-addresses]]
[:dispatch [:dismiss-modal :screen/settings.add-address-to-save]]
[:dispatch [:dismiss-modal :screen/settings.save-address]]
[:dispatch-later
{:ms 100
:dispatch [:toasts/upsert
{:type :positive
:theme :dark
:text toast-message}]}]]})
(rf/reg-event-fx :wallet/add-saved-address-success add-saved-address-success)
(defn edit-saved-address-success
[_]
{:fx [[:dispatch [:wallet/get-saved-addresses]]
[:dispatch [:dismiss-modal :screen/settings.edit-saved-address]]
[:dispatch-later
{:ms 100
:dispatch [:toasts/upsert
{:type :positive
:theme :dark
:text (i18n/label :t/address-edited)}]}]]})
(rf/reg-event-fx :wallet/edit-saved-address-success edit-saved-address-success)
(defn add-saved-address-failed
[_ [error]]
{:fx [[:dispatch [:wallet/saved-addresses-rpc-error :add-save-address error]]
[:dispatch
[:toasts/upsert
{:type :negative
:theme :dark
:text error}]]]})
(rf/reg-event-fx :wallet/add-saved-address-failed add-saved-address-failed)
(defn set-address-to-save
[{:keys [db]} [args]]
{:db (assoc-in db [:wallet :ui :saved-address] args)})
(rf/reg-event-fx :wallet/set-address-to-save set-address-to-save)
(defn clear-address-to-save
[{:keys [db]}]
{:db (update-in db [:wallet :ui] dissoc :saved-address)})
(rf/reg-event-fx :wallet/clear-address-to-save clear-address-to-save)
(defn check-remaining-capacity-for-saved-addresses
[{:keys [db]} [{:keys [on-success on-error]}]]
(let [test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?]))]
{:fx [[:json-rpc/call
[{:method "wakuext_remainingCapacityForSavedAddresses"
:params [test-networks-enabled?]
:on-success on-success
:on-error on-error}]]]}))
(rf/reg-event-fx :wallet/check-remaining-capacity-for-saved-addresses
(fn [{:keys [db]} [{:keys [on-success on-error]}]]
(let [test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?]))]
{:fx [[:json-rpc/call
[{:method "wakuext_remainingCapacityForSavedAddresses"
:params [test-networks-enabled?]
:on-success on-success
:on-error on-error}]]]})))
check-remaining-capacity-for-saved-addresses)
@@ -12,7 +12,7 @@
result-fx (:fx effects)
expected-fx [[:json-rpc/call
[{:method "wakuext_getSavedAddresses"
:on-success [:infra/convert-saved-addresses]
:on-success [:wallet/get-saved-addresses-success]
:on-error [:wallet/saved-addresses-rpc-error :get-saved-addresses]}]]]]
(is (match? expected-fx result-fx)))))
@@ -56,10 +56,10 @@
(deftest get-saved-addresses-success-test
(let [cofx {:db {}}
raw-saved-addresses [saved-address-rpc-1]
effects (events/convert-saved-addresses cofx [raw-saved-addresses])
effects (events/get-saved-addresses-success cofx [raw-saved-addresses])
saved-addresses (data-store/rpc->saved-addresses raw-saved-addresses)
result-fx (:fx effects)
expected-fx [[:dispatch [:domain/reconcile-saved-addresses saved-addresses]]]]
expected-fx [[:dispatch [:wallet/reconcile-saved-addresses saved-addresses]]]]
(is (match? expected-fx result-fx))))
(deftest reconcile-saved-addresses-test
@@ -220,7 +220,7 @@
toast-message "Address saved"
effects (events/add-saved-address-success cofx [toast-message])
result-fx (:fx effects)
expected-fx [[:dispatch [:infra/get-saved-addresses]]
expected-fx [[:dispatch [:wallet/get-saved-addresses]]
[:dispatch [:dismiss-modal :screen/settings.add-address-to-save]]
[:dispatch [:dismiss-modal :screen/settings.save-address]]
[:dispatch-later
@@ -238,7 +238,7 @@
toast-message "Address edited"
effects (events/edit-saved-address-success cofx)
result-fx (:fx effects)
expected-fx [[:dispatch [:infra/get-saved-addresses]]
expected-fx [[:dispatch [:wallet/get-saved-addresses]]
[:dispatch [:dismiss-modal :screen/settings.edit-saved-address]]
[:dispatch-later
{:ms 100
@@ -17,42 +17,50 @@
(defn view
[]
(let [{:keys [address name customization-color ens
ens? edit?]} (rf/sub [:get-screen-params])
(let [{:keys [edit?]} (rf/sub [:get-screen-params])
{:keys [address name customization-color ens ens?]}
(rf/sub [:wallet/saved-address])
[address-label set-address-label] (rn/use-state (or name ""))
[address-color set-address-color] (rn/use-state (or customization-color
(rand-nth colors/account-colors)))
placeholder (i18n/label :t/address-name)
address-text (rn/use-callback
(fn []
[quo/address-text
{:full-address? true
:address address
:format :long}])
[address])
on-press-save (rn/use-callback
(fn []
(rf/dispatch [:app/save-address
{:edit? edit?
:name address-label
:ens (when ens? ens)
:address address
:customization-color address-color}]))
[address address-label
address-color])
data-item-props (rn/use-memo
#(cond-> {:status :default
:size :default
:subtitle-type :default
:blur? true
:card? true
:title (i18n/label :t/address)
:subtitle ens
:custom-subtitle address-text
:container-style style/data-item}
ens?
(dissoc :custom-subtitle))
[ens ens? address-text])]
placeholder (i18n/label :t/address-name)
address-text (rn/use-callback
(fn []
[quo/address-text
{:full-address? true
:address address
:format :long}])
[address])
on-press-save (rn/use-callback
(fn []
(rf/dispatch [:wallet/save-address
{:on-success
(if edit?
[:wallet/edit-saved-address-success]
[:wallet/add-saved-address-success
(i18n/label :t/address-saved)])
:on-error
[:wallet/add-saved-address-failed]
:name address-label
:ens (when ens? ens)
:address address
:customization-color address-color}]))
[address address-label
address-color])
data-item-props (rn/use-memo
#(cond-> {:status :default
:size :default
:subtitle-type :default
:label :none
:blur? true
:card? true
:title (i18n/label :t/address)
:subtitle ens
:custom-subtitle address-text
:container-style style/data-item}
ens?
(dissoc :custom-subtitle))
[ens ens? address-text])]
[quo/overlay {:type :shell}
[floating-button-page/view
{:footer-container-padding (if edit? (+ (safe-area/get-bottom) 12) 0)
@@ -9,7 +9,7 @@
[utils.re-frame :as rf]))
(defn view
[{:keys [name address customization-color] :as address-details}]
[{:keys [name address customization-color] :as opts}]
(let [open-send-flow (rn/use-callback
(fn []
(rf/dispatch [:wallet/init-send-flow-for-address
@@ -62,20 +62,19 @@
{:theme :dark
:shell? true
:content (fn []
[remove-address/view address-details])}])
[address-details])
[remove-address/view opts])}])
[opts])
open-show-address-qr (rn/use-callback
#(rf/dispatch [:open-modal
:screen/settings.share-saved-address
address-details])
[address-details])
:screen/settings.share-saved-address opts])
[opts])
open-edit-saved-address (rn/use-callback
(fn []
(rf/dispatch [:wallet/set-address-to-save opts])
(rf/dispatch [:open-modal
:screen/settings.edit-saved-address
(merge {:edit? true}
address-details)]))
[address-details])]
{:edit? true}]))
[opts])]
[quo/action-drawer
[[{:icon :i/arrow-up
:label (i18n/label :t/send-to-user {:user name})
@@ -99,15 +99,12 @@
(defn- navigate-back
[]
(rf/dispatch [:app/finish-use-case :uc-view-saved-addresses])
#_(rf/dispatch [:navigate-back]))
(rf/dispatch [:navigate-back]))
(defn- add-address-to-save
[]
(rf/dispatch [:wallet/check-remaining-capacity-for-saved-addresses
{:on-success (fn []
(rf/dispatch [:app/start-use-case :uc-add-saved-address])
#_(rf/dispatch [:open-modal :screen/settings.add-address-to-save]))
{:on-success #(rf/dispatch [:open-modal :screen/settings.add-address-to-save])
:on-error #(rf/dispatch [:toasts/upsert
{:type :negative
:theme :dark
@@ -154,10 +151,6 @@
:on-clear on-clear-input
:customization-color customization-color}))
[has-saved-addresses? customization-color search-text])]
#_(rn/use-effect (fn []
(when (rf/sub [:app/use-case-active? :uc-view-saved-addresses])
(rf/dispatch [:navigate-back])))
[(rf/sub [:app/use-case-active? :uc-view-saved-addresses])])
[quo/overlay
{:type :shell
:top-inset? true}
@@ -7,8 +7,7 @@
(defn open-saved-addresses-settings-modal
[]
(rf/dispatch [:app/start-use-case :uc-view-saved-addresses])
#_(rf/dispatch [:open-modal :screen/settings.saved-addresses]))
(rf/dispatch [:open-modal :screen/settings.saved-addresses]))
(defn open-keypairs-and-accounts-settings-modal
[]
@@ -162,7 +162,25 @@
(->> (map rpc->keypair keypairs)
(sort-by #(if (= (:type %) :profile) 0 1))))
(defn- add-keys-to-saved-address
[saved-address]
(assoc saved-address :ens? (not (string/blank? (:ens saved-address)))))
(defn rpc->saved-address
[saved-address]
(-> saved-address
(set/rename-keys {:chainShortNames :chain-short-names
:isTest :test?
:createdAt :created-at
:colorId :customization-color
:mixedcaseAddress :mixedcase-address
:removed :removed?})
(update :customization-color (comp keyword string/lower-case))
add-keys-to-saved-address))
(defn rpc->saved-addresses
[saved-addresses]
(map rpc->saved-address saved-addresses))
(defn reconcile-keypairs
[keypairs]
+11 -9
View File
@@ -435,14 +435,16 @@
(rf/reg-event-fx
:wallet/start-bridge
(fn [{:keys [db]}]
(let [view-id (:view-id db)]
(cond-> {:db (assoc-in db [:wallet :ui :send :tx-type] :tx/bridge)}
(= view-id :screen/wallet.accounts)
(assoc :fx
[[:dispatch
[:wallet/wizard-navigate-forward
{:start-flow? true
:flow-id :wallet-bridge-flow}]]])))))
{:db (assoc-in db [:wallet :ui :send :tx-type] :tx/bridge)
:fx [[:dispatch
[:wallet/wizard-navigate-forward
{:start-flow? true
:flow-id :wallet-bridge-flow}]]]}))
(rf/reg-event-fx
:wallet/set-send-tx-type
(fn [{:keys [db]} [type]]
{:db (assoc-in db [:wallet :ui :send :tx-type] type)}))
(rf/reg-event-fx :wallet/select-bridge-network
(fn [{:keys [db]} [{:keys [network-chain-id stack-id]}]]
@@ -577,7 +579,7 @@
[:dispatch [:wallet/get-ethereum-chains]]
[:dispatch [:wallet/get-accounts]]
[:dispatch [:wallet/get-keypairs]]
[:dispatch [:infra/get-saved-addresses]]
[:dispatch [:wallet/get-saved-addresses]]
(when (ff/enabled? ::ff/wallet.wallet-connect)
[:dispatch-later [{:ms 500 :dispatch [:wallet-connect/init]}]])]}))
+6 -2
View File
@@ -91,12 +91,16 @@
{:content buy-token/view}]))
on-bridge-press (rn/use-callback
(fn []
;; For a single account, it starts the bridge flow immediately. For
;; multiple accounts, it sets the transaction type and starts the
;; bridge flow after account selection.
(rf/dispatch [:wallet/clean-send-data])
(when-not multiple-accounts?
(rf/dispatch [:wallet/switch-current-viewing-account
first-account-address]))
(rf/dispatch [:wallet/start-bridge])
first-account-address])
(rf/dispatch [:wallet/start-bridge]))
(when multiple-accounts?
(rf/dispatch [:wallet/set-send-tx-type :tx/bridge])
(rf/dispatch [:open-modal :screen/wallet.select-from])))
[multiple-accounts? first-account-address])
on-swap-press (rn/use-callback
@@ -52,7 +52,7 @@
(fn []
(rn/use-effect
(fn []
(rf/dispatch [:infra/get-saved-addresses])))
(rf/dispatch [:wallet/get-saved-addresses])))
(let [transaction-details (rf/sub [:wallet/send-transaction-progress])]
[floating-button-page/view
{:footer-container-padding 0
+1 -3
View File
@@ -41,6 +41,4 @@
:stickers/packs-pending #{}
:settings/change-password {}
:keycard {}
:theme :dark
:app {:use-cases-stack '()
:last-user-notification {}}})
:theme :dark})
-21
View File
@@ -1,21 +0,0 @@
(ns status-im.domain.events
(:require
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
(defn- update-saved-addresses
[saved-addresses-db new-saved-addresses]
(reduce
(fn [acc {:keys [address removed? test?] :as saved-address}]
(let [db-key (if test? :test :prod)]
(if removed?
(update acc db-key dissoc address)
(assoc-in acc [db-key address] saved-address))))
(or saved-addresses-db
{:test {}
:prod {}})
new-saved-addresses))
(rf/reg-event-fx :domain/reconcile-saved-addresses
(fn [{:keys [db]} [saved-addresses]]
{:db (update-in db [:wallet :saved-addresses] update-saved-addresses saved-addresses)}))
-3
View File
@@ -1,6 +1,5 @@
(ns status-im.events
(:require
status-im.app.events
status-im.common.alert-banner.events
status-im.common.alert.effects
status-im.common.async-storage.effects
@@ -56,8 +55,6 @@
status-im.contexts.wallet.swap.events
status-im.contexts.wallet.wallet-connect.events.core
[status-im.db :as db]
status-im.domain.events
status-im.infra.events
status-im.navigation.effects
status-im.navigation.events
[utils.re-frame :as rf]))
-25
View File
@@ -1,25 +0,0 @@
(ns status-im.infra.events
(:require
[status-im.infra.transform :as transform]
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
(rf/reg-event-fx :infra/convert-saved-addresses
(fn [_ [raw-saved-addresses]]
(let [saved-addresses (transform/rpc->saved-addresses raw-saved-addresses)]
{:fx [[:dispatch [:domain/reconcile-saved-addresses saved-addresses]]]})))
(rf/reg-event-fx :infra/get-saved-addresses
(fn [_]
{:fx [[:json-rpc/call
[{:method "wakuext_getSavedAddresses"
:on-success [:infra/convert-saved-addresses]
:on-error [:infra/saved-addresses-rpc-error :get-saved-addresses]}]]]}))
(rf/reg-event-fx :infra/saved-addresses-rpc-error
(fn [_ [action error]]
(log/warn (str "[wallet] [saved-addresses] Failed to " action)
{:error error})))
-32
View File
@@ -1,32 +0,0 @@
(ns status-im.infra.transform
(:require
[camel-snake-kebab.extras :as cske]
[clojure.set :as set]
[clojure.string :as string]
[status-im.constants :as constants]
[status-im.contexts.wallet.collectible.utils :as collectible-utils]
[status-im.contexts.wallet.send.utils :as send-utils]
[utils.collection :as utils.collection]
[utils.money :as money]
[utils.number :as utils.number]
[utils.transforms :as transforms]))
(defn- add-keys-to-saved-address
[saved-address]
(assoc saved-address :ens? (not (string/blank? (:ens saved-address)))))
(defn rpc->saved-address
[saved-address]
(-> saved-address
(set/rename-keys {:chainShortNames :chain-short-names
:isTest :test?
:createdAt :created-at
:colorId :customization-color
:mixedcaseAddress :mixedcase-address
:removed :removed?})
(update :customization-color (comp keyword string/lower-case))
add-keys-to-saved-address))
(defn rpc->saved-addresses
[saved-addresses]
(map rpc->saved-address saved-addresses))
-26
View File
@@ -1,26 +0,0 @@
(ns status-im.subs.app
(:require
[re-frame.core :as rf]))
(rf/reg-sub
:app/last-user-notification
:<- [:app]
:-> :last-user-notification)
(rf/reg-sub
:app/use-cases
:<- [:app]
:-> :use-cases-stack)
(rf/reg-sub
:app/current-use-case
:<- [:app/use-cases]
(fn [use-cases]
(first use-cases)))
(rf/reg-sub
:app/use-case-active?
:<- [:app/use-cases]
(fn [use-cases [_sub-name use-case]]
(some #(= use-case %) use-cases)))
-6
View File
@@ -3,7 +3,6 @@
[re-frame.core :as re-frame]
status-im.subs.activity-center
status-im.subs.alert-banner
status-im.subs.app
status-im.subs.biometrics
status-im.subs.bottom-sheet
status-im.subs.chats
@@ -192,8 +191,3 @@
;;keycard
(reg-root-key-sub :keycard :keycard)
(reg-root-key-sub :ui :ui)
(reg-root-key-sub :infra :infra)
(reg-root-key-sub :app :app)
(reg-root-key-sub :domain :domain)
-11
View File
@@ -1,11 +0,0 @@
(ns status-im.ui.core
(:require [re-frame.db :as rf.db]
[reagent.core :as reagent]
#_[utils.re-frame :as rf]
[utils.re-frame :as rf]))
+1 -1
View File
@@ -796,7 +796,7 @@
"device-syncing": "Device syncing",
"devices": "Devices",
"devices-count": "{{number}} devices",
"different-keycard": "Its a different Keycard",
"different-keycard": "This is a different Keycard",
"disable": "disable",
"disable-all": "Disable all",
"disable-later-in-settings": "You can disable this later in Settings",