Wallet/Approval Label Component (#20117)
This commit is contained in:
parent
ff82d9c39e
commit
e5ab94f1b2
|
@ -0,0 +1,43 @@
|
||||||
|
(ns quo.components.wallet.approval-label.component-spec
|
||||||
|
(:require [quo.components.wallet.approval-label.view :as approval-label]
|
||||||
|
[test-helpers.component :as h]))
|
||||||
|
|
||||||
|
(h/describe "Wallet: Approval Label"
|
||||||
|
(h/test "with :approve status"
|
||||||
|
(h/render-with-theme-provider
|
||||||
|
[approval-label/view
|
||||||
|
{:status :approve
|
||||||
|
:customization-color :blue
|
||||||
|
:token-value "100"
|
||||||
|
:token-symbol "SNT"}])
|
||||||
|
(h/is-truthy (h/get-by-translation-text :t/approve-amount-symbol {:amount "100" :symbol "SNT"})))
|
||||||
|
|
||||||
|
(h/test "with :approving status"
|
||||||
|
(h/render-with-theme-provider
|
||||||
|
[approval-label/view
|
||||||
|
{:status :approving
|
||||||
|
:customization-color :blue
|
||||||
|
:token-value "50"
|
||||||
|
:token-symbol "DAI"}])
|
||||||
|
(h/is-truthy (h/get-by-translation-text :t/approving-amount-symbol {:amount "50" :symbol "DAI"})))
|
||||||
|
|
||||||
|
(h/test "with :approved status"
|
||||||
|
(h/render-with-theme-provider
|
||||||
|
[approval-label/view
|
||||||
|
{:status :approved
|
||||||
|
:customization-color :blue
|
||||||
|
:token-value "5"
|
||||||
|
:token-symbol "ETH"}])
|
||||||
|
(h/is-truthy (h/get-by-translation-text :t/approved-amount-symbol {:amount "5" :symbol "ETH"})))
|
||||||
|
|
||||||
|
(h/test "on-press event is called when button is pressed"
|
||||||
|
(let [mock-fn (h/mock-fn)]
|
||||||
|
(h/render-with-theme-provider
|
||||||
|
[approval-label/view
|
||||||
|
{:status :approve
|
||||||
|
:customization-color :blue
|
||||||
|
:token-value "11"
|
||||||
|
:token-symbol "DAI"
|
||||||
|
:button-props {:on-press mock-fn}}])
|
||||||
|
(h/fire-event :press (h/get-by-translation-text :t/approve))
|
||||||
|
(h/was-called mock-fn))))
|
|
@ -0,0 +1,14 @@
|
||||||
|
(ns quo.components.wallet.approval-label.schema)
|
||||||
|
|
||||||
|
(def ?schema
|
||||||
|
[:=>
|
||||||
|
[:catn
|
||||||
|
[:props
|
||||||
|
[:map {:closed true}
|
||||||
|
[:status [:enum :approve :approving :approved]]
|
||||||
|
[:token-value :string]
|
||||||
|
[:token-symbol :string]
|
||||||
|
[:container-style {:optional true} [:maybe :map]]
|
||||||
|
[:button-props {:optional true} [:maybe :map]]
|
||||||
|
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]]]]
|
||||||
|
:any])
|
|
@ -0,0 +1,28 @@
|
||||||
|
(ns quo.components.wallet.approval-label.style
|
||||||
|
(:require [quo.foundations.colors :as colors]))
|
||||||
|
|
||||||
|
(def ^:const top-hole-view-height 24)
|
||||||
|
|
||||||
|
(defn container
|
||||||
|
[customization-color theme]
|
||||||
|
{:background-color (colors/resolve-color customization-color theme 5)
|
||||||
|
:align-items :center
|
||||||
|
:padding-horizontal 12
|
||||||
|
:padding-vertical 8
|
||||||
|
:padding-top (+ 8 top-hole-view-height)
|
||||||
|
:gap 8
|
||||||
|
:border-bottom-left-radius 16
|
||||||
|
:border-bottom-right-radius 16
|
||||||
|
:flex-direction :row})
|
||||||
|
|
||||||
|
(def content
|
||||||
|
{:flex-direction :row
|
||||||
|
:align-items :center
|
||||||
|
:flex 1
|
||||||
|
:padding-vertical 4
|
||||||
|
:gap 4})
|
||||||
|
|
||||||
|
(defn message
|
||||||
|
[theme]
|
||||||
|
{:flex 1
|
||||||
|
:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)})
|
|
@ -0,0 +1,70 @@
|
||||||
|
(ns quo.components.wallet.approval-label.view
|
||||||
|
(:require [oops.core :as oops]
|
||||||
|
[quo.components.buttons.button.view :as button]
|
||||||
|
[quo.components.icon :as icon]
|
||||||
|
[quo.components.markdown.text :as text]
|
||||||
|
[quo.components.wallet.approval-label.schema :as approval-label.schema]
|
||||||
|
[quo.components.wallet.approval-label.style :as style]
|
||||||
|
[quo.foundations.colors :as colors]
|
||||||
|
quo.theme
|
||||||
|
[react-native.core :as rn]
|
||||||
|
[react-native.hole-view :as hole-view]
|
||||||
|
[schema.core :as schema]
|
||||||
|
[utils.i18n :as i18n]))
|
||||||
|
|
||||||
|
(def ^:private status-icons
|
||||||
|
{:approve :i/alert
|
||||||
|
:approving :i/pending-state
|
||||||
|
:approved :i/check})
|
||||||
|
|
||||||
|
(def ^:private status-message
|
||||||
|
{:approve :t/approve-amount-symbol
|
||||||
|
:approving :t/approving-amount-symbol
|
||||||
|
:approved :t/approved-amount-symbol})
|
||||||
|
|
||||||
|
(defn- view-internal
|
||||||
|
[{:keys [status token-value token-symbol
|
||||||
|
container-style button-props]
|
||||||
|
:as props}]
|
||||||
|
(let [theme (quo.theme/use-theme)
|
||||||
|
customization-color (or (:customization-color props) :blue)
|
||||||
|
[container-width set-container-width] (rn/use-state 0)
|
||||||
|
on-layout (rn/use-callback
|
||||||
|
#(set-container-width
|
||||||
|
(oops/oget % :nativeEvent :layout :width)))]
|
||||||
|
[hole-view/hole-view
|
||||||
|
{:holes [{:x 0
|
||||||
|
:y 0
|
||||||
|
:height style/top-hole-view-height
|
||||||
|
:width container-width
|
||||||
|
:borderBottomStartRadius 16
|
||||||
|
:borderBottomEndRadius 16}]
|
||||||
|
:style {:margin-top (- style/top-hole-view-height)}
|
||||||
|
:on-layout on-layout}
|
||||||
|
[rn/view
|
||||||
|
{:style (merge (style/container customization-color theme)
|
||||||
|
container-style)
|
||||||
|
:accessibility-label :approval-label}
|
||||||
|
[rn/view {:style style/content}
|
||||||
|
[icon/icon
|
||||||
|
(status-icons status)
|
||||||
|
{:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
||||||
|
:size 16}]
|
||||||
|
[text/text
|
||||||
|
{:size :paragraph-2
|
||||||
|
:style (style/message theme)}
|
||||||
|
(i18n/label (status-message status)
|
||||||
|
{:amount token-value
|
||||||
|
:symbol token-symbol})]]
|
||||||
|
(when button-props
|
||||||
|
[button/button
|
||||||
|
(merge {:type (if (= status :approve) :primary :grey)
|
||||||
|
:background (when-not (= status :approve) :blur)
|
||||||
|
:customization-color customization-color
|
||||||
|
:size 24}
|
||||||
|
button-props)
|
||||||
|
(i18n/label (if (= status :approve)
|
||||||
|
:t/approve
|
||||||
|
:t/view))])]]))
|
||||||
|
|
||||||
|
(def view (schema/instrument #'view-internal approval-label.schema/?schema))
|
|
@ -165,6 +165,7 @@
|
||||||
quo.components.wallet.account-permissions.view
|
quo.components.wallet.account-permissions.view
|
||||||
quo.components.wallet.address-text.view
|
quo.components.wallet.address-text.view
|
||||||
quo.components.wallet.amount-input.view
|
quo.components.wallet.amount-input.view
|
||||||
|
quo.components.wallet.approval-label.view
|
||||||
quo.components.wallet.confirmation-progress.view
|
quo.components.wallet.confirmation-progress.view
|
||||||
quo.components.wallet.keypair.view
|
quo.components.wallet.keypair.view
|
||||||
quo.components.wallet.network-amount.view
|
quo.components.wallet.network-amount.view
|
||||||
|
@ -434,6 +435,7 @@
|
||||||
(def account-permissions quo.components.wallet.account-permissions.view/view)
|
(def account-permissions quo.components.wallet.account-permissions.view/view)
|
||||||
(def address-text quo.components.wallet.address-text.view/view)
|
(def address-text quo.components.wallet.address-text.view/view)
|
||||||
(def amount-input quo.components.wallet.amount-input.view/view)
|
(def amount-input quo.components.wallet.amount-input.view/view)
|
||||||
|
(def approval-label quo.components.wallet.approval-label.view/view)
|
||||||
(def confirmation-progress quo.components.wallet.confirmation-progress.view/view)
|
(def confirmation-progress quo.components.wallet.confirmation-progress.view/view)
|
||||||
(def keypair quo.components.wallet.keypair.view/view)
|
(def keypair quo.components.wallet.keypair.view/view)
|
||||||
(def network-amount quo.components.wallet.network-amount.view/view)
|
(def network-amount quo.components.wallet.network-amount.view/view)
|
||||||
|
|
|
@ -95,6 +95,7 @@
|
||||||
quo.components.wallet.account-overview.component-spec
|
quo.components.wallet.account-overview.component-spec
|
||||||
quo.components.wallet.account-permissions.component-spec
|
quo.components.wallet.account-permissions.component-spec
|
||||||
quo.components.wallet.amount-input.component-spec
|
quo.components.wallet.amount-input.component-spec
|
||||||
|
quo.components.wallet.approval-label.component-spec
|
||||||
quo.components.wallet.confirmation-progress.component-spec
|
quo.components.wallet.confirmation-progress.component-spec
|
||||||
quo.components.wallet.keypair.component-spec
|
quo.components.wallet.keypair.component-spec
|
||||||
quo.components.wallet.network-amount.component-spec
|
quo.components.wallet.network-amount.component-spec
|
||||||
|
|
|
@ -191,6 +191,7 @@
|
||||||
account-overview]
|
account-overview]
|
||||||
[status-im.contexts.preview.quo.wallet.account-permissions :as account-permissions]
|
[status-im.contexts.preview.quo.wallet.account-permissions :as account-permissions]
|
||||||
[status-im.contexts.preview.quo.wallet.amount-input :as amount-input]
|
[status-im.contexts.preview.quo.wallet.amount-input :as amount-input]
|
||||||
|
[status-im.contexts.preview.quo.wallet.approval-label :as approval-label]
|
||||||
[status-im.contexts.preview.quo.wallet.confirmation-progress :as
|
[status-im.contexts.preview.quo.wallet.confirmation-progress :as
|
||||||
confirmation-progress]
|
confirmation-progress]
|
||||||
[status-im.contexts.preview.quo.wallet.keypair :as keypair]
|
[status-im.contexts.preview.quo.wallet.keypair :as keypair]
|
||||||
|
@ -526,6 +527,8 @@
|
||||||
:component account-permissions/view}
|
:component account-permissions/view}
|
||||||
{:name :amount-input
|
{:name :amount-input
|
||||||
:component amount-input/view}
|
:component amount-input/view}
|
||||||
|
{:name :approval-label
|
||||||
|
:component approval-label/view}
|
||||||
{:name :confirmation-progress
|
{:name :confirmation-progress
|
||||||
:component confirmation-progress/view}
|
:component confirmation-progress/view}
|
||||||
{:name :keypair :component keypair/view}
|
{:name :keypair :component keypair/view}
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
(ns status-im.contexts.preview.quo.wallet.approval-label
|
||||||
|
(:require
|
||||||
|
[quo.core :as quo]
|
||||||
|
[react-native.core :as rn]
|
||||||
|
[status-im.contexts.preview.quo.preview :as preview]))
|
||||||
|
|
||||||
|
(def descriptor
|
||||||
|
[{:type :select
|
||||||
|
:key :status
|
||||||
|
:options [{:key :approve}
|
||||||
|
{:key :approving}
|
||||||
|
{:key :approved}]}
|
||||||
|
{:type :text
|
||||||
|
:key :token-value}
|
||||||
|
{:type :select
|
||||||
|
:key :token-symbol
|
||||||
|
:options [{:key "SNT"}
|
||||||
|
{:key "DAI"}
|
||||||
|
{:key "ETH"}]}
|
||||||
|
(preview/customization-color-option)])
|
||||||
|
|
||||||
|
(defn view
|
||||||
|
[]
|
||||||
|
(let [[state set-state] (rn/use-state {:status :approve
|
||||||
|
:customization-color :blue
|
||||||
|
:token-value "100"
|
||||||
|
:token-symbol "SNT"})]
|
||||||
|
[preview/preview-container
|
||||||
|
{:state state
|
||||||
|
:set-state set-state
|
||||||
|
:descriptor descriptor
|
||||||
|
:component-container-style {:padding-top 50}}
|
||||||
|
[quo/approval-label
|
||||||
|
(assoc state
|
||||||
|
:button-props
|
||||||
|
{:on-press
|
||||||
|
#(js/alert "Pressed")})]]))
|
|
@ -1991,6 +1991,9 @@
|
||||||
"approve-token-contract-desc": "Approving a token with a contract allows it to spend your token balance. If you feel that a project is untrustworthy, don’t approve the token with them, or approve only the amount you will use with them.",
|
"approve-token-contract-desc": "Approving a token with a contract allows it to spend your token balance. If you feel that a project is untrustworthy, don’t approve the token with them, or approve only the amount you will use with them.",
|
||||||
"unlimited": "Unlimited",
|
"unlimited": "Unlimited",
|
||||||
"approve": "Approve",
|
"approve": "Approve",
|
||||||
|
"approve-amount-symbol": "Approve {{amount}} {{symbol}}",
|
||||||
|
"approving-amount-symbol": "Approving {{amount}} {{symbol}}...",
|
||||||
|
"approved-amount-symbol": "Approved {{amount}} {{symbol}}",
|
||||||
"limit": "Limit",
|
"limit": "Limit",
|
||||||
"last-transaction": "Last transaction",
|
"last-transaction": "Last transaction",
|
||||||
"price-impact-desc": "Estimated price impact for this transaction. If the current block base fee exceeds this, your transaction will be included in a following block with a lower base fee.",
|
"price-impact-desc": "Estimated price impact for this transaction. If the current block base fee exceeds this, your transaction will be included in a following block with a lower base fee.",
|
||||||
|
|
Loading…
Reference in New Issue