Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb129b97f3 |
@@ -7,6 +7,11 @@
|
|||||||
[react-native.core :as rn]
|
[react-native.core :as rn]
|
||||||
[reagent.core :as reagent]))
|
[reagent.core :as reagent]))
|
||||||
|
|
||||||
|
(defn- label->accessibility-label
|
||||||
|
[label]
|
||||||
|
(let [label-name (if (keyword? label) (name label) label)]
|
||||||
|
(keyword (str "keyboard-key-" label-name))))
|
||||||
|
|
||||||
(defn- view-internal
|
(defn- view-internal
|
||||||
[]
|
[]
|
||||||
(let [pressed? (reagent/atom false)]
|
(let [pressed? (reagent/atom false)]
|
||||||
@@ -14,9 +19,11 @@
|
|||||||
(let [label-color (style/get-label-color disabled? theme blur?)
|
(let [label-color (style/get-label-color disabled? theme blur?)
|
||||||
background-color (style/toggle-background-color @pressed? blur? theme)]
|
background-color (style/toggle-background-color @pressed? blur? theme)]
|
||||||
[rn/pressable
|
[rn/pressable
|
||||||
{:accessibility-label :keyboard-key
|
{:accessibility-label (label->accessibility-label label)
|
||||||
:disabled (or disabled? (not label))
|
:disabled (or disabled? (not label))
|
||||||
:on-press (fn [] (on-press label))
|
:on-press (fn []
|
||||||
|
(when on-press
|
||||||
|
(on-press label)))
|
||||||
:on-press-in #(reset! pressed? true)
|
:on-press-in #(reset! pressed? true)
|
||||||
:on-press-out #(reset! pressed? false)
|
:on-press-out #(reset! pressed? false)
|
||||||
:style (style/container background-color)}
|
:style (style/container background-color)}
|
||||||
|
|||||||
@@ -17,13 +17,15 @@
|
|||||||
|
|
||||||
(defn- view-internal
|
(defn- view-internal
|
||||||
[]
|
[]
|
||||||
(fn [{:keys [disabled? theme blur? left-action delete-key? on-press]}]
|
(fn [{:keys [disabled? theme blur? left-action delete-key? on-press on-delete]
|
||||||
|
:or {left-action :none}}]
|
||||||
[rn/view
|
[rn/view
|
||||||
{:style style/container}
|
{:style style/container}
|
||||||
(for [row-index (range 1 4)]
|
(for [row-index (range 1 4)]
|
||||||
^{:key row-index}
|
^{:key row-index}
|
||||||
[rn/view {:style style/row-container}
|
[rn/view {:style style/row-container}
|
||||||
(for [column-index (range 1 4)]
|
(for [column-index (range 1 4)]
|
||||||
|
^{:key (str row-index column-index)}
|
||||||
[keyboard-item
|
[keyboard-item
|
||||||
{:item (+ (* (dec row-index) 3) column-index)
|
{:item (+ (* (dec row-index) 3) column-index)
|
||||||
:type :digit
|
:type :digit
|
||||||
@@ -61,7 +63,7 @@
|
|||||||
{:item :i/delete
|
{:item :i/delete
|
||||||
:type :key
|
:type :key
|
||||||
:disabled? disabled?
|
:disabled? disabled?
|
||||||
:on-press on-press
|
:on-press on-delete
|
||||||
:blur? blur?
|
:blur? blur?
|
||||||
:theme theme}]
|
:theme theme}]
|
||||||
[keyboard-item])]]))
|
[keyboard-item])]]))
|
||||||
|
|||||||
@@ -1,32 +1,39 @@
|
|||||||
(ns quo.components.wallet.token-input.view
|
(ns quo.components.wallet.token-input.view
|
||||||
(:require
|
(:require
|
||||||
[clojure.string :as string]
|
[clojure.string :as string]
|
||||||
[quo.components.buttons.button.view :as button]
|
[quo.components.buttons.button.view :as button]
|
||||||
[quo.components.dividers.divider-line.view :as divider-line]
|
[quo.components.dividers.divider-line.view :as divider-line]
|
||||||
[quo.components.markdown.text :as text]
|
[quo.components.markdown.text :as text]
|
||||||
[quo.components.tags.network-tags.view :as network-tag]
|
[quo.components.tags.network-tags.view :as network-tag]
|
||||||
[quo.components.wallet.token-input.style :as style]
|
[quo.components.wallet.token-input.style :as style]
|
||||||
[quo.foundations.colors :as colors]
|
[quo.foundations.colors :as colors]
|
||||||
[quo.foundations.common :as common]
|
[quo.foundations.common :as common]
|
||||||
[quo.foundations.resources :as resources]
|
[quo.foundations.resources :as resources]
|
||||||
[quo.theme :as quo.theme]
|
[quo.theme :as quo.theme]
|
||||||
[react-native.core :as rn]
|
[react-native.core :as rn]
|
||||||
[reagent.core :as reagent]))
|
[reagent.core :as reagent]))
|
||||||
|
|
||||||
(defn calc-value
|
(defn calc-value
|
||||||
[crypto? currency token value conversion]
|
[crypto? currency token value conversion]
|
||||||
(if crypto?
|
(let [num-value (if (string? value) (parse-double (or value "0")) value)]
|
||||||
(str (get common/currency-label currency) (.toFixed (* value conversion) 2))
|
(if crypto?
|
||||||
(str (.toFixed (/ value conversion) 2) " " (string/upper-case (clj->js token)))))
|
(str (get common/currency-label currency) (.toFixed (* num-value conversion) 2))
|
||||||
|
(str (.toFixed (/ num-value conversion) 2) " " (string/upper-case (or (clj->js token) ""))))))
|
||||||
|
|
||||||
(defn- view-internal
|
(defn- view-internal
|
||||||
[]
|
[]
|
||||||
(let [width (:width (rn/get-window))
|
(let [width (:width (rn/get-window))
|
||||||
value (reagent/atom 0)
|
value (reagent/atom nil)
|
||||||
crypto? (reagent/atom true)
|
crypto? (reagent/atom true)
|
||||||
input-ref (atom nil)]
|
input-ref (atom nil)]
|
||||||
(fn [{:keys [theme token currency conversion networks title customization-color]}]
|
(fn [{:keys [theme token currency conversion networks title customization-color
|
||||||
[rn/view {:style (style/main-container width)}
|
on-swap container-style show-keyboard?]
|
||||||
|
:or {show-keyboard? true}
|
||||||
|
external-value :value}]
|
||||||
|
[rn/view
|
||||||
|
{:style (merge
|
||||||
|
(style/main-container width)
|
||||||
|
container-style)}
|
||||||
[rn/view {:style style/amount-container}
|
[rn/view {:style style/amount-container}
|
||||||
[rn/pressable
|
[rn/pressable
|
||||||
{:on-press #(when @input-ref (.focus ^js @input-ref))
|
{:on-press #(when @input-ref (.focus ^js @input-ref))
|
||||||
@@ -37,30 +44,38 @@
|
|||||||
{:style style/token
|
{:style style/token
|
||||||
:source (resources/get-token token)}]
|
:source (resources/get-token token)}]
|
||||||
[rn/text-input
|
[rn/text-input
|
||||||
{:ref #(reset! input-ref %)
|
{:ref #(do (reset! input-ref %)
|
||||||
:placeholder "0"
|
(when %
|
||||||
:placeholder-text-color (colors/theme-colors colors/neutral-40 colors/neutral-50 theme)
|
(.focus ^js %)))
|
||||||
:keyboard-type :numeric
|
:placeholder "0"
|
||||||
:max-length 12
|
:placeholder-text-color (colors/theme-colors colors/neutral-40
|
||||||
:default-value @value
|
colors/neutral-50
|
||||||
:on-change-text #(reset! value %)
|
theme)
|
||||||
:style (style/text-input theme)
|
:default-value (or external-value @value)
|
||||||
:selection-color customization-color}]
|
:keyboard-type :numeric
|
||||||
[text/text
|
:max-length 12
|
||||||
{:size :paragraph-2
|
:on-change-text #(reset! value %)
|
||||||
:weight :semi-bold
|
:style (style/text-input theme)
|
||||||
:style {:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
:selection-color customization-color
|
||||||
:margin-right 8
|
:show-soft-input-on-focus show-keyboard?}]]
|
||||||
:padding-bottom 2}}
|
[text/text
|
||||||
(string/upper-case (clj->js (if @crypto? token currency)))]]
|
{:size :paragraph-2
|
||||||
[button/button
|
:weight :semi-bold
|
||||||
{:icon true
|
:style {:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
||||||
:icon-only? true
|
:margin-right 8
|
||||||
:size 32
|
:padding-bottom 2}}
|
||||||
:on-press #(swap! crypto? not)
|
(string/upper-case (or (clj->js (if @crypto? token currency)) ""))]]
|
||||||
:type :outline
|
[button/button
|
||||||
:accessibility-label :reorder}
|
{:icon true
|
||||||
:i/reorder]]
|
:icon-only? true
|
||||||
|
:size 32
|
||||||
|
:on-press (fn []
|
||||||
|
(swap! crypto? not)
|
||||||
|
(when on-swap
|
||||||
|
(on-swap @crypto?)))
|
||||||
|
:type :outline
|
||||||
|
:accessibility-label :reorder}
|
||||||
|
:i/reorder]
|
||||||
[divider-line/view {:container-style {:margin-vertical 8}}]
|
[divider-line/view {:container-style {:margin-vertical 8}}]
|
||||||
[rn/view {:style style/data-container}
|
[rn/view {:style style/data-container}
|
||||||
[network-tag/view {:networks networks :title title}]
|
[network-tag/view {:networks networks :title title}]
|
||||||
@@ -68,6 +83,6 @@
|
|||||||
{:size :paragraph-2
|
{:size :paragraph-2
|
||||||
:weight :medium
|
:weight :medium
|
||||||
:style {:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)}}
|
:style {:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)}}
|
||||||
(calc-value @crypto? currency token @value conversion)]]])))
|
(calc-value @crypto? currency token (or external-value @value) conversion)]]])))
|
||||||
|
|
||||||
(def view (quo.theme/with-theme view-internal))
|
(def view (quo.theme/with-theme view-internal))
|
||||||
|
|||||||
@@ -22,7 +22,9 @@
|
|||||||
[quo/button {:on-press #(rf/dispatch [:navigate-to :wallet-create-account])}
|
[quo/button {:on-press #(rf/dispatch [:navigate-to :wallet-create-account])}
|
||||||
"Create Account"]
|
"Create Account"]
|
||||||
[quo/button {:on-press #(rf/dispatch [:navigate-to :wallet-saved-addresses])}
|
[quo/button {:on-press #(rf/dispatch [:navigate-to :wallet-saved-addresses])}
|
||||||
"Saved Addresses"]])
|
"Saved Addresses"]
|
||||||
|
[quo/button {:on-press #(rf/dispatch [:navigate-to :wallet-send-input-amount])}
|
||||||
|
"Send: input amount"]])
|
||||||
|
|
||||||
(defn wallet-overview-state
|
(defn wallet-overview-state
|
||||||
[networks]
|
[networks]
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
(ns status-im2.contexts.wallet.send.input-amount.style)
|
||||||
|
|
||||||
|
(def screen
|
||||||
|
{:flex 1})
|
||||||
|
|
||||||
|
(def input-container
|
||||||
|
{:padding-top 12
|
||||||
|
:padding-bottom 0})
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
(ns status-im2.contexts.wallet.send.input-amount.view
|
||||||
|
(:require
|
||||||
|
[clojure.string :as string]
|
||||||
|
[quo.core :as quo]
|
||||||
|
[quo.theme :as quo.theme]
|
||||||
|
[react-native.core :as rn]
|
||||||
|
[reagent.core :as reagent]
|
||||||
|
[status-im2.contexts.wallet.send.input-amount.style :as style]
|
||||||
|
[utils.i18n :as i18n]
|
||||||
|
[utils.re-frame :as rf]))
|
||||||
|
|
||||||
|
(defn- make-limit-label
|
||||||
|
[{:keys [amount currency]}]
|
||||||
|
(str amount " " (string/upper-case (name currency))))
|
||||||
|
|
||||||
|
(defn- make-new-input
|
||||||
|
[current v]
|
||||||
|
(let [dot "."
|
||||||
|
max-length 12
|
||||||
|
length-owerflow? (>= (count current) max-length)
|
||||||
|
ignore-extra-dot? (and (= v dot) (string/includes? current dot))
|
||||||
|
ignore-value? (or
|
||||||
|
ignore-extra-dot?
|
||||||
|
length-owerflow?)]
|
||||||
|
(if ignore-value?
|
||||||
|
current
|
||||||
|
(str current v))))
|
||||||
|
|
||||||
|
(defn- view-internal
|
||||||
|
[_]
|
||||||
|
(let [token :eth
|
||||||
|
{:keys [currency]} (rf/sub [:profile/profile])
|
||||||
|
networks (rf/sub [:wallet/network-details])
|
||||||
|
conversion-rate 10
|
||||||
|
limit-crypto 286.32
|
||||||
|
limit-fiat (* limit-crypto conversion-rate)
|
||||||
|
input-value (reagent/atom "")
|
||||||
|
current-limit (reagent/atom {:amount limit-crypto
|
||||||
|
:currency token})
|
||||||
|
handle-swap (fn [crypto?]
|
||||||
|
(let [num-value (parse-double @input-value)]
|
||||||
|
(reset! current-limit (if crypto?
|
||||||
|
{:amount limit-crypto
|
||||||
|
:currency token}
|
||||||
|
{:amount limit-fiat
|
||||||
|
:currency currency}))
|
||||||
|
(when (> num-value (:amount @current-limit))
|
||||||
|
(reset! input-value ""))))
|
||||||
|
handle-keyboard-press (fn [v]
|
||||||
|
(let [current-value @input-value
|
||||||
|
new-value (make-new-input current-value v)
|
||||||
|
num-value (parse-double new-value)]
|
||||||
|
(when (<= num-value (:amount @current-limit))
|
||||||
|
(reset! input-value new-value))))
|
||||||
|
handle-delete (fn [_]
|
||||||
|
(swap! input-value #(subs % 0 (dec (count %)))))]
|
||||||
|
(fn [{:keys [on-confirm]
|
||||||
|
:or {on-confirm #(js/alert "Confirmed")}}]
|
||||||
|
(let [limit-label (make-limit-label @current-limit)]
|
||||||
|
[rn/view
|
||||||
|
{:style style/screen}
|
||||||
|
[quo/page-nav
|
||||||
|
{:background :blur
|
||||||
|
:icon-name :i/arrow-left
|
||||||
|
:on-press #(rf/dispatch [:navigate-back])
|
||||||
|
:right-side :account-switcher
|
||||||
|
:account-switcher {:customization-color :yellow
|
||||||
|
:emoji "🎮"
|
||||||
|
:on-press #(js/alert "Switch account")}}]
|
||||||
|
[quo/token-input
|
||||||
|
{:container-style style/input-container
|
||||||
|
:token token
|
||||||
|
:currency currency
|
||||||
|
:networks networks
|
||||||
|
:title (i18n/label :t/send-limit {:limit limit-label})
|
||||||
|
:conversion conversion-rate
|
||||||
|
:show-keyboard? false
|
||||||
|
:value @input-value
|
||||||
|
:on-swap handle-swap}]
|
||||||
|
;; Network routing content to be added
|
||||||
|
[rn/scroll-view]
|
||||||
|
[quo/bottom-actions
|
||||||
|
{:actions :1-action
|
||||||
|
:button-one-label (i18n/label :t/confirm)
|
||||||
|
:button-one-props {:disabled? (empty? @input-value)
|
||||||
|
:on-press on-confirm}}]
|
||||||
|
[quo/numbered-keyboard
|
||||||
|
{:left-action :dot
|
||||||
|
:delete-key? true
|
||||||
|
:on-press handle-keyboard-press
|
||||||
|
:on-delete handle-delete}]]))))
|
||||||
|
|
||||||
|
(def view (quo.theme/with-theme view-internal))
|
||||||
@@ -49,6 +49,7 @@
|
|||||||
[status-im2.contexts.wallet.edit-account.view :as wallet-edit-account]
|
[status-im2.contexts.wallet.edit-account.view :as wallet-edit-account]
|
||||||
[status-im2.contexts.wallet.saved-addresses.view :as wallet-saved-addresses]
|
[status-im2.contexts.wallet.saved-addresses.view :as wallet-saved-addresses]
|
||||||
[status-im2.contexts.wallet.scan-account.view :as scan-address]
|
[status-im2.contexts.wallet.scan-account.view :as scan-address]
|
||||||
|
[status-im2.contexts.wallet.send.input-amount.view :as wallet-send-input-amount]
|
||||||
[status-im2.contexts.wallet.send.select-address.view :as wallet-select-address]
|
[status-im2.contexts.wallet.send.select-address.view :as wallet-select-address]
|
||||||
[status-im2.navigation.options :as options]
|
[status-im2.navigation.options :as options]
|
||||||
[status-im2.navigation.transitions :as transitions]))
|
[status-im2.navigation.transitions :as transitions]))
|
||||||
@@ -287,6 +288,11 @@
|
|||||||
{:name :wallet-saved-addresses
|
{:name :wallet-saved-addresses
|
||||||
:component wallet-saved-addresses/view}
|
:component wallet-saved-addresses/view}
|
||||||
|
|
||||||
|
{:name :wallet-send-input-amount
|
||||||
|
:options {:modalPresentationStyle :overCurrentContext
|
||||||
|
:insets {:top? true}}
|
||||||
|
:component wallet-send-input-amount/view}
|
||||||
|
|
||||||
{:name :wallet-select-address
|
{:name :wallet-select-address
|
||||||
:options {:modalPresentationStyle :overCurrentContext}
|
:options {:modalPresentationStyle :overCurrentContext}
|
||||||
:component wallet-select-address/view}
|
:component wallet-select-address/view}
|
||||||
|
|||||||
@@ -2390,6 +2390,7 @@
|
|||||||
"invalid-address": "It’s not Ethereum address or ENS name",
|
"invalid-address": "It’s not Ethereum address or ENS name",
|
||||||
"address-already-in-use": "Address already being used",
|
"address-already-in-use": "Address already being used",
|
||||||
"address-copied": "Address copied",
|
"address-copied": "Address copied",
|
||||||
"no-dapps-description": "We want dApps!"
|
"no-dapps-description": "We want dApps!",
|
||||||
|
"send-limit": "Max: {{limit}}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user