diff --git a/libs/sdk-react-native/example/App.js b/libs/sdk-react-native/example/App.js
index a2185738a..6f6e7e0a9 100644
--- a/libs/sdk-react-native/example/App.js
+++ b/libs/sdk-react-native/example/App.js
@@ -6,169 +6,26 @@
* @flow strict-local
*/
-import React, { useState } from "react"
-import { SafeAreaView, ScrollView, StatusBar, Text, TouchableOpacity, View } from "react-native"
-import {
- backup,
- backupStatus,
- buyBitcoin,
- BuyBitcoinProvider,
- checkMessage,
- connect,
- defaultConfig,
- EnvironmentType,
- fetchFiatRates,
- fetchReverseSwapFees,
- inProgressReverseSwaps,
- lspInfo,
- listFiatCurrencies,
- mnemonicToSeed,
- NodeConfigVariant,
- nodeInfo,
- openChannelFee,
- receivePayment,
- setLogStream,
- signMessage
-} from "@breeztech/react-native-breez-sdk"
-import BuildConfig from "react-native-build-config"
-import { generateMnemonic } from "@dreson4/react-native-quick-bip39"
-import { obfuscateString } from "./utils/security"
-import { getSecureItem, setSecureItem } from "./utils/storage"
+import React from "react"
+import { NavigationContainer } from "@react-navigation/native"
+import { createNativeStackNavigator } from "@react-navigation/native-stack"
+import { FileLogger } from "react-native-file-logger"
+import HomeScreen from "./src/screens/HomeScreen"
-const MNEMONIC_STORE = "MNEMONIC_SECURE_STORE"
+FileLogger.configure({
+ captureConsole: false,
+ maximumNumberOfFiles: 5
+})
-const DebugLine = ({ title, text }) => {
- return (
-
-
- {title}
- {text && text.length > 0 ? {text} : <>>}
-
-
- )
-}
+const Stack = createNativeStackNavigator()
const App = () => {
- const [lines, setLines] = useState([])
-
- const addLine = (title, text) => {
- setLines((lines) => [{ at: new Date().getTime(), title, text }, ...lines])
- console.log(`${title}${text && text.length > 0 ? ": " + text : ""}`)
- }
-
- const logHandler = (logEntry) => {
- if (logEntry.level != "TRACE") {
- console.log(`[${logEntry.level}]: ${logEntry.line}`)
- }
- }
-
- const eventHandler = (breezEvent) => {
- addLine("event", JSON.stringify(breezEvent))
- }
-
- React.useEffect(() => {
- let logSubscription, eventSubscription
-
- const asyncFn = async () => {
- try {
- logSubscription = await setLogStream(logHandler)
-
- let mnemonic = await getSecureItem(MNEMONIC_STORE)
-
- if (mnemonic == null) {
- mnemonic = generateMnemonic(256)
- setSecureItem(MNEMONIC_STORE, mnemonic)
- }
-
- let seed = await mnemonicToSeed(mnemonic)
- addLine("mnemonicToSeed", obfuscateString(JSON.stringify(seed)))
-
- const nodeConfig = {
- type: NodeConfigVariant.GREENLIGHT,
- config: {}
- }
-
- const config = await defaultConfig(EnvironmentType.PRODUCTION, BuildConfig.BREEZ_API_KEY, nodeConfig)
- addLine("defaultConfig", JSON.stringify(config))
-
- eventSubscription = await connect({ config, seed }, eventHandler)
- addLine("connect", null)
-
- const nodeState = await nodeInfo()
- addLine("nodeInfo", JSON.stringify(nodeState))
-
- const lsp = await lspInfo()
- addLine("lspInfo", JSON.stringify(lsp))
-
- const fiatCurrencies = await listFiatCurrencies()
- addLine("listFiatCurrencies", JSON.stringify(fiatCurrencies))
-
- const fiatRates = await fetchFiatRates()
- addLine("fetchFiatRates", JSON.stringify(fiatRates))
-
- const revSwapFees = await fetchReverseSwapFees({ sendAmountSat: null })
- addLine("revSwapFees", JSON.stringify(revSwapFees))
-
- const inProgressRevSwaps = await inProgressReverseSwaps()
- addLine("inProgressRevSwaps", JSON.stringify(inProgressRevSwaps))
-
- const buyBitcoinResult = await buyBitcoin({
- provider: BuyBitcoinProvider.MOONPAY,
- openingFeeParams: null
- })
- addLine("buyBitcoin", JSON.stringify(buyBitcoinResult))
-
- const signMessageResult = await signMessage({ message: "Hello world" })
- addLine("signMessage: Hello World", JSON.stringify(signMessageResult))
-
- const verifyMessageResult = await checkMessage({
- message: "Hello world",
- pubkey: nodeState.id,
- signature: signMessageResult.signature
- })
- addLine("verifyMessage:", JSON.stringify(verifyMessageResult))
-
- const openChannelFeeResult = await openChannelFee({
- amountMsat: 100000000,
- expiry: 3600
- })
- addLine("openChannelFee", JSON.stringify(openChannelFeeResult))
-
- const receivePaymentResult = await receivePayment({
- amountMsat: 100000000,
- description: "Hello world",
- expiry: 3600,
- cltv: 144,
- useDescriptionHash: true,
- openingFeeParams: openChannelFeeResult.usedFeeParams
- })
- addLine("receivePayment", JSON.stringify(receivePaymentResult))
-
- await backup()
- addLine("backupStatus", JSON.stringify(await backupStatus()))
- } catch (e) {
- addLine("error", e.toString())
- console.log(`Error: ${JSON.stringify(e)}`)
- }
- }
-
- asyncFn()
-
- return () => {
- logSubscription.remove()
- eventSubscription.remove()
- }
- }, [])
-
return (
-
-
-
- {lines.map((line) => (
-
- ))}
-
-
+
+
+
+
+
)
}
diff --git a/libs/sdk-react-native/example/package.json b/libs/sdk-react-native/example/package.json
index 065dc4b6e..f671a9bab 100644
--- a/libs/sdk-react-native/example/package.json
+++ b/libs/sdk-react-native/example/package.json
@@ -13,13 +13,18 @@
"rebuild": "rm -rf node_modules && yarn && yarn pods"
},
"dependencies": {
- "@breeztech/react-native-breez-sdk": "0.5.1-rc6",
+ "@breeztech/react-native-breez-sdk": "0.5.2",
"@dreson4/react-native-quick-bip39": "^0.0.5",
+ "@react-navigation/native": "6.1.1",
+ "@react-navigation/native-stack": "6.9.7",
"react": "18.1.0",
"react-native": "0.70.15",
"react-native-build-config": "^0.3.2",
+ "react-native-file-logger": "0.4.1",
"react-native-quick-base64": "^2.0.5",
"react-native-quick-crypto": "^0.5.0",
+ "react-native-safe-area-context": "3.3.2",
+ "react-native-screens": "3.7.2",
"react-native-secure-storage": "https://github.com/satimoto/react-native-secure-storage"
},
"devDependencies": {
@@ -36,4 +41,4 @@
"jest": {
"preset": "react-native"
}
-}
\ No newline at end of file
+}
diff --git a/libs/sdk-react-native/example/src/components/DebugLine.js b/libs/sdk-react-native/example/src/components/DebugLine.js
new file mode 100644
index 000000000..a7d4ccb80
--- /dev/null
+++ b/libs/sdk-react-native/example/src/components/DebugLine.js
@@ -0,0 +1,15 @@
+import React from "react"
+import { Text, TouchableOpacity, View } from "react-native"
+
+const DebugLine = ({ title, text }) => {
+ return (
+
+
+ {title}
+ {text && text.length > 0 ? {text} : <>>}
+
+
+ )
+}
+
+export default DebugLine
diff --git a/libs/sdk-react-native/example/src/screens/HomeScreen.js b/libs/sdk-react-native/example/src/screens/HomeScreen.js
new file mode 100644
index 000000000..2e116daae
--- /dev/null
+++ b/libs/sdk-react-native/example/src/screens/HomeScreen.js
@@ -0,0 +1,212 @@
+import React, { useEffect, useState } from "react"
+import { Button, Platform, SafeAreaView, ScrollView } from "react-native"
+import {
+ backup,
+ backupStatus,
+ buyBitcoin,
+ BuyBitcoinProvider,
+ checkMessage,
+ connect,
+ defaultConfig,
+ EnvironmentType,
+ fetchFiatRates,
+ fetchReverseSwapFees,
+ inProgressReverseSwaps,
+ lspInfo,
+ listFiatCurrencies,
+ mnemonicToSeed,
+ NodeConfigVariant,
+ nodeInfo,
+ openChannelFee,
+ receivePayment,
+ setLogStream,
+ signMessage
+} from "@breeztech/react-native-breez-sdk"
+import BuildConfig from "react-native-build-config"
+import { FileLogger } from "react-native-file-logger"
+import { generateMnemonic } from "@dreson4/react-native-quick-bip39"
+import DebugLine from "../components/DebugLine"
+import { Log } from "../utils/logging"
+import { obfuscateString } from "../utils/security"
+import { getSecureItem, setSecureItem } from "../utils/storage"
+
+const log = new Log("ExampleApp")
+
+const DEBUG = Platform.select({
+ android: BuildConfig.DEBUG,
+ ios: BuildConfig.DEBUG === "true"
+})
+
+const MNEMONIC_STORE = "MNEMONIC_SECURE_STORE"
+
+const HomeScreen = ({ navigation }) => {
+ const [lines, setLines] = useState([])
+
+ // Log sharing
+ const onShareLogs = async () => {
+ let nodeInfo = {}
+
+ try {
+ nodeInfo = await nodeInfo()
+ } catch (e) {
+ nodeInfo = { error: JSON.stringify(e) }
+ }
+
+ try {
+ await FileLogger.sendLogFilesByEmail({
+ subject: "Logs",
+ body: `OS: ${Platform.OS} - ${Platform.Version}\n\n` + JSON.stringify(nodeInfo, null, 2)
+ })
+ } catch (e) {
+ log.error(JSON.stringify(e))
+ }
+ }
+
+ useEffect(() => {
+ navigation.setOptions({
+ headerRight: () =>
+ })
+ }, [navigation])
+
+ // Handling log entries and SDK events
+ const addLine = (title, text) => {
+ setLines((lines) => [{ at: new Date().getTime(), title, text }, ...lines])
+ log.debug(`${title}${text && text.length > 0 ? ": " + text : ""}`, true)
+ }
+
+ const logHandler = (logEntry) => {
+ switch (logEntry.level) {
+ case "ERROR":
+ log.error(`[ERROR]: ${logEntry.line}`, true)
+ break
+ case "INFO":
+ log.info(`[INFO]: ${logEntry.line}`, true)
+ break
+ case "TRACE":
+ // Only log to file when in DEBUG mode
+ log.debug(`[TRACE]: ${logEntry.line}`, DEBUG)
+ break
+ case "WARN":
+ log.warn(`[WARN]: ${logEntry.line}`, true)
+ break
+ default:
+ log.debug(`[${logEntry.level}]: ${logEntry.line}`, true)
+ break
+ }
+ }
+
+ const eventHandler = (breezEvent) => {
+ addLine("event", JSON.stringify(breezEvent))
+ }
+
+ // Starting the SDK
+ useEffect(() => {
+ let logSubscription, eventSubscription
+
+ const asyncFn = async () => {
+ try {
+ logSubscription = await setLogStream(logHandler)
+
+ let mnemonic = await getSecureItem(MNEMONIC_STORE)
+
+ if (mnemonic == null) {
+ mnemonic = generateMnemonic(256)
+ setSecureItem(MNEMONIC_STORE, mnemonic)
+ }
+
+ let seed = await mnemonicToSeed(mnemonic)
+ addLine("mnemonicToSeed", obfuscateString(JSON.stringify(seed)))
+
+ const nodeConfig = {
+ type: NodeConfigVariant.GREENLIGHT,
+ config: {}
+ }
+
+ const config = await defaultConfig(EnvironmentType.PRODUCTION, BuildConfig.BREEZ_API_KEY, nodeConfig)
+ addLine("defaultConfig", JSON.stringify(config))
+
+ eventSubscription = await connect({ config, seed }, eventHandler)
+ addLine("connect", null)
+
+ const nodeState = await nodeInfo()
+ addLine("nodeInfo", JSON.stringify(nodeState))
+
+ const lsp = await lspInfo()
+ addLine("lspInfo", JSON.stringify(lsp))
+
+ const fiatCurrencies = await listFiatCurrencies()
+ addLine("listFiatCurrencies", JSON.stringify(fiatCurrencies))
+
+ const fiatRates = await fetchFiatRates()
+ addLine("fetchFiatRates", JSON.stringify(fiatRates))
+
+ const revSwapFees = await fetchReverseSwapFees({ sendAmountSat: null })
+ addLine("revSwapFees", JSON.stringify(revSwapFees))
+
+ const inProgressRevSwaps = await inProgressReverseSwaps()
+ addLine("inProgressRevSwaps", JSON.stringify(inProgressRevSwaps))
+
+ const buyBitcoinResult = await buyBitcoin({
+ provider: BuyBitcoinProvider.MOONPAY,
+ openingFeeParams: null
+ })
+ addLine("buyBitcoin", JSON.stringify(buyBitcoinResult))
+
+ const signMessageResult = await signMessage({ message: "Hello world" })
+ addLine("signMessage: Hello World", JSON.stringify(signMessageResult))
+
+ const verifyMessageResult = await checkMessage({
+ message: "Hello world",
+ pubkey: nodeState.id,
+ signature: signMessageResult.signature
+ })
+ addLine("verifyMessage:", JSON.stringify(verifyMessageResult))
+
+ const openChannelFeeResult = await openChannelFee({
+ amountMsat: 100000000,
+ expiry: 3600
+ })
+ addLine("openChannelFee", JSON.stringify(openChannelFeeResult))
+
+ const receivePaymentResult = await receivePayment({
+ amountMsat: 100000000,
+ description: "Hello world",
+ expiry: 3600,
+ cltv: 144,
+ useDescriptionHash: true,
+ openingFeeParams: openChannelFeeResult.usedFeeParams
+ })
+ addLine("receivePayment", JSON.stringify(receivePaymentResult))
+
+ await backup()
+ addLine("backupStatus", JSON.stringify(await backupStatus()))
+ } catch (e) {
+ addLine("error", e.toString())
+ log.error(JSON.stringify(e))
+ }
+ }
+
+ asyncFn()
+
+ return () => {
+ if (logSubscription) {
+ logSubscription.remove()
+ }
+ if (eventSubscription) {
+ eventSubscription.remove()
+ }
+ }
+ }, [])
+
+ return (
+
+
+ {lines.map((line) => (
+
+ ))}
+
+
+ )
+}
+
+export default HomeScreen
diff --git a/libs/sdk-react-native/example/src/utils/logging.ts b/libs/sdk-react-native/example/src/utils/logging.ts
new file mode 100644
index 000000000..784d7804e
--- /dev/null
+++ b/libs/sdk-react-native/example/src/utils/logging.ts
@@ -0,0 +1,49 @@
+import { FileLogger } from "react-native-file-logger"
+
+export class Log {
+ tag = ""
+
+ constructor(tag: string) {
+ this.tag = tag
+ }
+
+ debug(message: string, toFile: boolean = false) {
+ const str = `${this.tag}: ${message}`
+
+ console.debug(str)
+
+ if (toFile) {
+ FileLogger.debug(str)
+ }
+ }
+
+ info(message: string, toFile: boolean = false) {
+ const str = `${this.tag}: ${message}`
+
+ console.info(str)
+
+ if (toFile) {
+ FileLogger.info(str)
+ }
+ }
+
+ error(message: string, toFile: boolean = false) {
+ const str = `${this.tag}: ${message}`
+
+ console.error(str)
+
+ if (toFile) {
+ FileLogger.error(str)
+ }
+ }
+
+ warn(message: string, toFile: boolean = false) {
+ const str = `${this.tag}: ${message}`
+
+ console.warn(str)
+
+ if (toFile) {
+ FileLogger.warn(str)
+ }
+ }
+}
diff --git a/libs/sdk-react-native/example/utils/security.ts b/libs/sdk-react-native/example/src/utils/security.ts
similarity index 100%
rename from libs/sdk-react-native/example/utils/security.ts
rename to libs/sdk-react-native/example/src/utils/security.ts
diff --git a/libs/sdk-react-native/example/utils/storage.ts b/libs/sdk-react-native/example/src/utils/storage.ts
similarity index 100%
rename from libs/sdk-react-native/example/utils/storage.ts
rename to libs/sdk-react-native/example/src/utils/storage.ts
diff --git a/libs/sdk-react-native/example/yarn.lock b/libs/sdk-react-native/example/yarn.lock
index 1d4c905a3..5467dc3bf 100644
--- a/libs/sdk-react-native/example/yarn.lock
+++ b/libs/sdk-react-native/example/yarn.lock
@@ -964,6 +964,11 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+"@breeztech/react-native-breez-sdk@0.5.2":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@breeztech/react-native-breez-sdk/-/react-native-breez-sdk-0.5.2.tgz#d3543ec4b61ea3f077ac22f7bf8c032862550f04"
+ integrity sha512-oK3CefKgNfFR8WdvHCEZGwX1Rn2G23sKfsJa9junRo/+bUkgZBemMr+fkgU6WJXSyeKPrvdwWhXJ1sCe8YTp2g==
+
"@cnakazawa/watch@^1.0.3":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
@@ -1507,6 +1512,48 @@
resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa"
integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==
+"@react-navigation/core@^6.4.5":
+ version "6.4.17"
+ resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.17.tgz#f277a196b578c8a456efcc563d1c9bd87eb4ab04"
+ integrity sha512-Nd76EpomzChWAosGqWOYE3ItayhDzIEzzZsT7PfGcRFDgW5miHV2t4MZcq9YIK4tzxZjVVpYbIynOOQQd1e0Cg==
+ dependencies:
+ "@react-navigation/routers" "^6.1.9"
+ escape-string-regexp "^4.0.0"
+ nanoid "^3.1.23"
+ query-string "^7.1.3"
+ react-is "^16.13.0"
+ use-latest-callback "^0.2.1"
+
+"@react-navigation/elements@^1.3.12":
+ version "1.3.31"
+ resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.31.tgz#28dd802a0787bb03fc0e5be296daf1804dbebbcf"
+ integrity sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ==
+
+"@react-navigation/native-stack@6.9.7":
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-6.9.7.tgz#9211fc8933825a41f19011b935133a6ed58b4ce1"
+ integrity sha512-YsBv4LldFErwQbqLCI/aWWDTpMf9SFS4IW3Qcefm+TZli9Ee7XpZMmFdotiZTz4KoYHbqhO1fuExjl2O7ZHrAQ==
+ dependencies:
+ "@react-navigation/elements" "^1.3.12"
+ warn-once "^0.1.0"
+
+"@react-navigation/native@6.1.1":
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.1.tgz#79d91db04fbad277f355a10405516df4f67cd308"
+ integrity sha512-iIozx9c66EjSFyzKrZPixnk6vBuivYXp0jmbKCJXNIa7MY+8OLx9CXj/+1py/l/OGlXDhI6jiUWWetOfOtMaBQ==
+ dependencies:
+ "@react-navigation/core" "^6.4.5"
+ escape-string-regexp "^4.0.0"
+ fast-deep-equal "^3.1.3"
+ nanoid "^3.1.23"
+
+"@react-navigation/routers@^6.1.9":
+ version "6.1.9"
+ resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-6.1.9.tgz#73f5481a15a38e36592a0afa13c3c064b9f90bed"
+ integrity sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==
+ dependencies:
+ nanoid "^3.1.23"
+
"@sideway/address@^4.1.3":
version "4.1.4"
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0"
@@ -2739,7 +2786,7 @@ decimal.js@^10.2.1:
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
-decode-uri-component@^0.2.0:
+decode-uri-component@^0.2.0, decode-uri-component@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
@@ -3377,6 +3424,11 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+filter-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
+ integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==
+
finalhandler@1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
@@ -5376,6 +5428,11 @@ ms@2.1.3:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+nanoid@^3.1.23:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -5961,6 +6018,16 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+query-string@^7.1.3:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328"
+ integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==
+ dependencies:
+ decode-uri-component "^0.2.2"
+ filter-obj "^1.1.0"
+ split-on-first "^1.0.0"
+ strict-uri-encode "^2.0.0"
+
querystringify@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
@@ -5999,7 +6066,7 @@ react-devtools-core@4.27.7:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67"
integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==
-react-is@^16.13.1:
+react-is@^16.13.0, react-is@^16.13.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -6029,6 +6096,11 @@ react-native-codegen@^0.70.7:
jscodeshift "^0.14.0"
nullthrows "^1.1.1"
+react-native-file-logger@0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/react-native-file-logger/-/react-native-file-logger-0.4.1.tgz#6d4cdfd333489a32b20242f898cff0b196444707"
+ integrity sha512-UpdMtpQvSgOB4ohid2QxwWFkI92gqKEl2woFbcPEWRbmfrwpTZuNPzNEooMTjmIhFBQPfaOcymCL9gK1naE01g==
+
react-native-gradle-plugin@^0.70.3:
version "0.70.3"
resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.70.3.tgz#cbcf0619cbfbddaa9128701aa2d7b4145f9c4fc8"
@@ -6054,6 +6126,18 @@ react-native-quick-crypto@^0.5.0:
stream-browserify "^3.0.0"
string_decoder "^1.3.0"
+react-native-safe-area-context@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-3.3.2.tgz#9549a2ce580f2374edb05e49d661258d1b8bcaed"
+ integrity sha512-yOwiiPJ1rk+/nfK13eafbpW6sKW0jOnsRem2C1LPJjM3tfTof6hlvV5eWHATye3XOpu2cJ7N+HdkUvUDGwFD2Q==
+
+react-native-screens@3.7.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.7.2.tgz#933cb0b6564b84a624a1e6ee0481e81415030ea9"
+ integrity sha512-TUmCE2ZIr6SFCUqsUqLsYQZ7EWo+tKyxSVFj3G5BCkGFOl3MwXEPgT/ihNCnL1aUAgr6TEMWVHg+awLkkQgYyQ==
+ dependencies:
+ warn-once "^0.1.0"
+
"react-native-secure-storage@https://github.com/satimoto/react-native-secure-storage":
version "0.1.2"
resolved "https://github.com/satimoto/react-native-secure-storage#e5d100a5e8f681f4a657fa613a349456954f96b7"
@@ -6742,6 +6826,11 @@ spdx-license-ids@^3.0.0:
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
+split-on-first@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
+ integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
+
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
@@ -6799,6 +6888,11 @@ stream-browserify@^3.0.0:
inherits "~2.0.4"
readable-stream "^3.5.0"
+strict-uri-encode@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
+ integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
+
string-length@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
@@ -7242,6 +7336,11 @@ url-parse@^1.5.3:
querystringify "^2.1.1"
requires-port "^1.0.0"
+use-latest-callback@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.1.tgz#4d4e6a9e4817b13142834850dcfa8d24ca4569cf"
+ integrity sha512-QWlq8Is8BGWBf883QOEQP5HWYX/kMI+JTbJ5rdtvJLmXTIh9XoHIO3PQcmQl8BU44VKxow1kbQUHa6mQSMALDQ==
+
use-sync-external-store@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
@@ -7320,6 +7419,11 @@ walker@^1.0.7, walker@~1.0.5:
dependencies:
makeerror "1.0.12"
+warn-once@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/warn-once/-/warn-once-0.1.1.tgz#952088f4fb56896e73fd4e6a3767272a3fccce43"
+ integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==
+
wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"