Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
52d7d60751 | ||
|
|
37c25b9351 | ||
|
|
c917454b7d | ||
|
|
25d51aa929 | ||
|
|
5bb3cdc19e | ||
|
|
756e892acb | ||
|
|
0dcf4e7b14 |
@@ -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"}])
|
||||
)
|
||||
@@ -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"})))
|
||||
|
||||
|
||||
@@ -3,12 +3,13 @@
|
||||
|
||||
(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})
|
||||
{: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})
|
||||
|
||||
(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.contexts.wallet.data-store :as wallet.data-store]
|
||||
[status-im.infra.transform :as infra.transform]
|
||||
[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 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")
|
||||
(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)))
|
||||
|
||||
(seq ens-username-details-js)
|
||||
|
||||
+8
-6
@@ -15,7 +15,8 @@
|
||||
|
||||
(defn- navigate-back
|
||||
[]
|
||||
(rf/dispatch [:navigate-back]))
|
||||
(rf/dispatch [:app/finish-use-case :uc-add-saved-address])
|
||||
#_(rf/dispatch [:navigate-back]))
|
||||
|
||||
(defn- validate-input
|
||||
[account-addresses saved-addresses user-input]
|
||||
@@ -164,15 +165,16 @@
|
||||
on-press-continue (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch
|
||||
[:wallet/set-address-to-save
|
||||
[:open-modal :screen/settings.save-address
|
||||
{:address address
|
||||
:ens (when ens-name? address-or-ens)
|
||||
:ens? ens-name?}])
|
||||
(rf/dispatch
|
||||
[:open-modal :screen/settings.save-address]))
|
||||
:ens? ens-name?}]))
|
||||
[address ens-name? address-or-ens])]
|
||||
(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}
|
||||
[floating-button-page/view
|
||||
{:footer-container-padding 0
|
||||
|
||||
@@ -5,164 +5,97 @@
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(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 :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]}]]]})))
|
||||
|
||||
(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
|
||||
[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-failed
|
||||
(fn [_ [error]]
|
||||
{:fx [[:dispatch [:hide-bottom-sheet]]
|
||||
[:dispatch-later
|
||||
{:ms 100
|
||||
:dispatch [:toasts/upsert
|
||||
{:type :negative
|
||||
:theme :dark
|
||||
:text error}]}]]}))
|
||||
|
||||
(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/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]}]]]})))
|
||||
|
||||
(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
|
||||
[_ [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/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)}]}]]}))
|
||||
|
||||
(rf/reg-event-fx :wallet/get-saved-addresses-success get-saved-addresses-success)
|
||||
|
||||
(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/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}]]]}))
|
||||
|
||||
(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)
|
||||
expected-fx [[:json-rpc/call
|
||||
[{: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]}]]]]
|
||||
(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/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)
|
||||
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))))
|
||||
|
||||
(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 [: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.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 [:wallet/get-saved-addresses]]
|
||||
expected-fx [[:dispatch [:infra/get-saved-addresses]]
|
||||
[:dispatch [:dismiss-modal :screen/settings.edit-saved-address]]
|
||||
[:dispatch-later
|
||||
{:ms 100
|
||||
|
||||
@@ -17,50 +17,42 @@
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [{:keys [edit?]} (rf/sub [:get-screen-params])
|
||||
{:keys [address name customization-color ens ens?]}
|
||||
(rf/sub [:wallet/saved-address])
|
||||
(let [{:keys [address name customization-color ens
|
||||
ens? edit?]} (rf/sub [:get-screen-params])
|
||||
[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 [: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])]
|
||||
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])]
|
||||
[quo/overlay {:type :shell}
|
||||
[floating-button-page/view
|
||||
{:footer-container-padding (if edit? (+ (safe-area/get-bottom) 12) 0)
|
||||
|
||||
+9
-8
@@ -9,7 +9,7 @@
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn view
|
||||
[{:keys [name address customization-color] :as opts}]
|
||||
[{:keys [name address customization-color] :as address-details}]
|
||||
(let [open-send-flow (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:wallet/init-send-flow-for-address
|
||||
@@ -62,19 +62,20 @@
|
||||
{:theme :dark
|
||||
:shell? true
|
||||
:content (fn []
|
||||
[remove-address/view opts])}])
|
||||
[opts])
|
||||
[remove-address/view address-details])}])
|
||||
[address-details])
|
||||
open-show-address-qr (rn/use-callback
|
||||
#(rf/dispatch [:open-modal
|
||||
:screen/settings.share-saved-address opts])
|
||||
[opts])
|
||||
:screen/settings.share-saved-address
|
||||
address-details])
|
||||
[address-details])
|
||||
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
|
||||
{:edit? true}]))
|
||||
[opts])]
|
||||
(merge {:edit? true}
|
||||
address-details)]))
|
||||
[address-details])]
|
||||
[quo/action-drawer
|
||||
[[{:icon :i/arrow-up
|
||||
:label (i18n/label :t/send-to-user {:user name})
|
||||
|
||||
@@ -99,12 +99,15 @@
|
||||
|
||||
(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
|
||||
[]
|
||||
(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
|
||||
{:type :negative
|
||||
:theme :dark
|
||||
@@ -151,6 +154,10 @@
|
||||
: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,7 +7,8 @@
|
||||
|
||||
(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
|
||||
[]
|
||||
|
||||
@@ -162,25 +162,7 @@
|
||||
(->> (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]
|
||||
|
||||
@@ -577,7 +577,7 @@
|
||||
[:dispatch [:wallet/get-ethereum-chains]]
|
||||
[:dispatch [:wallet/get-accounts]]
|
||||
[:dispatch [:wallet/get-keypairs]]
|
||||
[:dispatch [:wallet/get-saved-addresses]]
|
||||
[:dispatch [:infra/get-saved-addresses]]
|
||||
(when (ff/enabled? ::ff/wallet.wallet-connect)
|
||||
[:dispatch-later [{:ms 500 :dispatch [:wallet-connect/init]}]])]}))
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
(fn []
|
||||
(rn/use-effect
|
||||
(fn []
|
||||
(rf/dispatch [:wallet/get-saved-addresses])))
|
||||
(rf/dispatch [:infra/get-saved-addresses])))
|
||||
(let [transaction-details (rf/sub [:wallet/send-transaction-progress])]
|
||||
[floating-button-page/view
|
||||
{:footer-container-padding 0
|
||||
|
||||
@@ -41,4 +41,6 @@
|
||||
:stickers/packs-pending #{}
|
||||
:settings/change-password {}
|
||||
:keycard {}
|
||||
:theme :dark})
|
||||
:theme :dark
|
||||
:app {:use-cases-stack '()
|
||||
:last-user-notification {}}})
|
||||
|
||||
@@ -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)}))
|
||||
@@ -1,5 +1,6 @@
|
||||
(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
|
||||
@@ -55,6 +56,8 @@
|
||||
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]))
|
||||
|
||||
@@ -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})))
|
||||
|
||||
|
||||
@@ -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))
|
||||
@@ -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)))
|
||||
@@ -3,6 +3,7 @@
|
||||
[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
|
||||
@@ -191,3 +192,8 @@
|
||||
|
||||
;;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)
|
||||
|
||||
@@ -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]))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user