diff --git a/src/status_im/contexts/wallet/send/input_amount/controller.cljs b/src/status_im/contexts/wallet/send/input_amount/controller.cljs index 82f0246238..c7fa667240 100644 --- a/src/status_im/contexts/wallet/send/input_amount/controller.cljs +++ b/src/status_im/contexts/wallet/send/input_amount/controller.cljs @@ -119,10 +119,12 @@ (rf/reg-sub :send-input-amount-screen/data :<- [:send-input-amount-screen/controller] + :<- [:send-input-amount-screen/currency-information] :<- [:send-input-amount-screen/max-limit] :<- [:send-input-amount-screen/amount-in-crypto] :<- [:send-input-amount-screen/token-input-converted-value] (fn [[{:keys [crypto-currency? input-state] :as controller} + {:keys [conversion-rate]} max-limit amount-in-crypto token-input-converted-value]] @@ -136,23 +138,29 @@ :limit-exceeded? (controlled-input/upper-limit-exceeded? input-state) :amount-in-crypto amount-in-crypto :token-input-converted-value token-input-converted-value + :conversion-rate conversion-rate })) ;; events -(rf/reg-event-fx - :send-input-amount-screen/swap-between-fiat-and-crypto - (fn [{:keys [db]}] - {:db (update-in db [:layers :ui :send :input-amount-screen :controller :crypto-currency?] not)})) - - (rf/reg-event-fx :send-input-amount-screen/set-input-state (fn [{:keys [db]} [f]] {:db (update-in db [:layers :ui :send :input-amount-screen :controller :input-state] f)})) +(rf/reg-event-fx + :send-input-amount-screen/swap-between-fiat-and-crypto + (fn [{:keys [db]} [crypto-currency? conversion-rate]] + {:db (update-in db [:layers :ui :send :input-amount-screen :controller :crypto-currency?] not) + :fx (if crypto-currency? + [[:dispatch + [:send-input-amount-screen/set-input-state #(controlled-input/->fiat % conversion-rate)]]] + [[:dispatch + [:send-input-amount-screen/set-input-state + #(controlled-input/->crypto % conversion-rate)]]])})) + diff --git a/src/status_im/contexts/wallet/send/input_amount/view.cljs b/src/status_im/contexts/wallet/send/input_amount/view.cljs index 2b55bc47d2..69a79c32bf 100644 --- a/src/status_im/contexts/wallet/send/input_amount/view.cljs +++ b/src/status_im/contexts/wallet/send/input_amount/view.cljs @@ -234,129 +234,118 @@ valid-input? limit-exceeded? amount-in-crypto - token-input-converted-value] - :as state} (rf/sub [:send-input-amount-screen/data]) - view-id (rf/sub [:view-id]) - active-screen? (= view-id current-screen-id) - bottom (safe-area/get-bottom) - on-navigate-back on-navigate-back - handle-on-confirm (fn [amount] - (rf/dispatch [:wallet/set-token-amount-to-send - {:amount amount - :stack-id current-screen-id}])) - {fiat-currency :currency} (rf/sub [:profile/profile]) + token-input-converted-value + conversion-rate] + :as state} (rf/sub [:send-input-amount-screen/data]) + view-id (rf/sub [:view-id]) + active-screen? (= view-id current-screen-id) + bottom (safe-area/get-bottom) + on-navigate-back on-navigate-back + handle-on-confirm (fn [amount] + (rf/dispatch [:wallet/set-token-amount-to-send + {:amount amount + :stack-id current-screen-id}])) + {fiat-currency :currency} (rf/sub [:profile/profile]) {token-symbol :symbol token-networks :networks :as - token} (rf/sub [:wallet/wallet-send-token]) - send-from-locked-amounts (rf/sub [:wallet/wallet-send-from-locked-amounts]) - token-by-symbol (rf/sub [:wallet/token-by-symbol - (str token-symbol) - enabled-from-chain-ids]) - currency (rf/sub [:profile/currency]) - conversion-rate (-> token - :market-values-per-currency - currency - :price) - token-decimals (-> token - utils/token-usd-price - utils/one-cent-value - utils/calc-max-crypto-decimals) - clear-input! #(rf/dispatch [:send-input-amount-screen/set-input-state - controlled-input/delete-all]) - currency-symbol (rf/sub [:profile/currency-symbol]) - loading-routes? (rf/sub - [:wallet/wallet-send-loading-suggested-routes?]) - route (rf/sub [:wallet/wallet-send-route]) - on-confirm (or default-on-confirm handle-on-confirm) + token} (rf/sub [:wallet/wallet-send-token]) + send-from-locked-amounts (rf/sub [:wallet/wallet-send-from-locked-amounts]) + token-by-symbol (rf/sub [:wallet/token-by-symbol + (str token-symbol) + enabled-from-chain-ids]) + token-decimals (-> token + utils/token-usd-price + utils/one-cent-value + utils/calc-max-crypto-decimals) + clear-input! #(rf/dispatch + [:send-input-amount-screen/set-input-state + controlled-input/delete-all]) + currency-symbol (rf/sub [:profile/currency-symbol]) + loading-routes? (rf/sub + [:wallet/wallet-send-loading-suggested-routes?]) + route (rf/sub [:wallet/wallet-send-route]) + on-confirm (or default-on-confirm handle-on-confirm) - confirm-disabled? (or (nil? route) - (empty? route) - (not valid-input?)) - total-amount-receiver (rf/sub [:wallet/total-amount true]) - amount-text (str (number/remove-trailing-zeroes - (.toFixed total-amount-receiver - (min token-decimals 6))) - " " - token-symbol) - first-route (first route) - native-currency-symbol (when-not confirm-disabled? - (get-in first-route - [:from :native-currency-symbol])) - fee-formatted (when native-currency-symbol - (rf/sub [:wallet/wallet-send-fee-fiat-formatted - native-currency-symbol])) - show-select-asset-sheet #(rf/dispatch - [:show-bottom-sheet - {:content (fn [] - [select-asset-bottom-sheet - clear-input!])}]) - sender-network-values (rf/sub - [:wallet/wallet-send-sender-network-values]) - receiver-network-values (rf/sub - [:wallet/wallet-send-receiver-network-values]) - tx-type (rf/sub [:wallet/wallet-send-tx-type]) + confirm-disabled? (or (nil? route) + (empty? route) + (not valid-input?)) + total-amount-receiver (rf/sub [:wallet/total-amount true]) + amount-text (str (number/remove-trailing-zeroes + (.toFixed total-amount-receiver + (min token-decimals 6))) + " " + token-symbol) + first-route (first route) + native-currency-symbol (when-not confirm-disabled? + (get-in first-route + [:from :native-currency-symbol])) + fee-formatted (when native-currency-symbol + (rf/sub [:wallet/wallet-send-fee-fiat-formatted + native-currency-symbol])) + show-select-asset-sheet #(rf/dispatch + [:show-bottom-sheet + {:content (fn [] + [select-asset-bottom-sheet + clear-input!])}]) + sender-network-values (rf/sub + [:wallet/wallet-send-sender-network-values]) + receiver-network-values (rf/sub + [:wallet/wallet-send-receiver-network-values]) + tx-type (rf/sub [:wallet/wallet-send-tx-type]) token-not-supported-in-receiver-networks? (and (not= tx-type :tx/bridge) (->> receiver-network-values (remove #(= (:type %) :add)) (every? #(= (:type %) :not-available)))) - suggested-routes (rf/sub [:wallet/wallet-send-suggested-routes]) - routes (when suggested-routes - (or (:best suggested-routes) [])) - 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?)) - receiver-networks (rf/sub [:wallet/wallet-send-receiver-networks]) - receiver-preferred-networks (rf/sub - [:wallet/wallet-send-receiver-preferred-networks]) - receiver-preferred-networks-set (set receiver-preferred-networks) - sending-to-unpreferred-networks? (not (every? (fn [receiver-selected-network] - (contains? - receiver-preferred-networks-set - receiver-selected-network)) - receiver-networks)) - should-try-again? (and (not 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? limit-exceeded?) - (not-empty sender-network-values) - (if (= token-symbol - (string/upper-case - constants/mainnet-short-name)) - (money/equal-to - (controlled-input/value-bn input-state) - (controlled-input/upper-limit-bn input-state)) - (money/equal-to (:total-balance - owned-eth-token) - 0))) - show-no-routes? (and - (or no-routes-found? 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 limit-exceeded? - (some? routes))})) - swap-between-fiat-and-crypto (fn [] - (if crypto-currency? - (rf/dispatch [:send-input-amount-screen/set-input-state - #(controlled-input/->fiat % conversion-rate)]) - (rf/dispatch [:send-input-amount-screen/set-input-state - #(controlled-input/->crypto % conversion-rate)]) - ) - (rf/dispatch - [:send-input-amount-screen/swap-between-fiat-and-crypto]))] + suggested-routes (rf/sub [:wallet/wallet-send-suggested-routes]) + routes (when suggested-routes + (or (:best suggested-routes) [])) + 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?)) + receiver-networks (rf/sub [:wallet/wallet-send-receiver-networks]) + receiver-preferred-networks (rf/sub + [:wallet/wallet-send-receiver-preferred-networks]) + receiver-preferred-networks-set (set receiver-preferred-networks) + sending-to-unpreferred-networks? (not (every? (fn [receiver-selected-network] + (contains? + receiver-preferred-networks-set + receiver-selected-network)) + receiver-networks)) + should-try-again? (and (not 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? limit-exceeded?) + (not-empty sender-network-values) + (if (= token-symbol + (string/upper-case + constants/mainnet-short-name)) + (money/equal-to + (controlled-input/value-bn input-state) + (controlled-input/upper-limit-bn input-state)) + (money/equal-to (:total-balance + owned-eth-token) + 0))) + show-no-routes? (and + (or no-routes-found? 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 limit-exceeded? + (some? routes))})) + ] (rn/use-effect (fn [] (when active-screen? @@ -401,7 +390,8 @@ {:container-style style/input-container :token-symbol token-symbol :value input-value - :on-swap swap-between-fiat-and-crypto + :on-swap #(rf/dispatch [:send-input-amount-screen/swap-between-fiat-and-crypto + crypto-currency? conversion-rate]) :on-token-press show-select-asset-sheet :error? input-error :currency-symbol (if crypto-currency? token-symbol fiat-currency)