Merge branch 'master' into electrumtoggle

This commit is contained in:
Overtorment 2021-07-06 11:14:23 +01:00 committed by GitHub
commit 214b2f5743
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 1716 additions and 1387 deletions

3
.gitattributes vendored
View File

@ -1,4 +1,5 @@
*.pbxproj -text
*.patch -text
# specific for windows script files
# Windows files should use crlf line endings
# https://help.github.com/articles/dealing-with-line-endings/
*.bat text eol=crlf

4
_editorconfig Normal file
View File

@ -0,0 +1,4 @@
# Windows files
[*.bat]
end_of_line = crlf

View File

@ -20,7 +20,7 @@ import com.android.build.OutputFile
* // default. Can be overridden with ENTRY_FILE environment variable.
* entryFile: "index.android.js",
*
* // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format
* // https://reactnative.dev/docs/performance#enable-the-ram-format
* bundleCommand: "ram-bundle",
*
* // whether to bundle JS and assets in debug mode
@ -121,7 +121,10 @@ def jscFlavor = 'org.webkit:android-jsc-intl:+'
def enableHermes = project.ext.react.get("enableHermes", false);
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
@ -150,10 +153,11 @@ android {
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
}
buildTypes {
release {
// Caution! In production, you need to generate your own keystore file.
// see https://facebook.github.io/react-native/docs/signed-apk-android.
// see https://reactnative.dev/docs/signed-apk-android.
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
@ -164,11 +168,11 @@ android {
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// https://developer.android.com/studio/build/configure-apk-splits.html
// Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
}
}
@ -177,13 +181,8 @@ android {
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation files("../../node_modules/react-native-tor/android/libs/sifir_android.aar")
//noinspection GradleDynamicVersion
androidTestImplementation('com.wix:detox:+') {
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
}
implementation files("../../node_modules/react-native-tor/android/libs/sifir_android.aar")
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
@ -194,12 +193,17 @@ dependencies {
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
exclude group:'com.squareup.okhttp3', module:'okhttp'
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
}
androidTestImplementation('com.wix:detox:+') {
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
}
if (enableHermes) {
def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
@ -217,4 +221,4 @@ task copyDownloadableDepsToLibs(type: Copy) {
}
apply plugin: 'com.google.gms.google-services' // Google Services plugin
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)

View File

@ -1,7 +1,7 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:textColor">#000000</item>
</style>

View File

@ -11,14 +11,15 @@ buildscript {
googlePlayServicesIidVersion = "16.0.1"
firebaseVersion = "17.3.4"
firebaseMessagingVersion = "20.2.1"
ndkVersion = "20.1.5948944"
}
repositories {
google()
jcenter()
mavenCentral()
}
ext.kotlinVersion = '1.4.32'
dependencies {
classpath('com.android.tools.build:gradle:4.0.1')
classpath('com.android.tools.build:gradle:4.2.1')
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
classpath 'com.google.gms:google-services:4.3.5' // Google Services plugin
@ -30,6 +31,25 @@ buildscript {
allprojects {
repositories {
jcenter() {
content {
includeModule("com.facebook.yoga", "proguard-annotations")
includeModule("com.facebook.fbjni", "fbjni-java-only")
includeModule("com.facebook.fresco", "fresco")
includeModule("com.facebook.fresco", "stetho")
includeModule("com.facebook.fresco", "fbcore")
includeModule("com.facebook.fresco", "drawee")
includeModule("com.facebook.fresco", "imagepipeline")
includeModule("com.facebook.fresco", "imagepipeline-native")
includeModule("com.facebook.fresco", "memory-type-native")
includeModule("com.facebook.fresco", "memory-type-java")
includeModule("com.facebook.fresco", "nativeimagefilters")
includeModule("com.facebook.stetho", "stetho")
includeModule("com.wei.android.lib", "fingerprintidentify")
includeModule("com.eightbitlab", "blurview")
}
}
mavenCentral()
mavenLocal()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
@ -44,7 +64,6 @@ allprojects {
url "$rootDir/../node_modules/detox/Detox-android"
}
google()
jcenter()
maven { url 'https://www.jitpack.io' }
}
}
@ -54,6 +73,9 @@ subprojects {
if (project.hasProperty("android")) {
android {
compileSdkVersion 29
defaultConfig {
minSdkVersion 28
}
}
}
}

View File

@ -31,4 +31,4 @@ org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# Version of flipper SDK to use with React Native
FLIPPER_VERSION=0.54.0
FLIPPER_VERSION=0.75.1

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip

7
android/gradlew.bat vendored
View File

@ -37,7 +37,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -51,7 +51,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@ -82,8 +82,7 @@ set CMD_LINE_ARGS=%*
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

View File

@ -298,9 +298,7 @@ function WalletImport() {
const s3 = new SLIP39SegwitBech32Wallet();
s3.setSecret(importText);
if (await s3.wasEverUsed()) {
return WalletImport._saveWallet(s3);
}
return WalletImport._saveWallet(s3);
}
}

View File

@ -1,6 +1,6 @@
import React, { useRef } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { useTheme } from '@react-navigation/native';
import { useNavigation, useTheme } from '@react-navigation/native';
import { ListItem } from 'react-native-elements';
import PropTypes from 'prop-types';
import { AddressTypeBadge } from './AddressTypeBadge';
@ -9,11 +9,13 @@ import TooltipMenu from '../TooltipMenu';
import Clipboard from '@react-native-clipboard/clipboard';
import Share from 'react-native-share';
const AddressItem = ({ item, balanceUnit, onPress }) => {
const AddressItem = ({ item, balanceUnit, walletID, allowSignVerifyMessage }) => {
const { colors } = useTheme();
const tooltip = useRef();
const listItem = useRef();
const hasTransactions = item.transactions > 0;
const stylesHook = StyleSheet.create({
container: {
borderBottomColor: colors.lightBorder,
@ -28,8 +30,33 @@ const AddressItem = ({ item, balanceUnit, onPress }) => {
balance: {
color: colors.alternativeTextColor,
},
address: {
color: hasTransactions ? colors.darkGray : colors.buttonTextColor,
},
});
const { navigate } = useNavigation();
const navigateToReceive = () => {
navigate('ReceiveDetailsRoot', {
screen: 'ReceiveDetails',
params: {
walletID,
address: item.address,
},
});
};
const navigateToSignVerify = () => {
navigate('SignVerifyRoot', {
screen: 'SignVerify',
params: {
walletID,
address: item.address,
},
});
};
const showToolTipMenu = () => {
tooltip.current.showMenu();
};
@ -44,30 +71,40 @@ const AddressItem = ({ item, balanceUnit, onPress }) => {
Share.open({ message: item.address }).catch(error => console.log(error));
};
const getAvailableActions = () => {
const actions = [
{
id: 'copyToClipboard',
text: loc.transactions.details_copy,
onPress: handleCopyPress,
},
{
id: 'share',
text: loc.receive.details_share,
onPress: handleSharePress,
},
];
if (allowSignVerifyMessage) {
actions.push({
id: 'signVerify',
text: loc.addresses.sign_title,
onPress: navigateToSignVerify,
});
}
return actions;
};
const render = () => {
return (
<View>
<TooltipMenu
ref={tooltip}
anchorRef={listItem}
actions={[
{
id: 'copyToClipboard',
text: loc.transactions.details_copy,
onPress: handleCopyPress,
},
{
id: 'share',
text: loc.receive.details_share,
onPress: handleSharePress,
},
]}
/>
<TooltipMenu ref={tooltip} anchorRef={listItem} actions={getAvailableActions()} />
<ListItem
ref={listItem}
key={`${item.key}`}
button
onPress={onPress}
onPress={navigateToReceive}
containerStyle={stylesHook.container}
onLongPress={showToolTipMenu}
>
@ -76,9 +113,16 @@ const AddressItem = ({ item, balanceUnit, onPress }) => {
<Text style={[styles.index, stylesHook.index]}>{item.index + 1}</Text>{' '}
<Text style={[stylesHook.address, styles.address]}>{item.address}</Text>
</ListItem.Title>
<ListItem.Subtitle style={[stylesHook.list, styles.balance, stylesHook.balance]}>{balance}</ListItem.Subtitle>
<View style={styles.subtitle}>
<Text style={[stylesHook.list, styles.balance, stylesHook.balance]}>{balance}</Text>
</View>
</ListItem.Content>
<AddressTypeBadge isInternal={item.isInternal} />
<View style={styles.labels}>
<AddressTypeBadge isInternal={item.isInternal} hasTransactions={hasTransactions} />
<Text style={[stylesHook.list, styles.balance, stylesHook.balance]}>
{loc.addresses.transactions}: {item.transactions}
</Text>
</View>
</ListItem>
</View>
);
@ -89,7 +133,7 @@ const AddressItem = ({ item, balanceUnit, onPress }) => {
const styles = StyleSheet.create({
address: {
fontWeight: '600',
fontWeight: 'bold',
marginHorizontal: 40,
},
index: {
@ -99,6 +143,12 @@ const styles = StyleSheet.create({
marginTop: 8,
marginLeft: 14,
},
subtitle: {
flex: 1,
flexDirection: 'row',
justifyContent: 'space-between',
width: '100%',
},
});
AddressItem.propTypes = {

View File

@ -9,27 +9,46 @@ const styles = StyleSheet.create({
paddingVertical: 4,
paddingHorizontal: 10,
borderRadius: 20,
alignSelf: 'flex-end',
},
badgeText: {
fontSize: 12,
textAlign: 'center',
},
});
const AddressTypeBadge = ({ isInternal }) => {
const AddressTypeBadge = ({ isInternal, hasTransactions }) => {
const { colors } = useTheme();
const stylesHook = StyleSheet.create({
changeBadge: { backgroundColor: colors.changeBackground },
receiveBadge: { backgroundColor: colors.receiveBackground },
usedBadge: { backgroundColor: colors.buttonDisabledBackgroundColor },
changeText: { color: colors.changeText },
receiveText: { color: colors.receiveText },
usedText: { color: colors.alternativeTextColor },
});
const badgeLabel = isInternal ? loc.addresses.type_change : loc.addresses.type_receive;
// eslint-disable-next-line prettier/prettier
const badgeLabel = hasTransactions
? loc.addresses.type_used
: isInternal
? loc.addresses.type_change
: loc.addresses.type_receive;
const badgeStyle = isInternal ? stylesHook.changeBadge : stylesHook.receiveBadge;
// eslint-disable-next-line prettier/prettier
const badgeStyle = hasTransactions
? stylesHook.usedBadge
: isInternal
? stylesHook.changeBadge
: stylesHook.receiveBadge;
const textStyle = isInternal ? stylesHook.changeText : stylesHook.receiveText;
// eslint-disable-next-line prettier/prettier
const textStyle = hasTransactions
? stylesHook.usedText
: isInternal
? stylesHook.changeText
: stylesHook.receiveText;
return (
<View style={[styles.container, badgeStyle]}>
@ -40,6 +59,7 @@ const AddressTypeBadge = ({ isInternal }) => {
AddressTypeBadge.propTypes = {
isInternal: PropTypes.bool,
hasTransactions: PropTypes.bool,
};
export { AddressTypeBadge };

View File

@ -0,0 +1,94 @@
import { useTheme } from '@react-navigation/native';
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import loc from '../../loc';
export const TABS = {
EXTERNAL: 'receive',
INTERNAL: 'change',
};
const AddressTypeTabs = ({ currentTab, setCurrentTab }) => {
const { colors } = useTheme();
const stylesHook = StyleSheet.create({
activeTab: {
backgroundColor: colors.modal,
},
activeText: {
fontWeight: 'bold',
color: colors.foregroundColor,
},
inactiveTab: {
fontWeight: 'normal',
color: colors.foregroundColor,
},
backTabs: {
backgroundColor: colors.buttonDisabledBackgroundColor,
},
});
const tabs = Object.entries(TABS).map(([key, value]) => {
return {
key,
value,
name: loc.addresses[`type_${value}`],
};
});
const changeToTab = tabKey => {
if (tabKey in TABS) {
setCurrentTab(TABS[tabKey]);
}
};
const render = () => {
const tabsButtons = tabs.map(tab => {
const isActive = tab.value === currentTab;
const tabStyle = isActive ? stylesHook.activeTab : stylesHook.inactiveTab;
const textStyle = isActive ? stylesHook.activeText : stylesHook.inactiveTab;
return (
<View key={tab.key} onPress={() => changeToTab(tab.key)} style={[styles.tab, tabStyle]}>
<Text onPress={() => changeToTab(tab.key)} style={textStyle}>{tab.name}</Text>
</View>
);
});
return (
<View style={styles.container}>
<View style={[stylesHook.backTabs, styles.backTabs]}>
<View style={styles.tabs}>{tabsButtons}</View>
</View>
</View>
);
};
return render();
};
const styles = StyleSheet.create({
container: {
flex: 1,
flexDirection: 'row',
justifyContent: 'center',
},
backTabs: {
padding: 4,
marginVertical: 8,
borderRadius: 8,
},
tabs: {
flex: 1,
flexDirection: 'row',
justifyContent: 'center',
},
tab: {
borderRadius: 6,
paddingVertical: 8,
paddingHorizontal: 16,
},
});
export { AddressTypeTabs };

View File

@ -50,7 +50,7 @@
6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; };
6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; };
6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; };
6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; };
6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; };
6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; };
764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; };
782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; };
@ -397,7 +397,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */,
6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -837,7 +837,7 @@
);
name = "BlueWalletWatch Extension";
packageProductDependencies = (
6DFC806F24EA0B6C007B8700 /* EFQRCode */,
6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */,
);
productName = "BlueWalletWatch Extension";
productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */;
@ -921,7 +921,7 @@
);
mainGroup = 83CBB9F61A601CBA00E9B192;
packageReferences = (
6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */,
6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */,
);
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = "";
@ -1661,6 +1661,7 @@
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 ";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@ -1717,6 +1718,7 @@
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 ";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -1958,7 +1960,7 @@
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = {
6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/EFPrefix/EFQRCode.git";
requirement = {
@ -1969,9 +1971,9 @@
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
6DFC806F24EA0B6C007B8700 /* EFQRCode */ = {
6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = {
isa = XCSwiftPackageProductDependency;
package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */;
package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */;
productName = EFQRCode;
};
/* End XCSwiftPackageProductDependency section */

View File

@ -60,7 +60,6 @@ class ComplicationController: NSObject, CLKComplicationDataSource {
date = Date()
}
let line1Text = CLKSimpleTextProvider(text:valueLabel)
let line2Text = CLKSimpleTextProvider(text:currencySymbol)
let line1SmallText = CLKSimpleTextProvider(text: valueSmallLabel)
@ -139,7 +138,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource {
if #available(watchOSApplicationExtension 6.0, *) {
template.headerTextProvider = CLKTextProvider(format: "Bitcoin Price")
template.body1TextProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel)
template.body2TextProvider = CLKTextProvider(format: "%@", timeLabel)
template.body2TextProvider = CLKTextProvider(format: "at %@", timeLabel)
entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template)
handler(entry)
} else {
@ -149,7 +148,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource {
let template = CLKComplicationTemplateExtraLargeStackText()
if #available(watchOSApplicationExtension 6.0, *) {
template.line1TextProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel)
template.line2TextProvider = CLKTextProvider(format: "%@", timeLabel)
template.line2TextProvider = CLKTextProvider(format: "at %@", timeLabel)
entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template)
handler(entry)
} else {
@ -160,7 +159,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource {
if #available(watchOSApplicationExtension 6.0, *) {
template.headerTextProvider = CLKTextProvider(format: "Bitcoin Price")
template.body1TextProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel)
template.body2TextProvider = CLKTextProvider(format: "%@", timeLabel)
template.body2TextProvider = CLKTextProvider(format: "at %@", timeLabel)
entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template)
handler(entry)
} else {
@ -170,7 +169,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource {
if #available(watchOSApplicationExtension 7.0, *) {
let template = CLKComplicationTemplateGraphicExtraLargeCircularStackText()
template.line1TextProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel)
template.line1TextProvider = CLKTextProvider(format: "%@", timeLabel)
template.line1TextProvider = CLKTextProvider(format: "at %@", timeLabel)
entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template)
handler(entry)
} else {

View File

@ -2,19 +2,23 @@ platform :ios, '11.1'
workspace 'BlueWallet'
require_relative '../node_modules/react-native/scripts/react_native_pods'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
target 'BlueWallet' do
config = use_native_modules!
use_react_native!(:path => config["reactNativePath"])
use_react_native!(
:path => config[:reactNativePath],
# to enable hermes on iOS, change `false` to `true` and then install pods
:hermes_enabled => false
)
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable these next few lines.
use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
use_flipper!()
post_install do |installer|
flipper_post_install(installer)
react_native_post_install(installer)
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0'

View File

@ -4,15 +4,15 @@ PODS:
- React
- CocoaAsyncSocket (7.6.5)
- DoubleConversion (1.1.6)
- FBLazyVector (0.63.4)
- FBReactNativeSpec (0.63.4):
- Folly (= 2020.01.13.00)
- RCTRequired (= 0.63.4)
- RCTTypeSafety (= 0.63.4)
- React-Core (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- Flipper (0.87.0):
- FBLazyVector (0.64.2)
- FBReactNativeSpec (0.64.2):
- RCT-Folly (= 2020.01.13.00)
- RCTRequired (= 0.64.2)
- RCTTypeSafety (= 0.64.2)
- React-Core (= 0.64.2)
- React-jsi (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- Flipper (0.75.1):
- Flipper-Folly (~> 2.5)
- Flipper-RSocket (~> 1.3)
- Flipper-DoubleConversion (1.1.7)
@ -26,58 +26,38 @@ PODS:
- Flipper-PeerTalk (0.0.4)
- Flipper-RSocket (1.3.1):
- Flipper-Folly (~> 2.5)
- FlipperKit (0.87.0):
- FlipperKit/Core (= 0.87.0)
- FlipperKit/Core (0.87.0):
- Flipper (~> 0.87.0)
- FlipperKit (0.75.1):
- FlipperKit/Core (= 0.75.1)
- FlipperKit/Core (0.75.1):
- Flipper (~> 0.75.1)
- FlipperKit/CppBridge
- FlipperKit/FBCxxFollyDynamicConvert
- FlipperKit/FBDefines
- FlipperKit/FKPortForwarding
- FlipperKit/CppBridge (0.87.0):
- Flipper (~> 0.87.0)
- FlipperKit/FBCxxFollyDynamicConvert (0.87.0):
- FlipperKit/CppBridge (0.75.1):
- Flipper (~> 0.75.1)
- FlipperKit/FBCxxFollyDynamicConvert (0.75.1):
- Flipper-Folly (~> 2.5)
- FlipperKit/FBDefines (0.87.0)
- FlipperKit/FKPortForwarding (0.87.0):
- FlipperKit/FBDefines (0.75.1)
- FlipperKit/FKPortForwarding (0.75.1):
- CocoaAsyncSocket (~> 7.6)
- Flipper-PeerTalk (~> 0.0.4)
- FlipperKit/FlipperKitHighlightOverlay (0.87.0)
- FlipperKit/FlipperKitLayoutHelpers (0.87.0):
- FlipperKit/FlipperKitHighlightOverlay (0.75.1)
- FlipperKit/FlipperKitLayoutPlugin (0.75.1):
- FlipperKit/Core
- FlipperKit/FlipperKitHighlightOverlay
- FlipperKit/FlipperKitLayoutTextSearchable
- FlipperKit/FlipperKitLayoutIOSDescriptors (0.87.0):
- FlipperKit/Core
- FlipperKit/FlipperKitHighlightOverlay
- FlipperKit/FlipperKitLayoutHelpers
- YogaKit (~> 1.18)
- FlipperKit/FlipperKitLayoutPlugin (0.87.0):
- FlipperKit/FlipperKitLayoutTextSearchable (0.75.1)
- FlipperKit/FlipperKitNetworkPlugin (0.75.1):
- FlipperKit/Core
- FlipperKit/FlipperKitHighlightOverlay
- FlipperKit/FlipperKitLayoutHelpers
- FlipperKit/FlipperKitLayoutIOSDescriptors
- FlipperKit/FlipperKitLayoutTextSearchable
- YogaKit (~> 1.18)
- FlipperKit/FlipperKitLayoutTextSearchable (0.87.0)
- FlipperKit/FlipperKitNetworkPlugin (0.87.0):
- FlipperKit/FlipperKitReactPlugin (0.75.1):
- FlipperKit/Core
- FlipperKit/FlipperKitReactPlugin (0.87.0):
- FlipperKit/FlipperKitUserDefaultsPlugin (0.75.1):
- FlipperKit/Core
- FlipperKit/FlipperKitUserDefaultsPlugin (0.87.0):
- FlipperKit/Core
- FlipperKit/SKIOSNetworkPlugin (0.87.0):
- FlipperKit/SKIOSNetworkPlugin (0.75.1):
- FlipperKit/Core
- FlipperKit/FlipperKitNetworkPlugin
- Folly (2020.01.13.00):
- boost-for-react-native
- DoubleConversion
- Folly/Default (= 2020.01.13.00)
- glog
- Folly/Default (2020.01.13.00):
- boost-for-react-native
- DoubleConversion
- glog
- GCDWebServer (3.5.4):
- GCDWebServer/Core (= 3.5.4)
- GCDWebServer/Core (3.5.4)
@ -90,172 +70,199 @@ PODS:
- OpenSSL-Universal (1.1.180)
- PasscodeAuth (1.0.0):
- React
- RCTRequired (0.63.4)
- RCTTypeSafety (0.63.4):
- FBLazyVector (= 0.63.4)
- Folly (= 2020.01.13.00)
- RCTRequired (= 0.63.4)
- React-Core (= 0.63.4)
- React (0.63.4):
- React-Core (= 0.63.4)
- React-Core/DevSupport (= 0.63.4)
- React-Core/RCTWebSocket (= 0.63.4)
- React-RCTActionSheet (= 0.63.4)
- React-RCTAnimation (= 0.63.4)
- React-RCTBlob (= 0.63.4)
- React-RCTImage (= 0.63.4)
- React-RCTLinking (= 0.63.4)
- React-RCTNetwork (= 0.63.4)
- React-RCTSettings (= 0.63.4)
- React-RCTText (= 0.63.4)
- React-RCTVibration (= 0.63.4)
- React-callinvoker (0.63.4)
- React-Core (0.63.4):
- Folly (= 2020.01.13.00)
- RCT-Folly (2020.01.13.00):
- boost-for-react-native
- DoubleConversion
- glog
- React-Core/Default (= 0.63.4)
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- RCT-Folly/Default (= 2020.01.13.00)
- RCT-Folly/Default (2020.01.13.00):
- boost-for-react-native
- DoubleConversion
- glog
- RCTRequired (0.64.2)
- RCTTypeSafety (0.64.2):
- FBLazyVector (= 0.64.2)
- RCT-Folly (= 2020.01.13.00)
- RCTRequired (= 0.64.2)
- React-Core (= 0.64.2)
- React (0.64.2):
- React-Core (= 0.64.2)
- React-Core/DevSupport (= 0.64.2)
- React-Core/RCTWebSocket (= 0.64.2)
- React-RCTActionSheet (= 0.64.2)
- React-RCTAnimation (= 0.64.2)
- React-RCTBlob (= 0.64.2)
- React-RCTImage (= 0.64.2)
- React-RCTLinking (= 0.64.2)
- React-RCTNetwork (= 0.64.2)
- React-RCTSettings (= 0.64.2)
- React-RCTText (= 0.64.2)
- React-RCTVibration (= 0.64.2)
- React-callinvoker (0.64.2)
- React-Core (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default (= 0.64.2)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/CoreModulesHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/CoreModulesHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/Default (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/Default (0.64.2):
- glog
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- RCT-Folly (= 2020.01.13.00)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/DevSupport (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/DevSupport (0.64.2):
- glog
- React-Core/Default (= 0.63.4)
- React-Core/RCTWebSocket (= 0.63.4)
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-jsinspector (= 0.63.4)
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default (= 0.64.2)
- React-Core/RCTWebSocket (= 0.64.2)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-jsinspector (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTActionSheetHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTActionSheetHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTAnimationHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTAnimationHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTBlobHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTBlobHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTImageHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTImageHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTLinkingHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTLinkingHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTNetworkHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTNetworkHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTSettingsHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTSettingsHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTTextHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTTextHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTVibrationHeaders (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTVibrationHeaders (0.64.2):
- glog
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-Core/RCTWebSocket (0.63.4):
- Folly (= 2020.01.13.00)
- React-Core/RCTWebSocket (0.64.2):
- glog
- React-Core/Default (= 0.63.4)
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- RCT-Folly (= 2020.01.13.00)
- React-Core/Default (= 0.64.2)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsiexecutor (= 0.64.2)
- React-perflogger (= 0.64.2)
- Yoga
- React-CoreModules (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/CoreModulesHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- React-RCTImage (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-cxxreact (0.63.4):
- React-CoreModules (0.64.2):
- FBReactNativeSpec (= 0.64.2)
- RCT-Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.64.2)
- React-Core/CoreModulesHeaders (= 0.64.2)
- React-jsi (= 0.64.2)
- React-RCTImage (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- React-cxxreact (0.64.2):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-callinvoker (= 0.63.4)
- React-jsinspector (= 0.63.4)
- React-jsi (0.63.4):
- RCT-Folly (= 2020.01.13.00)
- React-callinvoker (= 0.64.2)
- React-jsi (= 0.64.2)
- React-jsinspector (= 0.64.2)
- React-perflogger (= 0.64.2)
- React-runtimeexecutor (= 0.64.2)
- React-jsi (0.64.2):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-jsi/Default (= 0.63.4)
- React-jsi/Default (0.63.4):
- RCT-Folly (= 2020.01.13.00)
- React-jsi/Default (= 0.64.2)
- React-jsi/Default (0.64.2):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-jsiexecutor (0.63.4):
- RCT-Folly (= 2020.01.13.00)
- React-jsiexecutor (0.64.2):
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsinspector (0.63.4)
- RCT-Folly (= 2020.01.13.00)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-perflogger (= 0.64.2)
- React-jsinspector (0.64.2)
- react-native-blue-crypto (1.0.0):
- React
- react-native-blur (0.8.0):
@ -289,66 +296,70 @@ PODS:
- React-Core
- react-native-widget-center (0.0.4):
- React
- React-RCTActionSheet (0.63.4):
- React-Core/RCTActionSheetHeaders (= 0.63.4)
- React-RCTAnimation (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/RCTAnimationHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTBlob (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- Folly (= 2020.01.13.00)
- React-Core/RCTBlobHeaders (= 0.63.4)
- React-Core/RCTWebSocket (= 0.63.4)
- React-jsi (= 0.63.4)
- React-RCTNetwork (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTImage (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/RCTImageHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- React-RCTNetwork (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTLinking (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- React-Core/RCTLinkingHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTNetwork (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/RCTNetworkHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTSettings (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/RCTSettingsHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTText (0.63.4):
- React-Core/RCTTextHeaders (= 0.63.4)
- React-RCTVibration (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- Folly (= 2020.01.13.00)
- React-Core/RCTVibrationHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- ReactCommon/turbomodule/core (0.63.4):
- React-perflogger (0.64.2)
- React-RCTActionSheet (0.64.2):
- React-Core/RCTActionSheetHeaders (= 0.64.2)
- React-RCTAnimation (0.64.2):
- FBReactNativeSpec (= 0.64.2)
- RCT-Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.64.2)
- React-Core/RCTAnimationHeaders (= 0.64.2)
- React-jsi (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- React-RCTBlob (0.64.2):
- FBReactNativeSpec (= 0.64.2)
- RCT-Folly (= 2020.01.13.00)
- React-Core/RCTBlobHeaders (= 0.64.2)
- React-Core/RCTWebSocket (= 0.64.2)
- React-jsi (= 0.64.2)
- React-RCTNetwork (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- React-RCTImage (0.64.2):
- FBReactNativeSpec (= 0.64.2)
- RCT-Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.64.2)
- React-Core/RCTImageHeaders (= 0.64.2)
- React-jsi (= 0.64.2)
- React-RCTNetwork (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- React-RCTLinking (0.64.2):
- FBReactNativeSpec (= 0.64.2)
- React-Core/RCTLinkingHeaders (= 0.64.2)
- React-jsi (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- React-RCTNetwork (0.64.2):
- FBReactNativeSpec (= 0.64.2)
- RCT-Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.64.2)
- React-Core/RCTNetworkHeaders (= 0.64.2)
- React-jsi (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- React-RCTSettings (0.64.2):
- FBReactNativeSpec (= 0.64.2)
- RCT-Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.64.2)
- React-Core/RCTSettingsHeaders (= 0.64.2)
- React-jsi (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- React-RCTText (0.64.2):
- React-Core/RCTTextHeaders (= 0.64.2)
- React-RCTVibration (0.64.2):
- FBReactNativeSpec (= 0.64.2)
- RCT-Folly (= 2020.01.13.00)
- React-Core/RCTVibrationHeaders (= 0.64.2)
- React-jsi (= 0.64.2)
- ReactCommon/turbomodule/core (= 0.64.2)
- React-runtimeexecutor (0.64.2):
- React-jsi (= 0.64.2)
- ReactCommon/turbomodule/core (0.64.2):
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-callinvoker (= 0.63.4)
- React-Core (= 0.63.4)
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- RCT-Folly (= 2020.01.13.00)
- React-callinvoker (= 0.64.2)
- React-Core (= 0.64.2)
- React-cxxreact (= 0.64.2)
- React-jsi (= 0.64.2)
- React-perflogger (= 0.64.2)
- RealmJS (10.4.2):
- GCDWebServer
- React
@ -388,8 +399,8 @@ PODS:
- DoubleConversion
- FBLazyVector
- FBReactNativeSpec
- Folly
- glog
- RCT-Folly
- RCTRequired
- RCTTypeSafety
- React
@ -413,11 +424,12 @@ PODS:
- React-RCTVibration
- ReactCommon/turbomodule/core
- Yoga
- RNScreens (2.18.1):
- RNScreens (3.4.0):
- React-Core
- React-RCTImage
- RNSecureKeyStore (1.0.0):
- React
- RNSentry (2.5.2):
- RNSentry (2.6.0):
- React-Core
- Sentry (= 7.0.0)
- RNShare (6.2.1):
@ -442,31 +454,31 @@ DEPENDENCIES:
- BVLinearGradient (from `../node_modules/react-native-linear-gradient`)
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
- FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`)
- Flipper (= 0.87.0)
- FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
- Flipper (~> 0.75.1)
- Flipper-DoubleConversion (= 1.1.7)
- Flipper-Folly (= 2.5.3)
- Flipper-Folly (~> 2.5.3)
- Flipper-Glog (= 0.3.6)
- Flipper-PeerTalk (~> 0.0.4)
- Flipper-RSocket (= 1.3.1)
- FlipperKit (= 0.87.0)
- FlipperKit/Core (= 0.87.0)
- FlipperKit/CppBridge (= 0.87.0)
- FlipperKit/FBCxxFollyDynamicConvert (= 0.87.0)
- FlipperKit/FBDefines (= 0.87.0)
- FlipperKit/FKPortForwarding (= 0.87.0)
- FlipperKit/FlipperKitHighlightOverlay (= 0.87.0)
- FlipperKit/FlipperKitLayoutPlugin (= 0.87.0)
- FlipperKit/FlipperKitLayoutTextSearchable (= 0.87.0)
- FlipperKit/FlipperKitNetworkPlugin (= 0.87.0)
- FlipperKit/FlipperKitReactPlugin (= 0.87.0)
- FlipperKit/FlipperKitUserDefaultsPlugin (= 0.87.0)
- FlipperKit/SKIOSNetworkPlugin (= 0.87.0)
- Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
- Flipper-RSocket (~> 1.3)
- FlipperKit (~> 0.75.1)
- FlipperKit/Core (~> 0.75.1)
- FlipperKit/CppBridge (~> 0.75.1)
- FlipperKit/FBCxxFollyDynamicConvert (~> 0.75.1)
- FlipperKit/FBDefines (~> 0.75.1)
- FlipperKit/FKPortForwarding (~> 0.75.1)
- FlipperKit/FlipperKitHighlightOverlay (~> 0.75.1)
- FlipperKit/FlipperKitLayoutPlugin (~> 0.75.1)
- FlipperKit/FlipperKitLayoutTextSearchable (~> 0.75.1)
- FlipperKit/FlipperKitNetworkPlugin (~> 0.75.1)
- FlipperKit/FlipperKitReactPlugin (~> 0.75.1)
- FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.75.1)
- FlipperKit/SKIOSNetworkPlugin (~> 0.75.1)
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
- lottie-ios (from `../node_modules/lottie-ios`)
- lottie-react-native (from `../node_modules/lottie-react-native`)
- PasscodeAuth (from `../node_modules/react-native-passcode-auth`)
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
- React (from `../node_modules/react-native/`)
@ -492,6 +504,7 @@ DEPENDENCIES:
- react-native-tor (from `../node_modules/react-native-tor`)
- react-native-webview (from `../node_modules/react-native-webview`)
- react-native-widget-center (from `../node_modules/react-native-widget-center`)
- React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
- React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
@ -501,6 +514,7 @@ DEPENDENCIES:
- React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
- React-RCTText (from `../node_modules/react-native/Libraries/Text`)
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
- React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
- RealmJS (from `../node_modules/realm`)
- "RemobileReactNativeQrcodeLocalImage (from `../node_modules/@remobile/react-native-qrcode-local-image`)"
@ -556,9 +570,7 @@ EXTERNAL SOURCES:
FBLazyVector:
:path: "../node_modules/react-native/Libraries/FBLazyVector"
FBReactNativeSpec:
:path: "../node_modules/react-native/Libraries/FBReactNativeSpec"
Folly:
:podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec"
:path: "../node_modules/react-native/React/FBReactNativeSpec"
glog:
:podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
lottie-ios:
@ -567,6 +579,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/lottie-react-native"
PasscodeAuth:
:path: "../node_modules/react-native-passcode-auth"
RCT-Folly:
:podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
RCTRequired:
:path: "../node_modules/react-native/Libraries/RCTRequired"
RCTTypeSafety:
@ -613,6 +627,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-webview"
react-native-widget-center:
:path: "../node_modules/react-native-widget-center"
React-perflogger:
:path: "../node_modules/react-native/ReactCommon/reactperflogger"
React-RCTActionSheet:
:path: "../node_modules/react-native/Libraries/ActionSheetIOS"
React-RCTAnimation:
@ -631,6 +647,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/Libraries/Text"
React-RCTVibration:
:path: "../node_modules/react-native/Libraries/Vibration"
React-runtimeexecutor:
:path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
ReactCommon:
:path: "../node_modules/react-native/ReactCommon"
RealmJS:
@ -700,17 +718,16 @@ SPEC CHECKSUMS:
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
DoubleConversion: cde416483dac037923206447da6e1454df403714
FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e
FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e
Flipper: 1bd2db48dcc31e4b167b9a33ec1df01c2ded4893
DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de
FBLazyVector: e686045572151edef46010a6f819ade377dfeb4b
FBReactNativeSpec: da2b9104721789106ad3943049ccf61ef6f4db39
Flipper: d3da1aa199aad94455ae725e9f3aa43f3ec17021
Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41
Flipper-Folly: 755929a4f851b2fb2c347d533a23f191b008554c
Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6
Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
Flipper-RSocket: 127954abe8b162fcaf68d2134d34dc2bd7076154
FlipperKit: 651f50a42eb95c01b3e89a60996dd6aded529eeb
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
FlipperKit: 8a20b5c5fcf9436cac58551dc049867247f64b00
GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4
glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
@ -718,16 +735,17 @@ SPEC CHECKSUMS:
lottie-react-native: 4dff8fe8d10ddef9e7880e770080f4a56121397e
OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b
PasscodeAuth: 1cc99b13d8e4de4716d7e2b4069af2f1a9de30b2
RCTRequired: 082f10cd3f905d6c124597fd1c14f6f2655ff65e
RCTTypeSafety: 8c9c544ecbf20337d069e4ae7fd9a377aadf504b
React: b0a957a2c44da4113b0c4c9853d8387f8e64e615
React-callinvoker: c3f44dd3cb195b6aa46621fff95ded79d59043fe
React-Core: d3b2a1ac9a2c13c3bcde712d9281fc1c8a5b315b
React-CoreModules: 0581ff36cb797da0943d424f69e7098e43e9be60
React-cxxreact: c1480d4fda5720086c90df537ee7d285d4c57ac3
React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31
React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949
React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a
RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c
RCTRequired: 6d3e854f0e7260a648badd0d44fc364bc9da9728
RCTTypeSafety: c1f31d19349c6b53085766359caac425926fafaa
React: bda6b6d7ae912de97d7a61aa5c160db24aa2ad69
React-callinvoker: 9840ea7e8e88ed73d438edb725574820b29b5baa
React-Core: b5e385da7ce5f16a220fc60fd0749eae2c6120f0
React-CoreModules: 17071a4e2c5239b01585f4aa8070141168ab298f
React-cxxreact: 9be7b6340ed9f7c53e53deca7779f07cd66525ba
React-jsi: 67747b9722f6dab2ffe15b011bcf6b3f2c3f1427
React-jsiexecutor: 80c46bd381fd06e418e0d4f53672dc1d1945c4c3
React-jsinspector: cc614ec18a9ca96fd275100c16d74d62ee11f0ae
react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56
react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c
react-native-camera: 6e6d25f6318980dd2837747760628b4442aac01a
@ -741,16 +759,18 @@ SPEC CHECKSUMS:
react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef
react-native-webview: 4288b81c682bca4dcc9037afb3ee118af2655c03
react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a
React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336
React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b
React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0
React-RCTImage: c1b1f2d3f43a4a528c8946d6092384b5c880d2f0
React-RCTLinking: 35ae4ab9dc0410d1fcbdce4d7623194a27214fb2
React-RCTNetwork: 29ec2696f8d8cfff7331fac83d3e893c95ef43ae
React-RCTSettings: 60f0691bba2074ef394f95d4c2265ec284e0a46a
React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c
React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d
ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b
React-perflogger: 25373e382fed75ce768a443822f07098a15ab737
React-RCTActionSheet: af7796ba49ffe4ca92e7277a5d992d37203f7da5
React-RCTAnimation: 6a2e76ab50c6f25b428d81b76a5a45351c4d77aa
React-RCTBlob: 02a2887023e0eed99391b6445b2e23a2a6f9226d
React-RCTImage: ce5bf8e7438f2286d9b646a05d6ab11f38b0323d
React-RCTLinking: ccd20742de14e020cb5f99d5c7e0bf0383aefbd9
React-RCTNetwork: dfb9d089ab0753e5e5f55fc4b1210858f7245647
React-RCTSettings: b14aef2d83699e48b410fb7c3ba5b66cd3291ae2
React-RCTText: 41a2e952dd9adc5caf6fb68ed46b275194d5da5f
React-RCTVibration: 24600e3b1aaa77126989bc58b6747509a1ba14f3
React-runtimeexecutor: a9904c6d0218fb9f8b19d6dd88607225927668f9
ReactCommon: 149906e01aa51142707a10665185db879898e966
RealmJS: 90f2a558fdda19ebb9fcbc0a52c7b1d1b049fb88
RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa
RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589
@ -768,10 +788,10 @@ SPEC CHECKSUMS:
RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93
RNRate: e0af7e724e5fcf89578dbd22ab6395c85402ef29
RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285
RNReanimated: d9da990fc90123f4ffbfdda93d00fc15174863a8
RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d
RNReanimated: 9c13c86454bfd54dab7505c1a054470bfecd2563
RNScreens: 21b73c94c9117e1110a79ee0ee80c93ccefed8ce
RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8
RNSentry: bfa1e2776c7413570e790cbbf79d2060dd0a565b
RNSentry: a2b02b326ae4fce91ce7c57d3f7dcf8df4f72269
RNShare: 5ac8f6532ca4cd80fc71caef1cfbba1854a6a045
RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f
RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59
@ -779,9 +799,9 @@ SPEC CHECKSUMS:
Sentry: 89d26e036063b9cb9caa59b6951dd2f8277aa13b
SwiftSocket: c8d482e867ae4d3eb4c769e9382e123c1f1f833b
ToolTipMenu: 4d89d95ddffd7539230bdbe02ee51bbde362e37e
Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6
Yoga: 575c581c63e0d35c9a83f4b46d01d63abc1100ac
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
PODFILE CHECKSUM: 73464a154246ad233697748ecc693fe37cb2eacb
PODFILE CHECKSUM: d6f6c7992cb83adb1c2ca00fa4d3e3a3402f4787
COCOAPODS: 1.10.1

View File

@ -579,7 +579,6 @@
"sign_placeholder_signature": "التوقيع",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "هل تريد إرسال رسالة موقعة إلى {hostname}؟",
"address_balance": "الرصيد: {Balance} ساتوشي",
"addresses_title": "العنوان",
"type_change": "تغيير",
"type_receive": "استلام"

View File

@ -579,7 +579,6 @@
"sign_placeholder_signature": "Podpis",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "Chcete poslat podepsanou zprávu uživateli {hostname}?",
"address_balance": "Zůstatek: {balance} sats",
"addresses_title": "Adresy",
"type_change": "Změnit",
"type_receive": "Příjmout"

View File

@ -283,7 +283,6 @@
"sign_placeholder_address": "Cyfeiriad",
"sign_placeholder_message": "Neges",
"sign_placeholder_signature": "Llofnod",
"address_balance": "Balans: {balance} sats",
"addresses_title": "Cyfeiriadau",
"type_change": "Newid",
"type_receive": "Derbyn"

View File

@ -579,7 +579,6 @@
"sign_placeholder_signature": "Signatur",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "Senden der signierten Nachricht nach {hostname}?",
"address_balance": "Guthaben: {balance} sats",
"addresses_title": "Adressen",
"type_change": "Wechsel",
"type_receive": "Empfang"

View File

@ -579,10 +579,11 @@
"sign_placeholder_signature": "Signature",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "Do you want to send signed message to {hostname}?",
"address_balance": "Balance: {balance} sats",
"addresses_title": "Addresses",
"type_change": "Change",
"type_receive": "Receive"
"type_receive": "Receive",
"type_used": "Used",
"transactions": "Transactions"
},
"aopp": {
"title": "Select Address",

View File

@ -579,7 +579,6 @@
"sign_placeholder_signature": "Firma",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "¿Quieres enviar un mensaje firmado a {hostname}?",
"address_balance": "Saldo: {balance} sats",
"addresses_title": "Direcciones",
"type_change": "Cambio",
"type_receive": "Recibir"

View File

@ -579,7 +579,6 @@
"sign_placeholder_signature": "امضا",
"sign_aopp_title": "پروتکل اثبات مالکیت آدرس (AOPP)",
"sign_aopp_confirm": "آیا مایل به ارسال پیام امضاشده به {hostname} هستید؟",
"address_balance": "موجودی: {balance} ساتوشی",
"addresses_title": "آدرس‌ها",
"type_change": "باقی‌مانده",
"type_receive": "دریافت"

View File

@ -579,7 +579,6 @@
"sign_placeholder_signature": "Signature",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "Voulez-vous envoyer un message signé à {hostname} ?",
"address_balance": "Solde : {balance} sats",
"addresses_title": "Adresses",
"type_change": "Monnaie",
"type_receive": "Réception"

View File

@ -579,7 +579,6 @@
"sign_placeholder_signature": "Podpis",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "Czy chcesz wysłać podpisaną wiadomość do [hostname]?",
"address_balance": "Saldo: {balance} sats",
"addresses_title": "Adresy",
"type_change": "Reszta",
"type_receive": "Otrzymaj"

View File

@ -578,7 +578,6 @@
"sign_placeholder_signature": "Assinatura",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "Você deseja enviar a mensagem assinada para {hostname}?",
"address_balance": "Saldo: {balance} sats",
"addresses_title": "Endereços",
"type_change": "Troco",
"type_receive": "Receber"

View File

@ -578,7 +578,6 @@
"sign_placeholder_signature": "Podpis",
"sign_aopp_title": "AOPP",
"sign_aopp_confirm": "Ali želite podpisano sporočilo poslati na {hostname}?",
"address_balance": "Stanje: {balance} sats",
"addresses_title": "Naslovi",
"type_change": "Vračilo",
"type_receive": "Prejemni"

View File

@ -4,24 +4,26 @@
*
* @format
*/
const path = require('path');
const blacklist = require('metro-config/src/defaults/blacklist');
// const path = require('path');
// const blacklist = require('metro-config/src/defaults/blacklist');
module.exports = {
resolver: {
blacklistRE: blacklist([
// This stops "react-native run-windows" from causing the metro server to crash if its already running
new RegExp(`${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`),
// This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip
/.*\.ProjectImports\.zip/,
]),
},
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
// blacklistRE: blacklist([
// // This stops "react-native run-windows" from causing the metro server to crash if its already running
// new RegExp(`${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`),
// // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip
// /.*\.ProjectImports\.zip/,
// ]),
// },
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
},
};

1967
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -7,13 +7,13 @@
"url": "https://github.com/BlueWallet/BlueWallet.git"
},
"devDependencies": {
"@babel/core": "^7.10.4",
"@babel/core": "^7.12.9",
"@babel/runtime": "^7.14.6",
"@jest/reporters": "^26.4.1",
"@react-native-community/eslint-config": "^2.0.0",
"babel-cli": "^6.26.0",
"babel-eslint": "^10.1.0",
"babel-jest": "^26.1.0",
"babel-jest": "^26.6.3",
"eslint": "^7.25.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard": "^16.0.2",
@ -28,7 +28,7 @@
"eslint-plugin-standard": "^4.1.0",
"jest": "^26.1.0",
"prettier": "^2.2.1",
"react-test-renderer": "16.13.1"
"react-test-renderer": "17.0.1"
},
"engines": {
"node": ">=10.16.0",
@ -48,7 +48,7 @@
"jest": "jest -b -w 1 tests/integration/*",
"maccatalystpatches": "./scripts/maccatalystpatches/applypatchesformaccatalyst.sh",
"e2e:debug-build": "detox build -c android.emu.debug",
"e2e:debug-test": "detox test -c android.emu.debug",
"e2e:debug-test": "detox test -c android.emu.debug -l fatal",
"e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test",
"e2e:release-build": "detox build -c android.emu.release",
"e2e:release-test": "detox test -c android.emu.release --record-videos all --take-screenshots all --headless --loglevel trace",
@ -62,6 +62,9 @@
"transform": {
"^.+\\.js$": "<rootDir>/node_modules/react-native/jest/preprocessor.js"
},
"transformIgnorePatterns": [
"node_modules/(?!((jest-)?react-native(-.*)?|@react-native(-community)?)/)"
],
"setupFiles": [
"./tests/setup.js"
],
@ -83,7 +86,7 @@
"@react-navigation/native": "5.9.4",
"@react-navigation/stack": "5.14.5",
"@remobile/react-native-qrcode-local-image": "https://github.com/BlueWallet/react-native-qrcode-local-image",
"@sentry/react-native": "2.5.2",
"@sentry/react-native": "2.6.0",
"aez": "1.0.1",
"amplitude-js": "7.4.4",
"assert": "2.0.0",
@ -103,7 +106,7 @@
"coinselect": "3.1.12",
"crypto-js": "4.0.0",
"dayjs": "1.10.5",
"detox": "18.17.0",
"detox": "18.18.1",
"ecurve": "1.0.6",
"electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4",
"electrum-mnemonic": "2.0.0",
@ -118,9 +121,9 @@
"pbkdf2": "3.1.1",
"process": "0.11.10",
"prop-types": "15.7.2",
"react": "16.13.1",
"react": "17.0.1",
"react-native": "0.64.2",
"react-localization": "1.0.17",
"react-native": "0.63.4",
"react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto",
"react-native-camera": "3.44.1",
"react-native-crypto": "2.2.0",
@ -132,7 +135,7 @@
"react-native-fs": "2.18.0",
"react-native-gesture-handler": "1.10.3",
"react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602",
"react-native-haptic-feedback": "1.11.0",
"react-native-haptic-feedback": "https://github.com/junina-de/react-native-haptic-feedback.git#8e4d598ad9be886325316b0e2140df8df624a91f",
"react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b",
"react-native-image-picker": "3.8.1",
"react-native-keychain": "7.0.0",
@ -140,8 +143,8 @@
"react-native-linear-gradient": "2.5.6",
"react-native-localize": "2.1.1",
"react-native-modal": "11.10.0",
"react-native-navigation-bar-color": "https://github.com/BlueWallet/react-native-navigation-bar-color#34e44b8f44e442133de9d35c35f2679d40982804",
"react-native-obscure": "1.2.1",
"react-native-navigation-bar-color": "https://github.com/BlueWallet/react-native-navigation-bar-color#3b2894ae62fbce99a3bd24105f0921cebaef5c94",
"react-native-obscure": "https://github.com/BlueWallet/react-native-obscure.git#f4b83b4a261e39b1f5ed4a45ac5bcabc8a59eadb",
"react-native-passcode-auth": "https://github.com/BlueWallet/react-native-passcode-auth#a2ff977ba92b36f8d0a5567f59c05cc608e8bd12",
"react-native-popup-menu-android": "1.0.3",
"react-native-privacy-snapshot": "https://github.com/BlueWallet/react-native-privacy-snapshot#529e4627d93f67752a27e82a040ff7b64dca0783",
@ -153,7 +156,7 @@
"react-native-rate": "1.2.6",
"react-native-reanimated": "2.2.0",
"react-native-safe-area-context": "3.2.0",
"react-native-screens": "2.18.1",
"react-native-screens": "3.4.0",
"react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9",
"react-native-share": "6.2.1",
"react-native-sortable-list": "https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb",

View File

@ -1,11 +1,12 @@
import React, { useCallback, useState, useContext, useRef, useEffect } from 'react';
import { ActivityIndicator, FlatList, StyleSheet, View, StatusBar } from 'react-native';
import { useFocusEffect, useNavigation, useRoute, useTheme } from '@react-navigation/native';
import { useFocusEffect, useRoute, useTheme } from '@react-navigation/native';
import Privacy from '../../blue_modules/Privacy';
import { BlueStorageContext } from '../../blue_modules/storage-context';
import loc from '../../loc';
import navigationStyle from '../../components/navigationStyle';
import { AddressItem } from '../../components/addresses/AddressItem';
import { AddressTypeTabs, TABS } from '../../components/addresses/AddressTypeTabs';
import { WatchOnlyWallet } from '../../class';
export const totalBalance = ({ c, u } = { c: 0, u: 0 }) => c + u;
@ -13,13 +14,16 @@ export const totalBalance = ({ c, u } = { c: 0, u: 0 }) => c + u;
export const getAddress = (wallet, index, isInternal) => {
let address;
let balance = 0;
let transactions = 0;
if (isInternal) {
address = wallet._getInternalAddressByIndex(index);
balance = totalBalance(wallet._balances_by_internal_index[index]);
transactions = wallet._txs_by_internal_index[index].length;
} else {
address = wallet._getExternalAddressByIndex(index);
balance = totalBalance(wallet._balances_by_external_index[index]);
transactions = wallet._txs_by_external_index[index].length;
}
return {
@ -28,16 +32,22 @@ export const getAddress = (wallet, index, isInternal) => {
address,
isInternal,
balance,
transactions: 0,
transactions,
};
};
export const sortByIndexAndType = (a, b) => {
if (a.isInternal > b.isInternal) return 1;
if (a.isInternal < b.isInternal) return -1;
export const sortByAddressIndex = (a, b) => {
if (a.index > b.index) {
return 1;
}
return -1;
};
if (a.index > b.index) return 1;
if (a.index < b.index) return -1;
export const filterByAddressType = (type, isInternal, currentType) => {
if (currentType === type) {
return isInternal === true;
}
return isInternal === false;
};
const WalletAddresses = () => {
@ -45,6 +55,8 @@ const WalletAddresses = () => {
const [addresses, setAddresses] = useState([]);
const [currentTab, setCurrentTab] = useState(TABS.EXTERNAL);
const { wallets } = useContext(BlueStorageContext);
const { walletID } = useRoute().params;
@ -55,18 +67,25 @@ const WalletAddresses = () => {
const balanceUnit = wallet.getPreferredBalanceUnit();
const walletInstance = wallet.type === WatchOnlyWallet.type ? wallet._hdWalletInstance : wallet;
const isWatchOnly = wallet.type === WatchOnlyWallet.type;
const walletInstance = isWatchOnly ? wallet._hdWalletInstance : wallet;
const allowSignVerifyMessage = 'allowSignVerifyMessage' in wallet && wallet.allowSignVerifyMessage();
const { colors } = useTheme();
const { navigate } = useNavigation();
const stylesHook = StyleSheet.create({
root: {
backgroundColor: colors.elevated,
},
});
// computed property
const filteredAddresses = addresses
.filter(address => filterByAddressType(TABS.INTERNAL, address.isInternal, currentTab))
.sort(sortByAddressIndex);
useEffect(() => {
if (showAddresses) {
addressList.current.scrollToIndex({ animated: false, index: 0 });
@ -76,7 +95,7 @@ const WalletAddresses = () => {
const getAddresses = () => {
const addressList = [];
for (let index = 0; index < walletInstance.next_free_change_address_index + walletInstance.gap_limit; index++) {
for (let index = 0; index <= walletInstance.next_free_change_address_index; index++) {
const address = getAddress(walletInstance, index, true);
addressList.push(address);
@ -88,7 +107,7 @@ const WalletAddresses = () => {
addressList.push(address);
}
setAddresses(addressList.sort(sortByIndexAndType));
setAddresses(addressList);
setShowAddresses(true);
};
@ -102,18 +121,8 @@ const WalletAddresses = () => {
}, []),
);
const navigateToReceive = item => {
navigate('ReceiveDetailsRoot', {
screen: 'ReceiveDetails',
params: {
walletID,
address: item.item.address,
},
});
};
const renderRow = item => {
return <AddressItem {...item} balanceUnit={balanceUnit} onPress={() => navigateToReceive(item)} />;
return <AddressItem {...item} balanceUnit={balanceUnit} walletID={walletID} allowSignVerifyMessage={allowSignVerifyMessage} />;
};
return (
@ -122,13 +131,14 @@ const WalletAddresses = () => {
<FlatList
contentContainerStyle={stylesHook.root}
ref={addressList}
data={addresses}
extraData={addresses}
initialNumToRender={40}
data={filteredAddresses}
extraData={filteredAddresses}
initialNumToRender={20}
renderItem={renderRow}
ListEmptyComponent={<ActivityIndicator />}
centerContent={!showAddresses}
contentInsetAdjustmentBehavior="automatic"
ListHeaderComponent={<AddressTypeTabs currentTab={currentTab} setCurrentTab={setCurrentTab} />}
/>
</View>
);

View File

@ -26,7 +26,7 @@ import WalletImport from '../../class/wallet-import';
import ActionSheet from '../ActionSheet';
import loc from '../../loc';
import { FContainer, FButton } from '../../components/FloatButtons';
import { useFocusEffect, useNavigation, useRoute, useTheme } from '@react-navigation/native';
import { useFocusEffect, useIsFocused, useNavigation, useRoute, useTheme } from '@react-navigation/native';
import { BlueStorageContext } from '../../blue_modules/storage-context';
import { isDesktop, isMacCatalina, isTablet } from '../../blue_modules/environment';
import BlueClipboard from '../../blue_modules/clipboard';
@ -46,6 +46,7 @@ const WalletsList = () => {
const { width } = useWindowDimensions();
const { colors, scanImage } = useTheme();
const { navigate, setOptions } = useNavigation();
const isFocused = useIsFocused();
const routeName = useRoute().name;
const [isLoading, setIsLoading] = useState(false);
const [isLargeScreen, setIsLargeScreen] = useState(
@ -202,6 +203,8 @@ const WalletsList = () => {
};
const onSnapToItem = e => {
if (!isFocused) return;
const contentOffset = e.nativeEvent.contentOffset;
const index = Math.ceil(contentOffset.x / width);
console.log('onSnapToItem', index);
@ -277,6 +280,7 @@ const WalletsList = () => {
ref={walletsCarousel}
testID="WalletsList"
horizontal
scrollEnabled={isFocused}
/>
);
};

View File

@ -4,7 +4,7 @@ import { BluePrivateBalance } from '../../BlueComponents';
import SortableList from 'react-native-sortable-list';
import LinearGradient from 'react-native-linear-gradient';
import ReactNativeHapticFeedback from 'react-native-haptic-feedback';
import { useTheme } from '@react-navigation/native';
import { useNavigation, useTheme } from '@react-navigation/native';
import navigationStyle from '../../components/navigationStyle';
import { PlaceholderWallet, LightningCustodianWallet, MultisigHDWallet } from '../../class';
@ -77,6 +77,7 @@ const ReorderWallets = () => {
const sortableList = useRef();
const { colors } = useTheme();
const { wallets, setWalletsWithNewOrder } = useContext(BlueStorageContext);
const navigation = useNavigation();
const stylesHook = {
root: {
backgroundColor: colors.elevated,
@ -87,15 +88,19 @@ const ReorderWallets = () => {
};
useEffect(() => {
if (sortableList.current?.state.data.length === data.length && hasMovedARow) {
const newWalletsOrderArray = [];
sortableList.current.state.order.forEach(element => {
newWalletsOrderArray.push(data[element]);
});
setWalletsWithNewOrder(newWalletsOrderArray);
}
const unsubscribe = navigation.addListener('blur', () => {
if (sortableList.current?.state.data.length === data.length && hasMovedARow) {
const newWalletsOrderArray = [];
sortableList.current.state.order.forEach(element => {
newWalletsOrderArray.push(data[element]);
});
setWalletsWithNewOrder(newWalletsOrderArray);
}
});
return unsubscribe;
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [hasMovedARow]);
}, [navigation, hasMovedARow]);
useEffect(() => {
const loadWallets = wallets.filter(wallet => wallet.type !== PlaceholderWallet.type);

View File

@ -185,7 +185,7 @@ describe('BlueWallet UI Tests', () => {
await yo('BitcoinAddressQRCodeContainer');
await yo('BlueCopyTextToClipboard');
await element(by.id('SetCustomAmountButton')).tap();
await element(by.id('BitcoinAmountInput')).typeText('1');
await element(by.id('BitcoinAmountInput')).replaceText('1');
await element(by.id('CustomAmountDescription')).typeText('test');
await element(by.id('CustomAmountSaveButton')).tap();
await sup('1 BTC');
@ -835,11 +835,11 @@ describe('BlueWallet UI Tests', () => {
await expect(element(by.id('BitcoinAddressQRCodeContainer'))).toBeVisible();
await expect(element(by.text('bc1qtc9zquvq7lgq87kzsgltvv4etwm9uxphfkvkay'))).toBeVisible();
await element(by.id('SetCustomAmountButton')).tap();
await element(by.id('BitcoinAmountInput')).typeText('1');
await element(by.id('BitcoinAmountInput')).replaceText('1');
await element(by.id('CustomAmountDescription')).typeText('Test');
await element(by.id('CustomAmountSaveButton')).tap();
await expect(element(by.text('1 BTC'))).toBeVisible();
await expect(element(by.text('Test'))).toBeVisible();
await sup('1 BTC');
await sup('Test');
await expect(element(by.id('BitcoinAddressQRCodeContainer'))).toBeVisible();
await expect(element(by.text('bitcoin:bc1qtc9zquvq7lgq87kzsgltvv4etwm9uxphfkvkay?amount=1&label=Test'))).toBeVisible();

View File

@ -1,21 +1,49 @@
import assert from 'assert';
import { getAddress, sortByIndexAndType, totalBalance } from '../../screen/wallets/addresses';
import { getAddress, sortByAddressIndex, totalBalance, filterByAddressType } from '../../screen/wallets/addresses';
import { TABS } from '../../components/addresses/AddressTypeTabs';
const mockAddressesList = [
{ index: 2, isInternal: false, key: 'third_external_address' },
{ index: 0, isInternal: true, key: 'first_internal_address' },
{ index: 1, isInternal: false, key: 'second_external_address' },
{ index: 1, isInternal: true, key: 'second_internal_address' },
{ index: 0, isInternal: false, key: 'first_external_address' },
];
describe('Addresses', () => {
it('Sort by index ASC and externals first', () => {
const originalList = [
{ index: 0, isInternal: true, key: 'first_internal_address' },
{ index: 1, isInternal: false, key: 'second_external_address' },
{ index: 1, isInternal: true, key: 'second_internal_address' },
{ index: 0, isInternal: false, key: 'first_external_address' },
];
it('Sort by index', () => {
const sortedList = mockAddressesList.sort(sortByAddressIndex);
const sortedList = originalList.sort(sortByIndexAndType);
assert.strictEqual(sortedList[0].index, 0);
assert.strictEqual(sortedList[2].index, 1);
assert.strictEqual(sortedList[4].index, 2);
});
assert.strictEqual(sortedList[0].key, 'first_external_address');
assert.strictEqual(sortedList[1].key, 'second_external_address');
assert.strictEqual(sortedList[2].key, 'first_internal_address');
assert.strictEqual(sortedList[3].key, 'second_internal_address');
it('Have tabs defined', () => {
const tabsEnum = {
EXTERNAL: 'receive',
INTERNAL: 'change',
};
assert.deepStrictEqual(TABS, tabsEnum);
});
it('Filter by type', () => {
let currentTab = TABS.EXTERNAL;
const externalAddresses = mockAddressesList.filter(address => filterByAddressType(TABS.INTERNAL, address.isInternal, currentTab));
currentTab = TABS.INTERNAL;
const internalAddresses = mockAddressesList.filter(address => filterByAddressType(TABS.INTERNAL, address.isInternal, currentTab));
externalAddresses.forEach(address => {
assert.strictEqual(address.isInternal, false);
});
internalAddresses.forEach(address => {
assert.strictEqual(address.isInternal, true);
});
});
it('Sum confirmed/unconfirmed balance', () => {
@ -34,6 +62,8 @@ describe('Addresses', () => {
_getInternalAddressByIndex: index => `internal_address_${index}`,
_balances_by_external_index: [{ c: 0, u: 0 }],
_balances_by_internal_index: [{ c: 0, u: 0 }],
_txs_by_external_index: { 0: [{}] },
_txs_by_internal_index: { 0: [{}, {}] },
};
const firstExternalAddress = getAddress(fakeWallet, 0, false);
@ -45,7 +75,7 @@ describe('Addresses', () => {
index: 0,
isInternal: false,
key: 'external_address_0',
transactions: 0,
transactions: 1,
});
assert.deepStrictEqual(firstInternalAddress, {
@ -54,7 +84,7 @@ describe('Addresses', () => {
index: 0,
isInternal: true,
key: 'internal_address_0',
transactions: 0,
transactions: 2,
});
});
});