From a2856cf1c39fdd23e18f33af71bae480500f5c3a Mon Sep 17 00:00:00 2001 From: Omar Basem Date: Mon, 27 Nov 2023 09:57:29 +0400 Subject: [PATCH 1/4] Wallet: Emoji picker performance (#17891) Wallet: Emoji picker navigation perf --- .../contexts/emoji_picker/view.cljs | 69 ++++++++++++------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/src/status_im2/contexts/emoji_picker/view.cljs b/src/status_im2/contexts/emoji_picker/view.cljs index 104a5a3596b..5a7c407ebd8 100644 --- a/src/status_im2/contexts/emoji_picker/view.cljs +++ b/src/status_im2/contexts/emoji_picker/view.cljs @@ -151,6 +151,34 @@ (reset! filtered-data nil) (reset! search-text "")) +(defn f-view + [{:keys [render-emojis? search-text on-change-text clear-states active-category scroll-ref theme] + :as sheet-opts}] + (let [search-active? (pos? (count @search-text))] + ;; rendering emojis is heavy on the UI thread, we need to delay rendering until the navigation + ;; animation completes. 250 is based on the default 300ms navigation duration. + (rn/use-effect #(js/setTimeout (fn [] (reset! render-emojis? true)) 250)) + [rn/keyboard-avoiding-view + {:style style/flex-spacer + :keyboard-vertical-offset 8} + [rn/view {:style style/flex-spacer} + [rn/view {:style style/search-input-container} + [quo/input + {:small? true + :placeholder (i18n/label :t/emoji-search-placeholder) + :icon-name :i/search + :value @search-text + :on-change-text on-change-text + :clearable? search-active? + :on-clear clear-states}]] + (when @render-emojis? + [render-list sheet-opts]) + (when-not search-active? + [footer + {:theme theme + :active-category active-category + :scroll-ref scroll-ref}])]])) + (defn- view-internal [_] (let [{:keys [on-select]} (rf/sub [:get-screen-params]) @@ -158,6 +186,7 @@ set-scroll-ref #(reset! scroll-ref %) search-text (reagent/atom "") filtered-data (reagent/atom nil) + render-emojis? (reagent/atom false) active-category (reagent/atom constants/default-category) clear-states #(clear {:active-category active-category :filtered-data filtered-data @@ -179,31 +208,19 @@ {:event event :active-category active-category :should-update-active-category? (nil? @filtered-data)}))] - (fn [{:keys [theme] :as sheet-opts}] - (let [search-active? (pos? (count @search-text))] - [rn/keyboard-avoiding-view - {:style style/flex-spacer - :keyboard-vertical-offset 8} - [rn/view {:style style/flex-spacer} - [rn/view {:style style/search-input-container} - [quo/input - {:small? true - :placeholder (i18n/label :t/emoji-search-placeholder) - :icon-name :i/search - :value @search-text - :on-change-text on-change-text - :clearable? search-active? - :on-clear clear-states}]] - [render-list - (merge {:filtered-data @filtered-data - :set-scroll-ref set-scroll-ref - :on-select on-select - :on-viewable-items-changed on-viewable-items-changed} - sheet-opts)] - (when-not search-active? - [footer - {:theme theme - :active-category active-category - :scroll-ref scroll-ref}])]])))) + (fn [sheet-opts] + [:f> f-view + (merge sheet-opts + {:render-emojis? render-emojis? + :search-text search-text + :on-change-text on-change-text + :clear-states clear-states + :filtered-data @filtered-data + :set-scroll-ref set-scroll-ref + :on-select on-select + :on-viewable-items-changed on-viewable-items-changed + :active-category active-category + :scroll-ref scroll-ref})]))) (def view (quo.theme/with-theme view-internal)) + From f82d28c6c9045a0fc40a4ba46a2cde308b25062c Mon Sep 17 00:00:00 2001 From: Volodymyr Kozieiev Date: Mon, 27 Nov 2023 12:29:12 +0000 Subject: [PATCH 2/4] Show network info on collectible info page (#17980) --- resources/images/icons2/20x20/opensea@2x.png | Bin 1185 -> 1033 bytes resources/images/icons2/20x20/opensea@3x.png | Bin 1679 -> 1673 bytes .../settings/data_item/component_spec.cljs | 4 +- .../components/settings/data_item/view.cljs | 11 ++-- .../quo_preview/settings/data_item.cljs | 2 + .../contexts/wallet/collectible/view.cljs | 56 ++++++++++-------- src/status_im2/subs/wallet/networks.cljs | 6 ++ 7 files changed, 49 insertions(+), 30 deletions(-) diff --git a/resources/images/icons2/20x20/opensea@2x.png b/resources/images/icons2/20x20/opensea@2x.png index 87897b37927e2d61457f8ab523a763b8ea4a394d..bb921a392a6481bb8b606a5b5e827e1ef69cda02 100644 GIT binary patch delta 997 zcmVOL zL_t(|0qs~#PTN2f{w7YqfkMr$6;yJ2fkIc^HS_|7UI1>;Z~~GWgcCrQ-N6YkCuq9s zE~x+ssf&&Z2vFVG6LPFge|?94;MY}w&H*xkf4OQcm=lzy zHQ%iP5xZKWIJk}65LLBi6fqhs)nE+f+RjGB=U1M5lKw<7Zx;it8cTsy)whS>I4;Gz z?k^ai3$axMBR@rxv^b$bxkCqiroo&q;_hWQK1MX?qq748kV)$ue%%xhXY^PJJG$z_ zF3izSo#94}i3=5^g0;z{f3?AbC;xQ92WCHlAyi%uw}qF6c#Ra$P92%kBJ-+wdQ%o4 zPGAVK#%6SW6fP2lU?So7z#P@iv;^A>IEj{ z6Wu2HY$ayxRDx~#Ma&|74-vwUDay0R|E#fKEwxN9^Fa)<5nU;G1*k?;sX65I#}(X#V`v?D5G+F+^z!Z}7}6$d`QZj2@o`LeTo3=PN?nyCb# zoIPw7igQnhH1{y^e=;)M6!$UlA~yHY9ctSna-%u_$m^@TK(o=}Qe6vCKlH-sEGx>+ zdMl|yqExpQwvrVd6u$;ZYm${5>n72tSw|HKI0+e(Z?IpGn!n7M--iEln(bY zOp`nQGli1IJIoG`!WbUE(XA{DWEJjW?D&m-bZWpTw+0t<{C1l6_-&3k9vgoFKL~LC T4Pptz00000NkvXXu0mjf|B245 delta 1150 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 diff --git a/src/quo/components/settings/data_item/component_spec.cljs b/src/quo/components/settings/data_item/component_spec.cljs index 987237a8008..e9cd8ea931d 100644 --- a/src/quo/components/settings/data_item/component_spec.cljs +++ b/src/quo/components/settings/data_item/component_spec.cljs @@ -1,6 +1,7 @@ (ns quo.components.settings.data-item.component-spec (:require [quo.core :as quo] + [quo.foundations.resources :as quo.resources] [test-helpers.component :as h])) (h/describe @@ -161,7 +162,8 @@ :subtitle "Description" :icon :i/placeholder :emoji "🎮" - :customization-color :yellow}]) + :customization-color :yellow + :network-image (quo.resources/get-network :ethereum)}]) (h/is-truthy (h/query-by-label-text :description-image))) (h/test "description emoji is visible when description is account" diff --git a/src/quo/components/settings/data_item/view.cljs b/src/quo/components/settings/data_item/view.cljs index 982697dc4f9..fec1c6f4e19 100644 --- a/src/quo/components/settings/data_item/view.cljs +++ b/src/quo/components/settings/data_item/view.cljs @@ -7,7 +7,6 @@ [quo.components.markdown.text :as text] [quo.components.settings.data-item.style :as style] [quo.foundations.colors :as colors] - [quo.foundations.resources :as quo.resources] [quo.theme :as quo.theme] [react-native.core :as rn] [utils.i18n :as i18n])) @@ -17,7 +16,8 @@ [rn/view {:style (style/loading-container size blur? theme)}]) (defn- left-subtitle - [{:keys [theme size description icon icon-color blur? subtitle customization-color emoji]}] + [{:keys [theme size description icon icon-color blur? subtitle customization-color emoji + network-image]}] [rn/view {:style style/subtitle-container} (when (not= :small size) [rn/view {:style (style/subtitle-icon-container description)} @@ -33,7 +33,7 @@ :type :default}] :network [rn/image {:accessibility-label :description-image - :source (quo.resources/tokens :eth) + :source network-image :style style/image}] nil)]) [text/text @@ -60,7 +60,7 @@ (defn- left-side "The description can either be given as a string `description` or a component `custom-subtitle`" [{:keys [theme title status size blur? description custom-subtitle icon subtitle label icon-color - customization-color + customization-color network-image emoji] :as props}] [rn/view {:style style/left-side} @@ -85,7 +85,8 @@ :blur? blur? :subtitle subtitle :customization-color customization-color - :emoji emoji}]))]) + :emoji emoji + :network-image network-image}]))]) (defn- right-side [{:keys [label icon-right? right-icon icon-color communities-list]}] diff --git a/src/status_im2/contexts/quo_preview/settings/data_item.cljs b/src/status_im2/contexts/quo_preview/settings/data_item.cljs index 0f51b5e15b3..37b5b0d6614 100644 --- a/src/status_im2/contexts/quo_preview/settings/data_item.cljs +++ b/src/status_im2/contexts/quo_preview/settings/data_item.cljs @@ -1,6 +1,7 @@ (ns status-im2.contexts.quo-preview.settings.data-item (:require [quo.core :as quo] + [quo.foundations.resources :as quo.resources] [reagent.core :as reagent] [status-im2.common.resources :as resources] [status-im2.contexts.quo-preview.preview :as preview])) @@ -50,6 +51,7 @@ :right-icon :i/chevron-right :emoji "🎮" :customization-color :yellow + :network-image (quo.resources/get-network :ethereum) :communities-list communities-list})] (fn [] [preview/preview-container diff --git a/src/status_im2/contexts/wallet/collectible/view.cljs b/src/status_im2/contexts/wallet/collectible/view.cljs index eea88279f63..99d5c729bfe 100644 --- a/src/status_im2/contexts/wallet/collectible/view.cljs +++ b/src/status_im2/contexts/wallet/collectible/view.cljs @@ -1,6 +1,8 @@ (ns status-im2.contexts.wallet.collectible.view (:require + [clojure.string :as string] [quo.core :as quo] + [quo.foundations.resources :as quo.resources] [react-native.core :as rn] [status-im2.common.scroll-page.view :as scroll-page] [status-im2.contexts.wallet.collectible.style :as style] @@ -80,33 +82,39 @@ :content-container-style style/traits-container}]])) (defn info - [] - [rn/view - {:style style/info-container} - [rn/view {:style style/account} - [quo/data-item - {:description :account - :card? true - :status :default - :size :default - :title (i18n/label :t/account-title) - :subtitle "Collectibles vault" - :emoji "🎮" - :customization-color :yellow}]] + [chain-id] + (let [network (rf/sub [:wallet/network-details-by-chain-id + chain-id]) + network-keyword (get network :network-name) + network-name (string/capitalize (name network-keyword))] + [rn/view + {:style style/info-container} + [rn/view {:style style/account} + [quo/data-item + {:description :account + :card? true + :status :default + :size :default + :title (i18n/label :t/account-title) + :subtitle "Collectibles vault" + :emoji "🎮" + :customization-color :yellow}]] - [rn/view {:style style/network} - [quo/data-item - {:description :network - :card? true - :status :default - :size :default - :title (i18n/label :t/network) - :subtitle (i18n/label :t/mainnet)}]]]) + [rn/view {:style style/network} + [quo/data-item + {:description :network + :card? true + :status :default + :size :default + :title (i18n/label :t/network) + :network-image (quo.resources/get-network network-keyword) + :subtitle network-name}]]])) (defn view [] - (let [collectible-details (rf/sub [:wallet/last-collectible-details]) - {:keys [name description preview-url traits]} collectible-details] + (let [collectible-details (rf/sub [:wallet/last-collectible-details]) + {:keys [name description preview-url traits id]} collectible-details + chain-id (get-in id [:contract-id :chain-id])] [scroll-page/scroll-page {:navigate-back? true :height 148 @@ -124,5 +132,5 @@ [header collectible-details] [cta-buttons] [tabs] - [info] + [info chain-id] [traits-section traits]]])) diff --git a/src/status_im2/subs/wallet/networks.cljs b/src/status_im2/subs/wallet/networks.cljs index afed703867c..fd1363c3512 100644 --- a/src/status_im2/subs/wallet/networks.cljs +++ b/src/status_im2/subs/wallet/networks.cljs @@ -41,3 +41,9 @@ :chain-id chain-id :related-chain-id related-chain-id))) networks))) + +(re-frame/reg-sub + :wallet/network-details-by-chain-id + :<- [:wallet/network-details] + (fn [networks [_ chain-id]] + (some #(when (= chain-id (:chain-id %)) %) networks))) From 1385e27cf46445a62a512a864387f765112b8421 Mon Sep 17 00:00:00 2001 From: Brian Sztamfater Date: Mon, 27 Nov 2023 11:03:02 -0300 Subject: [PATCH 3/4] feat: select asset screen ui (#17780) feat: select asset screen ui Signed-off-by: Brian Sztamfater --- resources/images/tokens/mainnet/AGLD@2x.png | Bin 0 -> 1934 bytes resources/images/tokens/mainnet/AGLD@3x.png | Bin 0 -> 2801 bytes resources/images/tokens/mainnet/CRV@2x.png | Bin 0 -> 9857 bytes resources/images/tokens/mainnet/CRV@3x.png | Bin 0 -> 17141 bytes src/mocks/js_dependencies.cljs | 1 + .../avatars/wallet_user_avatar/style.cljs | 26 ++- .../avatars/wallet_user_avatar/view.cljs | 18 +- .../components/list_items/address/view.cljs | 12 +- .../list_items/saved_address/view.cljs | 39 ++-- .../list_items/token_network/style.cljs | 22 +- .../list_items/token_network/view.cljs | 17 +- src/quo/foundations/resources.cljs | 193 +++++++++++++++++- src/react_native/core.cljs | 1 + src/status_im2/constants.cljs | 2 +- .../contexts/wallet/common/utils.cljs | 11 +- .../wallet/send/select_address/view.cljs | 25 ++- .../wallet/send/select_asset/style.cljs | 21 ++ .../wallet/send/select_asset/view.cljs | 108 ++++++++++ src/status_im2/contexts/wallet/temp.cljs | 29 ++- src/status_im2/navigation/screens.cljs | 5 + src/status_im2/subs/wallet/wallet.cljs | 26 ++- translations/en.json | 3 +- 22 files changed, 468 insertions(+), 91 deletions(-) create mode 100644 resources/images/tokens/mainnet/AGLD@2x.png create mode 100644 resources/images/tokens/mainnet/AGLD@3x.png create mode 100644 resources/images/tokens/mainnet/CRV@2x.png create mode 100644 resources/images/tokens/mainnet/CRV@3x.png create mode 100644 src/status_im2/contexts/wallet/send/select_asset/style.cljs create mode 100644 src/status_im2/contexts/wallet/send/select_asset/view.cljs diff --git a/resources/images/tokens/mainnet/AGLD@2x.png b/resources/images/tokens/mainnet/AGLD@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c24edcdba4d80b931d3d46d8ee27f5ec97f0fb2 GIT binary patch literal 1934 zcma)7do)|w9!@+X#49!NxFtQ>GE?#-B=ssu(Tfu5HLB9&Ajm@=#AB#ll<88+3R6XU z4LWzwF4UvNqGiqUs9HLuODEcDRZW*xhoav1#B|L3F@MZnYoEP;dwu8o{q}dhy-&Ws zpC<}wiiE*nC~q%16B_-M9ia+6?~JNkg9f;m>FExi9JI-V0xh9em>34rMk_lUR$gHY zgQ@s)gF+>tzCJXzfQMso1ZP2yPyih(N48j$+Fu+Sy|rs5l~pY)7TqU`Yg`Bc9-hCz5T66q+4@Mj`=F z77-_!#-tzroCAuSfmn$|NWK-5GeNOHDq@3- zBq*chABBk}Oz=->{=w@Id{-U3QjWjK14+KS1Zl3E?tNq^*s}@9hrE#tnE)~W?>NX? zaDSg524o~S9ImRWs-mKzrl!W{^BWr*>+0$%D=V*Fy;@UKbMD+ZBoeuA-##xdubrKp zjg5`Dxw)XAAX8IQBO{|vpFW91B6W3jZEfwfwY9CSEe?mXzP^sZV3C;L;9y-{-TeIgwzjs=&`=i_m(!({BNseXQb%gf6M1VS#CPfkwi>FI55ZgzBZn3AFpd^{^FD<&r9*|TSd4mX^}e(qu9j3WaiVa#~zm)X~xD?d`3uuC}+gKY#u_gTc6P;X+|y zp@W0N{QNwLL~?g`r%))7k&*A-y?gTHNq>L;(9qEA>@0MYPM$pJ>gxLZ`SaS^TIe)Q zO-)IqQbR+->FMdDq@=jGxTvV8u&}Vez(5|4=jiB|nVEU%(xr-uiiU=U#Kgp+qM|;2 zp#fxuhu-vKL9&W>a&92{n0_vKYQOHG4#1HUinxHV&b9msDLQh3P_OdL(5L_b1knBA z0=j=dmw^7;ru^Yy|5ED%{~N+IrqnZA$t@{A7AB|KesSpcR=aab$Cy0;I}qM=9btXK zE#4;~B3)7ZU9DDt%2Pvj8F%jM4O4g;ZrO|9+R9Ij+qX(7YY`3c zsoggP(roJ)Cu|=N^~=b?WV<+%N51dtD$U)R<;I;Au+G)I+0uz%JqBzhZB?%6UQbxD zfYH7aO-sa_`Cwu!z;IO)(ZLyh|v*{pZ2BLMhiY$5|7Spaq> zR;oD9GylmzM(kht*lSYNmMja+c1zJ7nEVo{YCwAX=%Ii653Xj|sKWoQf!WZF=V%x> zn!jXY9C#}+%gW@wk=jcBMFo(hZUEni-!uy6VZCRKJ0vDIb=vgQ%?J$+Sw3Mh3|u9m z^`g1^Bvmb$<2nawwfDxV+nqB`VQ)A`ww*Sf3_;3 z{wP&djBETm@hXqs?g-2fA8E&&1-yEkw5Tg_3HF<*S@!*= zIed#Gby>PYogKdYd=ukwqH2A;@qL=BehH&)yG>z1cIrP>x{M7YQkk5I0hQK+FPdY$ z?j83=4kcQmDX!dpYIeE3whx7}6U9HY-)O}q7`kzkZ5^|W&hzAL4E?sItNc-VGyLfP E2f=k5bN~PV literal 0 HcmV?d00001 diff --git a/resources/images/tokens/mainnet/AGLD@3x.png b/resources/images/tokens/mainnet/AGLD@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f25ed10db1f484f63bb535b642f9ca11d49993df GIT binary patch literal 2801 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 ArT_o{ literal 0 HcmV?d00001 diff --git a/resources/images/tokens/mainnet/CRV@3x.png b/resources/images/tokens/mainnet/CRV@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a3f17fdb5c0a86675251858460e1a4f7911476 GIT binary patch literal 17141 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 (count names) 0) (first names) "") - last-name (if (> (count names) 1) (last names) "")] - [rn/view {:style style/left-container} - [wallet-user-avatar/wallet-user-avatar - {:size :medium - :f-name first-name - :l-name last-name - :customization-color customization-color}] - [rn/view {:style style/account-container} - [text/text - {:weight :semi-bold - :size :paragraph-1 - :style style/name-text} - name] - [text/text {:size :paragraph-2} - [text/text - {:size :paragraph-2 - :weight :monospace - :style (style/account-address blur? theme)} - (or ens (address/get-shortened-key address))]]]])) + [rn/view {:style style/left-container} + [wallet-user-avatar/wallet-user-avatar + {:size :size-32 + :full-name name + :customization-color customization-color}] + [rn/view {:style style/account-container} + [text/text + {:weight :semi-bold + :size :paragraph-1 + :style style/name-text} + name] + [text/text {:size :paragraph-2} + [text/text + {:size :paragraph-2 + :weight :monospace + :style (style/account-address blur? theme)} + (or ens (address/get-shortened-key address))]]]]) (defn- internal-view [] diff --git a/src/quo/components/list_items/token_network/style.cljs b/src/quo/components/list_items/token_network/style.cljs index e53ea390dc7..721858609ad 100644 --- a/src/quo/components/list_items/token_network/style.cljs +++ b/src/quo/components/list_items/token_network/style.cljs @@ -26,21 +26,25 @@ (def info {:flex-direction :row - :align-items :center}) + :align-items :center + :width "70%"}) (def token-info - {:height 40}) + {:height 40 + :flex 1}) (def token-image - {:width 32 - :height 32 - :border-width 1 - :border-radius 16 - :border-color colors/neutral-80-opa-5 - :margin-right 8}) + {:width 32 + :height 32 + :border-width 1 + :border-radius 16 + :border-color colors/neutral-80-opa-5 + :margin-right 8 + :background-color colors/neutral-80-opa-5}) (def values-container - {:align-items :flex-end}) + {:align-items :flex-end + :max-width "30%"}) (defn fiat-value [theme] diff --git a/src/quo/components/list_items/token_network/view.cljs b/src/quo/components/list_items/token_network/view.cljs index 1aad33f33bb..b2b6c4f62f5 100644 --- a/src/quo/components/list_items/token_network/view.cljs +++ b/src/quo/components/list_items/token_network/view.cljs @@ -15,11 +15,14 @@ {:source (or (:source token) token) :style style/token-image}] [rn/view {:style style/token-info} - [text/text {:weight :semi-bold} label] + [text/text + {:weight :semi-bold + :number-of-lines 1} + (if-not (empty? label) label "-")] [preview-list/view {:type :network :size :size-14 - :number 3} + :number (count networks)} networks]]]) (defn- values @@ -30,12 +33,14 @@ :accessibility-label :check-icon}] [rn/view {:style style/values-container} [text/text - {:weight :medium - :size :paragraph-2} + {:weight :medium + :size :paragraph-2 + :number-of-lines 1} token-value] [text/text - {:style (style/fiat-value theme) - :size :paragraph-2} + {:style (style/fiat-value theme) + :size :paragraph-2 + :number-of-lines 1} fiat-value]])) (defn- view-internal diff --git a/src/quo/foundations/resources.cljs b/src/quo/foundations/resources.cljs index fef4dc933ef..9c601bcf170 100644 --- a/src/quo/foundations/resources.cljs +++ b/src/quo/foundations/resources.cljs @@ -33,14 +33,191 @@ (get dapps k)) (def tokens - {:eth (js/require "../resources/images/tokens/mainnet/ETH-token.png") - :knc (js/require "../resources/images/tokens/mainnet/KNC.png") - :mana (js/require "../resources/images/tokens/mainnet/MANA.png") - :rare (js/require "../resources/images/tokens/mainnet/RARE.png") - :dai (js/require "../resources/images/tokens/mainnet/DAI.png") - :fxc (js/require "../resources/images/tokens/mainnet/FXC.png") - :usdt (js/require "../resources/images/tokens/mainnet/USDT.png") - :snt (js/require "../resources/images/tokens/mainnet/SNT.png")}) + {:0-native (js/require "../resources/images/tokens/mainnet/0-native.png") + :0xbtc (js/require "../resources/images/tokens/mainnet/0XBTC.png") + :1st (js/require "../resources/images/tokens/mainnet/1ST.png") + :abt (js/require "../resources/images/tokens/mainnet/ABT.png") + :abyss (js/require "../resources/images/tokens/mainnet/ABYSS.png") + :ae (js/require "../resources/images/tokens/mainnet/AE.png") + :agld (js/require "../resources/images/tokens/mainnet/AGLD.png") + :akro (js/require "../resources/images/tokens/mainnet/AKRO.png") + :amb (js/require "../resources/images/tokens/mainnet/AMB.png") + :ampl (js/require "../resources/images/tokens/mainnet/AMPL.png") + :ant (js/require "../resources/images/tokens/mainnet/ANT.png") + :appc (js/require "../resources/images/tokens/mainnet/APPC.png") + :ast (js/require "../resources/images/tokens/mainnet/AST.png") + :atmchain (js/require "../resources/images/tokens/mainnet/ATMChain.png") + :ausdc (js/require "../resources/images/tokens/mainnet/aUSDC.png") + :bal (js/require "../resources/images/tokens/mainnet/BAL.png") + :bam (js/require "../resources/images/tokens/mainnet/BAM.png") + :band (js/require "../resources/images/tokens/mainnet/BAND.png") + :bat (js/require "../resources/images/tokens/mainnet/BAT.png") + :blt (js/require "../resources/images/tokens/mainnet/BLT.png") + :blz (js/require "../resources/images/tokens/mainnet/BLZ.png") + :bnb (js/require "../resources/images/tokens/mainnet/BNB.png") + :bnt (js/require "../resources/images/tokens/mainnet/BNT.png") + :brln (js/require "../resources/images/tokens/mainnet/BRLN.png") + :btm (js/require "../resources/images/tokens/mainnet/BTM.png") + :btu (js/require "../resources/images/tokens/mainnet/BTU.png") + :cdai (js/require "../resources/images/tokens/mainnet/cDAI.png") + :cdt (js/require "../resources/images/tokens/mainnet/CDT.png") + :centra (js/require "../resources/images/tokens/mainnet/Centra.png") + :cfi (js/require "../resources/images/tokens/mainnet/CFI.png") + :ck (js/require "../resources/images/tokens/mainnet/CK.png") + :cnd (js/require "../resources/images/tokens/mainnet/CND.png") + :cob (js/require "../resources/images/tokens/mainnet/COB.png") + :comp (js/require "../resources/images/tokens/mainnet/COMP.png") + :crv (js/require "../resources/images/tokens/mainnet/CRV.png") + :cvc (js/require "../resources/images/tokens/mainnet/CVC.png") + :dai (js/require "../resources/images/tokens/mainnet/DAI.png") + :dat (js/require "../resources/images/tokens/mainnet/DAT.png") + :data (js/require "../resources/images/tokens/mainnet/DATA.png") + :dcn (js/require "../resources/images/tokens/mainnet/DCN.png") + :dgd (js/require "../resources/images/tokens/mainnet/DGD.png") + :dgx (js/require "../resources/images/tokens/mainnet/DGX.png") + :dlt (js/require "../resources/images/tokens/mainnet/DLT.png") + :dnt (js/require "../resources/images/tokens/mainnet/DNT.png") + :dpy (js/require "../resources/images/tokens/mainnet/DPY.png") + :drt (js/require "../resources/images/tokens/mainnet/DRT.png") + :dta (js/require "../resources/images/tokens/mainnet/DTA.png") + :edg (js/require "../resources/images/tokens/mainnet/EDG.png") + :edo (js/require "../resources/images/tokens/mainnet/EDO.png") + :ekg (js/require "../resources/images/tokens/mainnet/EKG.png") + :eko (js/require "../resources/images/tokens/mainnet/EKO.png") + :elf (js/require "../resources/images/tokens/mainnet/ELF.png") + :emona (js/require "../resources/images/tokens/mainnet/EMONA.png") + :eng (js/require "../resources/images/tokens/mainnet/ENG.png") + :enj (js/require "../resources/images/tokens/mainnet/ENJ.png") + :ens (js/require "../resources/images/tokens/mainnet/ENS.png") + :eos (js/require "../resources/images/tokens/mainnet/EOS.png") + :equad (js/require "../resources/images/tokens/mainnet/EQUAD.png") + :eth (js/require "../resources/images/tokens/mainnet/ETH-token.png") + :eth2x-fli (js/require "../resources/images/tokens/mainnet/ETH2x-FLI.png") + :ethos (js/require "../resources/images/tokens/mainnet/ETHOS.png") + :evx (js/require "../resources/images/tokens/mainnet/EVX.png") + :fuel (js/require "../resources/images/tokens/mainnet/FUEL.png") + :fun (js/require "../resources/images/tokens/mainnet/FUN.png") + :fxc (js/require "../resources/images/tokens/mainnet/FXC.png") + :gdc (js/require "../resources/images/tokens/mainnet/GDC.png") + :gen (js/require "../resources/images/tokens/mainnet/GEN.png") + :glm (js/require "../resources/images/tokens/mainnet/GLM.png") + :gno (js/require "../resources/images/tokens/mainnet/GNO.png") + :gnt (js/require "../resources/images/tokens/mainnet/GNT.png") + :grid (js/require "../resources/images/tokens/mainnet/GRID.png") + :grt (js/require "../resources/images/tokens/mainnet/GRT.png") + :hez (js/require "../resources/images/tokens/mainnet/HEZ.png") + :hst (js/require "../resources/images/tokens/mainnet/HST.png") + :ht (js/require "../resources/images/tokens/mainnet/HT.png") + :icn (js/require "../resources/images/tokens/mainnet/ICN.png") + :icos (js/require "../resources/images/tokens/mainnet/ICOS.png") + :iost (js/require "../resources/images/tokens/mainnet/IOST.png") + :kdo (js/require "../resources/images/tokens/mainnet/KDO.png") + :kin (js/require "../resources/images/tokens/mainnet/KIN.png") + :knc (js/require "../resources/images/tokens/mainnet/KNC.png") + :kudos (js/require "../resources/images/tokens/mainnet/Kudos.png") + :lend (js/require "../resources/images/tokens/mainnet/LEND.png") + :link (js/require "../resources/images/tokens/mainnet/LINK.png") + :lisk (js/require "../resources/images/tokens/mainnet/LISK.png") + :loom (js/require "../resources/images/tokens/mainnet/LOOM.png") + :lpt (js/require "../resources/images/tokens/mainnet/LPT.png") + :lrc (js/require "../resources/images/tokens/mainnet/LRC.png") + :mana (js/require "../resources/images/tokens/mainnet/MANA.png") + :mco (js/require "../resources/images/tokens/mainnet/MCO.png") + :mda (js/require "../resources/images/tokens/mainnet/MDA.png") + :met (js/require "../resources/images/tokens/mainnet/MET.png") + :mfg (js/require "../resources/images/tokens/mainnet/MFG.png") + :mgo (js/require "../resources/images/tokens/mainnet/MGO.png") + :mkr (js/require "../resources/images/tokens/mainnet/MKR.png") + :mln (js/require "../resources/images/tokens/mainnet/MLN.png") + :moc (js/require "../resources/images/tokens/mainnet/MOC.png") + :mod (js/require "../resources/images/tokens/mainnet/MOD.png") + :mth (js/require "../resources/images/tokens/mainnet/MTH.png") + :mtl (js/require "../resources/images/tokens/mainnet/MTL.png") + :myb (js/require "../resources/images/tokens/mainnet/MYB.png") + :nexo (js/require "../resources/images/tokens/mainnet/NEXO.png") + :nexxo (js/require "../resources/images/tokens/mainnet/NEXXO.png") + :nmr (js/require "../resources/images/tokens/mainnet/NMR.png") + :npxs (js/require "../resources/images/tokens/mainnet/NPXS.png") + :ogn (js/require "../resources/images/tokens/mainnet/OGN.png") + :omg (js/require "../resources/images/tokens/mainnet/OMG.png") + :otn (js/require "../resources/images/tokens/mainnet/OTN.png") + :oxt (js/require "../resources/images/tokens/mainnet/OXT.png") + :pax (js/require "../resources/images/tokens/mainnet/PAX.png") + :paxg (js/require "../resources/images/tokens/mainnet/PAXG.png") + :pay (js/require "../resources/images/tokens/mainnet/PAY.png") + :pbtc (js/require "../resources/images/tokens/mainnet/PBTC.png") + :plr (js/require "../resources/images/tokens/mainnet/PLR.png") + :poe (js/require "../resources/images/tokens/mainnet/POE.png") + :poly (js/require "../resources/images/tokens/mainnet/POLY.png") + :powr (js/require "../resources/images/tokens/mainnet/POWR.png") + :ppp (js/require "../resources/images/tokens/mainnet/PPP.png") + :ppt (js/require "../resources/images/tokens/mainnet/PPT.png") + :pt (js/require "../resources/images/tokens/mainnet/PT.png") + :qkc (js/require "../resources/images/tokens/mainnet/QKC.png") + :qrl (js/require "../resources/images/tokens/mainnet/QRL.png") + :qsp (js/require "../resources/images/tokens/mainnet/QSP.png") + :r (js/require "../resources/images/tokens/mainnet/R.png") + :rae (js/require "../resources/images/tokens/mainnet/RAE.png") + :rare (js/require "../resources/images/tokens/mainnet/RARE.png") + :rcn (js/require "../resources/images/tokens/mainnet/RCN.png") + :rdn (js/require "../resources/images/tokens/mainnet/RDN.png") + :ren (js/require "../resources/images/tokens/mainnet/REN.png") + :rep (js/require "../resources/images/tokens/mainnet/REP.png") + :req (js/require "../resources/images/tokens/mainnet/REQ.png") + :rhoc (js/require "../resources/images/tokens/mainnet/RHOC.png") + :rlc (js/require "../resources/images/tokens/mainnet/RLC.png") + :rol (js/require "../resources/images/tokens/mainnet/ROL.png") + :sai (js/require "../resources/images/tokens/mainnet/SAI.png") + :salt (js/require "../resources/images/tokens/mainnet/SALT.png") + :san (js/require "../resources/images/tokens/mainnet/SAN.png") + :sngls (js/require "../resources/images/tokens/mainnet/SNGLS.png") + :snm (js/require "../resources/images/tokens/mainnet/SNM.png") + :snt (js/require "../resources/images/tokens/mainnet/SNT.png") + :snx (js/require "../resources/images/tokens/mainnet/SNX.png") + :socks (js/require "../resources/images/tokens/mainnet/SOCKS.png") + :spank (js/require "../resources/images/tokens/mainnet/SPANK.png") + :spike (js/require "../resources/images/tokens/mainnet/SPIKE.png") + :spn (js/require "../resources/images/tokens/mainnet/SPN.png") + :st (js/require "../resources/images/tokens/mainnet/ST.png") + :storj (js/require "../resources/images/tokens/mainnet/STORJ.png") + :storm (js/require "../resources/images/tokens/mainnet/STORM.png") + :strk (js/require "../resources/images/tokens/mainnet/STRK.png") + :stx (js/require "../resources/images/tokens/mainnet/STX.png") + :sub (js/require "../resources/images/tokens/mainnet/SUB.png") + :supr (js/require "../resources/images/tokens/mainnet/SUPR.png") + :susd (js/require "../resources/images/tokens/mainnet/sUSD.png") + :taas (js/require "../resources/images/tokens/mainnet/TAAS.png") + :taud (js/require "../resources/images/tokens/mainnet/TAUD.png") + :tcad (js/require "../resources/images/tokens/mainnet/TCAD.png") + :tgbp (js/require "../resources/images/tokens/mainnet/TGBP.png") + :tkn (js/require "../resources/images/tokens/mainnet/TKN.png") + :tkx (js/require "../resources/images/tokens/mainnet/TKX.png") + :tnt (js/require "../resources/images/tokens/mainnet/TNT.png") + :trst (js/require "../resources/images/tokens/mainnet/TRST.png") + :trx (js/require "../resources/images/tokens/mainnet/TRX.png") + :tusd (js/require "../resources/images/tokens/mainnet/TUSD.png") + :ubi (js/require "../resources/images/tokens/mainnet/UBI.png") + :ubt (js/require "../resources/images/tokens/mainnet/UBT.png") + :ukg (js/require "../resources/images/tokens/mainnet/UKG.png") + :uni (js/require "../resources/images/tokens/mainnet/UNI.png") + :upp (js/require "../resources/images/tokens/mainnet/UPP.png") + :usdc (js/require "../resources/images/tokens/mainnet/USDC.png") + :usds (js/require "../resources/images/tokens/mainnet/USDS.png") + :usdt (js/require "../resources/images/tokens/mainnet/USDT.png") + :veri (js/require "../resources/images/tokens/mainnet/VERI.png") + :vgx (js/require "../resources/images/tokens/mainnet/VGX.png") + :vib (js/require "../resources/images/tokens/mainnet/VIB.png") + :wabi (js/require "../resources/images/tokens/mainnet/WaBi.png") + :wbtc (js/require "../resources/images/tokens/mainnet/WBTC.png") + :weth (js/require "../resources/images/tokens/mainnet/WETH.png") + :wings (js/require "../resources/images/tokens/mainnet/WINGS.png") + :wtc (js/require "../resources/images/tokens/mainnet/WTC.png") + :xaur (js/require "../resources/images/tokens/mainnet/XAUR.png") + :xpa (js/require "../resources/images/tokens/mainnet/XPA.png") + :xrl (js/require "../resources/images/tokens/mainnet/XRL.png") + :xuc (js/require "../resources/images/tokens/mainnet/XUC.png") + :zrx (js/require "../resources/images/tokens/mainnet/ZRX.png") + :zsc (js/require "../resources/images/tokens/mainnet/ZSC.png")}) (defn get-token [k] diff --git a/src/react_native/core.cljs b/src/react_native/core.cljs index 55bb246f32b..fee337520e2 100644 --- a/src/react_native/core.cljs +++ b/src/react_native/core.cljs @@ -17,6 +17,7 @@ (def view (reagent/adapt-react-class (.-View ^js react-native))) (def scroll-view (reagent/adapt-react-class (.-ScrollView ^js react-native))) +(def safe-area-view (reagent/adapt-react-class (.-SafeAreaView ^js react-native))) (def ^:private image-native (reagent/adapt-react-class (.-Image ^js react-native))) diff --git a/src/status_im2/constants.cljs b/src/status_im2/constants.cljs index aebf9b9f20b..cf315771f63 100644 --- a/src/status_im2/constants.cljs +++ b/src/status_im2/constants.cljs @@ -193,7 +193,7 @@ (def regx-address #"^0x[a-fA-F0-9]{40}$") (def regx-address-contains #"(?i)0x[a-fA-F0-9]{40}") (def regx-starts-with-uuid #"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}") -(def regx-address-fragment #"^0x[a-fA-F0-9]{1,40}$") +(def regx-full-or-partial-address #"^0x[a-fA-F0-9]{1,40}$") (def ^:const dapp-permission-contact-code "contact-code") (def ^:const dapp-permission-web3 "web3") diff --git a/src/status_im2/contexts/wallet/common/utils.cljs b/src/status_im2/contexts/wallet/common/utils.cljs index 9f403f59096..70abc3104ca 100644 --- a/src/status_im2/contexts/wallet/common/utils.cljs +++ b/src/status_im2/contexts/wallet/common/utils.cljs @@ -29,7 +29,7 @@ (/ n (Math/pow 10 (utils.number/parse-int decimals))) 0)) -(defn- total-token-value-in-all-chains +(defn total-token-value-in-all-chains [{:keys [balances-per-chain decimals]}] (->> balances-per-chain (vals) @@ -43,3 +43,12 @@ (* (total-token-value-in-all-chains token) (-> token :market-values-per-currency :usd :price)))) (reduce +))) + +(defn network-list + [{:keys [balances-per-chain]} networks] + (into #{} + (mapv (fn [chain-id] + (first (filter #(or (= (:chain-id %) chain-id) + (= (:related-chain-id %) chain-id)) + networks))) + (keys balances-per-chain)))) diff --git a/src/status_im2/contexts/wallet/send/select_address/view.cljs b/src/status_im2/contexts/wallet/send/select_address/view.cljs index ce80379c685..cade62a0747 100644 --- a/src/status_im2/contexts/wallet/send/select_address/view.cljs +++ b/src/status_im2/contexts/wallet/send/select_address/view.cljs @@ -50,7 +50,10 @@ send-address (rf/sub [:wallet/send-address]) valid-ens-or-address? (rf/sub [:wallet/valid-ens-or-address?])] [quo/address-input - {:on-focus #(reset! input-focused? true) + {:on-focus (fn [] + (when (empty? @input-value) + (rf/dispatch [:wallet/clean-local-suggestions])) + (reset! input-focused? true)) :on-blur #(reset! input-focused? false) :on-scan (fn [] (rn/dismiss-keyboard!) @@ -66,7 +69,7 @@ 300) :on-change-text (fn [text] (let [starts-like-eth-address (re-matches - constants/regx-address-fragment + constants/regx-full-or-partial-address text)] (when-not (= scanned-address text) (rf/dispatch [:wallet/clean-scanned-address])) @@ -86,8 +89,8 @@ ^{:key (str network)} [quo/text {:size :paragraph-2 - :style {:color (colors/resolve-color network theme)}} - (str (subs (name network) 0 3) ":")]) + :style {:color (colors/resolve-color (:network-name network) theme)}} + (str (:short-name network) ":")]) networks) [quo/text {:size :paragraph-2 @@ -130,16 +133,15 @@ [] (let [margin-top (safe-area/get-top) selected-tab (reagent/atom (:id (first tabs-data))) - on-close #(rf/dispatch [:navigate-back]) + on-close (fn [] + (rf/dispatch [:wallet/clean-scanned-address]) + (rf/dispatch [:wallet/clean-local-suggestions]) + (rf/dispatch [:navigate-back])) on-change-tab #(reset! selected-tab %) input-value (reagent/atom "") input-focused? (reagent/atom false)] (fn [] (let [valid-ens-or-address? (boolean (rf/sub [:wallet/valid-ens-or-address?]))] - (rn/use-effect (fn [] - (fn [] - (rf/dispatch [:wallet/clean-scanned-address]) - (rf/dispatch [:wallet/clean-local-suggestions])))) [rn/scroll-view {:content-container-style (style/container margin-top) :keyboard-should-persist-taps :handled @@ -173,7 +175,10 @@ :type :primary :disabled? (not valid-ens-or-address?) :container-style style/button - :on-press #(js/alert "Not implemented yet")} + :on-press (fn [] + (rf/dispatch [:wallet/select-send-address @input-value]) + (rf/dispatch [:navigate-to-within-stack + [:wallet-select-asset :wallet-select-address]]))} (i18n/label :t/continue)])] [:<> [quo/tabs diff --git a/src/status_im2/contexts/wallet/send/select_asset/style.cljs b/src/status_im2/contexts/wallet/send/select_asset/style.cljs new file mode 100644 index 00000000000..a1fa91402a2 --- /dev/null +++ b/src/status_im2/contexts/wallet/send/select_asset/style.cljs @@ -0,0 +1,21 @@ +(ns status-im2.contexts.wallet.send.select-asset.style + (:require [react-native.navigation :as navigation] + [react-native.platform :as platform])) + +(def container + {:flex 1 + :padding-top (when platform/android? (navigation/status-bar-height))}) + +(def title-container + {:margin-horizontal 20 + :margin-vertical 12}) + +(defn empty-container-style + [margin-bottom] + {:justify-content :center + :flex 1 + :margin-bottom margin-bottom}) + +(def search-input-container + {:padding-horizontal 20 + :padding-vertical 8}) diff --git a/src/status_im2/contexts/wallet/send/select_asset/view.cljs b/src/status_im2/contexts/wallet/send/select_asset/view.cljs new file mode 100644 index 00000000000..984dda3338e --- /dev/null +++ b/src/status_im2/contexts/wallet/send/select_asset/view.cljs @@ -0,0 +1,108 @@ +(ns status-im2.contexts.wallet.send.select-asset.view + (:require + [clojure.string :as string] + [quo.core :as quo] + [quo.foundations.resources :as quo.resources] + [quo.theme :as quo.theme] + [react-native.core :as rn] + [react-native.safe-area :as safe-area] + [reagent.core :as reagent] + [status-im2.contexts.wallet.send.select-asset.style :as style] + [utils.i18n :as i18n] + [utils.re-frame :as rf])) + +(def tabs-data + [{:id :tab/assets :label (i18n/label :t/assets) :accessibility-label :assets-tab} + {:id :tab/collectibles :label (i18n/label :t/collectibles) :accessibility-label :collectibles-tab}]) + +(defn- asset-component + [] + (fn [token _ _ _] + (let [on-press #(js/alert "Not implemented yet") + total-balance-formatted (.toFixed (:total-balance token) 2) + balance-fiat-formatted (.toFixed (:total-balance-fiat token) 2) + currency-symbol "$"] + [quo/token-network + {:token (quo.resources/get-token (keyword (string/lower-case (:symbol token)))) + :label (:name token) + :token-value (str total-balance-formatted " " (:symbol token)) + :fiat-value (str currency-symbol balance-fiat-formatted) + :networks (:networks token) + :on-press on-press}]))) + +(defn- asset-list + [search-text] + (let [filtered-tokens (rf/sub [:wallet/tokens-filtered search-text])] + [rn/flat-list + {:data filtered-tokens + :style {:flex 1} + :content-container-style {:padding-horizontal 8} + :keyboard-should-persist-taps :handled + :key-fn :id + :on-scroll-to-index-failed identity + :render-fn asset-component}])) + +(defn- tab-view + [search-text selected-tab] + (case selected-tab + :tab/assets [asset-list search-text] + :tab/collectibles [quo/empty-state + {:title (i18n/label :t/no-collectibles) + :description (i18n/label :t/no-collectibles-description) + :placeholder? true + :container-style (style/empty-container-style (safe-area/get-top))}])) + +(defn- search-input + [search-text] + (let [on-change-text #(reset! search-text %)] + (fn [] + [rn/view {:style style/search-input-container} + [quo/input + {:small? true + :placeholder (i18n/label :t/search-assets) + :icon-name :i/search + :value @search-text + :on-change-text on-change-text}]]))) + +(defn- f-view-internal + [] + (let [selected-tab (reagent/atom (:id (first tabs-data))) + search-text (reagent/atom "") + on-close #(rf/dispatch [:navigate-back-within-stack + :wallet-select-asset])] + (fn [] + [rn/safe-area-view {:style style/container} + [rn/scroll-view + {:content-container-style {:flex 1} + :keyboard-should-persist-taps :handled + :scroll-enabled false} + [quo/page-nav + {:icon-name :i/arrow-left + :on-press on-close + :accessibility-label :top-bar + :right-side :account-switcher + :account-switcher {:customization-color :purple + :on-press #(js/alert "Not implemented yet") + :state :default + :emoji "🍑"}}] + [quo/text-combinations + {:title (i18n/label :t/select-asset) + :container-style style/title-container + :title-accessibility-label :title-label}] + [quo/segmented-control + {:size 32 + :blur? false + :symbol false + :default-active :tab/assets + :container-style {:margin-horizontal 20 + :margin-vertical 8} + :data tabs-data + :on-change #(reset! selected-tab %)}] + [search-input search-text] + [tab-view @search-text @selected-tab]]]))) + +(defn- view-internal + [] + [:f> f-view-internal]) + +(def view (quo.theme/with-theme view-internal)) diff --git a/src/status_im2/contexts/wallet/temp.cljs b/src/status_im2/contexts/wallet/temp.cljs index 85f223eca9e..7262e2b1067 100644 --- a/src/status_im2/contexts/wallet/temp.cljs +++ b/src/status_im2/contexts/wallet/temp.cljs @@ -4,17 +4,24 @@ [status-im2.contexts.wallet.item-types :as types])) (def ens-local-suggestion-saved-address-mock - {:type types/saved-address - :name "Pedro" - :ens "pedro.eth" - :address "0x4732894732894738294783294723894723984" - :networks [:ethereum :optimism]}) + {:type types/saved-address + :name "Pedro" + :ens "pedro.eth" + :address "0x4732894732894738294783294723894723984" + :customization-color :purple + :networks [{:network-name :ethereum + :short-name "eth"} + {:network-name :optimism + :short-name "opt"}]}) (def ens-local-suggestion-mock {:type types/address :ens "pedro.eth" :address "0x4732894732894738294783294723894723984" - :networks [:ethereum :optimism]}) + :networks [{:network-name :ethereum + :short-name "eth"} + {:network-name :optimism + :short-name "opt"}]}) (def address-local-suggestion-saved-contact-address-mock {:type types/saved-contact-address @@ -32,12 +39,18 @@ :name "Peter Lamborginski" :address "0x12FaBc34De56Ef78A9B0Cd12Ef3456AbC7D8E9F0" :customization-color :magenta - :networks [:ethereum :optimism]}) + :networks [{:network-name :ethereum + :short-name "eth"} + {:network-name :optimism + :short-name "opt"}]}) (def address-local-suggestion-mock {:type types/address :address "0x1233cD34De56Ef78A9B0Cd12Ef3456AbC7123dee" - :networks [:ethereum :optimism]}) + :networks [{:network-name :ethereum + :short-name "eth"} + {:network-name :optimism + :short-name "opt"}]}) (defn find-matching-addresses [substring] diff --git a/src/status_im2/navigation/screens.cljs b/src/status_im2/navigation/screens.cljs index f8b221334b5..a1a6b54dc3e 100644 --- a/src/status_im2/navigation/screens.cljs +++ b/src/status_im2/navigation/screens.cljs @@ -50,6 +50,7 @@ [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.send.select-address.view :as wallet-select-address] + [status-im2.contexts.wallet.send.select-asset.view :as wallet-select-asset] [status-im2.navigation.options :as options] [status-im2.navigation.transitions :as transitions])) @@ -291,6 +292,10 @@ :options {:modalPresentationStyle :overCurrentContext} :component wallet-select-address/view} + {:name :wallet-select-asset + :options {:insets {:top? true}} + :component wallet-select-asset/view} + {:name :scan-address :options (merge options/dark-screen diff --git a/src/status_im2/subs/wallet/wallet.cljs b/src/status_im2/subs/wallet/wallet.cljs index 9cd8bd0731b..302fce349ce 100644 --- a/src/status_im2/subs/wallet/wallet.cljs +++ b/src/status_im2/subs/wallet/wallet.cljs @@ -1,5 +1,6 @@ (ns status-im2.subs.wallet.wallet - (:require [re-frame.core :as rf] + (:require [clojure.string :as string] + [re-frame.core :as rf] [status-im2.contexts.wallet.common.utils :as utils] [utils.number])) @@ -59,3 +60,26 @@ (-> wallet (get-in [:accounts current-viewing-account-address]) (assoc :balance (get balances current-viewing-account-address))))) + +(rf/reg-sub + :wallet/tokens-filtered + :<- [:wallet/current-viewing-account] + :<- [:wallet/network-details] + (fn [[account networks] [_ query]] + (let [tokens (map (fn [token] + (assoc token + :networks (utils/network-list token networks) + :total-balance (utils/total-token-value-in-all-chains token) + :total-balance-fiat (utils/calculate-balance token))) + (:tokens account)) + + sorted-tokens + (sort-by :name compare tokens) + filtered-tokens + (filter #(or (string/starts-with? (string/lower-case (:name %)) + (string/lower-case query)) + (string/starts-with? (string/lower-case (:symbol %)) + (string/lower-case query))) + sorted-tokens)] + (println filtered-tokens "3421342342432") + filtered-tokens))) diff --git a/translations/en.json b/translations/en.json index ba3c01ee177..43f88f4e11d 100644 --- a/translations/en.json +++ b/translations/en.json @@ -2390,6 +2390,7 @@ "invalid-address": "It’s not Ethereum address or ENS name", "address-already-in-use": "Address already being used", "address-copied": "Address copied", - "no-dapps-description": "We want dApps!" + "no-dapps-description": "We want dApps!", + "select-asset": "Select asset" } From f124ca425244ca90d647e1e2c42af9158189bbf2 Mon Sep 17 00:00:00 2001 From: Jamie Caprani Date: Mon, 27 Nov 2023 17:16:31 +0000 Subject: [PATCH 4/4] chore(wallet): add common page-nav component for account switcher (#17946) --- .../contexts/wallet/account/bridge/view.cljs | 16 ++++---------- .../contexts/wallet/account/view.cljs | 21 ++++-------------- .../wallet/common/account_switcher/view.cljs | 22 +++++++++++++++++++ .../wallet/send/select_address/view.cljs | 11 ++-------- 4 files changed, 32 insertions(+), 38 deletions(-) create mode 100644 src/status_im2/contexts/wallet/common/account_switcher/view.cljs diff --git a/src/status_im2/contexts/wallet/account/bridge/view.cljs b/src/status_im2/contexts/wallet/account/bridge/view.cljs index 745a0d29f8e..bae5a81aada 100644 --- a/src/status_im2/contexts/wallet/account/bridge/view.cljs +++ b/src/status_im2/contexts/wallet/account/bridge/view.cljs @@ -4,7 +4,7 @@ [quo.foundations.resources :as quo.resources] [react-native.core :as rn] [status-im2.contexts.wallet.account.bridge.style :as style] - [status-im2.contexts.wallet.common.sheets.account-options.view :as account-options] + [status-im2.contexts.wallet.common.account-switcher.view :as account-switcher] [status-im2.contexts.wallet.common.temp :as temp] [utils.i18n :as i18n] [utils.re-frame :as rf])) @@ -18,17 +18,9 @@ (let [networks (rf/sub [:wallet/network-details]) networks-logos (map network-logo networks)] [rn/view {:style {:flex 1}} - [quo/page-nav - {:icon-name :i/close - :on-press #(rf/dispatch [:navigate-back]) - :accessibility-label :top-bar - :right-side :account-switcher - :account-switcher {:customization-color :purple - :on-press #(rf/dispatch [:show-bottom-sheet - {:content account-options/view - :gradient-cover? true - :customization-color :purple}]) - :emoji "🍑"}}] + [account-switcher/view + {:on-press #(rf/dispatch [:navigate-back]) + :accessibility-label :top-bar}] [quo/text-combinations {:container-style style/header-container :title (i18n/label :t/bridge)}] diff --git a/src/status_im2/contexts/wallet/account/view.cljs b/src/status_im2/contexts/wallet/account/view.cljs index 458ae5c5615..16b41c60b35 100644 --- a/src/status_im2/contexts/wallet/account/view.cljs +++ b/src/status_im2/contexts/wallet/account/view.cljs @@ -5,7 +5,7 @@ [reagent.core :as reagent] [status-im2.contexts.wallet.account.style :as style] [status-im2.contexts.wallet.account.tabs.view :as tabs] - [status-im2.contexts.wallet.common.sheets.account-options.view :as account-options] + [status-im2.contexts.wallet.common.account-switcher.view :as account-switcher] [status-im2.contexts.wallet.common.temp :as temp] [status-im2.contexts.wallet.common.utils :as utils] [utils.i18n :as i18n] @@ -32,23 +32,10 @@ [] (let [selected-tab (reagent/atom (:id (first tabs-data)))] (fn [] - (let [{:keys [name color emoji balance]} (rf/sub [:wallet/current-viewing-account]) - networks (rf/sub [:wallet/network-details])] + (let [{:keys [name color balance]} (rf/sub [:wallet/current-viewing-account]) + ] [rn/view {:style {:flex 1}} - [quo/page-nav - {:type :wallet-networks - :background :blur - :icon-name :i/close - :on-press #(rf/dispatch [:wallet/close-account-page]) - :networks networks - :networks-on-press #(js/alert "Pressed Networks") - :right-side :account-switcher - :account-switcher {:customization-color color - :on-press #(rf/dispatch [:show-bottom-sheet - {:content account-options/view - :gradient-cover? true - :customization-color color}]) - :emoji emoji}}] + [account-switcher/view {:on-press #(rf/dispatch [:wallet/close-account-page])}] [quo/account-overview {:current-value (utils/prettify-balance balance) :account-name name diff --git a/src/status_im2/contexts/wallet/common/account_switcher/view.cljs b/src/status_im2/contexts/wallet/common/account_switcher/view.cljs new file mode 100644 index 00000000000..aebbd0bcf5d --- /dev/null +++ b/src/status_im2/contexts/wallet/common/account_switcher/view.cljs @@ -0,0 +1,22 @@ +(ns status-im2.contexts.wallet.common.account-switcher.view + (:require [quo.core :as quo] + [status-im2.contexts.wallet.common.sheets.account-options.view :as account-options] + [utils.re-frame :as rf])) + +(defn view + [{:keys [on-press accessibility-label] :or {accessibility-label :top-bar}}] + (let [{:keys [color emoji]} (rf/sub [:wallet/current-viewing-account]) + networks (rf/sub [:wallet/network-details])] + [quo/page-nav + {:icon-name :i/close + :on-press on-press + :accessibility-label accessibility-label + :networks networks + :networks-on-press #(js/alert "Pressed Networks") + :right-side :account-switcher + :account-switcher {:customization-color color + :on-press #(rf/dispatch [:show-bottom-sheet + {:content account-options/view + :gradient-cover? true + :customization-color color}]) + :emoji emoji}}])) diff --git a/src/status_im2/contexts/wallet/send/select_address/view.cljs b/src/status_im2/contexts/wallet/send/select_address/view.cljs index cade62a0747..20d365c06bf 100644 --- a/src/status_im2/contexts/wallet/send/select_address/view.cljs +++ b/src/status_im2/contexts/wallet/send/select_address/view.cljs @@ -7,6 +7,7 @@ [react-native.safe-area :as safe-area] [reagent.core :as reagent] [status-im2.constants :as constants] + [status-im2.contexts.wallet.common.account-switcher.view :as account-switcher] [status-im2.contexts.wallet.item-types :as types] [status-im2.contexts.wallet.send.select-address.style :as style] [utils.debounce :as debounce] @@ -146,15 +147,7 @@ {:content-container-style (style/container margin-top) :keyboard-should-persist-taps :handled :scroll-enabled false} - [quo/page-nav - {:icon-name :i/close - :on-press on-close - :accessibility-label :top-bar - :right-side :account-switcher - :account-switcher {:customization-color :purple - :on-press #(js/alert "Not implemented yet") - :state :default - :emoji "🍑"}}] + [account-switcher/view {:on-press on-close}] [quo/text-combinations {:title (i18n/label :t/send-to) :container-style style/title-container