This commit is contained in:
Volodymyr Kozieiev 2024-10-23 15:43:53 +01:00
parent 4ceb5c890e
commit 1be5be1ff9
No known key found for this signature in database
GPG Key ID: 82B04968DF4C0535
8 changed files with 241 additions and 213 deletions

View File

@ -10,17 +10,14 @@
[] []
[rn/view {:style style/bridge-send-wrapper} [rn/view {:style style/bridge-send-wrapper}
[input-amount/view [input-amount/view
{:current-screen-id :screen/wallet.bridge-input-amount {:current-screen-id :screen/wallet.bridge-input-amount
:button-one-label (i18n/label :t/review-bridge) :button-one-label (i18n/label :t/review-bridge)
:button-one-props {:icon-left :i/bridge} :button-one-props {:icon-left :i/bridge}
:enabled-from-chain-ids (rf/sub :on-confirm (fn [amount]
[:wallet/bridge-from-chain-ids]) (rf/dispatch [:wallet/set-token-amount-to-bridge
:from-enabled-networks (rf/sub [:wallet/bridge-from-networks]) {:amount amount
:on-confirm (fn [amount] :stack-id :screen/wallet.bridge-input-amount}]))
(rf/dispatch [:wallet/set-token-amount-to-bridge :on-navigate-back (fn []
{:amount amount (rf/dispatch-sync [:wallet/stop-and-clean-suggested-routes])
:stack-id :screen/wallet.bridge-input-amount}])) (rf/dispatch [:wallet/clean-disabled-from-networks])
:on-navigate-back (fn [] (rf/dispatch [:wallet/clean-send-amount]))}]])
(rf/dispatch-sync [:wallet/stop-and-clean-suggested-routes])
(rf/dispatch [:wallet/clean-disabled-from-networks])
(rf/dispatch [:wallet/clean-send-amount]))}]])

View File

@ -104,7 +104,7 @@
:wallet/wallet-send-tx-type :tx/send :wallet/wallet-send-tx-type :tx/send
:wallet/wallet-send-fee-fiat-formatted "$5,00" :wallet/wallet-send-fee-fiat-formatted "$5,00"
:wallet/sending-collectible? false :wallet/sending-collectible? false
:wallet/total-amount (money/bignumber "250")}) :wallet/total-amount-in-to-chains (money/bignumber "250")})
(h/describe "Send > input amount screen" (h/describe "Send > input amount screen"
(h/setup-restorable-re-frame) (h/setup-restorable-re-frame)

View File

@ -1,12 +1,10 @@
(ns status-im.contexts.wallet.send.input-amount.controller (ns status-im.contexts.wallet.send.input-amount.controller
(:require (:require
[status-im.common.controlled-input.utils :as controlled-input]
[status-im.contexts.wallet.common.utils :as utils] [status-im.contexts.wallet.common.utils :as utils]
[status-im.contexts.wallet.send.input-amount.controlled-input-logic :as controlled-input-logic] [status-im.contexts.wallet.send.input-amount.controlled-input-logic :as controlled-input-logic]
[utils.money :as money] [utils.money :as money]
[utils.number :as number] [utils.number :as number]
[utils.re-frame :as rf] [utils.re-frame :as rf]))
[status-im.common.router :as router]))
;; notes ;; notes
;; token-by-symbol and token looks very similar but they have difference in market values data ;; token-by-symbol and token looks very similar but they have difference in market values data
@ -38,7 +36,6 @@
:<- [:profile/currency-symbol] :<- [:profile/currency-symbol]
:<- [:profile/profile] :<- [:profile/profile]
(fn [[{token-symbol :symbol (fn [[{token-symbol :symbol
total-balance :total-balance
:as :as
token} token}
currency currency
@ -57,8 +54,44 @@
utils/token-usd-price utils/token-usd-price
utils/one-cent-value utils/one-cent-value
utils/calc-max-crypto-decimals) utils/calc-max-crypto-decimals)
:token token :token token}))
:total-balance total-balance}))
(rf/reg-sub :send-input-amount-screen/max-decimals
:<- [:send-input-amount-screen/controller]
:<- [:send-input-amount-screen/currency-information]
:<- [:wallet/wallet-send-receiver-preferred-networks]
(fn [[{:keys [crypto-currency?]}
{:keys [token-decimals]}]]
(if crypto-currency? token-decimals 2)))
(rf/reg-sub :send-input-amount-screen/enabled-from-chain-ids
:<- [:wallet/wallet-send-tx-type]
:<- [:wallet/wallet-send-enabled-from-chain-ids]
:<- [:wallet/bridge-from-chain-ids]
(fn [[tx-type send-chain-ids bridge-chain-ids]]
(if (= tx-type :tx/bridge)
bridge-chain-ids
send-chain-ids)))
(rf/reg-sub :send-input-amount-screen/from-enabled-networks
:<- [:wallet/wallet-send-tx-type]
:<- [:wallet/wallet-send-enabled-networks]
:<- [:wallet/bridge-from-networks]
(fn [[tx-type send-enabled-networks bridge-enabled-networks]]
(if (= tx-type :tx/bridge)
bridge-enabled-networks
send-enabled-networks)))
(defn- every-network-value-is-zero?
[sender-network-values]
(every? (fn [{:keys [total-amount]}]
(and
total-amount
(money/bignumber? total-amount)
(money/equal-to total-amount
(money/bignumber "0"))))
sender-network-values))
(rf/reg-sub :send-input-amount-screen/routes-information (rf/reg-sub :send-input-amount-screen/routes-information
:<- [:wallet/wallet-send-route] :<- [:wallet/wallet-send-route]
@ -66,18 +99,32 @@
:<- [:wallet/wallet-send-receiver-network-values] :<- [:wallet/wallet-send-receiver-network-values]
:<- [:wallet/wallet-send-suggested-routes] :<- [:wallet/wallet-send-suggested-routes]
:<- [:wallet/wallet-send-loading-suggested-routes?] :<- [:wallet/wallet-send-loading-suggested-routes?]
:<- [:wallet/wallet-send-tx-type]
(fn [[route (fn [[route
sender-network-values sender-network-values
receiver-network-values receiver-network-values
suggested-routes suggested-routes
loading-routes?]] loading-routes?
{:route route tx-type]]
:sender-network-values sender-network-values (let [token-not-supported-in-receiver-networks? (and (not= tx-type :tx/bridge)
:receiver-network-values receiver-network-values (->> receiver-network-values
:suggested-routes suggested-routes (remove #(= (:type %) :add))
:loading-routes? loading-routes? (every? #(= (:type %) :not-available))))
:routes (when suggested-routes routes (when suggested-routes
(or (:best suggested-routes) []))})) (or (:best suggested-routes) []))]
{:route route
:sender-network-values sender-network-values
:receiver-network-values receiver-network-values
:suggested-routes suggested-routes
:loading-routes? loading-routes?
:routes routes
:token-not-supported-in-receiver-networks? token-not-supported-in-receiver-networks?
:no-routes-found? (and
(every-network-value-is-zero?
sender-network-values)
(not (nil? routes))
(not loading-routes?)
(not token-not-supported-in-receiver-networks?))})))
(rf/reg-sub :send-input-amount-screen/networks-information (rf/reg-sub :send-input-amount-screen/networks-information
:<- [:wallet/wallet-send-token] :<- [:wallet/wallet-send-token]
@ -85,25 +132,35 @@
:<- [:wallet/wallet-send-receiver-preferred-networks] :<- [:wallet/wallet-send-receiver-preferred-networks]
(fn [[{token-networks :networks} (fn [[{token-networks :networks}
receiver-networks receiver-networks
receiver-preferred-networks receiver-preferred-networks]]
]] {:token-networks token-networks
{:token-networks token-networks :receiver-networks receiver-networks
:receiver-networks receiver-networks :sending-to-unpreferred-networks? (not (every? (fn [receiver-selected-network]
:receiver-preferred-networks receiver-preferred-networks})) (contains?
(set receiver-preferred-networks)
receiver-selected-network))
receiver-networks))}))
(rf/reg-sub :send-input-amount-screen/token-by-symbol (rf/reg-sub :send-input-amount-screen/token-by-symbol
:<- [:wallet/wallet-send-enabled-from-chain-ids] :<- [:send-input-amount-screen/enabled-from-chain-ids]
:<- [:send-input-amount-screen/currency-information] :<- [:send-input-amount-screen/currency-information]
(fn [[enabled-from-chain-ids {:keys [token-symbol]}]] (fn [[enabled-from-chain-ids {:keys [token-symbol]}]]
(rf/sub [:wallet/token-by-symbol (rf/sub [:wallet/token-by-symbol
(str token-symbol) (str token-symbol)
enabled-from-chain-ids]))) enabled-from-chain-ids])))
(rf/reg-sub :send-input-amount-screen/total-balance
:<- [:send-input-amount-screen/token-by-symbol]
(fn [{:keys [total-balance]}]
total-balance))
(rf/reg-sub :send-input-amount-screen/upper-limit (rf/reg-sub :send-input-amount-screen/upper-limit
:<- [:send-input-amount-screen/controller] :<- [:send-input-amount-screen/controller]
:<- [:send-input-amount-screen/currency-information] :<- [:send-input-amount-screen/currency-information]
:<- [:send-input-amount-screen/total-balance]
(fn [[{:keys [crypto-currency?]} (fn [[{:keys [crypto-currency?]}
{:keys [total-balance usd-conversion-rate conversion-rate]}]] {:keys [usd-conversion-rate conversion-rate]}
total-balance]]
(if crypto-currency? (if crypto-currency?
(utils/cut-crypto-decimals-to-fit-usd-cents (utils/cut-crypto-decimals-to-fit-usd-cents
total-balance total-balance
@ -125,17 +182,6 @@
(.toFixed (/ token-input-value conversion-rate) (.toFixed (/ token-input-value conversion-rate)
token-decimals))))) token-decimals)))))
(rf/reg-sub
:send-input-amount-screen/token-not-supported-in-receiver-networks?
:<- [:wallet/wallet-send-tx-type]
:<- [:send-input-amount-screen/routes-information]
(fn [[tx-type
{:keys [receiver-network-values]}]]
(and (not= tx-type :tx/bridge)
(->> receiver-network-values
(remove #(= (:type %) :add))
(every? #(= (:type %) :not-available))))))
(defn- fiat->crypto (defn- fiat->crypto
[value conversion-rate] [value conversion-rate]
(-> value (-> value
@ -192,6 +238,35 @@
upper-limit]] upper-limit]]
(controlled-input-logic/value-out-of-limits? token-input-value upper-limit 0))) (controlled-input-logic/value-out-of-limits? token-input-value upper-limit 0)))
(rf/reg-sub :send-input-amount-screen/recipient-gets-amount
:<- [:send-input-amount-screen/currency-information]
:<- [:wallet/total-amount-in-to-chains]
(fn [[{:keys [conversion-rate token-symbol]}
total-amount-receiver]]
(utils/prettify-crypto-balance
token-symbol
total-amount-receiver
conversion-rate)))
#_(rf/reg-sub :send-input-amount-screen/owned-eth-balance-is-zero?
:<- [:send-input-amount-screen/currency-information]
:<- [:wallet/total-amount-in-to-chains]
(fn [[{:keys [conversion-rate token-symbol]}
total-amount-receiver]]
(let [owned-eth-token (rf/sub [:wallet/token-by-symbol
(string/upper-case
constants/mainnet-short-name)
enabled-from-chain-ids])])
))
(rf/reg-sub :send-input-amount-screen/fee-formatted
:<- [:send-input-amount-screen/routes-information]
(fn [{:keys [route]}]
(let [native-currency-symbol (when-not (or (nil? route) (empty? route))
(get-in (first route)
[:from :native-currency-symbol]))]
(rf/sub [:wallet/wallet-send-fee-fiat-formatted native-currency-symbol]))))
(rf/reg-sub :send-input-amount-screen/data (rf/reg-sub :send-input-amount-screen/data
:<- [:send-input-amount-screen/controller] :<- [:send-input-amount-screen/controller]
:<- [:send-input-amount-screen/currency-information] :<- [:send-input-amount-screen/currency-information]
@ -202,8 +277,13 @@
:<- [:send-input-amount-screen/value-out-of-limits?] :<- [:send-input-amount-screen/value-out-of-limits?]
:<- [:send-input-amount-screen/upper-limit-prettified] :<- [:send-input-amount-screen/upper-limit-prettified]
:<- [:send-input-amount-screen/routes-information] :<- [:send-input-amount-screen/routes-information]
:<- [:send-input-amount-screen/token-not-supported-in-receiver-networks?]
:<- [:send-input-amount-screen/networks-information] :<- [:send-input-amount-screen/networks-information]
:<- [:send-input-amount-screen/token-by-symbol]
:<- [:send-input-amount-screen/recipient-gets-amount]
:<- [:send-input-amount-screen/max-decimals]
:<- [:send-input-amount-screen/fee-formatted]
:<- [:send-input-amount-screen/enabled-from-chain-ids]
:<- [:send-input-amount-screen/from-enabled-networks]
(fn (fn
[[{:keys [crypto-currency? token-input-value] :as controller} [[{:keys [crypto-currency? token-input-value] :as controller}
{:keys [fiat-currency token-symbol token] :as currency-information} {:keys [fiat-currency token-symbol token] :as currency-information}
@ -216,12 +296,19 @@
{:keys [route {:keys [route
routes routes
sender-network-values sender-network-values
loading-routes?] loading-routes?
token-not-supported-in-receiver-networks?
no-routes-found?]
:as routes-information} :as routes-information}
token-not-supported-in-receiver-networks?
{:keys [token-networks {:keys [token-networks
receiver-networks receiver-networks
receiver-preferred-networks]}]] sending-to-unpreferred-networks?]}
token-by-symbol
recipient-gets-amount
max-decimals
fee-formatted
enabled-from-chain-ids
from-enabled-networks]]
{:crypto-currency? crypto-currency? {:crypto-currency? crypto-currency?
:fiat-currency fiat-currency :fiat-currency fiat-currency
:token token :token token
@ -246,7 +333,14 @@
:token-not-supported-in-receiver-networks? token-not-supported-in-receiver-networks? :token-not-supported-in-receiver-networks? token-not-supported-in-receiver-networks?
:token-networks token-networks :token-networks token-networks
:receiver-networks receiver-networks :receiver-networks receiver-networks
:receiver-preferred-networks receiver-preferred-networks})) :token-by-symbol token-by-symbol
:recipient-gets-amount recipient-gets-amount
:max-decimals max-decimals
:fee-formatted fee-formatted
:sending-to-unpreferred-networks? sending-to-unpreferred-networks?
:no-routes-found? no-routes-found?
:enabled-from-chain-ids enabled-from-chain-ids
:from-enabled-networks from-enabled-networks}))
@ -270,8 +364,13 @@
(rf/reg-event-fx :send-input-amount-screen/token-input-add-character (rf/reg-event-fx :send-input-amount-screen/token-input-add-character
(fn [{:keys [db]} [c]] (fn [{:keys [db]} [c max-decimals]]
{:db (update-in db token-input-value-path #(controlled-input-logic/add-character % c))})) (let [input-value (get-in db token-input-value-path)
new-text (str input-value c)
regex-pattern (str "^\\d*\\.?\\d{0," max-decimals "}$")
regex (re-pattern regex-pattern)]
(when (re-matches regex new-text)
{:db (update-in db token-input-value-path #(controlled-input-logic/add-character % c))}))))
(rf/reg-event-fx :send-input-amount-screen/token-input-delete-last (rf/reg-event-fx :send-input-amount-screen/token-input-delete-last
(fn [{:keys [db]}] (fn [{:keys [db]}]
@ -282,16 +381,3 @@
{:db (assoc-in db token-input-value-path "")})) {:db (assoc-in db token-input-value-path "")}))
(comment
(rf/dispatch [:send-input-amount-screen/swap-between-fiat-and-crypto])
(rf/sub [:send-input-amount-screen/upper-limit])
(rf/sub [:send-input-amount-screen/amount-in-crypto])
(rf/sub [:send-input-amount-screen/data])
(rf/sub [:send-input-amount-screen/controller])
(rf/dispatch [:send-input-amount-screen/set-input-state])
(tap> {:token-by-symbol (rf/sub [:send-input-amount-screen/token-by-symbol])
:token (:token (rf/sub [:send-input-amount-screen/currency-information]))})
)

View File

@ -1 +0,0 @@
(ns status-im.contexts.wallet.send.input-amount.logic)

View File

@ -99,7 +99,7 @@
(defn- estimated-fees (defn- estimated-fees
[{:keys [loading-routes? fees amount]}] [{:keys [loading-routes? fees recipient-gets-amount]}]
[rn/view {:style style/estimated-fees-container} [rn/view {:style style/estimated-fees-container}
(when (ff/enabled? ::ff/wallet.advanced-sending) (when (ff/enabled? ::ff/wallet.advanced-sending)
[rn/view {:style style/estimated-fees-content-container} [rn/view {:style style/estimated-fees-content-container}
@ -123,20 +123,12 @@
:status (if loading-routes? :loading :default) :status (if loading-routes? :loading :default)
:size :small :size :small
:title (i18n/label :t/recipient-gets) :title (i18n/label :t/recipient-gets)
:subtitle amount}]]) :subtitle recipient-gets-amount}]])
(defn- every-network-value-is-zero?
[sender-network-values]
(every? (fn [{:keys [total-amount]}]
(and
total-amount
(money/bignumber? total-amount)
(money/equal-to total-amount
(money/bignumber "0"))))
sender-network-values))
(defn select-asset-bottom-sheet (defn select-asset-bottom-sheet
[clear-input!] []
(let [{preselected-token-symbol :symbol} (rf/sub [:wallet/wallet-send-token])] (let [{preselected-token-symbol :symbol} (rf/sub [:wallet/wallet-send-token])]
[:<> ;; Need to be a `:<>` to keep `asset-list` scrollable. [:<> ;; Need to be a `:<>` to keep `asset-list` scrollable.
[quo/drawer-top [quo/drawer-top
@ -148,7 +140,8 @@
:preselected-token-symbol preselected-token-symbol :preselected-token-symbol preselected-token-symbol
:on-token-press (fn [token] :on-token-press (fn [token]
(rf/dispatch [:wallet/edit-token-to-send token]) (rf/dispatch [:wallet/edit-token-to-send token])
(clear-input!))}]])) #(rf/dispatch
[:send-input-amount-screen/token-input-delete-all]))}]]))
(defn- token-not-available (defn- token-not-available
[token-symbol receiver-networks token-networks] [token-symbol receiver-networks token-networks]
@ -218,13 +211,11 @@
(defn view (defn view
;; crypto-decimals, limit-crypto and initial-crypto-currency? args are needed ;; crypto-decimals, limit-crypto and initial-crypto-currency? args are needed
;; for component tests only ;; for component tests only
[{default-on-confirm :on-confirm [{on-confirm :on-confirm
on-navigate-back :on-navigate-back on-navigate-back :on-navigate-back
button-one-label :button-one-label button-one-label :button-one-label
button-one-props :button-one-props button-one-props :button-one-props
current-screen-id :current-screen-id current-screen-id :current-screen-id}]
enabled-from-chain-ids :enabled-from-chain-ids
from-enabled-networks :from-enabled-networks}]
(let [{:keys [crypto-currency? (let [{:keys [crypto-currency?
upper-limit upper-limit
upper-limit-prettified upper-limit-prettified
@ -243,92 +234,54 @@
fiat-currency fiat-currency
token-networks token-networks
receiver-networks receiver-networks
receiver-preferred-networks
token token
token-symbol] token-symbol
:as state} (rf/sub [:send-input-amount-screen/data]) token-by-symbol
view-id (rf/sub [:view-id]) recipient-gets-amount
active-screen? (= view-id current-screen-id) max-decimals
bottom (safe-area/get-bottom) fee-formatted
on-navigate-back on-navigate-back sending-to-unpreferred-networks?
handle-on-confirm (fn [amount] no-routes-found?
(rf/dispatch [:wallet/set-token-amount-to-send enabled-from-chain-ids
{:amount amount from-enabled-networks]
:stack-id current-screen-id}])) :as state} (rf/sub [:send-input-amount-screen/data])
on-confirm (or default-on-confirm handle-on-confirm) view-id (rf/sub [:view-id])
active-screen? (= view-id current-screen-id)
send-from-locked-amounts (rf/sub [:wallet/wallet-send-from-locked-amounts]) bottom (safe-area/get-bottom)
token-by-symbol (rf/sub [:wallet/token-by-symbol on-navigate-back on-navigate-back
(str token-symbol) show-select-asset-sheet #(rf/dispatch
enabled-from-chain-ids]) [:show-bottom-sheet
token-decimals (-> token {:content (fn [] [select-asset-bottom-sheet])}])
utils/token-usd-price should-try-again? (and (not upper-limit-exceeded?) no-routes-found?)
utils/one-cent-value current-address (rf/sub [:wallet/current-viewing-account-address])
utils/calc-max-crypto-decimals) owned-eth-token (rf/sub [:wallet/token-by-symbol
clear-input! #(rf/dispatch (string/upper-case
[:send-input-amount-screen/token-input-delete-all]) constants/mainnet-short-name)
enabled-from-chain-ids])
confirm-disabled? (or (nil? route) not-enough-asset? (and
(empty? route) (or no-routes-found? upper-limit-exceeded?)
(not valid-input?)) (not-empty sender-network-values)
total-amount-receiver (rf/sub [:wallet/total-amount true]) (if (= token-symbol
amount-text (str (number/remove-trailing-zeroes (string/upper-case
(.toFixed total-amount-receiver constants/mainnet-short-name))
(min token-decimals 6))) (money/equal-to
" " (money/bignumber input-value)
token-symbol) (money/bignumber upper-limit))
native-currency-symbol (when-not confirm-disabled? (money/equal-to (:total-balance
(get-in (first route) owned-eth-token)
[:from :native-currency-symbol])) 0)))
fee-formatted (when native-currency-symbol show-no-routes? (and
(rf/sub [:wallet/wallet-send-fee-fiat-formatted (or no-routes-found? upper-limit-exceeded?)
native-currency-symbol])) (not-empty sender-network-values)
show-select-asset-sheet #(rf/dispatch (not not-enough-asset?))
[:show-bottom-sheet request-fetch-routes (fn [bounce-duration-ms]
{:content (fn [] (fetch-routes
[select-asset-bottom-sheet {:amount amount-in-crypto
clear-input!])}]) :valid-input? valid-input?
no-routes-found? (and :bounce-duration-ms bounce-duration-ms
(every-network-value-is-zero? :token token
sender-network-values) :reset-amounts-to-zero? (and upper-limit-exceeded?
(not (nil? routes)) (some? routes))}))]
(not loading-routes?)
(not token-not-supported-in-receiver-networks?))
sending-to-unpreferred-networks? (not (every? (fn [receiver-selected-network]
(contains?
(set receiver-preferred-networks)
receiver-selected-network))
receiver-networks))
should-try-again? (and (not upper-limit-exceeded?) no-routes-found?)
current-address (rf/sub [:wallet/current-viewing-account-address])
owned-eth-token (rf/sub [:wallet/token-by-symbol
(string/upper-case
constants/mainnet-short-name)
enabled-from-chain-ids])
not-enough-asset? (and
(or no-routes-found? upper-limit-exceeded?)
(not-empty sender-network-values)
(if (= token-symbol
(string/upper-case
constants/mainnet-short-name))
(money/equal-to
(money/bignumber input-value)
(money/bignumber upper-limit))
(money/equal-to (:total-balance
owned-eth-token)
0)))
show-no-routes? (and
(or no-routes-found? upper-limit-exceeded?)
(not-empty sender-network-values)
(not not-enough-asset?))
request-fetch-routes (fn [bounce-duration-ms]
(fetch-routes
{:amount amount-in-crypto
:valid-input? valid-input?
:bounce-duration-ms bounce-duration-ms
:token token
:reset-amounts-to-zero? (and upper-limit-exceeded?
(some? routes))}))]
(rn/use-effect (rn/use-effect
(fn [] (fn []
(when active-screen? (when active-screen?
@ -348,14 +301,11 @@
[value-out-of-limits?]) [value-out-of-limits?])
(rn/use-effect (rn/use-effect
(fn [] (fn []
(clear-input!) (rf/dispatch [:send-input-amount-screen/token-input-delete-all])
(rf/dispatch [:wallet/stop-and-clean-suggested-routes]) (rf/dispatch [:wallet/stop-and-clean-suggested-routes])
(rf/dispatch [:wallet/clean-disabled-from-networks])) (rf/dispatch [:wallet/clean-disabled-from-networks]))
[current-address]) [current-address])
(rn/use-effect
(fn []
(request-fetch-routes 0))
[send-from-locked-amounts])
[rn/view [rn/view
{:style style/screen {:style style/screen
:accessibility-label (str "container" :accessibility-label (str "container"
@ -393,9 +343,9 @@
[token-not-available token-symbol receiver-networks token-networks]) [token-not-available token-symbol receiver-networks token-networks])
(when (and (not no-routes-found?) (or loading-routes? route)) (when (and (not no-routes-found?) (or loading-routes? route))
[estimated-fees [estimated-fees
{:loading-routes? loading-routes? {:loading-routes? loading-routes?
:fees fee-formatted :fees fee-formatted
:amount amount-text}]) :recipient-gets-amount recipient-gets-amount}])
(cond (cond
show-no-routes? [no-routes-found] show-no-routes? [no-routes-found]
not-enough-asset? [not-enough-asset]) not-enough-asset? [not-enough-asset])
@ -406,7 +356,10 @@
button-one-label) button-one-label)
:button-one-props (merge (when-not should-try-again? button-one-props) :button-one-props (merge (when-not should-try-again? button-one-props)
{:disabled? (or loading-routes? {:disabled? (or loading-routes?
(and (not should-try-again?) confirm-disabled?)) (and (not should-try-again?)
(or (nil? route)
(empty? route)
(not valid-input?))))
:on-press (cond :on-press (cond
should-try-again? should-try-again?
#(rf/dispatch [:wallet/start-get-suggested-routes #(rf/dispatch [:wallet/start-get-suggested-routes
@ -423,14 +376,8 @@
:left-action :dot :left-action :dot
:delete-key? true :delete-key? true
:on-press (fn [c] :on-press (fn [c]
(let [new-text (str input-value c) (rf/dispatch [:send-input-amount-screen/token-input-add-character c
max-decimals (if crypto-currency? token-decimals 2) max-decimals]))
regex-pattern (str "^\\d*\\.?\\d{0," max-decimals "}$")
regex (re-pattern regex-pattern)]
(when (re-matches regex new-text)
(debounce/clear-all)
(rf/dispatch [:send-input-amount-screen/token-input-add-character
c]))))
:on-delete (fn [] :on-delete (fn []
(debounce/clear-all) (debounce/clear-all)
(rf/dispatch [:send-input-amount-screen/token-input-delete-last]) (rf/dispatch [:send-input-amount-screen/token-input-delete-last])

View File

@ -8,12 +8,14 @@
(defn view (defn view
[] []
[input-amount/view [input-amount/view
{:current-screen-id :screen/wallet.send-input-amount {:current-screen-id :screen/wallet.send-input-amount
:button-one-label (i18n/label :t/review-send) :button-one-label (i18n/label :t/review-send)
:enabled-from-chain-ids (rf/sub [:wallet/wallet-send-enabled-from-chain-ids]) :on-confirm (fn [amount]
:from-enabled-networks (rf/sub [:wallet/wallet-send-enabled-networks]) (rf/dispatch [:wallet/set-token-amount-to-send
:on-navigate-back (fn [] {:amount amount
(rf/dispatch-sync [:wallet/stop-and-clean-suggested-routes]) :stack-id :screen/wallet.send-input-amount}]))
(rf/dispatch [:wallet/clean-disabled-from-networks]) :on-navigate-back (fn []
(rf/dispatch [:wallet/clean-from-locked-amounts]) (rf/dispatch-sync [:wallet/stop-and-clean-suggested-routes])
(rf/dispatch [:wallet/clean-send-amount]))}]) (rf/dispatch [:wallet/clean-disabled-from-networks])
(rf/dispatch [:wallet/clean-from-locked-amounts])
(rf/dispatch [:wallet/clean-send-amount]))}])

View File

@ -221,9 +221,8 @@
bridge-to-network (when bridge-to-chain-id bridge-to-network (when bridge-to-chain-id
(rf/sub [:wallet/network-details-by-chain-id (rf/sub [:wallet/network-details-by-chain-id
bridge-to-chain-id])) bridge-to-chain-id]))
loading-suggested-routes? (rf/sub loading-suggested-routes? (rf/sub [:wallet/wallet-send-loading-suggested-routes?])
[:wallet/wallet-send-loading-suggested-routes?]) total-amount-receiver (rf/sub [:wallet/total-amount-in-to-chains])
total-amount-receiver (rf/sub [:wallet/total-amount true])
from-account-props {:customization-color account-color from-account-props {:customization-color account-color
:size 32 :size 32
:emoji (:emoji account) :emoji (:emoji account)

View File

@ -75,15 +75,13 @@
{} {}
network-values)))) network-values))))
(re-frame/reg-sub (re-frame/reg-sub :wallet/total-amount-in-to-chains
:wallet/total-amount
:<- [:wallet/wallet-send] :<- [:wallet/wallet-send]
(fn [{:keys [from-values-by-chain to-values-by-chain]} [_ to-values?]] (fn [{:keys [to-values-by-chain]}]
(let [network-values (if to-values? to-values-by-chain from-values-by-chain)] (reduce
(reduce (fn [acc amount]
(fn [acc amount] (if (money/bignumber? amount)
(if (money/bignumber? amount) (money/add acc amount)
(money/add acc amount) acc))
acc)) (money/bignumber 0)
(money/bignumber 0) (vals to-values-by-chain))))
(vals network-values)))))