feat: implement wallet graph component (#16789)

Signed-off-by: Brian Sztamfater <brian@status.im>
This commit is contained in:
Brian Sztamfater 2023-08-01 11:10:16 -03:00 committed by GitHub
parent b8d01c8bb9
commit 21807cb761
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 365 additions and 59 deletions

View File

@ -49,6 +49,7 @@
"react-native-fetch-polyfill": "^1.1.2",
"react-native-fs": "^2.14.1",
"react-native-gesture-handler": "2.6.1",
"react-native-gifted-charts": "^1.3.2",
"react-native-haptic-feedback": "^1.9.0",
"react-native-hole-view": "git+https://github.com/status-im/react-native-hole-view.git#refs/tags/v2.1.3-status",
"react-native-image-crop-picker": "git+https://github.com/status-im/react-native-image-crop-picker.git#refs/tags/v0.36.2-status.0",
@ -65,11 +66,11 @@
"react-native-randombytes": "^3.6.1",
"react-native-reanimated": "2.11.0",
"react-native-redash": "^16.0.11",
"react-native-svg": "13.10.0",
"react-native-shake": "^3.3.1",
"react-native-share": "^8.2.2",
"react-native-static-safe-area-insets": "^2.2.0",
"react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#refs/tags/v2.5.39",
"react-native-svg": "^9.8.4",
"react-native-touch-id": "^4.4.1",
"react-native-transparent-video": "git+https://github.com/status-im/react-native-transparent-video.git#refs/tags/0.0.9",
"react-native-webview": "git+https://github.com/status-im/react-native-webview.git#refs/tags/v11.16.0-status",

View File

@ -346,6 +346,13 @@ globalThis.__STATUS_MOBILE_JS_IDENTITY_PROXY__ = new Proxy({}, {get() { return (
(def react-native-transparent-video #js {:default #js {}})
(def react-native-gifted-charts
#js
{:BarChart #js {}
:PieChart #js {}
:LineChart #js {}
:LineChartBicolor #js {}})
(def wallet-connect-client
#js
{:default #js {}
@ -409,6 +416,7 @@ globalThis.__STATUS_MOBILE_JS_IDENTITY_PROXY__ = new Proxy({}, {get() { return (
"react-native-svg" react-native-svg
"react-native-transparent-video" react-native-transparent-video
"react-native-orientation-locker" react-native-orientation-locker
"react-native-gifted-charts" react-native-gifted-charts
"../src/js/worklets/core.js" worklet-factory
"../src/js/worklets/shell/bottom_tabs.js" #js {}
"../src/js/worklets/shell/home_stack.js" #js {}

View File

@ -0,0 +1,19 @@
(ns quo2.components.graph.wallet-graph.component-spec
(:require [test-helpers.component :as h]
[quo2.components.graph.wallet-graph.view :as wallet-graph]))
(defn data
[num-elements]
(vec (take num-elements (repeat {:value 10}))))
(h/describe "wallet-graph"
(h/test "render empty wallet graph"
(h/render [wallet-graph/view
{:time-frame :empty}])
(h/is-truthy (h/get-by-label-text :illustration)))
(h/test "render 1 week wallet graph"
(h/render [wallet-graph/view
{:time-frame :1-week
:data (data 7)}])
(h/is-truthy (h/get-by-label-text :line-chart))))

View File

@ -0,0 +1,17 @@
(ns quo2.components.graph.wallet-graph.style
(:require [quo2.foundations.colors :as colors]))
(def gradient-background
{:height 294
:justify-content :flex-end})
(def x-axis-label-text-style ; We need this to remove unnecessary bottom spacing from graph
{:margin-bottom -3
:padding-top -10
:height 0})
(def illustration
{:height 96
:background-color colors/danger-50
:align-items :center
:justify-content :center})

View File

@ -0,0 +1,13 @@
(ns quo2.components.graph.wallet-graph.utils)
(defn find-highest-value
[coll]
(apply max (map :value coll)))
(defn downsample-data
[data max-array-size]
(let [data-size (count data)]
(if (> data-size max-array-size)
(let [step-size (max (/ data-size max-array-size) 1)]
(vec (take-nth step-size data)))
data)))

View File

@ -0,0 +1,55 @@
(ns quo2.components.graph.wallet-graph.utils-test
(:require [cljs.test :refer-macros [deftest is testing]]
[quo2.components.graph.wallet-graph.utils :as utils]))
(deftest find-highest-value
(testing "Find highest value with a single map"
(let [data [{:value 5}]]
(is (= (utils/find-highest-value data) 5))))
(testing "Find highest value with multiple maps"
(let [data [{:value 5} {:value 10} {:value 3} {:value 7}]]
(is (= (utils/find-highest-value data) 10))))
(testing "Find highest value with negative values"
(let [data [{:value -2} {:value -10} {:value -3} {:value -7}]]
(is (= (utils/find-highest-value data) -2))))
(testing "Find highest value with decimal values"
(let [data [{:value 3.5} {:value 7.2} {:value 2.9}]]
(is (= (utils/find-highest-value data) 7.2))))
(testing "Find highest value with a large data set"
(let [data (vec (for [num (range 1000)] {:value num}))]
(is (= (utils/find-highest-value data) 999)))))
(deftest downsample-data
(testing "Downsampling is applied correctly when needed"
(let [input-data [1 2 3 4 5 6 7 8 9 10]
max-array-size 5
expected-output [1 3 5 7 9]]
(is (= (utils/downsample-data input-data max-array-size) expected-output))))
(testing "Downsampling is not applied when not needed"
(let [input-data [1 2 3 4 5 6 7 8 9 10]
max-array-size 10
expected-output [1 2 3 4 5 6 7 8 9 10]]
(is (= (utils/downsample-data input-data max-array-size) expected-output))))
(testing "Downsampling works with empty input data"
(let [input-data []
max-array-size 5
expected-output []]
(is (= (utils/downsample-data input-data max-array-size) expected-output))))
(testing "Downsampling works with max-array-size of 1 (edge case)"
(let [input-data [1 2 3 4 5]
max-array-size 1
expected-output [1]]
(is (= (utils/downsample-data input-data max-array-size) expected-output))))
(testing "Downsampling works with large input data and max-array-size (randomized test)"
(let [large-data (range 1000)
max-array-size 500
expected-output (range 0 1000 2)] ;; expected-output contains every 2nd element from 0 to 1000
(is (= (utils/downsample-data large-data max-array-size) expected-output)))))

View File

@ -0,0 +1,70 @@
(ns quo2.components.graph.wallet-graph.view
(:require [quo2.theme :as quo.theme]
[react-native.linear-gradient :as linear-gradient]
[react-native.charts :as charts]
[react-native.core :as rn]
[quo2.components.graph.wallet-graph.style :as style]
[quo2.foundations.colors :as colors]
[quo2.components.markdown.text :as text]
[quo2.components.graph.wallet-graph.utils :as utils]))
(defn- max-data-points
[time-frame]
(case time-frame
:empty 0
:1-week 7
:1-month 30
:3-months 90
:1-year 365
500))
(defn- view-internal
[{:keys [data state time-frame theme]}]
(let [max-data-points (max-data-points time-frame)
data (if (and (not= time-frame :empty) (> (count data) max-data-points))
(utils/downsample-data data max-data-points)
data)
max-value (when-not (= time-frame :empty) (utils/find-highest-value data))
width (:width (rn/get-window))
line-color (if (= state :positive)
(colors/theme-colors colors/success-50 colors/success-60 theme)
(colors/theme-colors colors/danger-50 colors/danger-60 theme))
gradient-colors [(colors/alpha line-color 0.1) (colors/alpha line-color 0)]
fill-color (colors/theme-colors colors/white colors/neutral-95)]
[linear-gradient/linear-gradient
{:colors gradient-colors
:start {:x 0 :y 1}
:end {:x 0 :y 0}
:style style/gradient-background}
(if (= time-frame :empty)
[rn/view
{:accessibility-label :illustration
:style style/illustration}
[text/text "Illustration here"]]
[rn/view {:accessibility-label :line-chart}
[charts/line-chart
{:height 96
:width (+ width 1)
:max-value max-value
:min-value 0
:adjust-to-width true
:data data
:area-chart true
:start-fill-color fill-color
:end-fill-color fill-color
:hide-data-points true
:hide-rules true
:hide-y-axis-text true
:x-axis-indices-height 100
:thickness 2
:color line-color
:y-axis-thickness 0
:x-axis-thickness 0
:initial-spacing 0
:end-spacing 0
:disable-scroll true
:y-axis-label-width 0.01
:labels-extra-height -36
:x-axis-label-text-style style/x-axis-label-text-style}]])]))
(def view (quo.theme/with-theme view-internal))

View File

@ -39,6 +39,7 @@
quo2.components.dropdowns.dropdown
quo2.components.empty-state.empty-state.view
quo2.components.gradient.gradient-cover.view
quo2.components.graph.wallet-graph.view
quo2.components.header
quo2.components.icon
quo2.components.info.info-message
@ -178,6 +179,9 @@
;;;; EMPTY STATE
(def empty-state quo2.components.empty-state.empty-state.view/empty-state)
;;;; GRAPH
(def wallet-graph quo2.components.graph.wallet-graph.view/view)
;;;; HEADER
(def header quo2.components.header/header)

View File

@ -21,6 +21,7 @@
[quo2.components.drawers.drawer-buttons.component-spec]
[quo2.components.drawers.permission-context.component-spec]
[quo2.components.gradient.gradient-cover.component-spec]
[quo2.components.graph.wallet-graph.component-spec]
[quo2.components.inputs.input.component-spec]
[quo2.components.inputs.profile-input.component-spec]
[quo2.components.inputs.recovery-phrase.component-spec]

View File

@ -0,0 +1,5 @@
(ns react-native.charts
(:require ["react-native-gifted-charts" :as gifted-charts]
[reagent.core :as reagent]))
(def line-chart (reagent/adapt-react-class (.-LineChart gifted-charts)))

View File

@ -0,0 +1,90 @@
(ns status-im2.contexts.quo-preview.graph.wallet-graph
(:require [quo2.core :as quo]
[quo2.foundations.colors :as colors]
[react-native.core :as rn]
[reagent.core :as reagent]
[status-im2.contexts.quo-preview.preview :as preview]))
(defn generate-crypto-token-prices
[num-elements volatility]
(loop [n num-elements
prices []
prev-price (rand-int 100000)
volatility volatility]
(if (zero? n)
(vec (reverse prices))
(let [fluctuation (* prev-price volatility)
random-delta (- (rand fluctuation) (/ fluctuation 2))
new-price (max 1 (+ prev-price random-delta))
new-prices (conj prices {:value new-price})]
(recur (dec n) new-prices new-price volatility)))))
(def descriptor
[{:label "State:"
:key :state
:type :select
:options [{:key :positive
:value "Positive"}
{:key :negative
:value "Negative"}]}
{:label "Time frame:"
:key :time-frame
:type :select
:options [{:key :empty
:value "Empty"}
{:key :1-week
:value "1 Week"}
{:key :1-month
:value "1 Month"}
{:key :3-months
:value "3 Months"}
{:key :1-year
:value "1 Year"}
{:key :all-time
:value "All time (500 years data)"}]}])
(defn generate-data
[time-frame]
(let [data-points (case time-frame
:empty 0
:1-week 7
:1-month 30
:3-months 90
:1-year 365
(* 365 500))
volatility (case time-frame
:empty 0
:1-week 2
:1-month 1
:3-months 0.5
:1-year 0.05
0.005)]
(generate-crypto-token-prices data-points volatility)))
(defn cool-preview
[]
(let [state (reagent/atom {:state :positive
:time-frame :1-week})]
(fn []
[rn/touchable-without-feedback {:on-press rn/dismiss-keyboard!}
[rn/view {:padding-bottom 150}
[preview/customizer state descriptor]
[quo/wallet-graph
{:data (generate-data (:time-frame @state))
:state (:state @state)
:time-frame (:time-frame @state)}]]])))
(defn preview-wallet-graph
[]
[rn/view
{:style
{:background-color (colors/theme-colors
colors/white
colors/neutral-95)
:flex 1}}
[rn/flat-list
{:style {:flex 1}
:keyboard-should-persist-taps :always
:header [cool-preview]
:key-fn str
:scroll-enabled false}]])

View File

@ -24,6 +24,7 @@
[status-im2.contexts.quo-preview.calendar.calendar-year :as calendar-year]
[status-im2.contexts.quo-preview.browser.browser-input :as browser-input]
[status-im2.contexts.quo-preview.code.snippet :as code-snippet]
[status-im2.contexts.quo-preview.graph.wallet-graph :as wallet-graph]
[status-im2.contexts.quo-preview.colors.color-picker :as color-picker]
[status-im2.contexts.quo-preview.community.community-card-view :as community-card]
[status-im2.contexts.quo-preview.community.community-membership-list-view :as
@ -218,6 +219,9 @@
:gradient [{:name :gradient-cover
:options {:topBar {:visible true}}
:component gradient-cover/preview-gradient-cover}]
:graph [{:name :wallet-graph
:options {:topBar {:visible true}}
:component wallet-graph/preview-wallet-graph}]
:info [{:name :info-message
:options {:topBar {:visible true}}
:component info-message/preview-info-message}

View File

@ -9,12 +9,13 @@ module.exports = {
},
testTimeout: 60000,
transformIgnorePatterns: [
'/node_modules/(?!(@react-native|react-native-haptic-feedback|react-native-redash|react-native-image-crop-picker|@react-native-community|react-native-linear-gradient|react-native-background-timer|react-native|rn-emoji-keyboard|react-native-languages|react-native-shake|react-native-reanimated|react-native-redash|react-native-permissions|@react-native-community/blur|react-native-static-safe-area-insets)/).*/',
'/node_modules/(?!(@react-native|react-native-haptic-feedback|react-native-redash|react-native-image-crop-picker|@react-native-community|react-native-linear-gradient|react-native-background-timer|react-native|rn-emoji-keyboard|react-native-languages|react-native-shake|react-native-reanimated|react-native-redash|react-native-permissions|@react-native-community/blur|react-native-static-safe-area-insets|react-native-gifted-charts)/).*/',
],
globals: {
__TEST__: true,
},
testEnvironment: 'node',
timers: 'fake',
rootDir: '../../component-spec',
testMatch: ['**/*__tests__*', '**/*.component_spec.js'],
};

132
yarn.lock
View File

@ -3384,7 +3384,7 @@ bn.js@^5.1.1:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b"
integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==
boolbase@^1.0.0, boolbase@~1.0.0:
boolbase@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
@ -4197,28 +4197,29 @@ crypto-random-string@^2.0.0:
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
css-select@^2.0.2:
version "2.1.0"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
css-select@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
dependencies:
boolbase "^1.0.0"
css-what "^3.2.1"
domutils "^1.7.0"
nth-check "^1.0.2"
css-what "^6.1.0"
domhandler "^5.0.2"
domutils "^3.0.1"
nth-check "^2.0.1"
css-tree@^1.0.0-alpha.37:
version "1.0.0-alpha.39"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
css-tree@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
dependencies:
mdn-data "2.0.6"
mdn-data "2.0.14"
source-map "^0.6.1"
css-what@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1"
integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==
css-what@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
cssom@^0.4.4:
version "0.4.4"
@ -4483,28 +4484,24 @@ dijkstrajs@^1.0.1:
resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
integrity sha1-082BIh4+pAdCz83lVtTpnpjdxxs=
dom-serializer@0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
dom-serializer@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
dependencies:
domelementtype "^2.0.1"
entities "^2.0.0"
domelementtype "^2.3.0"
domhandler "^5.0.2"
entities "^4.2.0"
domain-browser@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
domelementtype@1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
domelementtype@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
domelementtype@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
domexception@^2.0.1:
version "2.0.1"
@ -4513,13 +4510,21 @@ domexception@^2.0.1:
dependencies:
webidl-conversions "^5.0.0"
domutils@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
domhandler@^5.0.2, domhandler@^5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
dependencies:
dom-serializer "0"
domelementtype "1"
domelementtype "^2.3.0"
domutils@^3.0.1:
version "3.1.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e"
integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==
dependencies:
dom-serializer "^2.0.0"
domelementtype "^2.3.0"
domhandler "^5.0.3"
dot-prop@^5.2.0:
version "5.3.0"
@ -4605,10 +4610,10 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
dependencies:
once "^1.4.0"
entities@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
entities@^4.2.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
envinfo@^7.7.2:
version "7.8.1"
@ -7152,10 +7157,10 @@ md5.js@^1.3.4:
inherits "^2.0.1"
safe-buffer "^5.1.2"
mdn-data@2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
mdn-data@2.0.14:
version "2.0.14"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
memoize-one@^5.0.0:
version "5.2.1"
@ -7898,12 +7903,12 @@ npmlog@^5.0.1:
gauge "^3.0.0"
set-blocking "^2.0.0"
nth-check@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
nth-check@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
dependencies:
boolbase "~1.0.0"
boolbase "^1.0.0"
nullthrows@^1.1.1:
version "1.1.1"
@ -8849,6 +8854,14 @@ react-native-gesture-handler@2.6.1:
lodash "^4.17.21"
prop-types "^15.7.2"
react-native-gifted-charts@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/react-native-gifted-charts/-/react-native-gifted-charts-1.3.2.tgz#9e2d054b8571026eec5d6a38a7a424da065df726"
integrity sha512-MHWE0A772w57ZKz/r7cWjBFwvRzY3kWDv+PaMBACzNdL13paLl/uOHsKzPP1lZ3Hnj3iICEo7u4aqo0TQ3mGLQ==
dependencies:
react-native-linear-gradient "^2.7.3"
react-native-svg "^13.9.0"
react-native-gradle-plugin@^0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.0.7.tgz#96602f909745239deab7b589443f14fce5da2056"
@ -8885,6 +8898,11 @@ react-native-languages@^3.0.2:
resolved "https://registry.yarnpkg.com/react-native-languages/-/react-native-languages-3.0.2.tgz#c2c4c5050974fe4b50f7372051ca1f9824c1c778"
integrity sha512-LGsTfixFM6hXDhcFJI6mrtrNBsGPSvXT9RtZQ0tlqmGFKmMyZW6eQgJ7kLw8lISD2FIGl4jJwY06EAJpbMsNxg==
react-native-linear-gradient@^2.7.3:
version "2.7.3"
resolved "https://registry.yarnpkg.com/react-native-linear-gradient/-/react-native-linear-gradient-2.7.3.tgz#f77b71ed7c955e033f9cba5fc8478df57953eb27"
integrity sha512-iyJszlZ1Ech2c+2qV+isMvvJKyoctR9ashDkhJg1/cuSF0vQaeLV1FAYTT3qW9doxChJGxVAFfYoxotH0yi3Iw==
react-native-linear-gradient@^2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/react-native-linear-gradient/-/react-native-linear-gradient-2.8.0.tgz#767eda0a5c5dbed852f99e4c07fb7d54a8ee3030"
@ -8981,13 +8999,13 @@ react-native-static-safe-area-insets@^2.2.0:
version "2.5.39"
resolved "git+https://github.com/status-im/react-native-status-keycard.git#93dd64754e676172310e6ea7187cc49f2dc013c6"
react-native-svg@^9.8.4:
version "9.13.6"
resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-9.13.6.tgz#5365fba2bc460054b90851e71f2a71006a5d373f"
integrity sha512-vjjuJhEhQCwWjqsgWyGy6/C/LIBM2REDxB40FU1PMhi8T3zQUwUHnA6M15pJKlQG8vaZyA+QnLyIVhjtujRgig==
react-native-svg@13.10.0, react-native-svg@^13.9.0:
version "13.10.0"
resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-13.10.0.tgz#d3c6222ea9cc1e21e2af0fd59dfbeafe7a3d0dc1"
integrity sha512-D/oYTmUi5nsA/2Nw4WYlF1UUi3vZqhpESpiEhpYCIFB/EMd6vz4A/uq3tIzZFcfa5z2oAdGSxRU1TaYr8IcPlQ==
dependencies:
css-select "^2.0.2"
css-tree "^1.0.0-alpha.37"
css-select "^5.1.0"
css-tree "^1.1.3"
react-native-touch-id@^4.4.1:
version "4.4.1"