diff --git a/android/app/build.gradle b/android/app/build.gradle index c36aea62f6f..3b8da4f30e3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -86,11 +86,11 @@ if (!sentrySlug.contains('SENTRY_ORGANIZATION')) { } android { - ndkVersion rootProject.ext.ndkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - compileSdk rootProject.ext.compileSdkVersion + ndkVersion = rootProject.ext.ndkVersion + buildToolsVersion = rootProject.ext.buildToolsVersion + compileSdk = rootProject.ext.compileSdkVersion - namespace "co.edgesecure.app" + namespace = "co.edgesecure.app" defaultConfig { applicationId "co.edgesecure.app" minSdkVersion rootProject.ext.minSdkVersion @@ -99,7 +99,7 @@ android { versionName "99.99.99" // Edge addition: - multiDexEnabled true + multiDexEnabled = true ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' // Exclude Intel } @@ -113,7 +113,7 @@ android { release { // Caution! In production, you need to generate your own keystore file. // see https://reactnative.dev/docs/signed-apk-android. - signingConfig signingConfigs.release + signingConfig = signingConfigs.release minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } @@ -123,7 +123,7 @@ android { compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 - coreLibraryDesugaringEnabled true + coreLibraryDesugaringEnabled = true } // Edge hacks for zcash and piratechain conflicts: diff --git a/android/app/src/main/java/co/edgesecure/app/MainActivity.kt b/android/app/src/main/java/co/edgesecure/app/MainActivity.kt index 5ae43218e79..5e993df5afa 100644 --- a/android/app/src/main/java/co/edgesecure/app/MainActivity.kt +++ b/android/app/src/main/java/co/edgesecure/app/MainActivity.kt @@ -8,6 +8,7 @@ import com.facebook.react.ReactActivityDelegate import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled import com.facebook.react.defaults.DefaultReactActivityDelegate import com.zoontek.rnbootsplash.RNBootSplash +import expo.modules.ReactActivityDelegateWrapper class MainActivity : ReactActivity() { /** @@ -21,7 +22,11 @@ class MainActivity : ReactActivity() { * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] */ override fun createReactActivityDelegate(): ReactActivityDelegate = - DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) + ReactActivityDelegateWrapper( + this, + BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, + DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) + ) // Edge addition override fun onCreate(savedInstanceState: Bundle?) { diff --git a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt index 731cfe64780..f9621099df5 100644 --- a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt +++ b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt @@ -8,13 +8,11 @@ import com.facebook.react.ReactHost import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load -import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.react.modules.i18nmanager.I18nUtil import com.facebook.react.soloader.OpenSourceMergedSoMapping import com.facebook.soloader.SoLoader -import expo.modules.ApplicationLifecycleDispatcher.onApplicationCreate -import expo.modules.ApplicationLifecycleDispatcher.onConfigurationChanged +import expo.modules.ApplicationLifecycleDispatcher import expo.modules.ReactNativeHostWrapper import io.sentry.Hint import io.sentry.SentryEvent @@ -24,12 +22,10 @@ import io.sentry.SentryOptions.BeforeSendCallback import io.sentry.android.core.SentryAndroid class MainApplication : Application(), ReactApplication { - override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( this, object : DefaultReactNativeHost(this) { - override fun getPackages(): List { // Packages that cannot be autolinked yet can be added manually here, for // example: @@ -47,7 +43,7 @@ class MainApplication : Application(), ReactApplication { ) override val reactHost: ReactHost - get() = getDefaultReactHost(applicationContext, reactNativeHost) + get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) override fun onCreate() { super.onCreate() @@ -101,17 +97,23 @@ class MainApplication : Application(), ReactApplication { // Background task: MessagesWorker.ensureScheduled(context) // MessagesWorker.testRun(context); + + // React Native template code: SoLoader.init(this, OpenSourceMergedSoMapping) if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { // If you opted-in for the New Architecture, we load the native entry point for this // app. load() } - onApplicationCreate(this) + + // Expo integration: + ApplicationLifecycleDispatcher.onApplicationCreate(this) } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - onConfigurationChanged(this, newConfig) + + // Expo integration: + ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) } } diff --git a/android/build.gradle b/android/build.gradle index be4ec146bd5..572b3ba88a2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -29,3 +29,4 @@ buildscript { } apply plugin: "com.facebook.react.rootproject" +apply plugin: "expo-root-project" diff --git a/android/gradle.properties b/android/gradle.properties index a19aa0f12e6..755fe3d211f 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -37,7 +37,7 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a # your application. You should enable this flag either if you want # to write custom TurboModules/Fabric components OR use libraries that # are providing them. -newArchEnabled=false +newArchEnabled=true # Use this property to enable or disable the Hermes JS engine. # If set to false, you will be using JSC instead. diff --git a/android/settings.gradle b/android/settings.gradle index f297a99f521..938f17ef24f 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,9 +1,22 @@ -pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } -plugins { id("com.facebook.react.settings") } -extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } +// Expo integration: +pluginManagement { + includeBuild("../node_modules/@react-native/gradle-plugin") + includeBuild("../node_modules/expo-modules-autolinking/android/expo-gradle-plugin") +} +plugins { + id("com.facebook.react.settings") + id("expo-autolinking-settings") +} +extensions.configure(com.facebook.react.ReactSettingsExtension) { + ex -> ex.autolinkLibrariesFromCommand(expoAutolinking.rnConfigCommand) +} + +// React template code: rootProject.name = 'co.edgesecure.app' include ':app' includeBuild('../node_modules/@react-native/gradle-plugin') -apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle") -useExpoModules() +// Expo integration: +expoAutolinking.useExpoModules() +expoAutolinking.useExpoVersionCatalog() +includeBuild(expoAutolinking.reactNativeGradlePlugin) diff --git a/babel.config.js b/babel.config.js index deb42c7e83e..a77622f4218 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,4 +1,4 @@ module.exports = { - presets: ['module:@react-native/babel-preset'], + presets: ['babel-preset-expo'], plugins: ['react-native-reanimated/plugin'] } diff --git a/ios/Podfile b/ios/Podfile index e5649896688..5a8846ce969 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -50,7 +50,7 @@ target 'edge' do :path => config[:reactNativePath], # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/..", - :fabric_enabled => false, + :fabric_enabled => true, :hermes_enabled => true ) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e21f447c370..ad473da9f4e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2497,7 +2497,7 @@ PODS: - Yoga - RNSecureRandom (1.0.1): - React - - RNSentry (6.14.0): + - RNSentry (6.20.0): - DoubleConversion - glog - hermes-engine @@ -2520,7 +2520,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - Sentry/HybridSDK (= 8.50.2) + - Sentry/HybridSDK (= 8.53.2) - Yoga - RNShare (12.0.11): - DoubleConversion @@ -2654,7 +2654,7 @@ PODS: - SDWebImageWebPCoder (0.8.5): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.10) - - Sentry/HybridSDK (8.50.2) + - Sentry/HybridSDK (8.53.2) - SocketRocket (0.7.1) - SQLite.swift/standalone (0.15.3): - sqlite3 @@ -3395,7 +3395,7 @@ SPEC CHECKSUMS: RNReanimated: 35a5a59798fe9a9a61259146be9fe8b0b602ab39 RNScreens: 90b905d545a5ebbe976985702b8a39e3475727b2 RNSecureRandom: b64d263529492a6897e236a22a2c4249aa1b53dc - RNSentry: 33bc24cea8f87ab26521a9330549a82c703b5db4 + RNSentry: b4746c5f642ec37c729206232b79ab8c51255d76 RNShare: 6300b941668273d502ecee9122cade0d5ea966bd RNSound: 436aa4de81ae87b90e1781b5dd9247df3aa4622a RNStoreReview: 8b47d208282c23296d2466a488a8d9ca1979d79b @@ -3403,7 +3403,7 @@ SPEC CHECKSUMS: RNVectorIcons: f1bc9e04b6f67ec09ea54e6f092e75a9e205c1d7 SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d - Sentry: d95f5f3b32d01324b3e27d3c52747005302cc026 + Sentry: 59993bffde4a1ac297ba6d268dc4bbce068d7c1b SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SQLite.swift: 8d054987f02728cc912b0eb5a9659650573a65a2 sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 @@ -3426,6 +3426,6 @@ SPEC CHECKSUMS: ZIPFoundation: b1f0de4eed33e74a676f76e12559ab6b75990197 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: 2ab3d4f06447f2252ef672833166c9c33f3e8475 +PODFILE CHECKSUM: 8c119d1d2fda8d2ceda1c186a5415d0c7473469a COCOAPODS: 1.16.2 diff --git a/ios/edge/AppDelegate.swift b/ios/edge/AppDelegate.swift index 9483d70d2ba..103a1d68b34 100644 --- a/ios/edge/AppDelegate.swift +++ b/ios/edge/AppDelegate.swift @@ -1,3 +1,4 @@ +import Expo import Firebase import FirebaseMessaging import RNBootSplash @@ -8,7 +9,7 @@ import UIKit import UserNotifications @main -class AppDelegate: UIResponder, UIApplicationDelegate { +class AppDelegate: ExpoAppDelegate { var window: UIWindow? var securityView: UIView? @@ -19,7 +20,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { * Handles deep links. * From https://reactnative.dev/docs/0.79/linking?ios-language=swift#enabling-deep-links */ - func application( + override func application( _ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:] ) -> Bool { return RCTLinkingManager.application(app, open: url, options: options) @@ -29,7 +30,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { * Handles deep links. * From https://reactnative.dev/docs/0.79/linking?ios-language=swift#enabling-deep-links */ - func application( + override func application( _ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void @@ -45,7 +46,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { * Handles app start-up. * React Native template code. */ - func application( + override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil ) -> Bool { @@ -58,11 +59,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // React Native template code: let delegate = ReactNativeDelegate() - let factory = RCTReactNativeFactory(delegate: delegate) + let factory = ExpoReactNativeFactory(delegate: delegate) delegate.dependencyProvider = RCTAppDependencyProvider() reactNativeDelegate = delegate reactNativeFactory = factory + bindReactNativeFactory(factory) window = UIWindow(frame: UIScreen.main.bounds) @@ -72,14 +74,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { launchOptions: launchOptions ) - return true + return super.application(application, didFinishLaunchingWithOptions: launchOptions) } /** * Periodic background fetch logic. * Edge addition. */ - func application( + override func application( _ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void ) { @@ -128,7 +130,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { * Hides the app when we go into the background. * Edge addition. */ - func applicationDidEnterBackground(_ application: UIApplication) { + override func applicationDidEnterBackground(_ application: UIApplication) { guard let storyboard = UIStoryboard(name: "LaunchScreen", bundle: nil) as UIStoryboard?, let launchScreen = storyboard.instantiateInitialViewController(), @@ -148,7 +150,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { * Shows the app when we come into the foreground. * Edge addition. */ - func applicationWillEnterForeground(_ application: UIApplication) { + override func applicationWillEnterForeground(_ application: UIApplication) { if let view = securityView { view.removeFromSuperview() securityView = nil @@ -158,13 +160,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { /// Configures the React Native instance. /// React Native template code. -class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { +class ReactNativeDelegate: ExpoReactNativeFactoryDelegate { override func sourceURL(for bridge: RCTBridge) -> URL? { self.bundleURL() } // react-native-bootsplash integration: - override func customize(_ rootView: RCTRootView) { + override func customize(_ rootView: UIView) { super.customize(rootView) RNBootSplash.initWithStoryboard("LaunchScreen", rootView: rootView) } diff --git a/metro.config.js b/metro.config.js index 939f4ee12a8..39a9d819eb9 100644 --- a/metro.config.js +++ b/metro.config.js @@ -1,4 +1,5 @@ -const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') +const { getDefaultConfig } = require('expo/metro-config') +const { mergeConfig } = require('@react-native/metro-config') const { wrapWithReanimatedMetroConfig } = require('react-native-reanimated/metro-config') diff --git a/package.json b/package.json index 6d2af4c4b81..150f5ff8a44 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@react-navigation/elements": "^1.3.14", "@react-navigation/native": "^6.1.3", "@react-navigation/stack": "^6.3.12", - "@sentry/react-native": "^6.14.0", + "@sentry/react-native": "^6.20.0", "@types/jsrsasign": "^10.5.13", "@unstoppabledomains/resolution": "^9.3.0", "@walletconnect/react-native-compat": "^2.21.6", diff --git a/patches/react-native-contacts+8.0.5.patch b/patches/react-native-contacts+8.0.5.patch new file mode 100644 index 00000000000..9cd9d8dd6c1 --- /dev/null +++ b/patches/react-native-contacts+8.0.5.patch @@ -0,0 +1,35 @@ +diff --git a/node_modules/react-native-contacts/src/NativeContacts.ts b/node_modules/react-native-contacts/src/NativeContacts.ts +index fc5f61a..9fa1903 100644 +--- a/node_modules/react-native-contacts/src/NativeContacts.ts ++++ b/node_modules/react-native-contacts/src/NativeContacts.ts +@@ -22,20 +22,20 @@ export interface Spec extends TurboModule { + requestPermission: () => Promise; + writePhotoToPath: (contactId: string, file: string) => Promise; + iosEnableNotesUsage: (enabled: boolean) => void; +- getGroups(): Promise; +- getGroup: (identifier: string) => Promise; +- deleteGroup(identifier: string): Promise; +- updateGroup(identifier: string, groupData: Object): Promise; +- addGroup(group: Object): Promise; +- contactsInGroup(identifier: string): Promise; +- addContactsToGroup( ++ getGroups?: () => Promise; ++ getGroup?: (identifier: string) => Promise; ++ deleteGroup?: (identifier: string) => Promise; ++ updateGroup?: (identifier: string, groupData: Object) => Promise; ++ addGroup?: (group: Object) => Promise; ++ contactsInGroup?: (identifier: string) => Promise; ++ addContactsToGroup?: ( + groupIdentifier: string, + contactIdentifiers: string[] +- ): Promise; +- removeContactsFromGroup( ++ ) => Promise; ++ removeContactsFromGroup?: ( + groupIdentifier: string, + contactIdentifiers: string[] +- ): Promise; ++ ) => Promise; + } + + export default TurboModuleRegistry.get("RCTContacts"); diff --git a/src/__tests__/components/__snapshots__/FilledTextInput.test.tsx.snap b/src/__tests__/components/__snapshots__/FilledTextInput.test.tsx.snap index e31f4b53330..7529eb6e076 100644 --- a/src/__tests__/components/__snapshots__/FilledTextInput.test.tsx.snap +++ b/src/__tests__/components/__snapshots__/FilledTextInput.test.tsx.snap @@ -146,7 +146,7 @@ exports[`FilledTextInput should render with some props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -158,7 +158,7 @@ exports[`FilledTextInput should render with some props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/AddressModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/AddressModal.test.tsx.snap index 4bd7c136b09..76956c2b786 100644 --- a/src/__tests__/modals/__snapshots__/AddressModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/AddressModal.test.tsx.snap @@ -660,7 +660,7 @@ exports[`AddressModalComponent should render with loaded props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -672,7 +672,7 @@ exports[`AddressModalComponent should render with loaded props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/CategoryModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/CategoryModal.test.tsx.snap index c3c82679233..594b71836bc 100644 --- a/src/__tests__/modals/__snapshots__/CategoryModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/CategoryModal.test.tsx.snap @@ -2514,7 +2514,7 @@ exports[`CategoryModal should render with an empty subcategory 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -2526,7 +2526,7 @@ exports[`CategoryModal should render with an empty subcategory 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/CountryListModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/CountryListModal.test.tsx.snap index 359f08dffe2..3bc100dd3d7 100644 --- a/src/__tests__/modals/__snapshots__/CountryListModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/CountryListModal.test.tsx.snap @@ -661,7 +661,7 @@ exports[`CountryListModal should render with a country list 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -673,7 +673,7 @@ exports[`CountryListModal should render with a country list 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/LogsModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/LogsModal.test.tsx.snap index ea1570ba50c..7295fba2053 100644 --- a/src/__tests__/modals/__snapshots__/LogsModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/LogsModal.test.tsx.snap @@ -839,7 +839,7 @@ exports[`LogsModal should render with a logs modal 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -851,7 +851,7 @@ exports[`LogsModal should render with a logs modal 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/PasswordReminderModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/PasswordReminderModal.test.tsx.snap index d69fb08aaa7..68263eb0a69 100644 --- a/src/__tests__/modals/__snapshots__/PasswordReminderModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/PasswordReminderModal.test.tsx.snap @@ -767,7 +767,7 @@ Please enter your password below. A successful verification will prevent this wa "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -779,7 +779,7 @@ Please enter your password below. A successful verification will prevent this wa { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/TextInputModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/TextInputModal.test.tsx.snap index d347d6e9ad4..f83bc812453 100644 --- a/src/__tests__/modals/__snapshots__/TextInputModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/TextInputModal.test.tsx.snap @@ -584,7 +584,7 @@ exports[`TextInputModal should render with a blank input field 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -596,7 +596,7 @@ exports[`TextInputModal should render with a blank input field 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/WalletListModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/WalletListModal.test.tsx.snap index e376b66c447..7a5a42bba30 100644 --- a/src/__tests__/modals/__snapshots__/WalletListModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/WalletListModal.test.tsx.snap @@ -482,7 +482,7 @@ exports[`WalletListModal should render with loading props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "Material Icons", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -494,7 +494,7 @@ exports[`WalletListModal should render with loading props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "Material Icons", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -665,7 +665,7 @@ exports[`WalletListModal should render with loading props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -677,7 +677,7 @@ exports[`WalletListModal should render with loading props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletAccountSetupScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletAccountSetupScene.test.tsx.snap index 67f87a5c888..0b5abc8f75f 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletAccountSetupScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletAccountSetupScene.test.tsx.snap @@ -845,7 +845,7 @@ exports[`CreateWalletAccountSelect renders 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -857,7 +857,7 @@ exports[`CreateWalletAccountSelect renders 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap index d0c69b41456..01b6a499c36 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap @@ -813,7 +813,7 @@ exports[`CreateWalletImportScene should render with loading props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -825,7 +825,7 @@ exports[`CreateWalletImportScene should render with loading props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap index 34cf1724fb1..48c44ebbceb 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap @@ -588,7 +588,7 @@ exports[`CreateWalletSelectCrypto should render with loading props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "Material Icons", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -600,7 +600,7 @@ exports[`CreateWalletSelectCrypto should render with loading props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "Material Icons", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -772,7 +772,7 @@ exports[`CreateWalletSelectCrypto should render with loading props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -784,7 +784,7 @@ exports[`CreateWalletSelectCrypto should render with loading props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/scenes/__snapshots__/DefaultFiatSettingScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/DefaultFiatSettingScene.test.tsx.snap index 9c7b3879983..e33b18fe3fc 100644 --- a/src/__tests__/scenes/__snapshots__/DefaultFiatSettingScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/DefaultFiatSettingScene.test.tsx.snap @@ -587,7 +587,7 @@ exports[`DefaultFiatSettingComponent should render with loading props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "Material Icons", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -599,7 +599,7 @@ exports[`DefaultFiatSettingComponent should render with loading props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "Material Icons", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -772,7 +772,7 @@ exports[`DefaultFiatSettingComponent should render with loading props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -784,7 +784,7 @@ exports[`DefaultFiatSettingComponent should render with loading props 1`] = ` { "color": "rgba(255, 255, 255, 0.5019607843137255)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/components/common/AnimatedNumber.tsx b/src/components/common/AnimatedNumber.tsx index 796338ff8ee..b715f5e3531 100644 --- a/src/components/common/AnimatedNumber.tsx +++ b/src/components/common/AnimatedNumber.tsx @@ -99,10 +99,10 @@ const AnimatedDigit = (props: AnimatedDigitProps): React.ReactElement => { const styles = getStyles(useTheme()) if (!isIntegerDigit(digit)) { - animY.value = withTiming(0, { duration: animationDuration, easing }) + // animY.value = withTiming(0, { duration: animationDuration, easing }) } else { const height = -1 * (numberHeight * Number(digit)) - animY.value = withTiming(height, { duration: animationDuration, easing }) + // animY.value = withTiming(height, { duration: animationDuration, easing }) } const animStyle = useAnimatedStyle(() => { diff --git a/src/components/icons/FiatIcon.tsx b/src/components/icons/FiatIcon.tsx index 29b1e51b236..03ce4522886 100644 --- a/src/components/icons/FiatIcon.tsx +++ b/src/components/icons/FiatIcon.tsx @@ -4,6 +4,7 @@ import FastImage from 'react-native-fast-image' import { getFiatSymbol } from '../../constants/WalletAndCurrencyConstants' import { getCurrencyIconUris } from '../../util/CdnUris' +import { safeFontSize } from '../../util/safeFontSize' import { fixSides, mapSides, sidesToMargin } from '../../util/sides' import { fixFiatCurrencyCode } from '../../util/utils' import { cacheStyles, type Theme, useTheme } from '../services/ThemeContext' @@ -54,7 +55,9 @@ export const FiatIconComponent = (props: Props) => { }, [marginRem, sizeRem, styles.fiatIcon, theme]) const textStyle = React.useMemo(() => { - const fiatSymbolSizing = { fontSize: theme.rem(sizeRem * 0.625) } + const fiatSymbolSizing = { + fontSize: safeFontSize(theme.rem(sizeRem * 0.625)) + } return [styles.fiatSymbol, fiatSymbolSizing] }, [sizeRem, styles.fiatSymbol, theme]) diff --git a/src/components/icons/IconBadge.tsx b/src/components/icons/IconBadge.tsx index 905a6a544a7..a5725b35311 100644 --- a/src/components/icons/IconBadge.tsx +++ b/src/components/icons/IconBadge.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { Platform, type StyleProp, View, type ViewStyle } from 'react-native' +import { safeFontSize } from '../../util/safeFontSize' import { cacheStyles, type Theme, useTheme } from '../services/ThemeContext' import { EdgeText } from '../themed/EdgeText' @@ -83,13 +84,13 @@ const getStyles = cacheStyles((theme: Theme) => { justifyContent: 'center' }, textIos: { - fontSize: theme.rem(0.5) - 1, + fontSize: safeFontSize(theme.rem(0.5) - 1), fontFamily: theme.fontFaceBold, marginLeft: 2, marginRight: 1 }, textAndroid: { - fontSize: theme.rem(0.5) - 1, + fontSize: safeFontSize(theme.rem(0.5) - 1), fontFamily: theme.fontFaceBold, marginTop: 1.5, marginHorizontal: 2 diff --git a/src/components/icons/ThemedIcons.tsx b/src/components/icons/ThemedIcons.tsx index 487cec10db7..c78b2cdfed2 100644 --- a/src/components/icons/ThemedIcons.tsx +++ b/src/components/icons/ThemedIcons.tsx @@ -9,6 +9,7 @@ import Ionicons from 'react-native-vector-icons/Ionicons' import MaterialIcons from 'react-native-vector-icons/MaterialIcons' import { Fontello } from '../../assets/vector' +import { safeFontSize } from '../../util/safeFontSize' import { useTheme } from '../services/ThemeContext' // @@ -52,7 +53,7 @@ function AnimatedFontIcon( const style = useAnimatedStyle(() => ({ color: color?.value ?? defaultColor, fontFamily, - fontSize: size?.value ?? defaultSize, + fontSize: safeFontSize(size?.value ?? defaultSize ?? 1), fontStyle: 'normal', fontWeight: 'normal' })) diff --git a/src/components/themed/FilledTextInput.tsx b/src/components/themed/FilledTextInput.tsx index f288547869c..97d6e4b4b8b 100644 --- a/src/components/themed/FilledTextInput.tsx +++ b/src/components/themed/FilledTextInput.tsx @@ -37,6 +37,7 @@ import { formatToNativeNumber, isValidInput } from '../../locales/intl' +import { safeFontSize } from '../../util/safeFontSize' import { EdgeTouchableWithoutFeedback } from '../common/EdgeTouchableWithoutFeedback' import { styled, styledWithRef } from '../hoc/styled' import { @@ -725,7 +726,7 @@ const PlaceholderText = styled(Animated.Text)<{ theme => ({ disableAnimation, focusAnimation, scale, shift, textsizeRem }) => { const fontSizeBase = theme.rem(textsizeRem ?? scale.value) - const fontSizeScaled = theme.rem(scale.value) * 0.75 + const fontSizeScaled = safeFontSize(theme.rem(scale.value) * 0.75) const interpolatePlaceholderTextColor = useAnimatedColorInterpolateFn( theme.textInputPlaceholderColor, theme.textInputPlaceholderColorFocused, @@ -785,7 +786,7 @@ const StyledAnimatedTextInput = styledWithRef(AnimatedTextInput)<{ }, useAnimatedStyle(() => ({ color: interpolateTextColor(focusAnimation, disableAnimation), - fontSize: scale.value * rem + fontSize: safeFontSize(scale.value * rem) })) ] }) diff --git a/src/util/safeFontSize.ts b/src/util/safeFontSize.ts new file mode 100644 index 00000000000..2b66e7b3648 --- /dev/null +++ b/src/util/safeFontSize.ts @@ -0,0 +1,31 @@ +/** + * Ensures a font size value is safe for React Native rendering. + * React Native crashes when fontSize is 0 or negative on both iOS and Android. + * + * @param size - The font size value to validate + * @param minimumSize - The minimum allowed font size (default: 1) + * @returns A safe font size value that won't crash the app + */ +export const safeFontSize = (size: number, minimumSize: number = 1): number => { + // Handle non-finite values (NaN, Infinity, -Infinity) + if (!Number.isFinite(size)) { + if (__DEV__) { + console.warn( + `safeFontSize: Invalid fontSize value ${size}, using minimum ${minimumSize}` + ) + } + return minimumSize + } + + // Ensure size is not zero or negative + if (size <= 0) { + if (__DEV__) { + console.warn( + `safeFontSize: fontSize ${size} is <= 0, using minimum ${minimumSize}` + ) + } + return minimumSize + } + + return size +} diff --git a/yarn.lock b/yarn.lock index 397d5446f56..3a2c552dcc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1133,12 +1133,7 @@ bfs-path "^1.0.2" cross-fetch "^3.1.5" -"@chain-registry/types@^2.0.28", "@chain-registry/types@^2.0.30": - version "2.0.30" - resolved "https://registry.yarnpkg.com/@chain-registry/types/-/types-2.0.30.tgz#08c7d5d02b04e0049ae42e3c701862c1cfd7d87a" - integrity sha512-5bcDLnsNhJ5lB7f9StIOebo+0Rf6C5sA1CtCQ4OtmNJVhqouIWLDvnQngJBbyiknYd3JPskI/HyP6AZ6P3GF3g== - -"@chain-registry/types@^2.0.42": +"@chain-registry/types@^2.0.28", "@chain-registry/types@^2.0.30", "@chain-registry/types@^2.0.42": version "2.0.42" resolved "https://registry.yarnpkg.com/@chain-registry/types/-/types-2.0.42.tgz#9d86692fcc400d13246ab08085ff40ac040566a7" integrity sha512-ozPgnok3kmtABQSUH4UussJdpygrdwA0uQJdnDhiVPczQ6OH5UQSvpX5UXDfNiutRkTztp7h/TA1DSQQbiQo1g== @@ -4547,96 +4542,96 @@ "@noble/hashes" "~1.7.0" "@scure/base" "~1.2.1" -"@sentry-internal/browser-utils@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.54.0.tgz#2d68c7fa843db867ed98059faf1a750be3eca95a" - integrity sha512-DKWCqb4YQosKn6aD45fhKyzhkdG7N6goGFDeyTaJFREJDFVDXiNDsYZu30nJ6BxMM7uQIaARhPAC5BXfoED3pQ== +"@sentry-internal/browser-utils@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.55.0.tgz#d89bae423edd29c39f01285c8e2d59ce9289d9a6" + integrity sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw== dependencies: - "@sentry/core" "8.54.0" + "@sentry/core" "8.55.0" -"@sentry-internal/feedback@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.54.0.tgz#52c3a63aa5b520eca7acfa1376621e8441984126" - integrity sha512-nQqRacOXoElpE0L0ADxUUII0I3A94niqG9Z4Fmsw6057QvyrV/LvTiMQBop6r5qLjwMqK+T33iR4/NQI5RhsXQ== +"@sentry-internal/feedback@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.55.0.tgz#170b8e96a36ce6f71f53daad680f1a0c98381314" + integrity sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw== dependencies: - "@sentry/core" "8.54.0" + "@sentry/core" "8.55.0" -"@sentry-internal/replay-canvas@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.54.0.tgz#e57a3893db2bb0ea7ad9dc2a804bb035142fe3ba" - integrity sha512-K/On3OAUBeq/TV2n+1EvObKC+WMV9npVXpVyJqCCyn8HYMm8FUGzuxeajzm0mlW4wDTPCQor6mK9/IgOquUzCw== +"@sentry-internal/replay-canvas@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.55.0.tgz#e65430207a2f18e4a07c25c669ec758d11282aaf" + integrity sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w== dependencies: - "@sentry-internal/replay" "8.54.0" - "@sentry/core" "8.54.0" + "@sentry-internal/replay" "8.55.0" + "@sentry/core" "8.55.0" -"@sentry-internal/replay@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.54.0.tgz#b92990a51ffbe8d92998ff8188db9e3a6f9d1e18" - integrity sha512-8xuBe06IaYIGJec53wUC12tY2q4z2Z0RPS2s1sLtbA00EvK1YDGuXp96IDD+HB9mnDMrQ/jW5f97g9TvPsPQUg== +"@sentry-internal/replay@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.55.0.tgz#4c00b22cdf58cac5b3e537f8d4f675f2b021f475" + integrity sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw== dependencies: - "@sentry-internal/browser-utils" "8.54.0" - "@sentry/core" "8.54.0" + "@sentry-internal/browser-utils" "8.55.0" + "@sentry/core" "8.55.0" -"@sentry/babel-plugin-component-annotate@3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.4.0.tgz#f47a7652e16f84556df82cbc38f0004bca1335d1" - integrity sha512-tSzfc3aE7m0PM0Aj7HBDet5llH9AB9oc+tBQ8AvOqUSnWodLrNCuWeQszJ7mIBovD3figgCU3h0cvI6U5cDtsg== - -"@sentry/browser@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.54.0.tgz#5487075908aac564892e689e1b6d233fdb314f5b" - integrity sha512-BgUtvxFHin0fS0CmJVKTLXXZcke0Av729IVfi+2fJ4COX8HO7/HAP02RKaSQGmL2HmvWYTfNZ7529AnUtrM4Rg== - dependencies: - "@sentry-internal/browser-utils" "8.54.0" - "@sentry-internal/feedback" "8.54.0" - "@sentry-internal/replay" "8.54.0" - "@sentry-internal/replay-canvas" "8.54.0" - "@sentry/core" "8.54.0" - -"@sentry/cli-darwin@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.45.0.tgz#e3d6feae4fadcfdf91db9c7b9c4689a66d3d8d19" - integrity sha512-p4Uxfv/L2fQdP3/wYnKVVz9gzZJf/1Xp9D+6raax/3Bu5y87yHYUqcdt98y/VAXQD4ofp2QgmhGUVPofvQNZmg== - -"@sentry/cli-linux-arm64@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.45.0.tgz#384c8e17f7e7dc007d164033d0e7c75aa83a2e9b" - integrity sha512-gUcLoEjzg7AIc4QQGEZwRHri+EHf3Gcms9zAR1VHiNF3/C/jL4WeDPJF2YiWAQt6EtH84tHiyhw1Ab/R8XFClg== - -"@sentry/cli-linux-arm@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.45.0.tgz#b9d6f86f3934b4d9ced5b45a8158ff2ac2bdd25d" - integrity sha512-6sEskFLlFKJ+e0MOYgIclBTUX5jYMyYhHIxXahEkI/4vx6JO0uvpyRAkUJRpJkRh/lPog0FM+tbP3so+VxB2qQ== - -"@sentry/cli-linux-i686@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.45.0.tgz#39e22beb84cfa26e11bdc198364315fdfb4da4d5" - integrity sha512-VmmOaEAzSW23YdGNdy/+oQjCNAMY+HmOGA77A25/ep/9AV7PQB6FI7xO5Y1PVvlkxZFJ23e373njSsEeg4uDZw== - -"@sentry/cli-linux-x64@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.45.0.tgz#25cd3699297f9433835fb5edd42dad722c11f041" - integrity sha512-a0Oj68mrb25a0WjX/ShZ6AAd4PPiuLcgyzQr7bl2+DvYxIOajwkGbR+CZFEhOVZcfhTnixKy/qIXEzApEPHPQg== - -"@sentry/cli-win32-arm64@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.45.0.tgz#50c7d29ea2169bdb4d98bbde81c5f7dac0dd3955" - integrity sha512-vn+CwS4p+52pQSLNPoi20ZOrQmv01ZgAmuMnjkh1oUZfTyBAwWLrAh6Cy4cztcN8DfL5dOWKQBo8DBKURE4ttg== - -"@sentry/cli-win32-i686@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.45.0.tgz#201075c4aec37a3e797160e0b468641245437f0c" - integrity sha512-8mMoDdlwxtcdNIMtteMK7dbi7054jak8wKSHJ5yzMw8UmWxC5thc/gXBc1uPduiaI56VjoJV+phWHBKCD+6I4w== - -"@sentry/cli-win32-x64@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.45.0.tgz#2075e9e1ea3c3609e0fa1a758ca033e94e1c600f" - integrity sha512-ZvK9cIqFaq7vZ0jkHJ/xh5au6902Dr+AUxSk6L6vCL7JCe2p93KGL/4d8VFB5PD/P7Y9b+105G/e0QIFKzpeOw== - -"@sentry/cli@2.45.0": - version "2.45.0" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.45.0.tgz#35feed7a2fee54faf25daed73001a2a2a3143396" - integrity sha512-4sWu7zgzgHAjIxIjXUA/66qgeEf5ZOlloO+/JaGD5qXNSW0G7KMTR6iYjReNKMgdBCTH6bUUt9qiuA+Ex9Masw== +"@sentry/babel-plugin-component-annotate@4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.1.1.tgz#371415afc602f6b2ba0987b51123bd34d1603193" + integrity sha512-HUpqrCK7zDVojTV6KL6BO9ZZiYrEYQqvYQrscyMsq04z+WCupXaH6YEliiNRvreR8DBJgdsG3lBRpebhUGmvfA== + +"@sentry/browser@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.55.0.tgz#9a489e2a54d29c65e6271b4ee594b43679cab7bd" + integrity sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw== + dependencies: + "@sentry-internal/browser-utils" "8.55.0" + "@sentry-internal/feedback" "8.55.0" + "@sentry-internal/replay" "8.55.0" + "@sentry-internal/replay-canvas" "8.55.0" + "@sentry/core" "8.55.0" + +"@sentry/cli-darwin@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.51.1.tgz#3a1db065651893f72dad3a502b2d7c2f5e6a7dd8" + integrity sha512-R1u8IQdn/7Rr8sf6bVVr0vJT4OqwCFdYsS44Y3OoWGVJW2aAQTWRJOTlV4ueclVLAyUQzmgBjfR8AtiUhd/M5w== + +"@sentry/cli-linux-arm64@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.51.1.tgz#b4c957a06bafc13623c48971eadb0cff7d3662a3" + integrity sha512-nvA/hdhsw4bKLhslgbBqqvETjXwN1FVmwHLOrRvRcejDO6zeIKUElDiL5UOjGG0NC+62AxyNw5ri8Wzp/7rg9Q== + +"@sentry/cli-linux-arm@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.51.1.tgz#f761d0c58d27be503471cee4ffc41875a7d9430b" + integrity sha512-Klro17OmSSKOOSaxVKBBNPXet2+HrIDZUTSp8NRl4LQsIubdc1S/aQ79cH/g52Muwzpl3aFwPxyXw+46isfEgA== + +"@sentry/cli-linux-i686@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.51.1.tgz#62baaf83c5995e478186289a45315d0acd5bd3bf" + integrity sha512-jp4TmR8VXBdT9dLo6mHniQHN0xKnmJoPGVz9h9VDvO2Vp/8o96rBc555D4Am5wJOXmfuPlyjGcmwHlB3+kQRWw== + +"@sentry/cli-linux-x64@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.51.1.tgz#0010fe24ad8ef492a917c12feb351ba768e72603" + integrity sha512-JuLt0MXM2KHNFmjqXjv23sly56mJmUQzGBWktkpY3r+jE08f5NLKPd5wQ6W/SoLXGIOKnwLz0WoUg7aBVyQdeQ== + +"@sentry/cli-win32-arm64@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.51.1.tgz#0894f9a91e6ecb3021ca09fe644f995ff4ff826d" + integrity sha512-PiwjTdIFDazTQCTyDCutiSkt4omggYSKnO3HE1+LDjElsFrWY9pJs4fU3D40WAyE2oKu0MarjNH/WxYGdqEAlg== + +"@sentry/cli-win32-i686@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.51.1.tgz#6a6c6402cdce4fd038716b2c1e0bfa788b54f3e9" + integrity sha512-TMvZZpeiI2HmrDFNVQ0uOiTuYKvjEGOZdmUxe3WlhZW82A/2Oka7sQ24ljcOovbmBOj5+fjCHRUMYvLMCWiysA== + +"@sentry/cli-win32-x64@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.51.1.tgz#d361e37146c9269d40c37459271a6c2cfa1fa8a6" + integrity sha512-v2hreYUPPTNK1/N7+DeX7XBN/zb7p539k+2Osf0HFyVBaoUC3Y3+KBwSf4ASsnmgTAK7HCGR+X0NH1vP+icw4w== + +"@sentry/cli@2.51.1": + version "2.51.1" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.51.1.tgz#c6bdc6025e8f600e44fc76f8274c369aeb5d4df4" + integrity sha512-FU+54kNcKJABU0+ekvtnoXHM9zVrDe1zXVFbQT7mS0On0m1P0zFRGdzbnWe2XzpzuEAJXtK6aog/W+esRU9AIA== dependencies: https-proxy-agent "^5.0.0" node-fetch "^2.6.7" @@ -4644,55 +4639,55 @@ proxy-from-env "^1.1.0" which "^2.0.2" optionalDependencies: - "@sentry/cli-darwin" "2.45.0" - "@sentry/cli-linux-arm" "2.45.0" - "@sentry/cli-linux-arm64" "2.45.0" - "@sentry/cli-linux-i686" "2.45.0" - "@sentry/cli-linux-x64" "2.45.0" - "@sentry/cli-win32-arm64" "2.45.0" - "@sentry/cli-win32-i686" "2.45.0" - "@sentry/cli-win32-x64" "2.45.0" - -"@sentry/core@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.54.0.tgz#a2ebec965cadcb6de89e116689feeef79d5862a6" - integrity sha512-03bWf+D1j28unOocY/5FDB6bUHtYlm6m6ollVejhg45ZmK9iPjdtxNWbrLsjT1WRym0Tjzowu+A3p+eebYEv0Q== - -"@sentry/react-native@^6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-6.14.0.tgz#bc6bdaf03860bb8946f8c30570a9abd82ed6cfc0" - integrity sha512-BBqixN6oV6tCNp1ABXfzvD531zxj1fUAH0HDPvOR/jX0h9f9pYfxCyI64B+DoQbVZKFsg8nte0QIHkZDhRAW9A== - dependencies: - "@sentry/babel-plugin-component-annotate" "3.4.0" - "@sentry/browser" "8.54.0" - "@sentry/cli" "2.45.0" - "@sentry/core" "8.54.0" - "@sentry/react" "8.54.0" - "@sentry/types" "8.54.0" - "@sentry/utils" "8.54.0" - -"@sentry/react@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-8.54.0.tgz#16cec103b5d5697bdfebacf6e2d35f19699b3ab3" - integrity sha512-42T/fp8snYN19Fy/2P0Mwotu4gcdy+1Lx+uYCNcYP1o7wNGigJ7qb27sW7W34GyCCHjoCCfQgeOqDQsyY8LC9w== - dependencies: - "@sentry/browser" "8.54.0" - "@sentry/core" "8.54.0" + "@sentry/cli-darwin" "2.51.1" + "@sentry/cli-linux-arm" "2.51.1" + "@sentry/cli-linux-arm64" "2.51.1" + "@sentry/cli-linux-i686" "2.51.1" + "@sentry/cli-linux-x64" "2.51.1" + "@sentry/cli-win32-arm64" "2.51.1" + "@sentry/cli-win32-i686" "2.51.1" + "@sentry/cli-win32-x64" "2.51.1" + +"@sentry/core@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.55.0.tgz#4964920229fcf649237ef13b1533dfc4b9f6b22e" + integrity sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA== + +"@sentry/react-native@^6.20.0": + version "6.20.0" + resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-6.20.0.tgz#6325f7393f24f1286bd9d1f3c68562cf99028864" + integrity sha512-YngSba14Hsb5t/ZNMOyxb/HInmYRL5pQ74BkoMBQ/UBBM5kWHgSILxoO2XkKYtaaJXrkSJj+kBalELHblz9h5g== + dependencies: + "@sentry/babel-plugin-component-annotate" "4.1.1" + "@sentry/browser" "8.55.0" + "@sentry/cli" "2.51.1" + "@sentry/core" "8.55.0" + "@sentry/react" "8.55.0" + "@sentry/types" "8.55.0" + "@sentry/utils" "8.55.0" + +"@sentry/react@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-8.55.0.tgz#309f005837956a98e79275ef8c2c2b5952c8be93" + integrity sha512-/qNBvFLpvSa/Rmia0jpKfJdy16d4YZaAnH/TuKLAtm0BWlsPQzbXCU4h8C5Hsst0Do0zG613MEtEmWpWrVOqWA== + dependencies: + "@sentry/browser" "8.55.0" + "@sentry/core" "8.55.0" hoist-non-react-statics "^3.3.2" -"@sentry/types@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.54.0.tgz#1d57bb094443081de4e0d8b638e6ebc40f5ddd36" - integrity sha512-wztdtr7dOXQKi0iRvKc8XJhJ7HaAfOv8lGu0yqFOFwBZucO/SHnu87GOPi8mvrTiy1bentQO5l+zXWAaMvG4uw== +"@sentry/types@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.55.0.tgz#af157791277c09debaca278c02522bd5bd548c32" + integrity sha512-6LRT0+r6NWQ+RtllrUW2yQfodST0cJnkOmdpHA75vONgBUhpKwiJ4H7AmgfoTET8w29pU6AnntaGOe0LJbOmog== dependencies: - "@sentry/core" "8.54.0" + "@sentry/core" "8.55.0" -"@sentry/utils@8.54.0": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-8.54.0.tgz#5e28e03a249451b4a55200a0787f4e2c59bab2c5" - integrity sha512-JL8UDjrsKxKclTdLXfuHfE7B3KbrAPEYP7tMyN/xiO2vsF6D84fjwYyalO0ZMtuFZE6vpSze8ZOLEh6hLnPYsw== +"@sentry/utils@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-8.55.0.tgz#6d575a68f4c37a7b45aa808a842693c12108c190" + integrity sha512-cYcl39+xcOivBpN9d8ZKbALl+DxZKo/8H0nueJZ0PO4JA+MJGhSm6oHakXxLPaiMoNLTX7yor8ndnQIuFg+vmQ== dependencies: - "@sentry/core" "8.54.0" + "@sentry/core" "8.55.0" "@sideway/address@^4.1.0": version "4.1.2" @@ -7951,14 +7946,7 @@ chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" -chain-registry@^2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/chain-registry/-/chain-registry-2.0.30.tgz#d99c5e71e48480f7e2d225228c75ea1adb7e3b40" - integrity sha512-EGwgdjXYVU9oBCKOpXImAEvJIC4zP6C3Efl/Jw5llNUchCuy1zilgzhuj802Sf+Y/f2DITfF1CjNfSty4eeYNg== - dependencies: - "@chain-registry/types" "^2.0.30" - -chain-registry@^2.0.37: +chain-registry@^2.0.30, chain-registry@^2.0.37: version "2.0.42" resolved "https://registry.yarnpkg.com/chain-registry/-/chain-registry-2.0.42.tgz#9ece4cbbf335c1bdb725e2573aae9dfe0442c88a" integrity sha512-Magth+y5yLEvyKLgOMJBkxtvaXufyE8/0KhLfyKZfG2Fqy+R9AuKoffr99n8ViSSAXf0kZCYDMZ8bh27P3Vo3A==