From 369aed389c92ef391bed7b556dfe5c0fdb12f4e8 Mon Sep 17 00:00:00 2001 From: codemaster <39961806+codemaster115@users.noreply.github.com> Date: Tue, 16 May 2023 07:37:14 -0400 Subject: [PATCH] feat: new keycard component (#15892) --- resources/images/ui2/keycard-chip-dark@2x.png | Bin 0 -> 1903 bytes resources/images/ui2/keycard-chip-dark@3x.png | Bin 0 -> 2843 bytes .../images/ui2/keycard-chip-light@2x.png | Bin 0 -> 2676 bytes .../images/ui2/keycard-chip-light@3x.png | Bin 0 -> 3892 bytes resources/images/ui2/keycard-logo@2x.png | Bin 0 -> 3403 bytes resources/images/ui2/keycard-logo@3x.png | Bin 0 -> 5482 bytes resources/images/ui2/keycard-watermark@2x.png | Bin 0 -> 10254 bytes resources/images/ui2/keycard-watermark@3x.png | Bin 0 -> 16089 bytes .../components/keycard/component_spec.cljs | 20 +++++++++ src/quo2/components/keycard/style.cljs | 42 ++++++++++++++++++ src/quo2/components/keycard/view.cljs | 38 ++++++++++++++++ src/quo2/core.cljs | 2 + src/quo2/foundations/resources.cljs | 11 +++++ src/status_im2/common/resources.cljs | 5 ++- .../contexts/quo_preview/keycard/keycard.cljs | 37 +++++++++++++++ src/status_im2/contexts/quo_preview/main.cljs | 8 +++- src/status_im2/setup/i18n_test.cljs | 4 +- translations/en.json | 2 + 18 files changed, 165 insertions(+), 4 deletions(-) create mode 100644 resources/images/ui2/keycard-chip-dark@2x.png create mode 100644 resources/images/ui2/keycard-chip-dark@3x.png create mode 100644 resources/images/ui2/keycard-chip-light@2x.png create mode 100644 resources/images/ui2/keycard-chip-light@3x.png create mode 100644 resources/images/ui2/keycard-logo@2x.png create mode 100644 resources/images/ui2/keycard-logo@3x.png create mode 100644 resources/images/ui2/keycard-watermark@2x.png create mode 100644 resources/images/ui2/keycard-watermark@3x.png create mode 100644 src/quo2/components/keycard/component_spec.cljs create mode 100644 src/quo2/components/keycard/style.cljs create mode 100644 src/quo2/components/keycard/view.cljs create mode 100644 src/quo2/foundations/resources.cljs create mode 100644 src/status_im2/contexts/quo_preview/keycard/keycard.cljs diff --git a/resources/images/ui2/keycard-chip-dark@2x.png b/resources/images/ui2/keycard-chip-dark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3b37157fb2a31025b4d60438dbfd8e69e4d88658 GIT binary patch literal 1903 zcmV-#2ax!QP)XbB2_ccWUr>uL-Z5zW_G)_s=SLg#w&C=R>au5Uc8;CWX9tar*P?aEcLO z0}4S1@s;|P4^Kgs1ksJGfe`bjRTw$*$@=nlSB1#^__SikHo^x9-{5NjCjcoWwkg%- zbbBYR|A8Qa7eLB+a3Dgx7FV+_3KW9^L-dqtMcpQqeUkf`KoGYU7cM(7L}-g*@x}~f zn+jpWh*6+Ad-x?UMB*c1cjtd-KH7nPQh06YO= z!kxV!I)LyYVIDrX5BKhFLO&UKxtz2h0ACx75*KGLEkQO}gZ7jW2B(fSwSZ`vMlUDC zM__@GvtvQaAQ&aSP>)NHB6NO$Il&vMp;I@Na~ozK^&I=*_o~p&B}~XD;hpXk#gUnT z6rsg{qw76rivnpV`}g4yuR*6%>;H%#av~@^IpPsMqz_y^7LDh_&~|Va7$p=KIjY1p z3Q9y>VLJzolf)#qdQjYE>|ObV6GV2Y5w=cV(1nf?o4SQ5n<8?8NEy1aSX8Zqk1<_w z^{`9Wj}s*hY86fpDMBZU=$tv#K2_}#Wee93IwKyF$6Lf@$S9$y0WBiG^A9J8l%U0c ziQ%+i#^)czjCeLmgbjv>{wDgDI={mSB3%?1+q+?-;ou{!9t{3se#a>O!`pe-fF!`J zZ`-u?_aUjj#}fFT#}OaS9WE#buY?Ovni|kk#5lCe)?v7EanRqxa|B5-cxD)Eg5_~+ zX~mcpn##Fdp*~bqq#Qh<+ONdVpo6zmD~0-3nEpXk6QcVY?Fcdc<^&``edC{C#M+m@7rsL_atA|;55juKSptwB@}!L*_JQ&FN0Q9%Sh?+pyZt!$1@ zE|<41h+IAoN&P*201H6oygs8Gwrx60kKj&Kk=lE}QNKo9djseVtP;@E2HL`+Ljjds zQfUurFJYSL%he0~u)!!gQL7CuvAoCFoggeiC3C}SRCWpFkg8%SW(i7GA;Sh^Z-Wxh zuoHwmerN1l5s3=*2g^eON)R{=aGCu!VRM48fgY7u5aLEX720b+Q)287dhEYN*qk6N z^BZFyH=k$$p~I-K&N-ON3%DtUy7rJ0gk3l%bIBhW)|tM$jGgOGRt}vYEMb(IsgcY% zjSA~SG1sQxA_UdH=mcS(I$`6IKW@}>P^E3IFhgCt-~?fxUN(8GZwNU-IJ$6xuulO} zj1z=?$ifn{wcYD>aWDPJ+`Ra z5yHkLnmyGUfDw=rgk7c>d)GNfR{{7Okba|M~={I2jg`q2Xo0Pw`1CHhivV!q}uz?b_UMtzl3WK z#yuY>r!<&Dxroo$x#cXmyNc6`J7jBt&apMTe}j4~hL7Nf;F8a{+wb^{oy#}Ixa)i1 zu!a`KVLO;y$c`kR#&kgnh&i&4kO?JzajT4!U?h{2bE`~g8>uk%+syCa@{J&2b%ID2 zyAX{aC;E{8}F`kh-? zNcsWVrRZ%c0X;%=s4_pp)WlG6nkNB-56A!^`=MY(7d z(g#;u>NVe}nX3^`%Kc>_ay}$XYyUCqxB6F?uvu@AAk!!aYDrm*i4NRywrhIv1c+~; zeNUrAxnIBA*IOHpS0-SfU_}%%C&V(O4}5E&nIImv8u5v1M0Q#|yodAp(hZeVh}R%N zhF=VnC?7(Qv17Q4mQ9~0nB@O7%jgFJtD9cBcQd~lKJaz&3<+h pP7peez#QN00009a7bBm001F4 z001F40Y#QEU;qFB0drDELIAGL9O(c600d`2O+f$vv5yP`ei$lY)^BzNKJT2k&@L}lYr@DqTaK=}f`p?fV| zxyj%{U5ID}MR8&KQb8#4Qi+-n$+YL`Ig{#SrqAQn&o;Jtx_9y?nijL7HjIZl&z06N5 zQi_6S?#D$H2L_A6aM~QF%u%y1*X-Xq@=MXoM*RcT)3v0 zuDvn+=5s|1wC}I}MvM3EQm+^}bc6=0aJ;rdcn?>}XLt7!DV+$Z8Be$vH&$cD7=u(1 z#ljfyyh8e}jrDa}UYMg^F=Psk#S?}x^PcwtsW93w6P@D>o-ntm8Ed4$HFb0xBT>U^T8X_wN7SLj`4+V~rD9Ay4B|b37qjGe$09aGM7el)>trTw54Rumi@pGmodV*~U_k5~<V!c1)uf*{*NrF)PRUHQq1WQ-)=o+l#Qj^O~Qsv>!G zDRcFZ3PX|L+JH2vQ#UV2xG&PA9&(*b2vvG7h{cdxsXZzTC6x>@LKSeQq-@X#Vf-ST ze~4sM7)maLz%`OPbx$~70|Rg=K0x+Wm8_1sQi_`lH3TVDio^$bOlriHl46Xi3PVAW zTDDVz-b8#Lk;kM)Tq(&N(*mCYBe^hDz!j3jkw<)x2O482Fj5VHkz66^X`csqe0PJo zQVI+*sU=rvCxns9H~pwE6r}?y3`OaH3PV9bT$IwRlU89UC_}(CQpQLUR~|7)E?FxT zhJqqB`K*6sc=9wa#JJkF&LqQmKe5CRrV^ct^58@2fBrCw5Y^ zwUD0FQZE$J4xU$ae7mT{P#}&2*GMfRQZE(aiZPPa$wOQ!3?-e!7CO@AW6Qu+I)B;~ zOS~6GYERF_>ZmXj31pjnX)QJ*1@Dq8#vpMDvU8u<)1|^tI+DR!FxP-_q^C3@uDs$D z$*ogiC{7@2VcaNbG6uqVRu8hFnzTwV0{7OHEXJG)Lvev@VD=GkjbwFx1_N(N7|z8| zi8w{FJj?$49Ym;1dE5LU4Ybz^sfAu%& z7xwJ^3sv{+qg_DV98XdEgyahK2d>z{KIOT;N^+x+7=;OdYmoRta>rt;;~zd6P_JRP zq@RSbf9S6?av0riwLh`nC&3f;eQIvr+_D_(LtX_$!8}GX-?&aD#tO*IGT_!RQbsEF zk$qB>6znDjb7oS#N7ibX*U;8-#9Azw@sRy-*{#VV-OJf1sh$#xONF6`Sb=0+Yk^pc zF9{>BI7NyZ)>;*OP1h>9l5kn1Co{WZVNPSAb&xE3JT?+`;f?gfU8hO9lq; z$T;dsDP5;dog4bDNfS9?E&f9?x52R_%d=@5%}Ob`v!w>Yjfm{Va8@e>pY9B&dyy}b zL8|XHV608=ONF6yg~UeA^(_A`V{vdcLjdohZK0LAQc4j)ii3S8exM;cfqddRnXnfBA~zicRxty7K}z3I z^7|&WpKx(7BpD=t@92*CCPaG2{5($uggb8U&Hh9?&7q^mXt0{c*DQ36$lSMgsl0@g z-oCL)LMAFh0M8e8O!xXHCa3CO)vqjii9)__R6=a3mwkS&J8XU0 z^F;m-%tRpp{I_Xi#pzlju*>HCT%>}*3xayFUSwdP&{^!L;(0GoiLv6~R(Gy}{F9n3 z@BEEUybc5{=pg}os^y7iz#2VxWiR>9nzs~Cfv5}&P!U!b7KvTZi^fQuBcoFN{J(kYakm1zSw7tqEega zJ}2V)^T^~gWe&RY0NEsNR;qz)s(c%9Tr#S=OiIyUOL5uUAANAiNL%bMVs~#_OUNUW zQy0{76bfr8rgn`BwN0cv`z@qm-mzDTEeA!7b6OSeDaK)rzB8iupIVAcgp^(&6l)+Y zQkw`*Og{7aYV_b_(|V{tb`TRnMhpD8o6rBTveqlQf$iw!)q`oS(seYD_Xy*Ae$?E!f9F{cTwa)?C3EZ_8m8fchp4FV{#U#`=a5Mu|H(9R)cM6|G46eeqN`ld tRxxZ3o1NkS{Iq?EEy$NK~#7F?Ook( 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 HS;+qb1K0E_ literal 0 HcmV?d00001 diff --git a/src/quo2/components/keycard/component_spec.cljs b/src/quo2/components/keycard/component_spec.cljs new file mode 100644 index 0000000000..350259efed --- /dev/null +++ b/src/quo2/components/keycard/component_spec.cljs @@ -0,0 +1,20 @@ +(ns quo2.components.keycard.component-spec + (:require [quo2.components.keycard.view :as keycard] + [test-helpers.component :as h] + [utils.i18n :as i18n])) + +(h/describe "keycard component" + (h/test "Render of keycard component when: Status = Empty, Locked = False" + (h/render [keycard/keycard]) + (-> (h/expect (h/query-by-label-text :holder-name)) + (h/is-equal (i18n/label :t/empty-keycard)))) + + (h/test "Render of keycard component when: Status = Filled, Locked = False" + (h/render [keycard/keycard {:holder-name? "Alisha"}]) + (-> (h/expect (h/query-by-label-text :holder-name)) + (h/is-equal (i18n/label :t/user-keycard {:name :holder-name})))) + + (h/test "Render of keycard component when: Status = Filled, Locked = True" + (h/render [keycard/keycard {:holder-name? "Alisha"}]) + (-> (h/expect (h/query-by-label-text :holder-name)) + (h/is-equal (i18n/label :t/user-keycard {:name :holder-name}))))) diff --git a/src/quo2/components/keycard/style.cljs b/src/quo2/components/keycard/style.cljs new file mode 100644 index 0000000000..d7791c6e0c --- /dev/null +++ b/src/quo2/components/keycard/style.cljs @@ -0,0 +1,42 @@ +(ns quo2.components.keycard.style + (:require [quo2.foundations.colors :as colors])) + +(def keycard-height 210) +(def keycard-chip-height 28) + +(defn card-container + [locked?] + {:overflow :hidden + :height keycard-height + :align-items :flex-start + :justify-content :space-between + :border-width 1 + :border-color (if locked? + colors/white-opa-5 + (colors/theme-colors colors/neutral-20 colors/neutral-80)) + :border-style :solid + :border-radius 16 + :padding 16 + :background-color (if locked? + (colors/theme-colors colors/danger colors/danger-opa-40) + (colors/theme-colors colors/neutral-5 colors/neutral-90))}) + +(defn keycard-logo + [locked?] + {:tint-color (if locked? colors/white (colors/theme-colors colors/neutral-100 colors/white))}) + +(defn keycard-watermark + [locked?] + {:position :absolute + :tint-color (if locked? colors/white-opa-5 (colors/theme-colors colors/neutral-100 colors/white)) + :align-self :center + :height 280.48 + :transform [{:rotate "-30deg"} {:translateY -30}] + :opacity (when-not locked? 0.02) + :z-index 1}) + +(def keycard-chip + {:height keycard-chip-height + :position :absolute + :right 16 + :top (/ (- keycard-height 28) 2)}) diff --git a/src/quo2/components/keycard/view.cljs b/src/quo2/components/keycard/view.cljs new file mode 100644 index 0000000000..ae2b462c38 --- /dev/null +++ b/src/quo2/components/keycard/view.cljs @@ -0,0 +1,38 @@ +(ns quo2.components.keycard.view + (:require [react-native.core :as rn] + [quo2.components.keycard.style :as style] + [quo2.components.tags.tag :as tag] + [quo2.foundations.colors :as colors] + [quo2.foundations.resources :as resources] + [utils.i18n :as i18n])) + +(defn keycard + "This component based on the following properties: + - :holder-name - Can be owner's name. Default is Empty + - :locked? - Boolean to specify whether the keycard is locked or not + " + [{:keys [holder-name locked?]}] + (let [label (if (boolean holder-name) + (i18n/label :t/user-keycard {:name holder-name}) + (i18n/label :t/empty-keycard))] + [rn/view {:style (style/card-container locked?)} + [rn/image + {:source (resources/get-image :keycard-logo) + :style (style/keycard-logo locked?)}] + [rn/image + {:source (resources/get-image + (if (or locked? (colors/dark?)) :keycard-chip-dark :keycard-chip-light)) + :style style/keycard-chip}] + [rn/image + {:source (resources/get-image :keycard-watermark) + :style (style/keycard-watermark locked?)}] + [tag/tag + {:size 32 + :type (when locked? :icon) + :label label + :labelled? true + :blurred? true + :resource (when locked? :i/locked) + :accessibility-label :holder-name + :icon-color colors/white-70-blur + :override-theme (when locked? :dark)}]])) diff --git a/src/quo2/core.cljs b/src/quo2/core.cljs index 41454db17b..2ea9056018 100644 --- a/src/quo2/core.cljs +++ b/src/quo2/core.cljs @@ -38,6 +38,7 @@ quo2.components.inputs.recovery-phrase.view quo2.components.inputs.search-input.view quo2.components.inputs.title-input.view + quo2.components.keycard.view quo2.components.links.url-preview-list.view quo2.components.links.url-preview.view quo2.components.links.link-preview.view @@ -126,6 +127,7 @@ ;;;; CARDS (def small-option-card quo2.components.onboarding.small-option-card.view/small-option-card) +(def keycard quo2.components.keycard.view/keycard) ;;;; COLORS (def color-picker quo2.components.colors.color-picker.view/view) diff --git a/src/quo2/foundations/resources.cljs b/src/quo2/foundations/resources.cljs new file mode 100644 index 0000000000..b897bc5bd5 --- /dev/null +++ b/src/quo2/foundations/resources.cljs @@ -0,0 +1,11 @@ +(ns quo2.foundations.resources) + +(def ui + {:keycard-logo (js/require "../resources/images/ui2/keycard-logo.png") + :keycard-chip-light (js/require "../resources/images/ui2/keycard-chip-light.png") + :keycard-chip-dark (js/require "../resources/images/ui2/keycard-chip-dark.png") + :keycard-watermark (js/require "../resources/images/ui2/keycard-watermark.png")}) + +(defn get-image + [k] + (get ui k)) diff --git a/src/status_im2/common/resources.cljs b/src/status_im2/common/resources.cljs index 3a8c043da2..9f59ea213c 100644 --- a/src/status_im2/common/resources.cljs +++ b/src/status_im2/common/resources.cljs @@ -15,7 +15,10 @@ :use-keycard (js/require "../resources/images/ui2/keycard.png") :onboarding-illustration (js/require "../resources/images/ui2/onboarding_illustration.png") :qr-code (js/require "../resources/images/ui2/qr-code.png") - }) + :keycard-logo (js/require "../resources/images/ui2/keycard-logo.png") + :keycard-chip-light (js/require "../resources/images/ui2/keycard-chip-light.png") + :keycard-chip-dark (js/require "../resources/images/ui2/keycard-chip-dark.png") + :keycard-watermark (js/require "../resources/images/ui2/keycard-watermark.png")}) (def mock-images {:coinbase (js/require "../resources/images/mock2/coinbase.png") diff --git a/src/status_im2/contexts/quo_preview/keycard/keycard.cljs b/src/status_im2/contexts/quo_preview/keycard/keycard.cljs new file mode 100644 index 0000000000..b92373a40a --- /dev/null +++ b/src/status_im2/contexts/quo_preview/keycard/keycard.cljs @@ -0,0 +1,37 @@ +(ns status-im2.contexts.quo-preview.keycard.keycard + (:require [status-im2.contexts.quo-preview.preview :as preview] + [react-native.core :as rn] + [quo2.foundations.colors :as colors] + [reagent.core :as reagent] + [quo2.core :as quo])) + +(def descriptor + [{:label "Holder" + :key :holder-name + :type :text} + {:label "Locked?" + :key :locked? + :type :boolean}]) + +(defn cool-preview + [] + (let [state (reagent/atom {:holder-name nil + :locked? true})] + (fn + [] + [rn/touchable-without-feedback {:on-press rn/dismiss-keyboard!} + [rn/view [preview/customizer state descriptor] + [quo/keycard + {:holder-name? (:holder-name @state) + :locked? (:locked? @state)}]]]))) + +(defn preview-keycard + [] + [rn/view + {:style {:background-color (colors/theme-colors colors/white colors/neutral-95) + :flex 1}} + [rn/flat-list + {:style {:flex 1} + :keyboard-should-persist-taps :always + :header [cool-preview] + :key-fn str}]]) diff --git a/src/status_im2/contexts/quo_preview/main.cljs b/src/status_im2/contexts/quo_preview/main.cljs index 350a7a5417..71d08cc6f7 100644 --- a/src/status_im2/contexts/quo_preview/main.cljs +++ b/src/status_im2/contexts/quo_preview/main.cljs @@ -90,7 +90,8 @@ [status-im2.contexts.quo-preview.wallet.lowest-price :as lowest-price] [status-im2.contexts.quo-preview.wallet.network-amount :as network-amount] [status-im2.contexts.quo-preview.wallet.network-breakdown :as network-breakdown] - [status-im2.contexts.quo-preview.wallet.token-overview :as token-overview])) + [status-im2.contexts.quo-preview.wallet.token-overview :as token-overview] + [status-im2.contexts.quo-preview.keycard.keycard :as keycard])) (def screens-categories {:foundations [{:name :shadows @@ -344,7 +345,10 @@ :component network-breakdown/preview-network-breakdown} {:name :network-amount :options {:topBar {:visible true}} - :component network-amount/preview}]}) + :component network-amount/preview}] + :keycard [{:name :keycard-component + :options {:topBar {:visible true}} + :component keycard/preview-keycard}]}) (def screens (flatten (map val screens-categories))) diff --git a/src/status_im2/setup/i18n_test.cljs b/src/status_im2/setup/i18n_test.cljs index e51e13def9..81bcf38019 100644 --- a/src/status_im2/setup/i18n_test.cljs +++ b/src/status_im2/setup/i18n_test.cljs @@ -992,7 +992,9 @@ :your-data-belongs-to-you :your-data-belongs-to-you-description :your-recovery-phrase - :your-recovery-phrase-description}) + :your-recovery-phrase-description + :empty-keycard + :user-keycard}) ;; NOTE: the rest checkpoints are based on the previous one, defined ;; like this: diff --git a/translations/en.json b/translations/en.json index 759e8f5ce9..c334b7a667 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1687,6 +1687,8 @@ "database-reset-content": "Chats, contacts and settings have been deleted. You can use your account with your Keycard", "database-reset-warning": "Database will be reset. Chats, contacts and settings will be deleted", "empty-keycard-required": "Requires an empty Keycard", + "empty-keycard": "Empty Keycard", + "user-keycard": "{{name}} Card", "current": "Current", "choose-storage": "Choose storage", "choose-new-location-for-keystore": "Choose a new location to save your keystore file",