Merge branch 'master' into langtsx

This commit is contained in:
Marcos Rodriguez Velez 2023-10-21 13:53:46 -04:00
commit fdaa5cda39
No known key found for this signature in database
GPG key ID: 6030B2F48CCE86D7
44 changed files with 396 additions and 344 deletions

2
App.js
View file

@ -11,7 +11,6 @@ import {
UIManager,
useColorScheme,
View,
StatusBar,
LogBox,
} from 'react-native';
import { NavigationContainer, CommonActions } from '@react-navigation/native';
@ -384,7 +383,6 @@ const App = () => {
return (
<SafeAreaProvider>
<View style={styles.root}>
<StatusBar barStyle={colorScheme === 'dark' ? 'light-content' : 'dark-content'} backgroundColor="transparent" translucent />
<NavigationContainer ref={navigationRef} theme={colorScheme === 'dark' ? BlueDarkTheme : BlueDefaultTheme}>
<InitRoot />
<Notifications onProcessNotifications={processPushNotifications} />

View file

@ -316,14 +316,16 @@ const AztecoRedeemRoot = () => {
const ScanQRCodeStack = createNativeStackNavigator();
const ScanQRCodeRoot = () => (
<ScanQRCodeStack.Navigator screenOptions={{ headerShown: false, stackPresentation: isDesktop ? 'containedModal' : 'fullScreenModal' }}>
<ScanQRCodeStack.Navigator
screenOptions={{ statusBarHidden: true, headerShown: false, stackPresentation: isDesktop ? 'containedModal' : 'fullScreenModal' }}
>
<ScanQRCodeStack.Screen name="ScanQRCode" component={ScanQRCode} />
</ScanQRCodeStack.Navigator>
);
const UnlockWithScreenStack = createNativeStackNavigator();
const UnlockWithScreenRoot = () => (
<UnlockWithScreenStack.Navigator name="UnlockWithScreenRoot" screenOptions={{ headerShown: false }}>
<UnlockWithScreenStack.Navigator name="UnlockWithScreenRoot" screenOptions={{ headerShown: false, statusBarStyle: 'auto' }}>
<UnlockWithScreenStack.Screen name="UnlockWithScreen" component={UnlockWith} initialParams={{ unlockOnComponentMount: true }} />
</UnlockWithScreenStack.Navigator>
);
@ -376,7 +378,11 @@ const WalletXpubStackRoot = () => {
const theme = useTheme();
return (
<WalletXpubStack.Navigator name="WalletXpubRoot" screenOptions={{ headerHideShadow: true }} initialRouteName="WalletXpub">
<WalletXpubStack.Navigator
name="WalletXpubRoot"
screenOptions={{ headerHideShadow: true, statusBarStyle: 'light' }}
initialRouteName="WalletXpub"
>
<WalletXpubStack.Screen name="WalletXpub" component={WalletXpub} options={WalletXpub.navigationOptions(theme)} />
</WalletXpubStack.Navigator>
);
@ -387,7 +393,11 @@ const SignVerifyStackRoot = () => {
const theme = useTheme();
return (
<SignVerifyStack.Navigator name="SignVerifyRoot" screenOptions={{ headerHideShadow: true }} initialRouteName="SignVerify">
<SignVerifyStack.Navigator
name="SignVerifyRoot"
screenOptions={{ headerHideShadow: true, statusBarStyle: 'light' }}
initialRouteName="SignVerify"
>
<SignVerifyStack.Screen name="SignVerify" component={SignVerify} options={SignVerify.navigationOptions(theme)} />
</SignVerifyStack.Navigator>
);
@ -398,7 +408,11 @@ const WalletExportStackRoot = () => {
const theme = useTheme();
return (
<WalletExportStack.Navigator name="WalletExportRoot" screenOptions={{ headerHideShadow: true }} initialRouteName="WalletExport">
<WalletExportStack.Navigator
name="WalletExportRoot"
screenOptions={{ headerHideShadow: true, statusBarStyle: 'light' }}
initialRouteName="WalletExport"
>
<WalletExportStack.Screen name="WalletExport" component={WalletExport} options={WalletExport.navigationOptions(theme)} />
</WalletExportStack.Navigator>
);
@ -440,7 +454,7 @@ const ViewEditMultisigCosignersRoot = () => {
<ViewEditMultisigCosignersStack.Navigator
name="ViewEditMultisigCosignersRoot"
initialRouteName="ViewEditMultisigCosigners"
screenOptions={{ headerHideShadow: true }}
screenOptions={{ headerHideShadow: true, statusBarStyle: 'light' }}
>
<ViewEditMultisigCosignersStack.Screen
name="ViewEditMultisigCosigners"
@ -459,7 +473,7 @@ const ExportMultisigCoordinationSetupRoot = () => {
<ExportMultisigCoordinationSetupStack.Navigator
name="ExportMultisigCoordinationSetupRoot"
initialRouteName="ExportMultisigCoordinationSetup"
screenOptions={{ headerHideShadow: true }}
screenOptions={{ headerHideShadow: true, statusBarStyle: 'light' }}
>
<ExportMultisigCoordinationSetupStack.Screen
name="ExportMultisigCoordinationSetup"
@ -486,9 +500,10 @@ const PaymentCodeStackRoot = () => {
const RootStack = createNativeStackNavigator();
const NavigationDefaultOptions = { headerShown: false, stackPresentation: isDesktop ? 'containedModal' : 'modal' };
const StatusBarLightOptions = { statusBarStyle: 'light' };
const Navigation = () => {
return (
<RootStack.Navigator initialRouteName="UnlockWithScreenRoot" screenOptions={{ headerHideShadow: true }}>
<RootStack.Navigator initialRouteName="UnlockWithScreenRoot" screenOptions={{ headerHideShadow: true, statusBarStyle: 'auto' }}>
{/* stacks */}
<RootStack.Screen name="WalletsRoot" component={WalletsRoot} options={{ headerShown: false, translucent: false }} />
<RootStack.Screen name="AddWalletRoot" component={AddWalletRoot} options={NavigationDefaultOptions} />
@ -497,15 +512,31 @@ const Navigation = () => {
<RootStack.Screen name="ScanLndInvoiceRoot" component={ScanLndInvoiceRoot} options={NavigationDefaultOptions} />
<RootStack.Screen name="AztecoRedeemRoot" component={AztecoRedeemRoot} options={NavigationDefaultOptions} />
{/* screens */}
<RootStack.Screen name="WalletExportRoot" component={WalletExportStackRoot} options={NavigationDefaultOptions} />
<RootStack.Screen
name="WalletExportRoot"
component={WalletExportStackRoot}
options={{ ...NavigationDefaultOptions, ...StatusBarLightOptions }}
/>
<RootStack.Screen
name="ExportMultisigCoordinationSetupRoot"
component={ExportMultisigCoordinationSetupRoot}
options={NavigationDefaultOptions}
/>
<RootStack.Screen name="ViewEditMultisigCosignersRoot" component={ViewEditMultisigCosignersRoot} options={NavigationDefaultOptions} />
<RootStack.Screen name="WalletXpubRoot" component={WalletXpubStackRoot} options={NavigationDefaultOptions} />
<RootStack.Screen name="SignVerifyRoot" component={SignVerifyStackRoot} options={NavigationDefaultOptions} />
<RootStack.Screen
name="ViewEditMultisigCosignersRoot"
component={ViewEditMultisigCosignersRoot}
options={{ ...NavigationDefaultOptions, ...StatusBarLightOptions }}
/>
<RootStack.Screen
name="WalletXpubRoot"
component={WalletXpubStackRoot}
options={{ ...NavigationDefaultOptions, ...StatusBarLightOptions }}
/>
<RootStack.Screen
name="SignVerifyRoot"
component={SignVerifyStackRoot}
options={{ ...NavigationDefaultOptions, ...StatusBarLightOptions }}
/>
<RootStack.Screen name="SelectWallet" component={SelectWallet} />
<RootStack.Screen name="ReceiveDetailsRoot" component={ReceiveDetailsStackRoot} options={NavigationDefaultOptions} />
<RootStack.Screen name="LappBrowserRoot" component={LappBrowserStackRoot} options={NavigationDefaultOptions} />
@ -517,6 +548,7 @@ const Navigation = () => {
options={{
headerShown: false,
stackPresentation: isDesktop ? 'containedModal' : 'fullScreenModal',
statusBarHidden: true,
}}
/>

View file

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useState } from 'react';
import { View, Image, TouchableOpacity, StyleSheet, StatusBar, ActivityIndicator, useColorScheme, LayoutAnimation } from 'react-native';
import { View, Image, TouchableOpacity, StyleSheet, ActivityIndicator, useColorScheme, LayoutAnimation } from 'react-native';
import { Icon } from 'react-native-elements';
import Biometric from './class/biometrics';
import LottieView from 'lottie-react-native';
@ -129,7 +129,6 @@ const UnlockWith = () => {
return (
<SafeAreaView style={styles.root}>
<StatusBar barStyle="default" />
<View style={styles.container}>
<LottieView source={require('./img/bluewalletsplash.json')} autoPlay loop={false} onAnimationFinish={onAnimationFinish} />
<View style={styles.biometric}>{animationDidFinish && <View style={styles.biometricRow}>{renderUnlockOptions()}</View>}</View>

View file

@ -8,6 +8,8 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application
android:name=".MainApplication"
android:label="@string/app_name"

View file

@ -5,14 +5,16 @@ const BlueApp = require('../BlueApp');
let userHasOptedOut = false;
if (process.env.NODE_ENV !== 'development') {
Bugsnag.start({
collectUserIp: false,
user: {
id: getUniqueId(),
},
onError: function (event) {
return !userHasOptedOut;
},
getUniqueId().then(uniqueID => {
Bugsnag.start({
collectUserIp: false,
user: {
id: uniqueID,
},
onError: function (event) {
return !userHasOptedOut;
},
});
});
}

View file

@ -4,6 +4,7 @@ import Frisbee from 'frisbee';
import { getApplicationName, getVersion, getSystemName, getSystemVersion, hasGmsSync, hasHmsSync } from 'react-native-device-info';
import AsyncStorage from '@react-native-async-storage/async-storage';
import loc from '../loc';
import { requestNotifications } from 'react-native-permissions';
const PushNotification = require('react-native-push-notification');
const constants = require('./constants');
@ -38,75 +39,80 @@ function Notifications(props) {
*/
const configureNotifications = async function () {
return new Promise(function (resolve) {
PushNotification.configure({
// (optional) Called when Token is generated (iOS and Android)
onRegister: async function (token) {
console.log('TOKEN:', token);
alreadyConfigured = true;
await _setPushToken(token);
resolve(true);
},
requestNotifications(['alert', 'sound', 'badge']).then(({ status, _ }) => {
if (status === 'granted') {
PushNotification.configure({
// (optional) Called when Token is generated (iOS and Android)
onRegister: async function (token) {
console.log('TOKEN:', token);
alreadyConfigured = true;
await _setPushToken(token);
resolve(true);
},
// (required) Called when a remote is received or opened, or local notification is opened
onNotification: async function (notification) {
// since we do not know whether we:
// 1) received notification while app is in background (and storage is not decrypted so wallets are not loaded)
// 2) opening this notification right now but storage is still unencrypted
// 3) any of the above but the storage is decrypted, and app wallets are loaded
//
// ...we save notification in internal notifications queue thats gona be processed later (on unsuspend with decrypted storage)
// (required) Called when a remote is received or opened, or local notification is opened
onNotification: async function (notification) {
// since we do not know whether we:
// 1) received notification while app is in background (and storage is not decrypted so wallets are not loaded)
// 2) opening this notification right now but storage is still unencrypted
// 3) any of the above but the storage is decrypted, and app wallets are loaded
//
// ...we save notification in internal notifications queue thats gona be processed later (on unsuspend with decrypted storage)
const payload = Object.assign({}, notification, notification.data);
if (notification.data && notification.data.data) Object.assign(payload, notification.data.data);
delete payload.data;
// ^^^ weird, but sometimes payload data is not in `data` but in root level
console.log('got push notification', payload);
const payload = Object.assign({}, notification, notification.data);
if (notification.data && notification.data.data) Object.assign(payload, notification.data.data);
delete payload.data;
// ^^^ weird, but sometimes payload data is not in `data` but in root level
console.log('got push notification', payload);
await Notifications.addNotification(payload);
await Notifications.addNotification(payload);
// (required) Called when a remote is received or opened, or local notification is opened
notification.finish(PushNotificationIOS.FetchResult.NoData);
// (required) Called when a remote is received or opened, or local notification is opened
notification.finish(PushNotificationIOS.FetchResult.NoData);
// if user is staring at the app when he receives the notification we process it instantly
// so app refetches related wallet
if (payload.foreground) props.onProcessNotifications();
},
// if user is staring at the app when he receives the notification we process it instantly
// so app refetches related wallet
if (payload.foreground) props.onProcessNotifications();
},
// (optional) Called when Registered Action is pressed and invokeApp is false, if true onNotification will be called (Android)
onAction: function (notification) {
console.log('ACTION:', notification.action);
console.log('NOTIFICATION:', notification);
// (optional) Called when Registered Action is pressed and invokeApp is false, if true onNotification will be called (Android)
onAction: function (notification) {
console.log('ACTION:', notification.action);
console.log('NOTIFICATION:', notification);
// process the action
},
// process the action
},
// (optional) Called when the user fails to register for remote notifications. Typically occurs when APNS is having issues, or the device is a simulator. (iOS)
onRegistrationError: function (err) {
console.error(err.message, err);
resolve(false);
},
// (optional) Called when the user fails to register for remote notifications. Typically occurs when APNS is having issues, or the device is a simulator. (iOS)
onRegistrationError: function (err) {
console.error(err.message, err);
resolve(false);
},
// IOS ONLY (optional): default: all - Permissions to register.
permissions: {
alert: true,
badge: true,
sound: true,
},
// IOS ONLY (optional): default: all - Permissions to register.
permissions: {
alert: true,
badge: true,
sound: true,
},
// Should the initial notification be popped automatically
// default: true
popInitialNotification: true,
// Should the initial notification be popped automatically
// default: true
popInitialNotification: true,
/**
* (optional) default: true
* - Specified if permissions (ios) and token (android and ios) will requested or not,
* - if not, you must call PushNotificationsHandler.requestPermissions() later
* - if you are not using remote notification or do not have Firebase installed, use this:
* requestPermissions: Platform.OS === 'ios'
*/
requestPermissions: true,
/**
* (optional) default: true
* - Specified if permissions (ios) and token (android and ios) will requested or not,
* - if not, you must call PushNotificationsHandler.requestPermissions() later
* - if you are not using remote notification or do not have Firebase installed, use this:
* requestPermissions: Platform.OS === 'ios'
*/
requestPermissions: true,
});
}
});
});
// …
};
Notifications.cleanUserOptOutFlag = async function () {
@ -227,8 +233,7 @@ function Notifications(props) {
if (!pushToken || !pushToken.token || !pushToken.os) return;
const api = new Frisbee({ baseURI });
return await api.post(
const postCall = await api.post(
'/unsubscribe',
Object.assign({}, _getHeaders(), {
body: {
@ -240,6 +245,8 @@ function Notifications(props) {
},
}),
);
Notifications.abandonPermissions();
return postCall;
};
Notifications.isNotificationsEnabled = async function () {

View file

@ -1000,6 +1000,9 @@
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Brands.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Regular.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Solid.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf",
@ -1020,6 +1023,9 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome6_Brands.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome6_Regular.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome6_Solid.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf",

View file

@ -47,7 +47,7 @@
<key>WidgetsExtension.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>144</integer>
<integer>99</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>

View file

@ -1,6 +1,6 @@
#import <RNScreens/UIViewController+RNScreens.h>
#import <Bugsnag/Bugsnag.h>
#import "AppDelegate.h"
#import <React/RCTLinkingManager.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTI18nUtil.h>

View file

@ -57,17 +57,17 @@
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>JSON File</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>public.json</string>
</array>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
<key>CFBundleTypeName</key>
<string>JSON File</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>public.json</string>
</array>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
@ -219,7 +219,7 @@
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<true/>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>

View file

@ -16,7 +16,7 @@ require_relative '../node_modules/@react-native-community/cli-platform-ios/nativ
workspace 'BlueWallet'
platform :ios, '13.0'
prepare_react_native_project!
setup_permissions(['Camera'])
setup_permissions(['Camera', 'Notifications'])
# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set.
# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded
#

View file

@ -302,7 +302,7 @@ PODS:
- React-Core
- react-native-tor (0.1.8):
- React
- react-native-webview (12.4.0):
- react-native-webview (13.6.2):
- React-Core
- react-native-widget-center (0.0.9):
- React
@ -404,7 +404,7 @@ PODS:
- React-Core
- RNDefaultPreference (1.4.4):
- React-Core
- RNDeviceInfo (8.7.1):
- RNDeviceInfo (10.11.0):
- React-Core
- RNFS (2.20.0):
- React-Core
@ -461,7 +461,7 @@ PODS:
- React-Core
- RNSVG (13.14.0):
- React-Core
- RNVectorIcons (9.2.0):
- RNVectorIcons (10.0.0):
- React-Core
- RNWatch (1.1.0):
- React
@ -752,7 +752,7 @@ SPEC CHECKSUMS:
react-native-secure-key-store: 910e6df6bc33cb790aba6ee24bc7818df1fe5898
react-native-tcp-socket: c1b7297619616b4c9caae6889bcb0aba78086989
react-native-tor: 3b14e9160b2eb7fa3f310921b2dee71a5171e5b7
react-native-webview: 65f1143983cfeaedf02fd25b2621d3f4a37075de
react-native-webview: 8fc09f66a1a5b16bbe37c3878fda27d5982bb776
react-native-widget-center: 12dfba20a4fa995850b52cf0afecf734397f4b9c
React-perflogger: 4987ad83731c23d11813c84263963b0d3028c966
React-RCTActionSheet: 5ad952b2a9740d87a5bd77280c4bc23f6f89ea0c
@ -774,13 +774,13 @@ SPEC CHECKSUMS:
RNCClipboard: d77213bfa269013bf4b857b7a9ca37ee062d8ef1
RNCPushNotificationIOS: 64218f3c776c03d7408284a819b2abfda1834bc8
RNDefaultPreference: 08bdb06cfa9188d5da97d4642dac745218d7fb31
RNDeviceInfo: aad3c663b25752a52bf8fce93f2354001dd185aa
RNDeviceInfo: bf8a32acbcb875f568217285d1793b0e8588c974
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
RNGestureHandler: fa40ab6b6cafaa7609294d31f8e8fbbd0cce8ea6
RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa
RNKeychain: a65256b6ca6ba6976132cc4124b238a5b13b3d9c
RNLocalize: dbea38dcb344bf80ff18a1757b1becf11f70cae4
RNPermissions: eae8b97d8ab0587f082966ee608f47c97b2a349b
RNPermissions: e9e703e08dfe50cf4d2ca45852eb45c4ac98f7b7
RNPrivacySnapshot: 71919dde3c6a29dd332115409c2aec564afee8f4
RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93
RNRate: ef3bcff84f39bb1d1e41c5593d3eea4aab2bd73a
@ -789,10 +789,10 @@ SPEC CHECKSUMS:
RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f
RNShare: 32e97adc8d8c97d4a26bcdd3c45516882184f8b6
RNSVG: d00c8f91c3cbf6d476451313a18f04d220d4f396
RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8
RNVectorIcons: 8b5bb0fa61d54cd2020af4f24a51841ce365c7e9
RNWatch: fd30ca40a5b5ef58dcbc195638e68219bc455236
Yoga: e71803b4c1fff832ccf9b92541e00f9b873119b9
PODFILE CHECKSUM: 23bb5c319ccbedd7e109c44fe4273afce6efb48a
PODFILE CHECKSUM: 27db07925dc3a89e9ecced7e377a50dba9deb58a
COCOAPODS: 1.11.3
COCOAPODS: 1.13.0

258
package-lock.json generated
View file

@ -63,7 +63,7 @@
"react-native-camera-kit": "13.0.0",
"react-native-crypto": "2.2.0",
"react-native-default-preference": "1.4.4",
"react-native-device-info": "8.7.1",
"react-native-device-info": "10.11.0",
"react-native-document-picker": "https://github.com/BlueWallet/react-native-document-picker#857655cdddf17751c0fae1286a9121fda2a6d568",
"react-native-draggable-flatlist": "github:BlueWallet/react-native-draggable-flatlist#ebfddc4",
"react-native-elements": "3.4.3",
@ -94,13 +94,13 @@
"react-native-safe-area-context": "3.4.1",
"react-native-screens": "3.20.0",
"react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#2076b48",
"react-native-share": "^9.4.1",
"react-native-share": "9.4.1",
"react-native-svg": "13.14.0",
"react-native-tcp-socket": "5.6.2",
"react-native-tor": "0.1.8",
"react-native-vector-icons": "9.2.0",
"react-native-vector-icons": "10.0.0",
"react-native-watch-connectivity": "1.1.0",
"react-native-webview": "12.4.0",
"react-native-webview": "13.6.2",
"react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#a128c38",
"readable-stream": "3.6.2",
"realm": "12.2.1",
@ -179,10 +179,12 @@
"integrity": "sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA=="
},
"node_modules/@babel/code-frame": {
"version": "7.18.6",
"integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
"version": "7.22.13",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
"integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
"dependencies": {
"@babel/highlight": "^7.18.6"
"@babel/highlight": "^7.22.13",
"chalk": "^2.4.2"
},
"engines": {
"node": ">=6.9.0"
@ -241,10 +243,11 @@
}
},
"node_modules/@babel/generator": {
"version": "7.21.1",
"integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
"integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
"dependencies": {
"@babel/types": "^7.21.0",
"@babel/types": "^7.23.0",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@ -353,8 +356,9 @@
}
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.18.9",
"integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"engines": {
"node": ">=6.9.0"
}
@ -370,21 +374,23 @@
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.21.0",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
"integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dependencies": {
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.18.6",
"integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dependencies": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@ -497,25 +503,28 @@
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.18.6",
"integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
"version": "7.22.6",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
"integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dependencies": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.19.4",
"integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
"integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.19.1",
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"engines": {
"node": ">=6.9.0"
}
@ -554,11 +563,12 @@
}
},
"node_modules/@babel/highlight": {
"version": "7.18.6",
"integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
"integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
"dependencies": {
"@babel/helper-validator-identifier": "^7.18.6",
"chalk": "^2.0.0",
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"engines": {
@ -566,8 +576,9 @@
}
},
"node_modules/@babel/parser": {
"version": "7.21.2",
"integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==",
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
"integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
"bin": {
"parser": "bin/babel-parser.js"
},
@ -1818,29 +1829,31 @@
}
},
"node_modules/@babel/template": {
"version": "7.20.7",
"integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
"integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"dependencies": {
"@babel/code-frame": "^7.18.6",
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/code-frame": "^7.22.13",
"@babel/parser": "^7.22.15",
"@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.21.2",
"integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
"version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
"integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
"dependencies": {
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.21.1",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.21.2",
"@babel/types": "^7.21.2",
"@babel/code-frame": "^7.22.13",
"@babel/generator": "^7.23.0",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/parser": "^7.23.0",
"@babel/types": "^7.23.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@ -1849,11 +1862,12 @@
}
},
"node_modules/@babel/types": {
"version": "7.21.2",
"integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
"integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
"dependencies": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/helper-string-parser": "^7.22.5",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
},
"engines": {
@ -18128,8 +18142,9 @@
}
},
"node_modules/react-native-device-info": {
"version": "8.7.1",
"integrity": "sha512-cVMZztFa2Qn6qpQa601W61CtUwZQ1KXfqCOeltejAWEXmgIWivC692WGSdtGudj4upSi1UgMSaGcvKjfcpdGjg==",
"version": "10.11.0",
"resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-10.11.0.tgz",
"integrity": "sha512-qRzhuYOm5ZXQi5dhfJFjDq157oipxcEW/fo0QyMm5+TI6V6/+P/tju+Hif6z0rpLCf7MV7iDVRv2Kqha4D/yvQ==",
"peerDependencies": {
"react-native": "*"
}
@ -18570,14 +18585,17 @@
}
},
"node_modules/react-native-vector-icons": {
"version": "9.2.0",
"integrity": "sha512-wKYLaFuQST/chH3AJRjmOLoLy3JEs1JR6zMNgTaemFpNoXs0ztRnTxcxFD9xhX7cJe1/zoN5BpQYe7kL0m5yyA==",
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.0.0.tgz",
"integrity": "sha512-efMOVbZIebY8RszZPzPBoXi9pvD/NFYmjIDYxRoc9LYSzV8rMJtT8FfcO2hPu85Rn2x9xktha0+qn0B7EqMAcQ==",
"dependencies": {
"prop-types": "^15.7.2",
"yargs": "^16.1.1"
},
"bin": {
"fa-upgrade.sh": "bin/fa-upgrade.sh",
"fa5-upgrade": "bin/fa5-upgrade.sh",
"fa6-upgrade": "bin/fa6-upgrade.sh",
"generate-icon": "bin/generate-icon.js"
}
},
@ -18593,9 +18611,9 @@
}
},
"node_modules/react-native-webview": {
"version": "12.4.0",
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-12.4.0.tgz",
"integrity": "sha512-wYzTfNADidmqv6bY+x6NUfX8+uBR9mmF1CO1NOvY4oD2vv+D4rA0XwcwAe2D7RevXUy3fmuTT93kFQcgo8fEhg==",
"version": "13.6.2",
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.6.2.tgz",
"integrity": "sha512-QzhQ5JCU+Nf2W285DtvCZOVQy/MkJXMwNDYPZvOWQbAOgxJMSSO+BtqXTMA1UPugDsko6PxJ0TxSlUwIwJijDg==",
"dependencies": {
"escape-string-regexp": "2.0.0",
"invariant": "2.2.4"
@ -20988,10 +21006,12 @@
"integrity": "sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA=="
},
"@babel/code-frame": {
"version": "7.18.6",
"integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
"version": "7.22.13",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
"integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
"requires": {
"@babel/highlight": "^7.18.6"
"@babel/highlight": "^7.22.13",
"chalk": "^2.4.2"
}
},
"@babel/compat-data": {
@ -21030,10 +21050,11 @@
}
},
"@babel/generator": {
"version": "7.21.1",
"integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
"integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
"requires": {
"@babel/types": "^7.21.0",
"@babel/types": "^7.23.0",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@ -21111,8 +21132,9 @@
}
},
"@babel/helper-environment-visitor": {
"version": "7.18.9",
"integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA=="
},
"@babel/helper-explode-assignable-expression": {
"version": "7.18.6",
@ -21122,18 +21144,20 @@
}
},
"@babel/helper-function-name": {
"version": "7.21.0",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
"integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"requires": {
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
}
},
"@babel/helper-hoist-variables": {
"version": "7.18.6",
"integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"requires": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
}
},
"@babel/helper-member-expression-to-functions": {
@ -21213,19 +21237,22 @@
}
},
"@babel/helper-split-export-declaration": {
"version": "7.18.6",
"integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
"version": "7.22.6",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
"integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"requires": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
}
},
"@babel/helper-string-parser": {
"version": "7.19.4",
"integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
"integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw=="
},
"@babel/helper-validator-identifier": {
"version": "7.19.1",
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="
},
"@babel/helper-validator-option": {
"version": "7.22.15",
@ -21252,17 +21279,19 @@
}
},
"@babel/highlight": {
"version": "7.18.6",
"integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
"integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
"requires": {
"@babel/helper-validator-identifier": "^7.18.6",
"chalk": "^2.0.0",
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
}
},
"@babel/parser": {
"version": "7.21.2",
"integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ=="
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
"integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw=="
},
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.18.6",
@ -22038,36 +22067,39 @@
}
},
"@babel/template": {
"version": "7.20.7",
"integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
"integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"requires": {
"@babel/code-frame": "^7.18.6",
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/code-frame": "^7.22.13",
"@babel/parser": "^7.22.15",
"@babel/types": "^7.22.15"
}
},
"@babel/traverse": {
"version": "7.21.2",
"integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
"version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
"integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
"requires": {
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.21.1",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.21.2",
"@babel/types": "^7.21.2",
"@babel/code-frame": "^7.22.13",
"@babel/generator": "^7.23.0",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/parser": "^7.23.0",
"@babel/types": "^7.23.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
"version": "7.21.2",
"integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
"integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
"requires": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/helper-string-parser": "^7.22.5",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
}
},
@ -34168,8 +34200,9 @@
"integrity": "sha512-h0vtgiSKws3UmMRJykXAVM4ne1SgfoocUcoBD19ewRpQd6wqurE0HJRQGrSxcHK5LdKE7QPSIB1VX3YGIVS8Jg=="
},
"react-native-device-info": {
"version": "8.7.1",
"integrity": "sha512-cVMZztFa2Qn6qpQa601W61CtUwZQ1KXfqCOeltejAWEXmgIWivC692WGSdtGudj4upSi1UgMSaGcvKjfcpdGjg=="
"version": "10.11.0",
"resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-10.11.0.tgz",
"integrity": "sha512-qRzhuYOm5ZXQi5dhfJFjDq157oipxcEW/fo0QyMm5+TI6V6/+P/tju+Hif6z0rpLCf7MV7iDVRv2Kqha4D/yvQ=="
},
"react-native-document-picker": {
"version": "git+ssh://git@github.com/BlueWallet/react-native-document-picker.git#857655cdddf17751c0fae1286a9121fda2a6d568",
@ -34450,8 +34483,9 @@
}
},
"react-native-vector-icons": {
"version": "9.2.0",
"integrity": "sha512-wKYLaFuQST/chH3AJRjmOLoLy3JEs1JR6zMNgTaemFpNoXs0ztRnTxcxFD9xhX7cJe1/zoN5BpQYe7kL0m5yyA==",
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.0.0.tgz",
"integrity": "sha512-efMOVbZIebY8RszZPzPBoXi9pvD/NFYmjIDYxRoc9LYSzV8rMJtT8FfcO2hPu85Rn2x9xktha0+qn0B7EqMAcQ==",
"requires": {
"prop-types": "^15.7.2",
"yargs": "^16.1.1"
@ -34465,9 +34499,9 @@
}
},
"react-native-webview": {
"version": "12.4.0",
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-12.4.0.tgz",
"integrity": "sha512-wYzTfNADidmqv6bY+x6NUfX8+uBR9mmF1CO1NOvY4oD2vv+D4rA0XwcwAe2D7RevXUy3fmuTT93kFQcgo8fEhg==",
"version": "13.6.2",
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.6.2.tgz",
"integrity": "sha512-QzhQ5JCU+Nf2W285DtvCZOVQy/MkJXMwNDYPZvOWQbAOgxJMSSO+BtqXTMA1UPugDsko6PxJ0TxSlUwIwJijDg==",
"requires": {
"escape-string-regexp": "2.0.0",
"invariant": "2.2.4"

View file

@ -148,7 +148,7 @@
"react-native-camera-kit": "13.0.0",
"react-native-crypto": "2.2.0",
"react-native-default-preference": "1.4.4",
"react-native-device-info": "8.7.1",
"react-native-device-info": "10.11.0",
"react-native-document-picker": "https://github.com/BlueWallet/react-native-document-picker#857655cdddf17751c0fae1286a9121fda2a6d568",
"react-native-draggable-flatlist": "github:BlueWallet/react-native-draggable-flatlist#ebfddc4",
"react-native-elements": "3.4.3",
@ -183,9 +183,9 @@
"react-native-svg": "13.14.0",
"react-native-tcp-socket": "5.6.2",
"react-native-tor": "0.1.8",
"react-native-vector-icons": "9.2.0",
"react-native-vector-icons": "10.0.0",
"react-native-watch-connectivity": "1.1.0",
"react-native-webview": "12.4.0",
"react-native-webview": "13.6.2",
"react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#a128c38",
"readable-stream": "3.6.2",
"realm": "12.2.1",

View file

@ -1,18 +1,7 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Ionicons from 'react-native-vector-icons/Ionicons';
import {
ActivityIndicator,
Alert,
BackHandler,
Keyboard,
Platform,
StatusBar,
StyleSheet,
TextInput,
TouchableOpacity,
View,
} from 'react-native';
import { ActivityIndicator, Alert, BackHandler, Keyboard, Platform, StyleSheet, TextInput, TouchableOpacity, View } from 'react-native';
import { WebView } from 'react-native-webview';
import { SafeBlueArea } from '../../BlueComponents';
@ -440,8 +429,6 @@ export default class Browser extends Component {
return (
<SafeBlueArea>
<View style={styles.safeRoot}>
<StatusBar barStyle="default" />
<Button
icon={{
type: 'ionicon',
@ -534,6 +521,7 @@ Browser.navigationOptions = navigationStyle(
{
headerHideBackButton: true,
closeButton: true,
statusBarStyle: 'auto',
},
opts => ({ ...opts, title: loc.wallets.list_ln_browser }),
);

View file

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useRef, useState } from 'react';
import { View, StatusBar, StyleSheet, Text, Keyboard, TouchableOpacity, SectionList } from 'react-native';
import { View, StyleSheet, Text, Keyboard, TouchableOpacity, SectionList } from 'react-native';
import { RouteProp, useNavigation, useRoute, useTheme } from '@react-navigation/native';
import { SafeBlueArea, BlueButton, BlueSpacing20, BlueSpacing10, BlueLoading, BlueTextCentered } from '../../BlueComponents';
import navigationStyle from '../../components/navigationStyle';
@ -373,7 +373,6 @@ const LdkInfo = () => {
// @ts-ignore This kind of magic is not allowed in typescript, we should try and be more specific
return (
<SafeBlueArea styles={[styles.root, stylesHook.root]}>
<StatusBar barStyle="default" />
<SectionList
ref={(ref: SectionList) => {
sectionList.current = ref;
@ -460,6 +459,7 @@ LdkInfo.navigationOptions = navigationStyle(
(options, { theme, navigation, route }) => {
return {
...options,
statusBarStyle: 'auto',
};
},
);

View file

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useRef, useState } from 'react';
import { View, StatusBar, StyleSheet } from 'react-native';
import { View, StyleSheet } from 'react-native';
import { RouteProp, useNavigation, useRoute, useTheme } from '@react-navigation/native';
import { BlueLoading, SafeBlueArea, BlueButton, BlueDismissKeyboardInputAccessory, BlueSpacing20, BlueText } from '../../BlueComponents';
import navigationStyle from '../../components/navigationStyle';
@ -273,12 +273,7 @@ const LdkOpenChannel = (props: any) => {
);
};
return (
<SafeBlueArea styles={[styles.root, stylesHook.root]}>
<StatusBar barStyle="default" />
{render()}
</SafeBlueArea>
);
return <SafeBlueArea styles={[styles.root, stylesHook.root]}>{render()}</SafeBlueArea>;
};
const styles = StyleSheet.create({
@ -310,6 +305,7 @@ LdkOpenChannel.navigationOptions = navigationStyle(
...options,
headerTitle: loc.lnd.new_channel,
headerLargeTitle: true,
statusBarStyle: 'auto',
};
},
);

View file

@ -4,7 +4,6 @@ import {
Image,
Keyboard,
KeyboardAvoidingView,
StatusBar,
StyleSheet,
Text,
TextInput,
@ -404,7 +403,6 @@ const LNDCreateInvoice = () => {
if (!wallet.current) {
return (
<View style={[styles.root, styleHooks.root]}>
<StatusBar barStyle="light-content" />
<BlueLoading />
</View>
);
@ -413,7 +411,6 @@ const LNDCreateInvoice = () => {
return (
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<View style={[styles.root, styleHooks.root]}>
<StatusBar barStyle="light-content" />
<View style={[styles.amount, styleHooks.amount]}>
<KeyboardAvoidingView enabled={!Platform.isPad} behavior="position">
<AmountInput
@ -538,6 +535,7 @@ LNDCreateInvoice.navigationOptions = navigationStyle(
{
closeButton: true,
headerHideBackButton: true,
statusBarStyle: 'light',
},
opts => ({ ...opts, title: loc.receive.header }),
);

View file

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useRef, useState } from 'react';
import { View, Text, StatusBar, ScrollView, BackHandler, TouchableOpacity, StyleSheet, I18nManager, Image } from 'react-native';
import { View, Text, ScrollView, BackHandler, TouchableOpacity, StyleSheet, I18nManager, Image } from 'react-native';
import Share from 'react-native-share';
import ReactNativeHapticFeedback from 'react-native-haptic-feedback';
import { Icon } from 'react-native-elements';
@ -282,12 +282,7 @@ const LNDViewInvoice = () => {
}
};
return (
<SafeBlueArea onLayout={onLayout}>
<StatusBar barStyle="default" />
{render()}
</SafeBlueArea>
);
return <SafeBlueArea onLayout={onLayout}>{render()}</SafeBlueArea>;
};
const styles = StyleSheet.create({
@ -334,6 +329,7 @@ const styles = StyleSheet.create({
LNDViewInvoice.navigationOptions = navigationStyle({}, (options, { theme }) => {
return {
...options,
statusBarStyle: 'auto',
headerTitle: loc.lndViewInvoice.lightning_invoice,
headerStyle: {
backgroundColor: theme.colors.customHeader,

View file

@ -5,7 +5,6 @@ import {
KeyboardAvoidingView,
View,
TouchableOpacity,
StatusBar,
Keyboard,
ScrollView,
StyleSheet,
@ -299,7 +298,6 @@ const ScanLndInvoice = () => {
return (
<SafeBlueArea style={stylesHook.root}>
<StatusBar barStyle="light-content" />
<View style={[styles.root, stylesHook.root]}>
<ScrollView contentContainerStyle={styles.scroll} keyboardShouldPersistTaps="handled">
<KeyboardAvoidingView enabled behavior="position" keyboardVerticalOffset={20}>
@ -371,7 +369,7 @@ ScanLndInvoice.navigationOptions = navigationStyle(
closeButton: true,
headerHideBackButton: true,
},
opts => ({ ...opts, title: loc.send.header }),
opts => ({ ...opts, title: loc.send.header, statusBarStyle: 'light' }),
);
const styles = StyleSheet.create({

View file

@ -1,6 +1,6 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Keyboard, Text, TouchableOpacity, StatusBar, TouchableWithoutFeedback, View, StyleSheet, I18nManager } from 'react-native';
import { Keyboard, Text, TouchableOpacity, TouchableWithoutFeedback, View, StyleSheet, I18nManager } from 'react-native';
import { Icon } from 'react-native-elements';
import { BlueButton, BlueLoading, BlueSpacing, BlueText } from '../../BlueComponents';
@ -153,7 +153,6 @@ export default class AztecoRedeem extends Component {
return (
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<View>
<StatusBar barStyle="default" />
<View style={styles.root}>
<Text>{loc.azteco.codeIs}</Text>
<BlueText style={styles.code}>
@ -185,4 +184,4 @@ AztecoRedeem.propTypes = {
}),
};
AztecoRedeem.navigationOptions = navigationStyleTx({}, opts => ({ ...opts, title: loc.azteco.title }));
AztecoRedeem.navigationOptions = navigationStyleTx({}, opts => ({ ...opts, title: loc.azteco.title, statusBarStyle: 'auto' }));

View file

@ -6,7 +6,6 @@ import {
KeyboardAvoidingView,
Platform,
ScrollView,
StatusBar,
StyleSheet,
TextInput,
View,
@ -459,7 +458,6 @@ const ReceiveDetails = () => {
return (
<View style={[styles.root, stylesHook.root]}>
<StatusBar barStyle="light-content" />
{address !== undefined && showAddress && (
<HandoffComponent title={loc.send.details_address} type={HandoffComponent.activityTypes.ReceiveOnchain} userInfo={{ address }} />
)}
@ -541,7 +539,7 @@ ReceiveDetails.navigationOptions = navigationStyle(
closeButton: true,
headerHideBackButton: true,
},
opts => ({ ...opts, title: loc.receive.header }),
opts => ({ ...opts, title: loc.receive.header, statusBarStyle: 'light' }),
);
export default ReceiveDetails;

View file

@ -1,5 +1,5 @@
import React, { useEffect, useState } from 'react';
import { Image, View, TouchableOpacity, StatusBar, Platform, StyleSheet, TextInput, Alert } from 'react-native';
import { Image, View, TouchableOpacity, Platform, StyleSheet, TextInput, Alert } from 'react-native';
import { CameraScreen } from 'react-native-camera-kit';
import { Icon } from 'react-native-elements';
import { launchImageLibrary } from 'react-native-image-picker';
@ -398,12 +398,7 @@ const ScanQRCode = () => {
</>
);
return (
<View style={styles.root}>
<StatusBar hidden />
{render}
</View>
);
return <View style={styles.root}>{render}</View>;
};
export default ScanQRCode;

View file

@ -1,6 +1,6 @@
import React, { useCallback, useEffect } from 'react';
import PropTypes from 'prop-types';
import { TextInput, FlatList, Linking, TouchableOpacity, StyleSheet, Text, View, Platform, PermissionsAndroid, Alert } from 'react-native';
import { TextInput, FlatList, Linking, TouchableOpacity, StyleSheet, Text, View, Platform, Alert } from 'react-native';
import Clipboard from '@react-native-clipboard/clipboard';
import { Icon } from 'react-native-elements';
import Share from 'react-native-share';
@ -15,6 +15,7 @@ import { DynamicQRCode } from '../../components/DynamicQRCode';
import { isDesktop } from '../../blue_modules/environment';
import { useNavigation, useRoute, useTheme } from '@react-navigation/native';
import alert from '../../components/Alert';
import { PERMISSIONS, RESULTS, request } from 'react-native-permissions';
const bitcoin = require('bitcoinjs-lib');
const currency = require('../../blue_modules/currency');
@ -68,15 +69,8 @@ const SendCreate = () => {
RNFS.unlink(filePath);
});
} else if (Platform.OS === 'android') {
const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, {
title: loc.send.permission_storage_title,
message: loc.send.permission_storage_message,
buttonNeutral: loc.send.permission_storage_later,
buttonNegative: loc._.cancel,
buttonPositive: loc._.ok,
});
if (granted === PermissionsAndroid.RESULTS.GRANTED || Platform.Version >= 33) {
const granted = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
if (granted === RESULTS.GRANTED) {
console.log('Storage Permission: Granted');
const filePath = RNFS.DownloadDirectoryPath + `/${fileName}`;
try {

View file

@ -9,7 +9,6 @@ import {
KeyboardAvoidingView,
LayoutAnimation,
Platform,
StatusBar,
StyleSheet,
Text,
TextInput,
@ -1439,7 +1438,6 @@ const SendDetails = () => {
return (
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<View style={[styles.root, stylesHook.root]} onLayout={e => setWidth(e.nativeEvent.layout.width)}>
<StatusBar barStyle="light-content" />
<View>
<KeyboardAvoidingView enabled={!Platform.isPad} behavior="position">
<FlatList
@ -1681,4 +1679,5 @@ const styles = StyleSheet.create({
SendDetails.navigationOptions = navigationStyleTx({}, options => ({
...options,
title: loc.send.header,
statusBarStyle: 'light',
}));

View file

@ -1,4 +1,4 @@
import React, { useContext } from 'react';
import React, { useContext, useEffect, useState } from 'react';
import { TouchableOpacity, ScrollView, Linking, Image, View, Text, StyleSheet, useWindowDimensions, Platform, Alert } from 'react-native';
import { useNavigation, useTheme } from '@react-navigation/native';
import { Icon } from 'react-native-elements';
@ -20,6 +20,7 @@ const About = () => {
const { colors } = useTheme();
const { width, height } = useWindowDimensions();
const { isElectrumDisabled } = useContext(BlueStorageContext);
const [uniqueID, setUniqueID] = useState();
const styles = StyleSheet.create({
copyToClipboard: {
justifyContent: 'center',
@ -75,6 +76,10 @@ const About = () => {
},
});
useEffect(() => {
getUniqueId().then(setUniqueID);
}, []);
const handleOnReleaseNotesPress = () => {
navigate('ReleaseNotes');
};
@ -244,12 +249,12 @@ const About = () => {
<BlueTextCentered>
w, h = {width}, {height}
</BlueTextCentered>
<BlueTextCentered>Unique ID: {getUniqueId()}</BlueTextCentered>
<BlueTextCentered>Unique ID: {uniqueID}</BlueTextCentered>
<View style={styles.copyToClipboard}>
<TouchableOpacity
accessibilityRole="button"
onPress={() => {
const stringToCopy = 'userId:' + getUniqueId();
const stringToCopy = 'userId:' + uniqueID;
A.logError('copied unique id');
Clipboard.setString(stringToCopy);
}}

View file

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useLayoutEffect, useState } from 'react';
import { View, ScrollView, TouchableOpacity, Text, TextInput, Linking, StatusBar, StyleSheet, Keyboard } from 'react-native';
import { View, ScrollView, TouchableOpacity, Text, TextInput, Linking, StyleSheet, Keyboard } from 'react-native';
import { useNavigation, useRoute, useTheme } from '@react-navigation/native';
import Clipboard from '@react-native-clipboard/clipboard';
import { BlueCard, BlueCopyToClipboardButton, BlueLoading, BlueSpacing20, BlueText } from '../../BlueComponents';
@ -217,7 +217,6 @@ const TransactionsDetails = () => {
type={HandoffComponent.activityTypes.ViewInBlockExplorer}
url={`https://mempool.space/tx/${tx.hash}`}
/>
<StatusBar barStyle="default" />
<BlueCard>
<View>
<TextInput
@ -412,6 +411,7 @@ export default TransactionsDetails;
TransactionsDetails.navigationOptions = navigationStyle({ headerTitle: loc.transactions.details_title }, (options, { theme }) => {
return {
...options,
statusBarStyle: 'auto',
headerStyle: {
backgroundColor: theme.colors.customHeader,
borderBottomWidth: 0,

View file

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';
import { View, ActivityIndicator, Text, TouchableOpacity, StyleSheet, StatusBar, BackHandler } from 'react-native';
import { View, ActivityIndicator, Text, TouchableOpacity, StyleSheet, BackHandler } from 'react-native';
import { Icon } from 'react-native-elements';
import { useNavigation, useRoute, useTheme } from '@react-navigation/native';
import ReactNativeHapticFeedback from 'react-native-haptic-feedback';
@ -361,7 +361,6 @@ const TransactionsStatus = () => {
url={`https://mempool.space/tx/${tx.hash}`}
/>
<StatusBar barStyle="default" />
<View style={styles.container}>
<BlueCard>
<View style={styles.center}>
@ -540,6 +539,7 @@ const styles = StyleSheet.create({
TransactionsStatus.navigationOptions = navigationStyle(
{
headerTitle: '',
statusBarStyle: 'auto',
},
(options, { theme }) => ({
...options,

View file

@ -7,7 +7,6 @@ import {
KeyboardAvoidingView,
Platform,
View,
StatusBar,
TextInput,
StyleSheet,
useColorScheme,
@ -46,6 +45,7 @@ const ButtonSelected = Object.freeze({
const WalletsAdd = () => {
const { colors } = useTheme();
const colorScheme = useColorScheme();
const { addWallet, saveToDisk, isAdvancedModeEnabled, wallets } = useContext(BlueStorageContext);
const [isLoading, setIsLoading] = useState(true);
const [walletBaseURI, setWalletBaseURI] = useState('');
@ -54,7 +54,7 @@ const WalletsAdd = () => {
const [isAdvancedOptionsEnabled, setIsAdvancedOptionsEnabled] = useState(false);
const [selectedWalletType, setSelectedWalletType] = useState(false);
const [backdoorPressed, setBackdoorPressed] = useState(1);
const { navigate, goBack } = useNavigation();
const { navigate, goBack, setOptions } = useNavigation();
const [entropy, setEntropy] = useState();
const [entropyButtonText, setEntropyButtonText] = useState(loc.wallets.add_entropy_provide);
const stylesHook = {
@ -89,6 +89,12 @@ const WalletsAdd = () => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isAdvancedOptionsEnabled]);
useEffect(() => {
setOptions({
statusBarStyle: Platform.select({ ios: 'light', default: colorScheme === 'dark' ? 'light' : 'dark' }),
});
}, [colorScheme, setOptions]);
const entropyGenerated = newEntropy => {
let entropyTitle;
if (!newEntropy) {
@ -258,9 +264,6 @@ const WalletsAdd = () => {
return (
<ScrollView style={stylesHook.root}>
<StatusBar
barStyle={Platform.select({ ios: 'light-content', default: useColorScheme() === 'dark' ? 'light-content' : 'dark-content' })}
/>
<BlueSpacing20 />
<KeyboardAvoidingView enabled behavior={Platform.OS === 'ios' ? 'padding' : null} keyboardVerticalOffset={62}>
<BlueFormLabel>{loc.wallets.add_wallet_name}</BlueFormLabel>

View file

@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { Image, View, Text, ScrollView, StyleSheet, StatusBar } from 'react-native';
import { Image, View, Text, ScrollView, StyleSheet } from 'react-native';
import { useTheme } from '@react-navigation/native';
import { SafeBlueArea, BlueLoading } from '../../BlueComponents';
import navigationStyle from '../../components/navigationStyle';
@ -39,7 +39,6 @@ const WalletsAddMultisigHelp = () => {
<BlueLoading />
) : (
<SafeBlueArea style={stylesHook.root}>
<StatusBar barStyle="light-content" />
<ScrollView>
<View style={[styles.intro, stylesHook.intro]}>
<Text style={[styles.introTitle, stylesHook.introTitle]}>{loc.multisig.ms_help_title}</Text>
@ -133,6 +132,7 @@ WalletsAddMultisigHelp.navigationOptions = navigationStyle({
},
headerTintColor: '#FFFFFF',
headerBackTitleVisible: false,
statusBarStyle: 'light',
});
export default WalletsAddMultisigHelp;

View file

@ -1,5 +1,5 @@
import React, { useCallback, useState, useContext, useRef, useEffect, useLayoutEffect } from 'react';
import { ActivityIndicator, FlatList, StyleSheet, View, StatusBar } from 'react-native';
import { ActivityIndicator, FlatList, StyleSheet, View } from 'react-native';
import { useFocusEffect, useNavigation, useRoute, useTheme } from '@react-navigation/native';
import Privacy from '../../blue_modules/Privacy';
import { BlueStorageContext } from '../../blue_modules/storage-context';
@ -142,7 +142,6 @@ const WalletAddresses = () => {
return (
<View style={[styles.root, stylesHook.root]}>
<StatusBar barStyle="default" />
<FlatList
contentContainerStyle={stylesHook.root}
ref={addressList}
@ -161,6 +160,7 @@ const WalletAddresses = () => {
WalletAddresses.navigationOptions = navigationStyle({
title: loc.addresses.addresses_title,
statusBarStyle: 'auto',
});
export default WalletAddresses;

View file

@ -12,9 +12,7 @@ import {
Platform,
Linking,
StyleSheet,
StatusBar,
ScrollView,
PermissionsAndroid,
InteractionManager,
ActivityIndicator,
I18nManager,
@ -45,6 +43,7 @@ import { AbstractHDElectrumWallet } from '../../class/wallets/abstract-hd-electr
import alert from '../../components/Alert';
import { BitcoinUnit, Chain } from '../../models/bitcoinUnits';
import { writeFileAndExport } from '../../blue_modules/fs';
import { PERMISSIONS, RESULTS, request } from 'react-native-permissions';
const prompt = require('../../helpers/prompt');
@ -364,15 +363,8 @@ const WalletDetails = () => {
RNFS.unlink(filePath);
});
} else if (Platform.OS === 'android') {
const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, {
title: loc.send.permission_storage_title,
message: loc.send.permission_storage_message,
buttonNeutral: loc.send.permission_storage_later,
buttonNegative: loc._.cancel,
buttonPositive: loc._.ok,
});
if (granted === PermissionsAndroid.RESULTS.GRANTED || Platform.Version >= 33) {
const granted = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
if (granted === RESULTS.GRANTED) {
console.log('Storage Permission: Granted');
const filePath = RNFS.DownloadDirectoryPath + `/${fileName}`;
try {
@ -496,8 +488,6 @@ const WalletDetails = () => {
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<View>
<BlueCard style={styles.address}>
<StatusBar barStyle="default" />
{(() => {
if (
[LegacyWallet.type, SegwitBech32Wallet.type, SegwitP2SHWallet.type].includes(wallet.type) ||
@ -709,6 +699,10 @@ const WalletDetails = () => {
);
};
WalletDetails.navigationOptions = navigationStyle({}, opts => ({ ...opts, headerTitle: loc.wallets.details_title }));
WalletDetails.navigationOptions = navigationStyle({}, opts => ({
...opts,
headerTitle: loc.wallets.details_title,
statusBarStyle: 'auto',
}));
export default WalletDetails;

View file

@ -1,5 +1,5 @@
import React, { useState, useCallback, useContext, useRef, useEffect } from 'react';
import { InteractionManager, ScrollView, ActivityIndicator, StatusBar, View, StyleSheet, AppState } from 'react-native';
import { InteractionManager, ScrollView, ActivityIndicator, View, StyleSheet, AppState } from 'react-native';
import { useTheme, useNavigation, useFocusEffect, useRoute } from '@react-navigation/native';
import { BlueSpacing20, SafeBlueArea, BlueText, BlueCopyTextToClipboard, BlueCard } from '../../BlueComponents';
@ -94,7 +94,6 @@ const WalletExport = () => {
return (
<SafeBlueArea style={[styles.root, stylesHook.root]} onLayout={onLayout}>
<StatusBar barStyle="light-content" />
<ScrollView contentContainerStyle={styles.scrollViewContent} testID="WalletExportScroll">
<View>
<BlueText style={[styles.type, stylesHook.type]}>{wallet.typeReadable}</BlueText>
@ -164,6 +163,7 @@ WalletExport.navigationOptions = navigationStyle(
{
closeButton: true,
headerHideBackButton: true,
statusBarStyle: 'light',
},
opts => ({ ...opts, title: loc.wallets.export_title }),
);

View file

@ -1,5 +1,5 @@
import React, { useCallback, useContext, useRef, useState } from 'react';
import { ActivityIndicator, InteractionManager, ScrollView, StatusBar, StyleSheet, View } from 'react-native';
import { ActivityIndicator, InteractionManager, ScrollView, StyleSheet, View } from 'react-native';
import { useFocusEffect, useNavigation, useRoute, useTheme } from '@react-navigation/native';
import { BlueSpacing20, BlueText, SafeBlueArea } from '../../BlueComponents';
@ -76,7 +76,6 @@ const ExportMultisigCoordinationSetup = () => {
</View>
) : (
<SafeBlueArea style={stylesHook.root}>
<StatusBar barStyle="light-content" />
<ScrollView contentContainerStyle={styles.scrollViewContent}>
<View>
<BlueText style={[styles.type, stylesHook.type]}>{wallet.getLabel()}</BlueText>
@ -131,6 +130,7 @@ ExportMultisigCoordinationSetup.navigationOptions = navigationStyle(
{
closeButton: true,
headerHideBackButton: true,
statusBarStyle: 'light',
},
opts => ({ ...opts, title: loc.multisig.export_coordination_setup }),
);

View file

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useState, useRef, useMemo } from 'react';
import { FlatList, StatusBar, StyleSheet, TextInput, View } from 'react-native';
import { FlatList, StyleSheet, TextInput, View } from 'react-native';
import { useNavigation, useRoute, useTheme } from '@react-navigation/native';
import { BlueButton, BlueFormLabel, BlueSpacing20, BlueTextCentered, SafeBlueArea } from '../../BlueComponents';
@ -118,7 +118,6 @@ const ImportCustomDerivationPath = () => {
return (
<SafeBlueArea style={[styles.root, stylesHook.root]}>
<StatusBar barStyle="light-content" />
<BlueSpacing20 />
<BlueFormLabel>{loc.wallets.import_derivation_subtitle}</BlueFormLabel>
<BlueSpacing20 />
@ -181,6 +180,10 @@ const styles = StyleSheet.create({
},
});
ImportCustomDerivationPath.navigationOptions = navigationStyle({}, opts => ({ ...opts, title: loc.wallets.import_derivation_title }));
ImportCustomDerivationPath.navigationOptions = navigationStyle({}, opts => ({
...opts,
title: loc.wallets.import_derivation_title,
statusBarStyle: 'light',
}));
export default ImportCustomDerivationPath;

View file

@ -1,5 +1,5 @@
import React, { useContext, useState } from 'react';
import { Alert, View, StatusBar, StyleSheet, TextInput, ActivityIndicator } from 'react-native';
import { Alert, View, StyleSheet, TextInput, ActivityIndicator } from 'react-native';
import { useNavigation, useTheme } from '@react-navigation/native';
import { HDSegwitBech32Wallet, WatchOnlyWallet } from '../../class';
@ -72,7 +72,6 @@ const WalletsImportSpeed = () => {
return (
<SafeBlueArea style={styles.root}>
<StatusBar barStyle="light-content" />
<BlueSpacing20 />
<BlueFormLabel>Mnemonic</BlueFormLabel>
<BlueSpacing20 />
@ -90,6 +89,6 @@ const WalletsImportSpeed = () => {
);
};
WalletsImportSpeed.navigationOptions = navigationStyle({}, opts => ({ ...opts, title: loc.wallets.import_title }));
WalletsImportSpeed.navigationOptions = navigationStyle({}, opts => ({ ...opts, statusBarStyle: 'light', title: loc.wallets.import_title }));
export default WalletsImportSpeed;

View file

@ -1,6 +1,5 @@
import React, { useCallback, useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';
import {
StatusBar,
View,
TouchableOpacity,
Text,
@ -39,7 +38,7 @@ const WalletsList = () => {
const { wallets, getTransactions, getBalance, refreshAllWalletTransactions, setSelectedWallet, isElectrumDisabled } =
useContext(BlueStorageContext);
const { width } = useWindowDimensions();
const { colors, scanImage, barStyle } = useTheme();
const { colors, scanImage } = useTheme();
const { navigate, setOptions } = useNavigation();
const isFocused = useIsFocused();
const routeName = useRoute().name;
@ -361,7 +360,6 @@ const WalletsList = () => {
return (
<View style={styles.root} onLayout={onLayout}>
<StatusBar barStyle={barStyle} backgroundColor="transparent" translucent animated />
<View style={[styles.walletsListWrapper, stylesHook.walletsListWrapper]}>
<SectionList
removeClippedSubviews

View file

@ -1,5 +1,5 @@
import React, { useEffect, useRef, useContext, useState } from 'react';
import { View, Image, Text, StyleSheet, StatusBar, I18nManager, Pressable, useColorScheme, Platform } from 'react-native';
import { View, Image, Text, StyleSheet, I18nManager, Pressable, useColorScheme, Platform } from 'react-native';
import { BluePrivateBalance } from '../../BlueComponents';
import DraggableFlatList, { ScaleDecorator } from 'react-native-draggable-flatlist';
import LinearGradient from 'react-native-linear-gradient';
@ -74,8 +74,8 @@ const ReorderWallets = () => {
const sortableList = useRef();
const { colors } = useTheme();
const { wallets, setWalletsWithNewOrder } = useContext(BlueStorageContext);
const { navigate } = useNavigation();
const colorScheme = useColorScheme();
const { navigate, setOptions } = useNavigation();
const stylesHook = {
root: {
backgroundColor: colors.elevated,
@ -90,6 +90,12 @@ const ReorderWallets = () => {
setWalletData(wallets);
}, [wallets]);
useEffect(() => {
setOptions({
statusBarStyle: Platform.select({ ios: 'light', default: colorScheme === 'dark' ? 'light' : 'dark' }),
});
}, [colorScheme, setOptions]);
const navigateToWallet = wallet => {
const walletID = wallet.getID();
navigate('WalletTransactions', {
@ -178,11 +184,9 @@ const ReorderWallets = () => {
<Text style={{ color: colors.foregroundColor }}>{loc.wallets.reorder_instructions}</Text>
</View>
);
return (
<GestureHandlerRootView style={[styles.root, stylesHook.root]}>
<StatusBar
barStyle={Platform.select({ ios: 'light-content', default: useColorScheme() === 'dark' ? 'light-content' : 'dark-content' })}
/>
<DraggableFlatList
ListHeaderComponent={ListHeaderComponent}
ref={sortableList}

View file

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useState } from 'react';
import { View, ActivityIndicator, Image, Text, TouchableOpacity, I18nManager, FlatList, StyleSheet, StatusBar } from 'react-native';
import { View, ActivityIndicator, Image, Text, TouchableOpacity, I18nManager, FlatList, StyleSheet } from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
import ReactNativeHapticFeedback from 'react-native-haptic-feedback';
import { useRoute, useTheme, useNavigation, useNavigationState } from '@react-navigation/native';
@ -100,6 +100,14 @@ const SelectWallet = () => {
setIsLoading(false);
}, []);
useEffect(() => {
if (isLoading || data.length === 0) {
setOptions({ statusBarStyle: 'light' });
} else {
setOptions({ statusBarStyle: 'auto' });
}
}, [isLoading, data.length, setOptions]);
useEffect(() => {
setOptions(
isModal
@ -176,14 +184,12 @@ const SelectWallet = () => {
if (isLoading) {
return (
<View style={styles.loading}>
<StatusBar barStyle="light-content" />
<ActivityIndicator />
</View>
);
} else if (data.length <= 0) {
return (
<SafeBlueArea>
<StatusBar barStyle="light-content" />
<View style={styles.noWallets}>
<BlueText style={styles.center}>{loc.wallets.select_no_bitcoin}</BlueText>
<BlueSpacing20 />
@ -194,7 +200,6 @@ const SelectWallet = () => {
} else {
return (
<SafeBlueArea>
<StatusBar barStyle="default" />
<FlatList extraData={data} data={data} renderItem={renderItem} keyExtractor={(_item, index) => `${index}`} />
</SafeBlueArea>
);

View file

@ -6,7 +6,6 @@ import {
KeyboardAvoidingView,
LayoutAnimation,
Platform,
StatusBar,
StyleSheet,
TextInput,
TouchableWithoutFeedback,
@ -113,7 +112,6 @@ const SignVerify = () => {
return (
<SafeBlueArea style={[styles.root, stylesHooks.root]}>
<StatusBar barStyle="light-content" />
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<KeyboardAvoidingView style={[styles.root, stylesHooks.root]}>
{!isKeyboardVisible && (
@ -232,7 +230,7 @@ const SignVerify = () => {
);
};
SignVerify.navigationOptions = navigationStyle({ closeButton: true, headerHideBackButton: true }, opts => ({
SignVerify.navigationOptions = navigationStyle({ closeButton: true, headerHideBackButton: true, statusBarStyle: 'light' }, opts => ({
...opts,
title: loc.addresses.sign_title,
}));

View file

@ -8,7 +8,6 @@ import {
PixelRatio,
Platform,
ScrollView,
StatusBar,
StyleSheet,
Text,
findNodeHandle,
@ -501,6 +500,10 @@ const WalletTransactions = ({ navigation }) => {
}
};
useEffect(() => {
setOptions({ statusBarStyle: 'light', barTintColor: WalletGradient.headerColorFor(wallet.type) });
}, [setOptions, wallet.type]);
const getItemLayout = (_, index) => ({
length: 64,
offset: 64 * index,
@ -509,7 +512,6 @@ const WalletTransactions = ({ navigation }) => {
return (
<View style={styles.flex}>
<StatusBar barStyle="light-content" backgroundColor={WalletGradient.headerColorFor(wallet.type)} animated />
<TransactionsNavigationHeader
navigation={navigation}
wallet={wallet}

View file

@ -8,7 +8,6 @@ import {
KeyboardAvoidingView,
LayoutAnimation,
Platform,
StatusBar,
StyleSheet,
Switch,
Text,
@ -561,7 +560,6 @@ const ViewEditMultisigCosigners = () => {
return (
<View style={[styles.root, stylesHook.root]}>
<StatusBar barStyle="light-content" />
<KeyboardAvoidingView
enabled={!Platform.isPad}
behavior={Platform.OS === 'ios' ? 'padding' : null}
@ -659,6 +657,7 @@ ViewEditMultisigCosigners.navigationOptions = navigationStyle(
{
closeButton: true,
headerHideBackButton: true,
statusBarStyle: 'light',
},
opts => ({ ...opts, headerTitle: loc.multisig.manage_keys }),
);

View file

@ -1,5 +1,5 @@
import React, { useCallback, useContext, useEffect, useState } from 'react';
import { InteractionManager, ActivityIndicator, View, StatusBar, StyleSheet } from 'react-native';
import { InteractionManager, ActivityIndicator, View, StyleSheet } from 'react-native';
import { useFocusEffect, useRoute, useNavigation, useTheme } from '@react-navigation/native';
import navigationStyle from '../../components/navigationStyle';
import { BlueSpacing20, SafeBlueArea, BlueText, BlueCopyTextToClipboard, BlueButton } from '../../BlueComponents';
@ -83,7 +83,6 @@ const WalletXpub = () => {
</View>
) : (
<SafeBlueArea style={[styles.root, stylesHook.root]} onLayout={onLayout}>
<StatusBar barStyle="light-content" />
<>
<View style={styles.container}>
{wallet && (

View file

@ -50,6 +50,8 @@ jest.mock('@react-native-community/push-notification-ios', () => {
return {};
});
jest.mock('react-native-permissions', () => require('react-native-permissions/mock'));
jest.mock('react-native-device-info', () => {
return {
getUniqueId: jest.fn().mockReturnValue('uniqueId'),