From 96b88a427d0af9fe0002c191b00d8e7be1535782 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Thu, 29 Aug 2024 14:32:55 +0300 Subject: [PATCH] [#20720] feat: add ability to set currency from account Settings (#20772) * [#20720] feat: add ability to set currency from account Settings --- resources/images/tokens/mainnet/BTC.png | Bin 0 -> 1830 bytes resources/images/tokens/mainnet/BTC@2x.png | Bin 0 -> 4174 bytes resources/images/tokens/mainnet/BTC@3x.png | Bin 0 -> 6213 bytes resources/images/ui2/no-assets-dark@2x.png | Bin 0 -> 15176 bytes resources/images/ui2/no-assets-dark@3x.png | Bin 0 -> 29177 bytes resources/images/ui2/no-assets-light@2x.png | Bin 0 -> 15089 bytes resources/images/ui2/no-assets-light@3x.png | Bin 0 -> 29209 bytes src/legacy/status_im/data_store/settings.cljs | 12 +- .../status_im/multiaccounts/update/core.cljs | 7 +- src/legacy/status_im/utils/currency.cljs | 84 -------- .../settings/settings_item/view.cljs | 2 + src/status_im/common/json_rpc/events.cljs | 8 + src/status_im/common/resources.cljs | 5 +- src/status_im/constants.cljs | 2 + .../contexts/profile/login/events.cljs | 1 + .../contexts/profile/settings/events.cljs | 5 + .../contexts/profile/settings/list_items.cljs | 13 +- .../language_and_currency/currency/style.cljs | 8 + .../language_and_currency/currency/utils.cljs | 20 ++ .../language_and_currency/currency/view.cljs | 84 ++++++++ .../language_and_currency/data_store.cljs | 30 +++ .../data_store_test.cljs | 56 ++++++ .../language_and_currency/events.cljs | 18 ++ .../language_and_currency/events_test.cljs | 27 +++ .../settings/language_and_currency/view.cljs | 36 ++++ .../settings/privacy_and_security/view.cljs | 2 +- .../contexts/wallet/common/utils.cljs | 5 +- src/status_im/db.cljs | 1 + src/status_im/events.cljs | 1 + src/status_im/navigation/screens.cljs | 10 + src/status_im/subs/general.cljs | 24 +++ src/status_im/subs/general_test.cljs | 187 ++++++++++++++++++ src/status_im/subs/profile.cljs | 23 ++- src/status_im/subs/profile_test.cljs | 13 +- src/status_im/subs/root.cljs | 1 + src/status_im/subs/wallet/swap_test.cljs | 16 +- src/status_im/subs/wallet/wallet_test.cljs | 15 ++ status-go-version.json | 6 +- translations/en.json | 11 +- 39 files changed, 620 insertions(+), 113 deletions(-) create mode 100644 resources/images/tokens/mainnet/BTC.png create mode 100644 resources/images/tokens/mainnet/BTC@2x.png create mode 100644 resources/images/tokens/mainnet/BTC@3x.png create mode 100644 resources/images/ui2/no-assets-dark@2x.png create mode 100644 resources/images/ui2/no-assets-dark@3x.png create mode 100644 resources/images/ui2/no-assets-light@2x.png create mode 100644 resources/images/ui2/no-assets-light@3x.png delete mode 100644 src/legacy/status_im/utils/currency.cljs create mode 100644 src/status_im/contexts/settings/language_and_currency/currency/style.cljs create mode 100644 src/status_im/contexts/settings/language_and_currency/currency/utils.cljs create mode 100644 src/status_im/contexts/settings/language_and_currency/currency/view.cljs create mode 100644 src/status_im/contexts/settings/language_and_currency/data_store.cljs create mode 100644 src/status_im/contexts/settings/language_and_currency/data_store_test.cljs create mode 100644 src/status_im/contexts/settings/language_and_currency/events.cljs create mode 100644 src/status_im/contexts/settings/language_and_currency/events_test.cljs create mode 100644 src/status_im/contexts/settings/language_and_currency/view.cljs create mode 100644 src/status_im/subs/general_test.cljs diff --git a/resources/images/tokens/mainnet/BTC.png b/resources/images/tokens/mainnet/BTC.png new file mode 100644 index 0000000000000000000000000000000000000000..ee426a391bdf30c04b4c0b1bc8d07c6d9ff27618 GIT binary patch literal 1830 zcmV+>2if?EP)vS=-@X*F2nFh&f`C!*%_t;A7jg<2qiq~ID*~v#r38E z%ZZ$~-56x7*$=+Qn}JW6F*L?qy_$h4WHG4huAkNj;}Ps>DA~Zd+Dyml6}+$lJ>e|i zrBB5MtZc}5;RyIveh6%Gamx37r01Mf_0*TFO-K-3NdUc79T`NblcEic`_}-!D=@my zJ&W|Wx_%zy^>e_dEe1B}Zs0SX1h6BJ3bbV=o|*z#Pi}2^+#J3UAhuXs2HaRH4?G6e zBU@vH`p$y9^eeD}dHPv)9E{B=m>+xY`W@8GtKbIYTYV<@qf)$%k8h0-B7ZegK%MTM$DPTSCtUpHv5cEz1rklbR+olb*n z{~5$zy8sLyaQ{5VZ_Lcnq*>KP+|x0A4EqtM13`vYysc1-=b=)aJ4o?EDYfrHMg$qB}*{q2hxcY z%>SU{SzbB-k=@Th_>=h%{k|I1z(og9-xD7LFM25Ty2!=kP^dE|#^s}41OF&N=kdz! zllohQ`aqod3c_EmL?iiQbOJZQocA)gTAMgYRfety<``*)GIAvjf@2LL+z&F?;@o)3 zbZ`So<0KdrTuCV9;9Y_YeIUQZdbR#_wZ_jI>a6K>f3ie-OJr zydCwf1k8oiV9a@bWD4D@{x-0WHoDq_w?atS?+8w%i^Pk>^ust2qGtg@gMZrVw!&?+Y*Jz<1xdGc|Inkn1trfjU}Vm z`QR09Et!h`L7NA2tK07#I$70hOIGJgnh#=j(Ro5&F}_%TymT5^#$>I3+M+S_8h6uy zcCe2$fEz@F?n-Enu49PF%^f%xa%;@oU#7_s?C)NI@TUv#CZwO`R~sdb3!D*OO|OTO^EJ$ z731w?NEbGWj#?wbZIO{EY%udZ?45MEaXBy~y^;E(a6#-Dk9#8INP1DpgVeVf9vdM@ zQj|>9h6GC){p^G9;<1*4eN3MMu&mr6!Utd?UKd(UQI__(ULF|WLD;e zh+-{ao2Q%XxB?w3k&6nxhgn&x6U`adBB)P8t&mKUvfJBB75f(uvdQ16ru^!Tq~3en zTsps|y+%m&VhFu@R6Ea!_u;gq;#z}I)@1`u3G1+!;g;cDqU63P z0ib|@yEc(qBhQiQJ+Dpl0QRb@u!;UO+N-Xmv6&ugqVrfIoj_7jx@wFCeWkyl6K|Wb z@Z8~sSXu;cg)aE1rUrH&>QO0rnCZwYmply;>cypdF(jNo;>R#@wdPk}`VrE=|29^# UX1jxXIRF3v07*qoM6N<$f|-(PW&i*H literal 0 HcmV?d00001 diff --git a/resources/images/tokens/mainnet/BTC@2x.png b/resources/images/tokens/mainnet/BTC@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8b78b5ebd7a6c47809396913917667ae7ea43d77 GIT binary patch literal 4174 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 Y02W_ZaH4{)d;kCd07*qoM6N<$f*H}+*Z=?k literal 0 HcmV?d00001 diff --git a/resources/images/tokens/mainnet/BTC@3x.png b/resources/images/tokens/mainnet/BTC@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f099862d0a122f54ba1a46cabc7c1d5ba1683b32 GIT binary patch literal 6213 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 YV4dXzkfs1XOpP#LSrwToDU;y;0R})`9smFU literal 0 HcmV?d00001 diff --git a/resources/images/ui2/no-assets-light@2x.png b/resources/images/ui2/no-assets-light@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c18b4965bfad254068b6a5bf9f74e944161c6d GIT binary patch literal 15089 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 m#%b$+hvcurrency + [currency] + (-> currency + (name) + (string/lower-case) + (keyword))) + (defn rpc->settings [settings] (-> settings @@ -26,7 +34,7 @@ (update :wallet-legacy/visible-tokens rpc->visible-tokens) (update :pinned-mailservers rpc->pinned-mailservers) (update :link-previews-enabled-sites set) - (update :currency keyword) + (update :currency rpc->currency) (visibility-status-updates/<-rpc-settings) (set/rename-keys {:compressedKey :compressed-key :emojiHash :emoji-hash}))) @@ -34,5 +42,5 @@ (defn rpc->setting-value [{:keys [name] :as setting}] (condp = name - :currency (update setting :value keyword) + :currency (update setting :value rpc->currency) setting)) diff --git a/src/legacy/status_im/multiaccounts/update/core.cljs b/src/legacy/status_im/multiaccounts/update/core.cljs index 35fdafc035..b187b30cf1 100644 --- a/src/legacy/status_im/multiaccounts/update/core.cljs +++ b/src/legacy/status_im/multiaccounts/update/core.cljs @@ -1,5 +1,6 @@ (ns legacy.status-im.multiaccounts.update.core (:require + [legacy.status-im.data-store.settings :as settings] [legacy.status-im.utils.deprecated-types :as types] [status-im.constants :as constants] [taoensso.timbre :as log] @@ -81,7 +82,7 @@ [{:keys [db] :as cofx} setting setting-value] (let [current-multiaccount (:profile/profile db) setting-value (if (= :currency setting) - (keyword setting-value) + (settings/rpc->currency setting-value) setting-value) db (case setting :stickers/packs-pending @@ -104,7 +105,9 @@ db)] {:db (if setting-value (assoc-in db [:profile/profile setting] setting-value) - (update db :profile/profile dissoc setting))})) + (update db :profile/profile dissoc setting)) + :fx [(when (= setting :currency) + [:dispatch [:wallet/get-wallet-token-for-all-accounts]])]})) (rf/defn set-many-js [cofx settings-js] diff --git a/src/legacy/status_im/utils/currency.cljs b/src/legacy/status_im/utils/currency.cljs deleted file mode 100644 index 8599ce52fe..0000000000 --- a/src/legacy/status_im/utils/currency.cljs +++ /dev/null @@ -1,84 +0,0 @@ -(ns legacy.status-im.utils.currency - (:require - [utils.i18n :as i18n])) - -(def currencies - {:aed {:id :aed :code "AED" :display-name (i18n/label :t/currency-display-name-aed) :symbol "د.إ"} - :afn {:id :afn :code "AFN" :display-name (i18n/label :t/currency-display-name-afn) :symbol "؋"} - :ars {:id :ars :code "ARS" :display-name (i18n/label :t/currency-display-name-ars) :symbol "$"} - :aud {:id :aud :code "AUD" :display-name (i18n/label :t/currency-display-name-aud) :symbol "$"} - :bbd {:id :bbd :code "BBD" :display-name (i18n/label :t/currency-display-name-bbd) :symbol "$"} - :bdt {:id :bdt :code "BDT" :display-name (i18n/label :t/currency-display-name-bdt) :symbol " Tk"} - :bgn {:id :bgn :code "BGN" :display-name (i18n/label :t/currency-display-name-bgn) :symbol "лв"} - :bhd {:id :bhd :code "BHD" :display-name (i18n/label :t/currency-display-name-bhd) :symbol "BD"} - :bnd {:id :bnd :code "BND" :display-name (i18n/label :t/currency-display-name-bnd) :symbol "$"} - :bob {:id :bob :code "BOB" :display-name (i18n/label :t/currency-display-name-bob) :symbol "$b"} - :brl {:id :brl :code "BRL" :display-name (i18n/label :t/currency-display-name-brl) :symbol "R$"} - :btn {:id :btn :code "BTN" :display-name (i18n/label :t/currency-display-name-btn) :symbol "Nu."} - :cad {:id :cad :code "CAD" :display-name (i18n/label :t/currency-display-name-cad) :symbol "$"} - :chf {:id :chf :code "CHF" :display-name (i18n/label :t/currency-display-name-chf) :symbol "CHF"} - :clp {:id :clp :code "CLP" :display-name (i18n/label :t/currency-display-name-clp) :symbol "$"} - :cny {:id :cny :code "CNY" :display-name (i18n/label :t/currency-display-name-cny) :symbol "¥"} - :cop {:id :cop :code "COP" :display-name (i18n/label :t/currency-display-name-cop) :symbol "$"} - :crc {:id :crc :code "CRC" :display-name (i18n/label :t/currency-display-name-crc) :symbol "₡"} - :czk {:id :czk :code "CZK" :display-name (i18n/label :t/currency-display-name-czk) :symbol "Kč"} - :dkk {:id :dkk :code "DKK" :display-name (i18n/label :t/currency-display-name-dkk) :symbol "kr"} - :dop {:id :dop :code "DOP" :display-name (i18n/label :t/currency-display-name-dop) :symbol "RD$"} - :egp {:id :egp :code "EGP" :display-name (i18n/label :t/currency-display-name-egp) :symbol "£"} - :etb {:id :etb :code "ETB" :display-name (i18n/label :t/currency-display-name-etb) :symbol "Br"} - :eur {:id :eur :code "EUR" :display-name (i18n/label :t/currency-display-name-eur) :symbol "€"} - :gbp {:id :gbp :code "GBP" :display-name (i18n/label :t/currency-display-name-gbp) :symbol "£"} - :gel {:id :gel :code "GEL" :display-name (i18n/label :t/currency-display-name-gel) :symbol "₾"} - :ghs {:id :ghs :code "GHS" :display-name (i18n/label :t/currency-display-name-ghs) :symbol "¢"} - :hkd {:id :hkd :code "HKD" :display-name (i18n/label :t/currency-display-name-hkd) :symbol "$"} - :hrk {:id :hrk :code "HRK" :display-name (i18n/label :t/currency-display-name-hrk) :symbol "kn"} - :huf {:id :huf :code "HUF" :display-name (i18n/label :t/currency-display-name-huf) :symbol "Ft"} - :idr {:id :idr :code "IDR" :display-name (i18n/label :t/currency-display-name-idr) :symbol "Rp"} - :ils {:id :ils :code "ILS" :display-name (i18n/label :t/currency-display-name-ils) :symbol "₪"} - :inr {:id :inr :code "INR" :display-name (i18n/label :t/currency-display-name-inr) :symbol "₹"} - :isk {:id :isk :code "ISK" :display-name (i18n/label :t/currency-display-name-isk) :symbol "kr"} - :jmd {:id :jmd :code "JMD" :display-name (i18n/label :t/currency-display-name-jmd) :symbol "J$"} - :jpy {:id :jpy :code "JPY" :display-name (i18n/label :t/currency-display-name-jpy) :symbol "¥"} - :kes {:id :kes :code "KES" :display-name (i18n/label :t/currency-display-name-kes) :symbol "KSh"} - :krw {:id :krw :code "KRW" :display-name (i18n/label :t/currency-display-name-krw) :symbol "₩"} - :kwd {:id :kwd :code "KWD" :display-name (i18n/label :t/currency-display-name-kwd) :symbol "د.ك"} - :kzt {:id :kzt :code "KZT" :display-name (i18n/label :t/currency-display-name-kzt) :symbol "лв"} - :lkr {:id :lkr :code "LKR" :display-name (i18n/label :t/currency-display-name-lkr) :symbol "₨"} - :mad {:id :mad :code "MAD" :display-name (i18n/label :t/currency-display-name-mad) :symbol "MAD"} - :mdl {:id :mdl :code "MDL" :display-name (i18n/label :t/currency-display-name-mdl) :symbol "MDL"} - :mur {:id :mur :code "MUR" :display-name (i18n/label :t/currency-display-name-mur) :symbol "₨"} - :mwk {:id :mwk :code "MWK" :display-name (i18n/label :t/currency-display-name-mwk) :symbol "MK"} - :mxn {:id :mxn :code "MXN" :display-name (i18n/label :t/currency-display-name-mxn) :symbol "$"} - :myr {:id :myr :code "MYR" :display-name (i18n/label :t/currency-display-name-myr) :symbol "RM"} - :mzn {:id :mzn :code "MZN" :display-name (i18n/label :t/currency-display-name-mzn) :symbol "MT"} - :nad {:id :nad :code "NAD" :display-name (i18n/label :t/currency-display-name-nad) :symbol "$"} - :ngn {:id :ngn :code "NGN" :display-name (i18n/label :t/currency-display-name-ngn) :symbol "₦"} - :nok {:id :nok :code "NOK" :display-name (i18n/label :t/currency-display-name-nok) :symbol "kr"} - :npr {:id :npr :code "NPR" :display-name (i18n/label :t/currency-display-name-npr) :symbol "₨"} - :nzd {:id :nzd :code "NZD" :display-name (i18n/label :t/currency-display-name-nzd) :symbol "$"} - :omr {:id :omr :code "OMR" :display-name (i18n/label :t/currency-display-name-omr) :symbol "﷼"} - :pen {:id :pen :code "PEN" :display-name (i18n/label :t/currency-display-name-pen) :symbol "S/."} - :pgk {:id :pgk :code "PGK" :display-name (i18n/label :t/currency-display-name-pgk) :symbol "K"} - :php {:id :php :code "PHP" :display-name (i18n/label :t/currency-display-name-php) :symbol "₱"} - :pkr {:id :pkr :code "PKR" :display-name (i18n/label :t/currency-display-name-pkr) :symbol "₨"} - :pln {:id :pln :code "PLN" :display-name (i18n/label :t/currency-display-name-pln) :symbol "zł"} - :pyg {:id :pyg :code "PYG" :display-name (i18n/label :t/currency-display-name-pyg) :symbol "Gs"} - :qar {:id :qar :code "QAR" :display-name (i18n/label :t/currency-display-name-qar) :symbol "﷼"} - :ron {:id :ron :code "RON" :display-name (i18n/label :t/currency-display-name-ron) :symbol "lei"} - :rsd {:id :rsd :code "RSD" :display-name (i18n/label :t/currency-display-name-rsd) :symbol "Дин."} - :rub {:id :rub :code "RUB" :display-name (i18n/label :t/currency-display-name-rub) :symbol "₽"} - :sar {:id :sar :code "SAR" :display-name (i18n/label :t/currency-display-name-sar) :symbol "﷼"} - :sek {:id :sek :code "SEK" :display-name (i18n/label :t/currency-display-name-sek) :symbol "kr"} - :sgd {:id :sgd :code "SGD" :display-name (i18n/label :t/currency-display-name-sgd) :symbol "$"} - :thb {:id :thb :code "THB" :display-name (i18n/label :t/currency-display-name-thb) :symbol "฿"} - :ttd {:id :ttd :code "TTD" :display-name (i18n/label :t/currency-display-name-ttd) :symbol "TT$"} - :twd {:id :twd :code "TWD" :display-name (i18n/label :t/currency-display-name-twd) :symbol "NT$"} - :tzs {:id :tzs :code "TZS" :display-name (i18n/label :t/currency-display-name-tzs) :symbol "TSh"} - :try {:id :try :code "TRY" :display-name (i18n/label :t/currency-display-name-try) :symbol "₺"} - :uah {:id :uah :code "UAH" :display-name (i18n/label :t/currency-display-name-uah) :symbol "₴"} - :ugx {:id :ugx :code "UGX" :display-name (i18n/label :t/currency-display-name-ugx) :symbol "USh"} - :uyu {:id :uyu :code "UYU" :display-name (i18n/label :t/currency-display-name-uyu) :symbol "$U"} - :usd {:id :usd :code "USD" :display-name (i18n/label :t/currency-display-name-usd) :symbol "$"} - :vef {:id :vef :code "VEF" :display-name (i18n/label :t/currency-display-name-vef) :symbol "Bs"} - :vnd {:id :vnd :code "VND" :display-name (i18n/label :t/currency-display-name-vnd) :symbol "₫"} - :zar {:id :zar :code "ZAR" :display-name (i18n/label :t/currency-display-name-zar) :symbol "R"}}) diff --git a/src/quo/components/settings/settings_item/view.cljs b/src/quo/components/settings/settings_item/view.cljs index 4f800748ba..a68d9e077c 100644 --- a/src/quo/components/settings/settings_item/view.cljs +++ b/src/quo/components/settings/settings_item/view.cljs @@ -10,6 +10,7 @@ [quo.components.settings.settings-item.style :as style] [quo.components.tags.context-tag.view :as context-tag] [quo.components.tags.status-tags :as status-tags] + [quo.components.utilities.token.view :as token] [quo.foundations.colors :as colors] [quo.theme :as quo.theme] [react-native.core :as rn] @@ -59,6 +60,7 @@ :icon [icon/icon image-props (style/color blur? theme)] :avatar [user-avatar/user-avatar image-props] :icon-avatar [icon-avatar/icon-avatar image-props] + :token [token/view image-props] nil)])) (defn tag-component diff --git a/src/status_im/common/json_rpc/events.cljs b/src/status_im/common/json_rpc/events.cljs index c4bd54db83..1bce7c204e 100644 --- a/src/status_im/common/json_rpc/events.cljs +++ b/src/status_im/common/json_rpc/events.cljs @@ -94,3 +94,11 @@ (fn [params] (doseq [param params] (call param)))) + +(defn log-rpc-error + [_ [{:keys [event params]} error]] + (log/error (str "Failed to " event) + {:params params + :error error})) + +(rf/reg-event-fx :log-rpc-error log-rpc-error) diff --git a/src/status_im/common/resources.cljs b/src/status_im/common/resources.cljs index ae5e6f6f48..1ceec876bb 100644 --- a/src/status_im/common/resources.cljs +++ b/src/status_im/common/resources.cljs @@ -90,7 +90,10 @@ :dark (js/require "../resources/images/ui2/sweating-man-dark.png")} :no-pinned-messages {:light (js/require "../resources/images/ui2/no-pinned-messages-light.png") - :dark (js/require "../resources/images/ui2/no-pinned-messages-dark.png")}}) + :dark (js/require "../resources/images/ui2/no-pinned-messages-dark.png")} + :no-assets + {:light (js/require "../resources/images/ui2/no-assets-light.png") + :dark (js/require "../resources/images/ui2/no-assets-dark.png")}}) (def mock-images {:bored-ape (js/require "../resources/images/mock2/bored-ape.png") diff --git a/src/status_im/constants.cljs b/src/status_im/constants.cljs index b72bed8392..22c45ff76d 100644 --- a/src/status_im/constants.cljs +++ b/src/status_im/constants.cljs @@ -586,6 +586,8 @@ (def ^:const contact-item-height 56) +(def ^:const currency-item-height 64) + (def ^:const slippages [0.1 0.5 1]) (def ^:const default-slippage 0.5) (def ^:const max-recommended-slippage 5) diff --git a/src/status_im/contexts/profile/login/events.cljs b/src/status_im/contexts/profile/login/events.cljs index e0642291fe..e105be95c4 100644 --- a/src/status_im/contexts/profile/login/events.cljs +++ b/src/status_im/contexts/profile/login/events.cljs @@ -95,6 +95,7 @@ [:dispatch-later [{:ms 1500 :dispatch [:profile.login/non-critical-initialization]}]] [:dispatch [:network/check-expensive-connection]] [:profile.settings/get-profile-picture key-uid] + [:settings/get-currencies] (when (ff/enabled? ::ff/wallet.wallet-connect) [:dispatch [:wallet-connect/init]]) (when notifications-enabled? diff --git a/src/status_im/contexts/profile/settings/events.cljs b/src/status_im/contexts/profile/settings/events.cljs index 3675195403..89567e885c 100644 --- a/src/status_im/contexts/profile/settings/events.cljs +++ b/src/status_im/contexts/profile/settings/events.cljs @@ -151,3 +151,8 @@ [{:method "settings_mnemonicWasShown" :on-success #(log/debug "mnemonic was marked as shown") :on-error #(log/error "mnemonic was not marked as shown" %)}]]]})) + +(rf/reg-event-fx :profile.settings/update-currency + (fn [_ [currency]] + {:fx [[:dispatch [:profile.settings/profile-update :currency currency]] + [:dispatch [:wallet/get-wallet-token-for-all-accounts]]]})) diff --git a/src/status_im/contexts/profile/settings/list_items.cljs b/src/status_im/contexts/profile/settings/list_items.cljs index f158d3f8cb..fb68c3446a 100644 --- a/src/status_im/contexts/profile/settings/list_items.cljs +++ b/src/status_im/contexts/profile/settings/list_items.cljs @@ -85,13 +85,12 @@ :image :icon :blur? true :action :arrow} - (when config/show-not-implemented-features? - {:title (i18n/label :t/language-and-currency) - :on-press not-implemented/alert - :image-props :i/globe - :image :icon - :blur? true - :action :arrow})] + {:title (i18n/label :t/language-and-currency) + :on-press #(rf/dispatch [:open-modal :screen/settings.language-and-currency]) + :image-props :i/globe + :image :icon + :blur? true + :action :arrow}] [(when config/show-not-implemented-features? {:title (i18n/label :t/data-usage) :on-press not-implemented/alert diff --git a/src/status_im/contexts/settings/language_and_currency/currency/style.cljs b/src/status_im/contexts/settings/language_and_currency/currency/style.cljs new file mode 100644 index 0000000000..c860bcc58b --- /dev/null +++ b/src/status_im/contexts/settings/language_and_currency/currency/style.cljs @@ -0,0 +1,8 @@ +(ns status-im.contexts.settings.language-and-currency.currency.style) + +(def input-container + {:padding-horizontal 20 + :padding-vertical 8}) + +(def empty-results + {:margin-top 100}) diff --git a/src/status_im/contexts/settings/language_and_currency/currency/utils.cljs b/src/status_im/contexts/settings/language_and_currency/currency/utils.cljs new file mode 100644 index 0000000000..69632036f8 --- /dev/null +++ b/src/status_im/contexts/settings/language_and_currency/currency/utils.cljs @@ -0,0 +1,20 @@ +(ns status-im.contexts.settings.language-and-currency.currency.utils + (:require [status-im.constants :as constants])) + +(defn make-currency-item + "This function generates props for quo/category component item" + [{:keys [currency selected-currency on-change]}] + {:title (if (:token? currency) + (:short-name currency) + (str (:short-name currency) " · " (:symbol currency))) + :description :text + :description-props {:text (:name currency)} + :container-style {:height constants/currency-item-height} + :image (when (:token? currency) :token) + :image-props {:token (:id currency) + :size :size-20} + :action :selector + :action-props {:type :radio + :blur? true + :checked? (= selected-currency (:id currency)) + :on-change #(on-change (:id currency))}}) diff --git a/src/status_im/contexts/settings/language_and_currency/currency/view.cljs b/src/status_im/contexts/settings/language_and_currency/currency/view.cljs new file mode 100644 index 0000000000..6cb785b10b --- /dev/null +++ b/src/status_im/contexts/settings/language_and_currency/currency/view.cljs @@ -0,0 +1,84 @@ +(ns status-im.contexts.settings.language-and-currency.currency.view + (:require [quo.core :as quo] + [react-native.core :as rn] + [status-im.common.resources :as resources] + [status-im.constants :as constants] + [status-im.contexts.settings.language-and-currency.currency.style :as style] + [status-im.contexts.settings.language-and-currency.currency.utils :as utils] + [status-im.contexts.settings.language-and-currency.data-store :as data-store] + [utils.debounce :as debounce] + [utils.i18n :as i18n] + [utils.re-frame :as rf])) + +(defn- navigate-back + [] + (rf/dispatch [:navigate-back])) + +(defn- get-item-layout + [_ index] + #js {:length constants/currency-item-height + :offset (* constants/currency-item-height index) + :index index}) + +(defn- settings-category-view + [{:keys [title data]} _ _ {:keys [selected-currency on-currency-press]}] + [rn/delay-render + [quo/category + {:label title + :data (map (fn [currency] + (utils/make-currency-item + {:currency currency + :selected-currency selected-currency + :on-change on-currency-press})) + data) + :blur? true + :list-type :settings}]]) + +(defn view + [] + (let [[search-text set-search-text] (rn/use-state "") + on-currency-press (rn/use-callback #(rf/dispatch [:profile.settings/update-currency + %])) + selected-currency (rf/sub [:profile/currency]) + currencies (rf/sub [:currencies/categorized search-text]) + on-change-text (rn/use-callback + (debounce/debounce + #(set-search-text %) + 300)) + formatted-data (rn/use-memo + #(data-store/get-formatted-currency-data currencies) + [search-text currencies])] + [quo/overlay + {:type :shell + :top-inset? true} + [quo/page-nav + {:background :blur + :icon-name :i/arrow-left + :on-press navigate-back}] + [quo/page-top + {:title (i18n/label :t/currency)}] + [quo/input + {:small? true + :blur? true + :container-style style/input-container + :placeholder (i18n/label :t/search-currencies) + :icon-name :i/search + :on-change-text on-change-text}] + (when (zero? (:total currencies)) + [quo/empty-state + {:title (i18n/label :t/no-result) + :image (resources/get-themed-image :no-assets :dark) + :container-style style/empty-results + :description (i18n/label :t/try-with-different-currency)}]) + [rn/flat-list + {:data formatted-data + :render-data {:selected-currency selected-currency + :on-currency-press on-currency-press} + :render-fn settings-category-view + :get-item-layout get-item-layout + :initial-num-to-render 14 + :max-to-render-per-batch 20 + :scroll-event-throttle 16 + :shows-vertical-scroll-indicator false + :bounces false + :over-scroll-mode :never}]])) diff --git a/src/status_im/contexts/settings/language_and_currency/data_store.cljs b/src/status_im/contexts/settings/language_and_currency/data_store.cljs new file mode 100644 index 0000000000..fd08c1b151 --- /dev/null +++ b/src/status_im/contexts/settings/language_and_currency/data_store.cljs @@ -0,0 +1,30 @@ +(ns status-im.contexts.settings.language-and-currency.data-store + (:require [clojure.set :as set] + [utils.i18n :as i18n])) + +(defn rpc->currency + [currency] + (some-> currency + (dissoc :unicode) + (set/rename-keys + {:shortName :short-name + :isPopular :popular? + :isToken :token?}) + (update :id keyword))) + +(defn rpc->currencies + [currencies] + (map rpc->currency currencies)) + +(defn get-formatted-currency-data + [{:keys [popular crypto other]}] + (concat + (when (seq popular) + [{:title (i18n/label :t/popular-currencies) + :data popular}]) + (when (seq crypto) + [{:title (i18n/label :t/crypto) + :data crypto}]) + (when (seq other) + [{:title (i18n/label :t/all-currencies) + :data other}]))) diff --git a/src/status_im/contexts/settings/language_and_currency/data_store_test.cljs b/src/status_im/contexts/settings/language_and_currency/data_store_test.cljs new file mode 100644 index 0000000000..d20fac0a8d --- /dev/null +++ b/src/status_im/contexts/settings/language_and_currency/data_store_test.cljs @@ -0,0 +1,56 @@ +(ns status-im.contexts.settings.language-and-currency.data-store-test + (:require + [cljs.test :refer-macros [deftest is testing]] + matcher-combinators.test + [status-im.contexts.settings.language-and-currency.data-store :as sut])) + +(def raw-currency-popular + {:id "usd" + :shortName "USD" + :name "US Dollar" + :symbol "$" + :emoji "🇺🇸" + :isPopular true + :isToken false + :imageSource "https://example.com/image.png"}) + +(def raw-currency-token + {:id "btc" + :shortName "BTC" + :name "Bitcoin" + :symbol "" + :emoji "" + :isPopular false + :isToken true + :imageSource "https://example.com/image.png"}) + +(deftest rpc->currency-test + (testing "transforms a currency" + (is + (match? {:id :usd + :short-name "USD" + :symbol "$" + :emoji "🇺🇸" + :name "US Dollar" + :popular? true + :token? false} + (sut/rpc->currency raw-currency-popular))))) + +(deftest rpc->currencies-test + (testing "transforms and sorts raw keypairs" + (is + (match? [(sut/rpc->currency raw-currency-popular) + (sut/rpc->currency raw-currency-token)] + (sut/rpc->currencies [raw-currency-popular + raw-currency-token]))))) + +(deftest get-formatted-currency-data-test + (testing "returns formatted currency data" + (is + (match? [{:title "Popular currencies" + :data [(sut/rpc->currency raw-currency-popular)]} + {:title "Crypto" + :data [(sut/rpc->currency raw-currency-token)]}] + (sut/get-formatted-currency-data {:popular [(sut/rpc->currency raw-currency-popular)] + :crypto [(sut/rpc->currency raw-currency-token)] + :other []}))))) diff --git a/src/status_im/contexts/settings/language_and_currency/events.cljs b/src/status_im/contexts/settings/language_and_currency/events.cljs new file mode 100644 index 0000000000..4297041a75 --- /dev/null +++ b/src/status_im/contexts/settings/language_and_currency/events.cljs @@ -0,0 +1,18 @@ +(ns status-im.contexts.settings.language-and-currency.events + (:require [status-im.common.json-rpc.events :as json-rpc] + [status-im.contexts.settings.language-and-currency.data-store :as data-store] + [utils.collection] + [utils.re-frame :as rf])) + +(rf/reg-event-fx :settings/get-currencies-success + (fn [{:keys [db]} [currencies]] + (let [all-currencies (data-store/rpc->currencies currencies)] + {:db (assoc db + :currencies + (utils.collection/index-by :id all-currencies))}))) + +(rf/reg-fx :settings/get-currencies + (fn [] + (json-rpc/call {:method "appgeneral_getCurrencies" + :on-success [:settings/get-currencies-success] + :on-error [:log-rpc-error {:event :settings/get-currencies}]}))) diff --git a/src/status_im/contexts/settings/language_and_currency/events_test.cljs b/src/status_im/contexts/settings/language_and_currency/events_test.cljs new file mode 100644 index 0000000000..85fd9e74f3 --- /dev/null +++ b/src/status_im/contexts/settings/language_and_currency/events_test.cljs @@ -0,0 +1,27 @@ +(ns status-im.contexts.settings.language-and-currency.events-test + (:require + [cljs.test :refer-macros [is]] + matcher-combinators.test + status-im.contexts.settings.language-and-currency.events + [test-helpers.unit :as h])) + +(def raw-currency-popular + {:id "usd" + :shortName "USD" + :name "US Dollar" + :symbol "$" + :emoji "🇺🇸" + :isPopular true + :isToken false + :imageSource "https://example.com/image.png"}) + +(h/deftest-event :settings/get-currencies-success + [event-id dispatch] + (let [expected-effects {:db {:currencies {:usd {:id :usd + :short-name "USD" + :symbol "$" + :emoji "🇺🇸" + :name "US Dollar" + :popular? true + :token? false}}}}] + (is (match? expected-effects (dispatch [event-id [raw-currency-popular]]))))) diff --git a/src/status_im/contexts/settings/language_and_currency/view.cljs b/src/status_im/contexts/settings/language_and_currency/view.cljs new file mode 100644 index 0000000000..ccdba1c7e8 --- /dev/null +++ b/src/status_im/contexts/settings/language_and_currency/view.cljs @@ -0,0 +1,36 @@ +(ns status-im.contexts.settings.language-and-currency.view + (:require [quo.core :as quo] + [utils.i18n :as i18n] + [utils.re-frame :as rf])) + +(defn- navigate-back + [] + (rf/dispatch [:navigate-back])) + +(defn- on-currency-press + [] + (rf/dispatch [:open-modal :screen/settings.currency-selection])) + +(defn view + [] + (let [{:keys [name short-name token?] + :as currency} (rf/sub [:profile/currency-info]) + currency-title (if token? name (str short-name " · " (:symbol currency)))] + [quo/overlay + {:type :shell + :top-inset? true} + [quo/page-nav + {:background :blur + :icon-name :i/arrow-left + :on-press navigate-back}] + [quo/page-top + {:title (i18n/label :t/language-and-currency)}] + [quo/category + {:label (i18n/label :t/currency) + :data [{:title currency-title + :on-press on-currency-press + :description :text + :action :arrow + :description-props {:text name}}] + :blur? true + :list-type :settings}]])) diff --git a/src/status_im/contexts/settings/privacy_and_security/view.cljs b/src/status_im/contexts/settings/privacy_and_security/view.cljs index ceddc5fdb9..dd8ff21f54 100644 --- a/src/status_im/contexts/settings/privacy_and_security/view.cljs +++ b/src/status_im/contexts/settings/privacy_and_security/view.cljs @@ -95,7 +95,7 @@ show-profile-pictures-to open-show-profile-pictures-to-options)) (setting-preview-privacy preview-privacy? customization-color toggle-preview-privacy) - {:title (i18n/label :t/share-usage-data) + {:title (i18n/label :t/share-usage-data-with-status) :description :text :description-props {:text (i18n/label :t/from-all-profiles-on-device)} :blur? true diff --git a/src/status_im/contexts/wallet/common/utils.cljs b/src/status_im/contexts/wallet/common/utils.cljs index 3398b987e5..44c7e6173d 100644 --- a/src/status_im/contexts/wallet/common/utils.cljs +++ b/src/status_im/contexts/wallet/common/utils.cljs @@ -22,7 +22,10 @@ (defn prettify-balance [currency-symbol balance] - (str currency-symbol (cut-fiat-balance-to-two-decimals balance))) + (let [formatted-symbol (if (> (count currency-symbol) 1) + (str currency-symbol " ") + currency-symbol)] + (str formatted-symbol (cut-fiat-balance-to-two-decimals balance)))) (defn get-derivation-path [number-of-accounts] diff --git a/src/status_im/db.cljs b/src/status_im/db.cljs index 2fe4ecd7fb..b41b9e7ca3 100644 --- a/src/status_im/db.cljs +++ b/src/status_im/db.cljs @@ -13,6 +13,7 @@ :pairing/installations {} :group/selected-contacts #{} :chats {} + :currencies {} :current-chat-id nil :group-chat/selected-participants #{} :group-chat/deselected-members #{} diff --git a/src/status_im/events.cljs b/src/status_im/events.cljs index b0e6e05276..ad46c42aa9 100644 --- a/src/status_im/events.cljs +++ b/src/status_im/events.cljs @@ -34,6 +34,7 @@ status-im.contexts.onboarding.events status-im.contexts.profile.events status-im.contexts.profile.settings.events + status-im.contexts.settings.language-and-currency.events status-im.contexts.settings.wallet.saved-addresses.events status-im.contexts.shell.qr-reader.events status-im.contexts.shell.share.events diff --git a/src/status_im/navigation/screens.cljs b/src/status_im/navigation/screens.cljs index b5bf76dd88..5f93bde02e 100644 --- a/src/status_im/navigation/screens.cljs +++ b/src/status_im/navigation/screens.cljs @@ -58,6 +58,8 @@ [status-im.contexts.profile.settings.screens.password.view :as settings-password] [status-im.contexts.profile.settings.screens.syncing.view :as settings.syncing] [status-im.contexts.profile.settings.view :as settings] + [status-im.contexts.settings.language-and-currency.currency.view :as settings.currency-selection] + [status-im.contexts.settings.language-and-currency.view :as settings.language-and-currency] [status-im.contexts.settings.privacy-and-security.view :as settings.privacy-and-security] [status-im.contexts.settings.wallet.keypairs-and-accounts.missing-keypairs.encrypted-qr.view :as encrypted-keypair-qr] @@ -643,6 +645,14 @@ :options options/transparent-modal-screen-options :component settings.privacy-and-security/view} + {:name :screen/settings.language-and-currency + :options options/transparent-modal-screen-options + :component settings.language-and-currency/view} + + {:name :screen/settings.currency-selection + :options options/transparent-modal-screen-options + :component settings.currency-selection/view} + {:name :screen/change-password :options (assoc options/transparent-modal-screen-options :theme :dark) :component change-password/view} diff --git a/src/status_im/subs/general.cljs b/src/status_im/subs/general.cljs index 365e29730d..9bbb06e693 100644 --- a/src/status_im/subs/general.cljs +++ b/src/status_im/subs/general.cljs @@ -161,3 +161,27 @@ :<- [:network/status] (fn [status] (= status :online))) + +(re-frame/reg-sub :currencies/categorized + :<- [:currencies] + (fn [currencies [_ query]] + (let [search-lc (string/lower-case query)] + (reduce + (fn [acc currency] + (let [{:keys [popular? token? name short-name]} currency + matches-query? (or (string/includes? (string/lower-case + name) + search-lc) + (string/includes? (string/lower-case + short-name) + search-lc))] + (cond-> acc + matches-query? (update :total inc) + (and popular? matches-query?) (update :popular conj currency) + (and token? matches-query?) (update :crypto conj currency) + (and matches-query? (not popular?) (not token?)) (update :other conj currency)))) + {:total 0 + :popular [] + :crypto [] + :other []} + (vals currencies))))) diff --git a/src/status_im/subs/general_test.cljs b/src/status_im/subs/general_test.cljs new file mode 100644 index 0000000000..f04529de79 --- /dev/null +++ b/src/status_im/subs/general_test.cljs @@ -0,0 +1,187 @@ +(ns status-im.subs.general-test + (:require + [cljs.test :refer [is testing use-fixtures]] + [re-frame.db :as rf-db] + [test-helpers.unit :as h] + [utils.re-frame :as rf])) + +(use-fixtures :each + {:before #(reset! rf-db/app-db {}) + :after #(reset! rf-db/app-db {})}) + +(def currencies + {:usd + {:id :usd :short-name "USD" :symbol "$" :emoji "🇺🇸" :name "US Dollar" :popular? true :token? false} + :eur {:id :eur :short-name "EUR" :symbol "€" :emoji "🇪🇺" :name "Euro" :popular? true :token? false} + :btc + {:id :btc :short-name "BTC" :symbol "₿" :emoji "🇧🇹" :name "Bitcoin" :popular? false :token? true} + :eth + {:id :eth :short-name "ETH" :symbol "Ξ" :emoji "🇪🇹" :name "Ethereum" :popular? false :token? true} + :gbp {:id :gbp + :short-name "GBP" + :symbol "£" + :emoji "🇬🇧" + :name "British Pound" + :popular? false + :token? false} + :jpy {:id :jpy + :short-name "JPY" + :symbol "¥" + :emoji "🇯🇵" + :name "Japanese Yen" + :popular? false + :token? false}}) + +(h/deftest-sub :currencies/categorized + [sub-name] + (swap! rf-db/app-db assoc :currencies currencies) + + (testing "all currencies categorized correctly" + (is + (= {:total 6 + :popular [{:id :usd + :short-name "USD" + :symbol "$" + :emoji "🇺🇸" + :name "US Dollar" + :popular? true + :token? false} + {:id :eur + :short-name "EUR" + :symbol "€" + :emoji "🇪🇺" + :name "Euro" + :popular? true + :token? false}] + :crypto [{:id :btc + :short-name "BTC" + :symbol "₿" + :emoji "🇧🇹" + :name "Bitcoin" + :popular? false + :token? true} + {:id :eth + :short-name "ETH" + :symbol "Ξ" + :emoji "🇪🇹" + :name "Ethereum" + :popular? false + :token? true}] + :other [{:id :gbp + :short-name "GBP" + :symbol "£" + :emoji "🇬🇧" + :name "British Pound" + :popular? false + :token? false} + {:id :jpy + :short-name "JPY" + :symbol "¥" + :emoji "🇯🇵" + :name "Japanese Yen" + :popular? false + :token? false}]} + (rf/sub [sub-name ""])))) + + (testing "search query filters correctly" + (is (= {:total 1 + :popular [{:id :usd + :short-name "USD" + :symbol "$" + :emoji "🇺🇸" + :name "US Dollar" + :popular? true + :token? false}] + :crypto [] + :other []} + (rf/sub [sub-name "usd"]))) + (is + (= + {:total 1 + :popular + [{:id :eur :short-name "EUR" :symbol "€" :emoji "🇪🇺" :name "Euro" :popular? true :token? false}] + :crypto [] + :other []} + (rf/sub [sub-name "eur"]))) + (is + (= {:total 3 + :popular [] + :crypto [{:id :btc + :short-name "BTC" + :symbol "₿" + :emoji "🇧🇹" + :name "Bitcoin" + :popular? false + :token? true} + {:id :eth + :short-name "ETH" + :symbol "Ξ" + :emoji "🇪🇹" + :name "Ethereum" + :popular? false + :token? true}] + :other [{:id :gbp + :short-name "GBP" + :symbol "£" + :emoji "🇬🇧" + :name "British Pound" + :popular? false + :token? false}]} + (rf/sub [sub-name "t"])))) + + (testing "case insensitive search query" + (is (= {:total 1 + :popular [{:id :usd + :short-name "USD" + :symbol "$" + :emoji "🇺🇸" + :name "US Dollar" + :popular? true + :token? false}] + :crypto [] + :other []} + (rf/sub [sub-name "USD"]))) + (is + (= + {:total 1 + :popular + [{:id :eur :short-name "EUR" :symbol "€" :emoji "🇪🇺" :name "Euro" :popular? true :token? false}] + :crypto [] + :other []} + (rf/sub [sub-name "eUr"]))) + (is + (= {:total 3 + :popular [] + :crypto [{:id :btc + :short-name "BTC" + :symbol "₿" + :emoji "🇧🇹" + :name "Bitcoin" + :popular? false + :token? true} + {:id :eth + :short-name "ETH" + :symbol "Ξ" + :emoji "🇪🇹" + :name "Ethereum" + :popular? false + :token? true}] + :other [{:id :gbp + :short-name "GBP" + :symbol "£" + :emoji "🇬🇧" + :name "British Pound" + :popular? false + :token? false}]} + (rf/sub [sub-name "T"])))) + + (testing "search with no matching results" + (is (= {:total 0 + :popular [] + :crypto [] + :other []} + (rf/sub [sub-name "xyz"])))) + + (testing "all categories are included" + (is (= [:total :popular :crypto :other] + (keys (rf/sub [sub-name ""])))))) diff --git a/src/status_im/subs/profile.cljs b/src/status_im/subs/profile.cljs index c7f3b26c22..06ac358b04 100644 --- a/src/status_im/subs/profile.cljs +++ b/src/status_im/subs/profile.cljs @@ -4,7 +4,6 @@ [clojure.string :as string] [legacy.status-im.fleet.core :as fleet] [legacy.status-im.multiaccounts.db :as multiaccounts.db] - [legacy.status-im.utils.currency :as currency] [quo.theme] [re-frame.core :as re-frame] [status-im.common.pixel-ratio :as pixel-ratio] @@ -20,9 +19,9 @@ (re-frame/reg-sub :profile/currency - (fn [] - ;; returns "usd" by default as the support for other currencies are in progress on Mobile - constants/profile-default-currency)) + :<- [:profile/profile] + (fn [{:keys [currency]}] + (or currency constants/profile-default-currency))) (re-frame/reg-sub :profile/syncing-on-mobile-network? @@ -32,10 +31,20 @@ (re-frame/reg-sub :profile/currency-symbol + :<- [:currencies] :<- [:profile/currency] - (fn [currency-id] - (-> (get currency/currencies currency-id) - :symbol))) + (fn [[currencies currency-id]] + (let [currency (get currencies currency-id)] + (if (:token? currency) + (:short-name currency) + (:symbol currency))))) + +(re-frame/reg-sub + :profile/currency-info + :<- [:currencies] + :<- [:profile/currency] + (fn [[currencies currency-id]] + (get currencies currency-id))) (re-frame/reg-sub :profile/login-profiles-picture diff --git a/src/status_im/subs/profile_test.cljs b/src/status_im/subs/profile_test.cljs index 9b4b431e3f..55406b1398 100644 --- a/src/status_im/subs/profile_test.cljs +++ b/src/status_im/subs/profile_test.cljs @@ -100,6 +100,15 @@ :colorHash [[3 25] [4 3] [5 4] [2 0] [1 10] [5 2] [2 4] [1 17] [3 23] [2 19] [4 1]] :installation-id "cee7e269-1ca7-4468-a1dd-e60e5cfb0894"}) +(def sample-currency + {:usd {:id :usd + :short-name "USD" + :symbol "$" + :emoji "🇺🇸" + :name "US Dollar" + :popular? true + :token? false}}) + (h/deftest-sub :profile/currency [sub-name] (testing "returns the selected currency of user" @@ -109,7 +118,9 @@ (h/deftest-sub :profile/currency-symbol [sub-name] (testing "returns the symbol of the user's selected currency" - (swap! rf-db/app-db #(assoc % :profile/profile sample-profile)) + (swap! rf-db/app-db assoc + :profile/profile sample-profile + :currencies sample-currency) (is (match? "$" (rf/sub [sub-name]))))) (h/deftest-sub :profile/public-key diff --git a/src/status_im/subs/root.cljs b/src/status_im/subs/root.cljs index b515bbbe34..2bf2aabb00 100644 --- a/src/status_im/subs/root.cljs +++ b/src/status_im/subs/root.cljs @@ -74,6 +74,7 @@ (reg-root-key-sub :initials-avatar-font-file :initials-avatar-font-file) (reg-root-key-sub :alert-banners :alert-banners) (reg-root-key-sub :alert-banners/hide? :alert-banners/hide?) +(reg-root-key-sub :currencies :currencies) ;;onboarding (reg-root-key-sub :onboarding/generated-keys? :onboarding/generated-keys?) diff --git a/src/status_im/subs/wallet/swap_test.cljs b/src/status_im/subs/wallet/swap_test.cljs index 5b0dba310a..d1a8bab0f4 100644 --- a/src/status_im/subs/wallet/swap_test.cljs +++ b/src/status_im/subs/wallet/swap_test.cljs @@ -7,6 +7,15 @@ [test-helpers.unit :as h] [utils.re-frame :as rf])) +(def ^:private currencies + {:usd {:id :usd + :short-name "USD" + :symbol "$" + :emoji "🇺🇸" + :name "US Dollar" + :popular? true + :token? false}}) + (def networks {:mainnet-network {:full-name "Mainnet" @@ -146,7 +155,8 @@ (h/deftest-sub :wallet/swap-asset-to-pay-network-balance [sub-name] (testing "Return swap asset-to-pay" - (swap! rf-db/app-db assoc-in - [:wallet :ui :swap] - swap-data) + (swap! rf-db/app-db + #(-> % + (assoc :currencies currencies) + (assoc-in [:wallet :ui :swap] swap-data))) (is (match? {:crypto "1 SNT" :fiat "$0.03"} (rf/sub [sub-name 1]))))) diff --git a/src/status_im/subs/wallet/wallet_test.cljs b/src/status_im/subs/wallet/wallet_test.cljs index eaff51d605..8a8ffdea56 100644 --- a/src/status_im/subs/wallet/wallet_test.cljs +++ b/src/status_im/subs/wallet/wallet_test.cljs @@ -12,6 +12,15 @@ (use-fixtures :each {:before #(reset! rf-db/app-db {})}) +(def ^:private currencies + {:usd {:id :usd + :short-name "USD" + :symbol "$" + :emoji "🇺🇸" + :name "US Dollar" + :popular? true + :token? false}}) + (def ^:private accounts-with-tokens {:0x1 {:tokens [{:symbol "ETH" :balances-per-chain {1 {:raw-balance "100"}} @@ -318,6 +327,7 @@ (swap! rf-db/app-db #(-> % (assoc :wallet db/defaults) + (assoc :currencies currencies) (assoc-in [:wallet :accounts] accounts) (assoc-in [:wallet :current-viewing-account-address] "0x1") (assoc-in [:wallet :networks] network-data))) @@ -600,6 +610,7 @@ (testing "returns aggregated tokens (in quo/token-value props) and balances from all accounts" (swap! rf-db/app-db #(-> % (assoc :wallet db/defaults) + (assoc :currencies currencies) (assoc-in [:wallet :accounts] accounts))) (let [{:keys [formatted-balance tokens]} (rf/sub [sub-name])] (is (match? 2 (count tokens))) @@ -873,6 +884,7 @@ (assoc-in [:wallet :accounts] accounts) (assoc-in [:wallet :networks] network-data) (assoc-in [:wallet :current-viewing-account-address] "0x2") + (assoc :currencies currencies) (assoc-in [:profile/profile :currency] :usd))) (is (match? (count (rf/sub [sub-name ""])) 2)) (is (match? (count (rf/sub [sub-name "et"])) 1)))) @@ -936,6 +948,7 @@ #(-> % (assoc-in [:wallet :accounts] accounts) (assoc-in [:wallet :networks] network-data) + (assoc :currencies currencies) (assoc-in [:profile/profile :currency] :usd))) (let [result (rf/sub [sub-name]) @@ -952,6 +965,7 @@ (assoc-in [:wallet :accounts] accounts) (assoc-in [:wallet :networks] network-data) (assoc-in [:wallet :current-viewing-account-address] "0x2") + (assoc :currencies currencies) (assoc-in [:profile/profile :currency] :usd))) (let [result (rf/sub [sub-name]) @@ -969,6 +983,7 @@ (assoc-in [:wallet :accounts] accounts-with-tokens) (assoc-in [:wallet :current-viewing-account-address] "0x1") (assoc-in [:wallet :ui :send :route] route-data) + (assoc :currencies currencies) (assoc-in [:profile/profile :currency] :usd) (assoc-in [:profile/profile :currency-symbol] "$"))) diff --git a/status-go-version.json b/status-go-version.json index 60b7cca84d..c21a1b3768 100644 --- a/status-go-version.json +++ b/status-go-version.json @@ -3,7 +3,7 @@ "_comment": "Instead use: scripts/update-status-go.sh ", "owner": "status-im", "repo": "status-go", - "version": "v0.184.47", - "commit-sha1": "83aa01c7daf69d518e624fc584ea22ca27b34b73", - "src-sha256": "07gqijx652ap0lf0kvcpd0lxx5x58air19pxgjawwymq2b8kly16" + "version": "v0.184.48", + "commit-sha1": "0f8e6d0b4e4ebfb1258dacde52d7603ad44c84d4", + "src-sha256": "0jp91py71marsiiw726518d9pb38dg7wv1di55cc1rjmd312xplx" } diff --git a/translations/en.json b/translations/en.json index eb8f5fc697..2cbf28182f 100644 --- a/translations/en.json +++ b/translations/en.json @@ -112,6 +112,7 @@ "all-addresses": "All addresses", "all-changes-will-be-discarded": "All changes in shared addresses for permissions will be discarded.", "all-connections": "All Connections", + "all-currencies": "All currencies", "all-messages": "All messages", "all-networks": "All networks", "all-time": "All time", @@ -539,6 +540,7 @@ "create-profile-password-info-box-description": "Your Status keys are the foundation of your self-sovereign identity in Web3. You have complete control over these keys, which you can use to sign transactions, access your data, and interact with Web3 services.\n\nYour keys are always securely stored on your device and protected by your Status profile password. Status doesn't know your password and can't reset it for you. If you forget your password, you may lose access to your Status profile and wallet funds.\n\nRemember your Status password and don't share it with anyone.", "create-profile-password-info-box-title": "About your profile password", "created-group-chat-description": "You created the group {{group-name}}", + "crypto": "Crypto", "cryptokitty-name": "CryptoKitty #{{id}}", "currency": "Currency", "currency-display-name-aed": "Emirati Dirham", @@ -552,6 +554,7 @@ "currency-display-name-bnd": "Brunei Darussalam Dollar", "currency-display-name-bob": "Bolivia Bolíviano", "currency-display-name-brl": "Brazil Real", + "currency-display-name-btc": "Bitcoin", "currency-display-name-btn": "Bhutanese Ngultrum", "currency-display-name-cad": "Canada Dollar", "currency-display-name-chf": "Switzerland Franc", @@ -560,10 +563,12 @@ "currency-display-name-cop": "Colombia Peso", "currency-display-name-crc": "Costa Rica Colon", "currency-display-name-czk": "Czech Koruna", + "currency-display-name-dai": "DAI", "currency-display-name-dkk": "Denmark Krone", "currency-display-name-dop": "Dominican Republic Peso", "currency-display-name-egp": "Egypt Pound", "currency-display-name-etb": "Ethiopian Birr", + "currency-display-name-eth": "Ethereum", "currency-display-name-eur": "Euro", "currency-display-name-gbp": "British Pound", "currency-display-name-gel": "Georgian Lari", @@ -608,6 +613,7 @@ "currency-display-name-sar": "Saudi Arabia Riyal", "currency-display-name-sek": "Sweden Krona", "currency-display-name-sgd": "Singapore Dollar", + "currency-display-name-snt": "Status Network Token", "currency-display-name-thb": "Thailand Baht", "currency-display-name-try": "Turkish Lira", "currency-display-name-ttd": "Trinidad and Tobago Dollar", @@ -1901,6 +1907,7 @@ }, "pinned-messages-empty": "Pinned messages will appear here. To pin a message, press and hold it and tap `Pin`", "podcasts": "Podcasts", + "popular-currencies": "Popular currencies", "positive": "Positive", "powered-by-paraswap": "Powered by Paraswap", "preference": "Preference", @@ -2125,6 +2132,7 @@ "search": "Search", "search-assets": "Search assets", "search-contacts": "Search contacts", + "search-currencies": "Search currencies", "search-discover-communities": "Search communities or categories", "search-no-chat-found": "No search results. Do you mean", "searching-for-activity": "Searching for activity...", @@ -2231,8 +2239,8 @@ "share-profile": "Share profile", "share-profile-link": "Share profile link", "share-public-chat-text": "Check out this public chat on the Status app: {{link}}", - "share-usage-data": "Share usage data with Status", "share-usage-data": "Share usage data", + "share-usage-data-with-status": "Share usage data with Status", "shared": "Shared", "shared-a-community": "Shared a community", "sharing-copied-to-clipboard": "Copied", @@ -2506,6 +2514,7 @@ "try-again": "Try again", "try-keeping-the-card-still": "Try keeping the card still", "try-to-search-something-else": "Try to search something else", + "try-with-different-currency": "Try with a different currency", "try-your-luck-again": "Try your luck again!", "tu": "Tu", "tue": "Tue",