Compare commits

...
Author SHA1 Message Date
Volodymyr Kozieiev 52d7d60751 wip 2025-02-26 09:33:26 +00:00
Volodymyr Kozieiev 37c25b9351 wip 2025-02-25 09:36:21 +00:00
Volodymyr Kozieiev c917454b7d wip: use-case based navigation 2025-02-24 21:14:19 +00:00
Volodymyr Kozieiev 25d51aa929 wip 2025-02-21 09:30:23 +00:00
Volodymyr Kozieiev 5bb3cdc19e wip 2025-02-20 13:33:04 +00:00
Volodymyr Kozieiev 756e892acb Saved address refactoring wip 2025-02-20 09:09:47 +00:00
Volodymyr Kozieiev 0dcf4e7b14 Fixed issue when incorrect address details where on the edit page
Data to screen was passed via rf-db and acquired in the screen via
sbuscription. But sometimes subscription wasnt calculated yet and
returned nil value. That nil value was captured by use-state and never
updated after subscription updated.
2025-02-19 11:52:33 +00:00
22 changed files with 516 additions and 245 deletions
+129
View File
@@ -0,0 +1,129 @@
(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
@@ -0,0 +1,97 @@
(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"})))
+7 -6
View File
@@ -3,12 +3,13 @@
(defn outmost-transparent-container (defn outmost-transparent-container
[] []
{:elevation 2 {:elevation 2
:pointer-events :box-none :pointer-events :box-none
:padding-top (+ (safe-area/get-top) 6) :padding-top (+ (safe-area/get-top) 6)
:flex-direction :column :flex-direction :column
:justify-content :center :justify-content :center
:align-items :center}) :align-items :center
:background-color :yellow})
(def each-toast-container (def each-toast-container
{:width "100%" {:width "100%"
@@ -21,7 +21,7 @@
[status-im.contexts.chat.messenger.messages.pin.events :as messages.pin] [status-im.contexts.chat.messenger.messages.pin.events :as messages.pin]
[status-im.contexts.communities.events :as communities] [status-im.contexts.communities.events :as communities]
[status-im.contexts.shell.activity-center.events :as activity-center] [status-im.contexts.shell.activity-center.events :as activity-center]
[status-im.contexts.wallet.data-store :as wallet.data-store] [status-im.infra.transform :as infra.transform]
[taoensso.timbre :as log] [taoensso.timbre :as log]
[utils.re-frame :as rf])) [utils.re-frame :as rf]))
@@ -220,10 +220,10 @@
current-visibility-status-clj))) current-visibility-status-clj)))
(seq saved-addresses-js) (seq saved-addresses-js)
(let [saved-addresses (-> saved-addresses-js types/js->clj wallet.data-store/rpc->saved-addresses)] (let [saved-addresses (-> saved-addresses-js types/js->clj infra.transform/rpc->saved-addresses)]
(js-delete response-js "savedAddresses") (js-delete response-js "savedAddresses")
(rf/merge cofx (rf/merge cofx
{:fx [[:dispatch [:wallet/reconcile-saved-addresses saved-addresses]]]} {:fx [[:dispatch [:domain/reconcile-saved-addresses saved-addresses]]]}
(process-next response-js sync-handler))) (process-next response-js sync-handler)))
(seq ens-username-details-js) (seq ens-username-details-js)
@@ -15,7 +15,8 @@
(defn- navigate-back (defn- navigate-back
[] []
(rf/dispatch [:navigate-back])) (rf/dispatch [:app/finish-use-case :uc-add-saved-address])
#_(rf/dispatch [:navigate-back]))
(defn- validate-input (defn- validate-input
[account-addresses saved-addresses user-input] [account-addresses saved-addresses user-input]
@@ -164,15 +165,16 @@
on-press-continue (rn/use-callback on-press-continue (rn/use-callback
(fn [] (fn []
(rf/dispatch (rf/dispatch
[:wallet/set-address-to-save [:open-modal :screen/settings.save-address
{:address address {:address address
:ens (when ens-name? address-or-ens) :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])] [address ens-name? address-or-ens])]
(rn/use-unmount #(rf/dispatch [:wallet/clean-scanned-address])) (rn/use-unmount #(rf/dispatch [:wallet/clean-scanned-address]))
(rn/use-mount #(rf/dispatch [:wallet/clear-address-to-save])) #_(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])])
[quo/overlay {:type :shell} [quo/overlay {:type :shell}
[floating-button-page/view [floating-button-page/view
{:footer-container-padding 0 {:footer-container-padding 0
@@ -5,164 +5,97 @@
[utils.i18n :as i18n] [utils.i18n :as i18n]
[utils.re-frame :as rf])) [utils.re-frame :as rf]))
(defn save-address (rf/reg-event-fx :app/save-address
[{:keys [db]} (fn [{:keys [db]}
[{:keys [address name customization-color on-success on-error ens]}]] [{:keys [address name customization-color ens edit?]}]]
(let [test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?])) (let [on-success (if edit?
address-to-save {:address address [:wallet/edit-saved-address-success]
:name name [:wallet/add-saved-address-success])
:colorId customization-color test-networks-enabled? (boolean (get-in db [:profile/profile :test-networks-enabled?]))
:ens ens address-to-save {:address address
:isTest test-networks-enabled?}] :name name
{:fx [[:json-rpc/call :colorId customization-color
[{:method "wakuext_upsertSavedAddress" :ens ens
:params [address-to-save] :isTest test-networks-enabled?}]
:on-success on-success {:fx [[:json-rpc/call
:on-error on-error}]]]})) [{:method "wakuext_upsertSavedAddress"
:params [address-to-save]
:on-success on-success
:on-error [:wallet/add-saved-address-failed]}]]]})))
(rf/reg-event-fx :wallet/save-address save-address) (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}]}]]})))
(defn- update-saved-addresses (rf/reg-event-fx :wallet/delete-saved-address-failed
[saved-addresses-db new-saved-addresses] (fn [_ [error]]
(reduce {:fx [[:dispatch [:hide-bottom-sheet]]
(fn [acc {:keys [address removed? test?] :as saved-address}] [:dispatch-later
(let [db-key (if test? :test :prod)] {:ms 100
(if removed? :dispatch [:toasts/upsert
(update acc db-key dissoc address) {:type :negative
(assoc-in acc [db-key address] saved-address)))) :theme :dark
(or saved-addresses-db :text error}]}]]}))
{:test {}
:prod {}})
new-saved-addresses))
(defn reconcile-saved-addresses (rf/reg-event-fx :wallet/delete-saved-address
[{:keys [db]} [saved-addresses]] (fn [{:keys [db]} [{:keys [address toast-message]}]]
{:db (update-in db [:wallet :saved-addresses] update-saved-addresses saved-addresses)}) (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/reconcile-saved-addresses reconcile-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)}]}]]}))
(defn get-saved-addresses-success (rf/reg-event-fx :wallet/edit-saved-address-success
[_ [raw-saved-addresses]] (fn [_]
(let [saved-addresses (data-store/rpc->saved-addresses raw-saved-addresses)] {:fx [[:dispatch [:infra/get-saved-addresses]]
{:fx [[:dispatch [:wallet/reconcile-saved-addresses 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/get-saved-addresses-success get-saved-addresses-success)
(defn saved-addresses-rpc-error (rf/reg-event-fx :wallet/add-saved-address-failed
[_ [action error]] (fn [_ [error]]
(log/warn (str "[wallet] [saved-addresses] Failed to " action) {:fx [[:dispatch [:infra/saved-addresses-rpc-error :add-save-address error]]
{:error error})) [:dispatch
[:toasts/upsert
(rf/reg-event-fx :wallet/saved-addresses-rpc-error saved-addresses-rpc-error) {:type :negative
:theme :dark
(defn get-saved-addresses :text error}]]]}))
[_]
{: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 (rf/reg-event-fx :wallet/check-remaining-capacity-for-saved-addresses
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}]]]})))
@@ -12,7 +12,7 @@
result-fx (:fx effects) result-fx (:fx effects)
expected-fx [[:json-rpc/call expected-fx [[:json-rpc/call
[{:method "wakuext_getSavedAddresses" [{:method "wakuext_getSavedAddresses"
:on-success [:wallet/get-saved-addresses-success] :on-success [:infra/convert-saved-addresses]
:on-error [:wallet/saved-addresses-rpc-error :get-saved-addresses]}]]]] :on-error [:wallet/saved-addresses-rpc-error :get-saved-addresses]}]]]]
(is (match? expected-fx result-fx))))) (is (match? expected-fx result-fx)))))
@@ -56,10 +56,10 @@
(deftest get-saved-addresses-success-test (deftest get-saved-addresses-success-test
(let [cofx {:db {}} (let [cofx {:db {}}
raw-saved-addresses [saved-address-rpc-1] raw-saved-addresses [saved-address-rpc-1]
effects (events/get-saved-addresses-success cofx [raw-saved-addresses]) effects (events/convert-saved-addresses cofx [raw-saved-addresses])
saved-addresses (data-store/rpc->saved-addresses raw-saved-addresses) saved-addresses (data-store/rpc->saved-addresses raw-saved-addresses)
result-fx (:fx effects) result-fx (:fx effects)
expected-fx [[:dispatch [:wallet/reconcile-saved-addresses saved-addresses]]]] expected-fx [[:dispatch [:domain/reconcile-saved-addresses saved-addresses]]]]
(is (match? expected-fx result-fx)))) (is (match? expected-fx result-fx))))
(deftest reconcile-saved-addresses-test (deftest reconcile-saved-addresses-test
@@ -220,7 +220,7 @@
toast-message "Address saved" toast-message "Address saved"
effects (events/add-saved-address-success cofx [toast-message]) effects (events/add-saved-address-success cofx [toast-message])
result-fx (:fx effects) result-fx (:fx effects)
expected-fx [[:dispatch [:wallet/get-saved-addresses]] expected-fx [[:dispatch [:infra/get-saved-addresses]]
[:dispatch [:dismiss-modal :screen/settings.add-address-to-save]] [:dispatch [:dismiss-modal :screen/settings.add-address-to-save]]
[:dispatch [:dismiss-modal :screen/settings.save-address]] [:dispatch [:dismiss-modal :screen/settings.save-address]]
[:dispatch-later [:dispatch-later
@@ -238,7 +238,7 @@
toast-message "Address edited" toast-message "Address edited"
effects (events/edit-saved-address-success cofx) effects (events/edit-saved-address-success cofx)
result-fx (:fx effects) result-fx (:fx effects)
expected-fx [[:dispatch [:wallet/get-saved-addresses]] expected-fx [[:dispatch [:infra/get-saved-addresses]]
[:dispatch [:dismiss-modal :screen/settings.edit-saved-address]] [:dispatch [:dismiss-modal :screen/settings.edit-saved-address]]
[:dispatch-later [:dispatch-later
{:ms 100 {:ms 100
@@ -17,50 +17,42 @@
(defn view (defn view
[] []
(let [{:keys [edit?]} (rf/sub [:get-screen-params]) (let [{:keys [address name customization-color ens
{:keys [address name customization-color ens ens?]} ens? edit?]} (rf/sub [:get-screen-params])
(rf/sub [:wallet/saved-address])
[address-label set-address-label] (rn/use-state (or name "")) [address-label set-address-label] (rn/use-state (or name ""))
[address-color set-address-color] (rn/use-state (or customization-color [address-color set-address-color] (rn/use-state (or customization-color
(rand-nth colors/account-colors))) (rand-nth colors/account-colors)))
placeholder (i18n/label :t/address-name) placeholder (i18n/label :t/address-name)
address-text (rn/use-callback address-text (rn/use-callback
(fn [] (fn []
[quo/address-text [quo/address-text
{:full-address? true {:full-address? true
:address address :address address
:format :long}]) :format :long}])
[address]) [address])
on-press-save (rn/use-callback on-press-save (rn/use-callback
(fn [] (fn []
(rf/dispatch [:wallet/save-address (rf/dispatch [:app/save-address
{:on-success {:edit? edit?
(if edit? :name address-label
[:wallet/edit-saved-address-success] :ens (when ens? ens)
[:wallet/add-saved-address-success :address address
(i18n/label :t/address-saved)]) :customization-color address-color}]))
:on-error [address address-label
[:wallet/add-saved-address-failed] address-color])
:name address-label data-item-props (rn/use-memo
:ens (when ens? ens) #(cond-> {:status :default
:address address :size :default
:customization-color address-color}])) :subtitle-type :default
[address address-label :blur? true
address-color]) :card? true
data-item-props (rn/use-memo :title (i18n/label :t/address)
#(cond-> {:status :default :subtitle ens
:size :default :custom-subtitle address-text
:subtitle-type :default :container-style style/data-item}
:label :none ens?
:blur? true (dissoc :custom-subtitle))
:card? true [ens ens? address-text])]
: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} [quo/overlay {:type :shell}
[floating-button-page/view [floating-button-page/view
{:footer-container-padding (if edit? (+ (safe-area/get-bottom) 12) 0) {:footer-container-padding (if edit? (+ (safe-area/get-bottom) 12) 0)
@@ -9,7 +9,7 @@
[utils.re-frame :as rf])) [utils.re-frame :as rf]))
(defn view (defn view
[{:keys [name address customization-color] :as opts}] [{:keys [name address customization-color] :as address-details}]
(let [open-send-flow (rn/use-callback (let [open-send-flow (rn/use-callback
(fn [] (fn []
(rf/dispatch [:wallet/init-send-flow-for-address (rf/dispatch [:wallet/init-send-flow-for-address
@@ -62,19 +62,20 @@
{:theme :dark {:theme :dark
:shell? true :shell? true
:content (fn [] :content (fn []
[remove-address/view opts])}]) [remove-address/view address-details])}])
[opts]) [address-details])
open-show-address-qr (rn/use-callback open-show-address-qr (rn/use-callback
#(rf/dispatch [:open-modal #(rf/dispatch [:open-modal
:screen/settings.share-saved-address opts]) :screen/settings.share-saved-address
[opts]) address-details])
[address-details])
open-edit-saved-address (rn/use-callback open-edit-saved-address (rn/use-callback
(fn [] (fn []
(rf/dispatch [:wallet/set-address-to-save opts])
(rf/dispatch [:open-modal (rf/dispatch [:open-modal
:screen/settings.edit-saved-address :screen/settings.edit-saved-address
{:edit? true}])) (merge {:edit? true}
[opts])] address-details)]))
[address-details])]
[quo/action-drawer [quo/action-drawer
[[{:icon :i/arrow-up [[{:icon :i/arrow-up
:label (i18n/label :t/send-to-user {:user name}) :label (i18n/label :t/send-to-user {:user name})
@@ -99,12 +99,15 @@
(defn- navigate-back (defn- navigate-back
[] []
(rf/dispatch [:navigate-back])) (rf/dispatch [:app/finish-use-case :uc-view-saved-addresses])
#_(rf/dispatch [:navigate-back]))
(defn- add-address-to-save (defn- add-address-to-save
[] []
(rf/dispatch [:wallet/check-remaining-capacity-for-saved-addresses (rf/dispatch [:wallet/check-remaining-capacity-for-saved-addresses
{:on-success #(rf/dispatch [:open-modal :screen/settings.add-address-to-save]) {:on-success (fn []
(rf/dispatch [:app/start-use-case :uc-add-saved-address])
#_(rf/dispatch [:open-modal :screen/settings.add-address-to-save]))
:on-error #(rf/dispatch [:toasts/upsert :on-error #(rf/dispatch [:toasts/upsert
{:type :negative {:type :negative
:theme :dark :theme :dark
@@ -151,6 +154,10 @@
:on-clear on-clear-input :on-clear on-clear-input
:customization-color customization-color})) :customization-color customization-color}))
[has-saved-addresses? customization-color search-text])] [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 [quo/overlay
{:type :shell {:type :shell
:top-inset? true} :top-inset? true}
@@ -7,7 +7,8 @@
(defn open-saved-addresses-settings-modal (defn open-saved-addresses-settings-modal
[] []
(rf/dispatch [:open-modal :screen/settings.saved-addresses])) (rf/dispatch [:app/start-use-case :uc-view-saved-addresses])
#_(rf/dispatch [:open-modal :screen/settings.saved-addresses]))
(defn open-keypairs-and-accounts-settings-modal (defn open-keypairs-and-accounts-settings-modal
[] []
@@ -162,25 +162,7 @@
(->> (map rpc->keypair keypairs) (->> (map rpc->keypair keypairs)
(sort-by #(if (= (:type %) :profile) 0 1)))) (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 (defn reconcile-keypairs
[keypairs] [keypairs]
+1 -1
View File
@@ -577,7 +577,7 @@
[:dispatch [:wallet/get-ethereum-chains]] [:dispatch [:wallet/get-ethereum-chains]]
[:dispatch [:wallet/get-accounts]] [:dispatch [:wallet/get-accounts]]
[:dispatch [:wallet/get-keypairs]] [:dispatch [:wallet/get-keypairs]]
[:dispatch [:wallet/get-saved-addresses]] [:dispatch [:infra/get-saved-addresses]]
(when (ff/enabled? ::ff/wallet.wallet-connect) (when (ff/enabled? ::ff/wallet.wallet-connect)
[:dispatch-later [{:ms 500 :dispatch [:wallet-connect/init]}]])]})) [:dispatch-later [{:ms 500 :dispatch [:wallet-connect/init]}]])]}))
@@ -52,7 +52,7 @@
(fn [] (fn []
(rn/use-effect (rn/use-effect
(fn [] (fn []
(rf/dispatch [:wallet/get-saved-addresses]))) (rf/dispatch [:infra/get-saved-addresses])))
(let [transaction-details (rf/sub [:wallet/send-transaction-progress])] (let [transaction-details (rf/sub [:wallet/send-transaction-progress])]
[floating-button-page/view [floating-button-page/view
{:footer-container-padding 0 {:footer-container-padding 0
+3 -1
View File
@@ -41,4 +41,6 @@
:stickers/packs-pending #{} :stickers/packs-pending #{}
:settings/change-password {} :settings/change-password {}
:keycard {} :keycard {}
:theme :dark}) :theme :dark
:app {:use-cases-stack '()
:last-user-notification {}}})
+21
View File
@@ -0,0 +1,21 @@
(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,5 +1,6 @@
(ns status-im.events (ns status-im.events
(:require (:require
status-im.app.events
status-im.common.alert-banner.events status-im.common.alert-banner.events
status-im.common.alert.effects status-im.common.alert.effects
status-im.common.async-storage.effects status-im.common.async-storage.effects
@@ -55,6 +56,8 @@
status-im.contexts.wallet.swap.events status-im.contexts.wallet.swap.events
status-im.contexts.wallet.wallet-connect.events.core status-im.contexts.wallet.wallet-connect.events.core
[status-im.db :as db] [status-im.db :as db]
status-im.domain.events
status-im.infra.events
status-im.navigation.effects status-im.navigation.effects
status-im.navigation.events status-im.navigation.events
[utils.re-frame :as rf])) [utils.re-frame :as rf]))
+25
View File
@@ -0,0 +1,25 @@
(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
@@ -0,0 +1,32 @@
(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
@@ -0,0 +1,26 @@
(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,6 +3,7 @@
[re-frame.core :as re-frame] [re-frame.core :as re-frame]
status-im.subs.activity-center status-im.subs.activity-center
status-im.subs.alert-banner status-im.subs.alert-banner
status-im.subs.app
status-im.subs.biometrics status-im.subs.biometrics
status-im.subs.bottom-sheet status-im.subs.bottom-sheet
status-im.subs.chats status-im.subs.chats
@@ -191,3 +192,8 @@
;;keycard ;;keycard
(reg-root-key-sub :keycard :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
@@ -0,0 +1,11 @@
(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]))