react native navigation

Signed-off-by: andrey <motor4ik@gmail.com>
This commit is contained in:
andrey 2021-05-24 16:25:05 +02:00
parent 0e12360ed8
commit 5f719ac95b
No known key found for this signature in database
GPG Key ID: 89B67245FD2F0272
181 changed files with 5329 additions and 4021 deletions

View File

@ -26,14 +26,14 @@ import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
import com.facebook.react.ReactFragmentActivity;
import com.facebook.react.ReactActivity;
import com.reactnativenavigation.NavigationActivity;
import com.facebook.react.modules.core.PermissionListener;
import org.devio.rn.splashscreen.SplashScreen;
import java.util.Properties;
import im.status.ethereum.module.StatusThreadPoolExecutor;
public class MainActivity extends ReactFragmentActivity
public class MainActivity extends NavigationActivity
implements ActivityCompat.OnRequestPermissionsResultCallback{
@ -178,14 +178,7 @@ public class MainActivity extends ReactFragmentActivity
super.onDestroy();
}
/**
* Returns the name of the main component registered from JavaScript.
* This is used to schedule rendering of the component.
*/
@Override
protected String getMainComponentName() {
return "StatusIm";
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
@ -242,14 +235,4 @@ public class MainActivity extends ReactFragmentActivity
mPermissionListener = null;
}
}
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new ReactActivityDelegate(this, getMainComponentName()) {
@Override
protected ReactRootView createRootView() {
return new RNGestureHandlerEnabledRootView(MainActivity.this);
}
};
}
}

View File

@ -10,8 +10,9 @@ import com.facebook.react.PackageList;
import com.aakashns.reactnativedialogs.ReactNativeDialogsPackage;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.reactnativenavigation.NavigationApplication;
import com.reactnativenavigation.react.NavigationReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import com.facebook.react.ReactInstanceManager;
import java.util.List;
@ -20,9 +21,9 @@ import im.status.ethereum.keycard.RNStatusKeycardPackage;
import im.status.ethereum.module.StatusPackage;
import im.status.ethereum.pushnotifications.PushNotificationPackage;
public class MainApplication extends MultiDexApplication implements ReactApplication {
public class MainApplication extends NavigationApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
private final ReactNativeHost mReactNativeHost = new NavigationReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
@ -54,7 +55,7 @@ public class MainApplication extends MultiDexApplication implements ReactApplica
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG_WEBVIEW == "1");
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}

View File

@ -4,6 +4,7 @@
* Project-wide gradle configuration properties for use by all modules
*/
ext {
RNNKotlinVersion = "1.4.31"
buildToolsVersion = project.buildToolsVersion
minSdkVersion = Integer.valueOf(project.minSdkVersion)
compileSdkVersion = Integer.valueOf(project.compileSdkVersion)
@ -19,6 +20,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31"
classpath "com.android.tools.build:gradle:${project.ext.gradlePluginVersion}"
// WARNING: Do not place your application dependencies here!
// They belong in the individual module build.gradle files.

View File

@ -1,4 +1,4 @@
platform :ios, '10.0'
platform :ios, '11.0'
require_relative '../node_modules/react-native/scripts/react_native_pods'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'

View File

@ -290,6 +290,15 @@ PODS:
- React
- ReactNativeDarkMode (0.2.2):
- React
- ReactNativeNavigation (7.13.0):
- React-Core
- React-RCTImage
- React-RCTText
- ReactNativeNavigation/Core (= 7.13.0)
- ReactNativeNavigation/Core (7.13.0):
- React-Core
- React-RCTImage
- React-RCTText
- RNCAsyncStorage (1.11.0):
- React
- RNCClipboard (1.2.2):
@ -321,10 +330,35 @@ PODS:
- React
- RNReactNativeHapticFeedback (1.9.0):
- React
- RNReanimated (1.13.0):
- React
- RNScreens (2.10.1):
- RNReanimated (2.1.0):
- DoubleConversion
- FBLazyVector
- FBReactNativeSpec
- Folly
- glog
- RCTRequired
- RCTTypeSafety
- React
- React-callinvoker
- React-Core
- React-Core/DevSupport
- React-Core/RCTWebSocket
- React-CoreModules
- React-cxxreact
- React-jsi
- React-jsiexecutor
- React-jsinspector
- React-RCTActionSheet
- React-RCTAnimation
- React-RCTBlob
- React-RCTImage
- React-RCTLinking
- React-RCTNetwork
- React-RCTSettings
- React-RCTText
- React-RCTVibration
- ReactCommon/turbomodule/core
- Yoga
- RNSVG (9.13.6):
- React
- secp256k1 (0.1.6)
@ -387,6 +421,7 @@ DEPENDENCIES:
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
- "ReactNativeAudioToolkit (from `../node_modules/@react-native-community/audio-toolkit`)"
- ReactNativeDarkMode (from `../node_modules/react-native-dark-mode`)
- ReactNativeNavigation (from `../node_modules/react-native-navigation`)
- "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)"
- "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)"
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
@ -400,7 +435,6 @@ DEPENDENCIES:
- RNPermissions (from `../node_modules/react-native-permissions`)
- RNReactNativeHapticFeedback (from `../node_modules/react-native-haptic-feedback`)
- RNReanimated (from `../node_modules/react-native-reanimated`)
- RNScreens (from `../node_modules/react-native-screens`)
- RNSVG (from `../node_modules/react-native-svg`)
- secp256k1 (from `https://github.com/status-im/secp256k1.swift.git`)
- SQLCipher (~> 3.0)
@ -507,6 +541,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-community/audio-toolkit"
ReactNativeDarkMode:
:path: "../node_modules/react-native-dark-mode"
ReactNativeNavigation:
:path: "../node_modules/react-native-navigation"
RNCAsyncStorage:
:path: "../node_modules/@react-native-community/async-storage"
RNCClipboard:
@ -533,8 +569,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-haptic-feedback"
RNReanimated:
:path: "../node_modules/react-native-reanimated"
RNScreens:
:path: "../node_modules/react-native-screens"
RNSVG:
:path: "../node_modules/react-native-svg"
secp256k1:
@ -562,7 +596,7 @@ SPEC CHECKSUMS:
FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e
FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
glog: cee4319f395bad5865ef3f32466c2e0ae677432c
glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3
Keycard: dd96182888da0aacf4de821b641103143bbb26cc
Permission-Camera: afad27bf90337684d4a86f3825112d648c8c4d3b
Permission-Microphone: 0ffabc3fe1c75cfb260525ee3f529383c9f4368c
@ -602,6 +636,7 @@ SPEC CHECKSUMS:
ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b
ReactNativeAudioToolkit: de9610f323e855ac6574be8c99621f3d57c5df06
ReactNativeDarkMode: 0178ffca3b10f6a7c9f49d6f9810232b328fa949
ReactNativeNavigation: 4c4ca87edc0da4ee818158a62cb6188088454e5c
RNCAsyncStorage: d059c3ee71738c39834a627476322a5a8cd5bf36
RNCClipboard: 8148e21ac347c51fd6cd4b683389094c216bb543
RNCMaskedView: 71fc32d971f03b7f03d6ab6b86b730c4ee64f5b6
@ -614,8 +649,7 @@ SPEC CHECKSUMS:
RNLanguages: 962e562af0d34ab1958d89bcfdb64fafc37c513e
RNPermissions: ad71dd4f767ec254f2cd57592fbee02afee75467
RNReactNativeHapticFeedback: 2566b468cc8d0e7bb2f84b23adc0f4614594d071
RNReanimated: 89f5e0a04d1dd52fbf27e7e7030d8f80a646a3fc
RNScreens: b748efec66e095134c7166ca333b628cd7e6f3e2
RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c
RNSVG: 8ba35cbeb385a52fd960fd28db9d7d18b4c2974f
secp256k1: f61d67e6fdcb85fd727acf1bf35ace6036db540c
SQLCipher: f9fcf29b2e59ced7defc2a2bdd0ebe79b40d4990
@ -624,6 +658,6 @@ SPEC CHECKSUMS:
TouchID: ba4c656d849cceabc2e4eef722dea5e55959ecf4
Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6
PODFILE CHECKSUM: 3df5a5ce6c538b5f3727cb3ee1c20bf66d7ac3eb
PODFILE CHECKSUM: 27b3929c4d7f0b5afd76276d0bd4ae289ec11f18
COCOAPODS: 1.10.0

View File

@ -8,6 +8,7 @@
*/
#import "AppDelegate.h"
#import <ReactNativeNavigation/ReactNativeNavigation.h>
#import <asl.h>
#import "ReactNativeConfig.h"
@ -18,7 +19,6 @@
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <UserNotifications/UserNotifications.h>
#import <RNCPushNotificationIOS.h>
@ -77,21 +77,8 @@ static void InitializeFlipper(UIApplication *application) {
dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:@"BLANK_PREVIEW"];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"StatusIm"
initialProperties:nil];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
[ReactNativeNavigation bootstrapWithDelegate:self launchOptions:launchOptions];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
_blankView = [[UIView alloc]initWithFrame:self.window.frame];
_blankView.backgroundColor = [UIColor whiteColor];
_blankView.alpha = 0;
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
[RNSplashScreen show];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
@ -116,6 +103,10 @@ static void InitializeFlipper(UIApplication *application) {
restorationHandler:restorationHandler];
}
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge {
return [ReactNativeNavigation extraModulesForBridge:bridge];
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG

View File

@ -126,7 +126,7 @@
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<true/>
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>A00000080400010101</string>

View File

@ -132,7 +132,7 @@
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<true/>
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>A00000080400010101</string>

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,27 @@
androidx.activity:activity:1.0.0
androidx.activity:activity:1.1.0
androidx.annotation:annotation-experimental:1.0.0
androidx.annotation:annotation:1.0.0
androidx.annotation:annotation:1.1.0
androidx.appcompat:appcompat-resources:1.1.0
androidx.appcompat:appcompat-resources:1.2.0
androidx.appcompat:appcompat:1.0.2
androidx.appcompat:appcompat:1.1.0
androidx.appcompat:appcompat:1.2.0
androidx.arch.core:core-common:2.0.0
androidx.arch.core:core-common:2.1.0
androidx.arch.core:core-runtime:2.0.0
androidx.arch.core:core-runtime:2.1.0
androidx.asynclayoutinflater:asynclayoutinflater:1.0.0
androidx.cardview:cardview:1.0.0
androidx.collection:collection:1.0.0
androidx.collection:collection:1.1.0
androidx.constraintlayout:constraintlayout-solver:2.0.4
androidx.constraintlayout:constraintlayout:2.0.4
androidx.coordinatorlayout:coordinatorlayout:1.0.0
androidx.coordinatorlayout:coordinatorlayout:1.1.0
androidx.core:core-ktx:1.3.2
androidx.core:core:1.0.1
androidx.core:core:1.1.0
androidx.core:core:1.3.2
androidx.cursoradapter:cursoradapter:1.0.0
androidx.customview:customview:1.0.0
androidx.databinding:databinding-common:3.2.1
@ -31,25 +36,21 @@ androidx.exifinterface:exifinterface:1.1.0-beta01
androidx.exifinterface:exifinterface:1.1.0-rc01
androidx.fragment:fragment:1.0.0
androidx.fragment:fragment:1.1.0
androidx.fragment:fragment:1.2.1
androidx.interpolator:interpolator:1.0.0
androidx.legacy:legacy-support-core-ui:1.0.0
androidx.legacy:legacy-support-core-utils:1.0.0
androidx.legacy:legacy-support-v4:1.0.0
androidx.lifecycle:lifecycle-common:2.0.0
androidx.lifecycle:lifecycle-common:2.1.0
androidx.lifecycle:lifecycle-common:2.2.0
androidx.lifecycle:lifecycle-livedata-core:2.0.0
androidx.lifecycle:lifecycle-livedata-core:2.2.0
androidx.lifecycle:lifecycle-livedata:2.0.0
androidx.lifecycle:lifecycle-runtime:2.0.0
androidx.lifecycle:lifecycle-runtime:2.1.0
androidx.lifecycle:lifecycle-runtime:2.2.0
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0
androidx.lifecycle:lifecycle-viewmodel:2.0.0
androidx.lifecycle:lifecycle-viewmodel:2.1.0
androidx.lifecycle:lifecycle-viewmodel:2.2.0
androidx.loader:loader:1.0.0
androidx.localbroadcastmanager:localbroadcastmanager:1.0.0
androidx.media:media:1.0.0
androidx.multidex:multidex:2.0.1
androidx.print:print:1.0.0
androidx.recyclerview:recyclerview:1.0.0
@ -58,7 +59,7 @@ androidx.savedstate:savedstate:1.0.0
androidx.slidingpanelayout:slidingpanelayout:1.0.0
androidx.swiperefreshlayout:swiperefreshlayout:1.0.0
androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02
androidx.transition:transition:1.1.0
androidx.test:monitor:1.3.0-rc03
androidx.transition:transition:1.2.0
androidx.transition:transition:1.2.0-rc01
androidx.vectordrawable:vectordrawable-animated:1.0.0
@ -79,6 +80,7 @@ commons-logging:commons-logging:1.2
com.adobe.xmp:xmpcore:5.1.2
com.afollestad.material-dialogs:commons:0.9.6.0
com.afollestad.material-dialogs:core:0.9.6.0
com.almworks.sqlite4java:sqlite4java:0.282
com.android.databinding:baseLibrary:1.0-rc5
com.android.databinding:baseLibrary:3.0.0
com.android.databinding:baseLibrary:3.0.1
@ -331,9 +333,13 @@ com.facebook.soloader:annotation:0.9.0
com.facebook.soloader:nativeloader:0.9.0
com.facebook.soloader:soloader:0.9.0
com.facebook.yoga:proguard-annotations:1.14.1
com.github.clans:fab:1.6.4
com.github.gundy:semver4j:0.16.4
com.github.status-im.status-keycard-java:android:3.0.4
com.github.status-im.status-keycard-java:lib:3.0.4
com.github.status-im:function:0.0.1
com.github.wix-playground:ahbottomnavigation:3.3.0
com.github.wix-playground:reflow-animator:1.0.6
com.github.yalantis:ucrop:2.2.5-native
com.googlecode.json-simple:json-simple:1.1
com.googlecode.juniversalchardet:juniversalchardet:1.0.3
@ -342,7 +348,8 @@ com.google.android.gms:play-services-base:17.0.0
com.google.android.gms:play-services-iid:17.0.0
com.google.android.gms:play-services-stats:17.0.0
com.google.android.gms:play-services-tasks:17.0.0
com.google.android.material:material:1.1.0
com.google.android.material:material:1.2.0-alpha03
com.google.auto.value:auto-value-annotations:1.6.2
com.google.auto.value:auto-value:1.5.2
com.google.code.findbugs:jsr305:1.3.9
com.google.code.findbugs:jsr305:3.0.2
@ -351,6 +358,7 @@ com.google.code.gson:gson:2.3
com.google.code.gson:gson:2.7
com.google.code.gson:gson:2.8.0
com.google.code.gson:gson:2.8.5
com.google.code.gson:gson:2.8.6
com.google.errorprone:error_prone_annotations:2.0.18
com.google.errorprone:error_prone_annotations:2.1.2
com.google.errorprone:error_prone_annotations:2.2.0
@ -368,9 +376,12 @@ com.google.protobuf:protobuf-java-util:3.4.0
com.google.protobuf:protobuf-java:3.0.0
com.google.protobuf:protobuf-java:3.4.0
com.google.zxing:core:3.3.0
com.ibm.icu:icu4j:53.1
com.intellij:annotations:12.0
com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0
com.parse.bolts:bolts-applinks:1.4.0
com.parse.bolts:bolts-tasks:1.4.0
com.squareup.assertj:assertj-android:1.1.1
com.squareup.okhttp3:okhttp-urlconnection:3.12.12
com.squareup.okhttp3:okhttp:3.12.12
com.squareup.okio:okio:1.15.0
@ -383,12 +394,16 @@ com.tunnelvisionlabs:antlr4-annotations:4.5
com.tunnelvisionlabs:antlr4-runtime:4.5
com.tunnelvisionlabs:antlr4:4.5
de.undercouch:gradle-download-task:3.4.3
de.undercouch:gradle-download-task:4.0.2
it.unimi.dsi:fastutil:7.2.0
javax.annotation:javax.annotation-api:1.3.2
javax.inject:javax.inject:1
javax.xml.bind:jaxb-api:2.2.12-b140109.1041
junit:junit:4.12
me.zhanghai.android.materialprogressbar:library:1.4.2
net.bytebuddy:byte-buddy-agent:1.9.10
net.bytebuddy:byte-buddy-agent:1.10.18
net.bytebuddy:byte-buddy:1.9.10
net.bytebuddy:byte-buddy:1.10.18
net.sf.jopt-simple:jopt-simple:4.9
net.sf.kxml:kxml2:2.3.0
@ -402,6 +417,7 @@ net.sf.proguard:proguard-gradle:5.3.3
net.sf.proguard:proguard-gradle:6.0.3
org.abego.treelayout:org.abego.treelayout.core:1.0.1
org.antlr:ST4:4.0.8
org.antlr:antlr4-runtime:4.5.2-1
org.antlr:antlr4:4.5.3
org.antlr:antlr-runtime:3.5.2
org.antlr:antlr:3.5.2
@ -423,11 +439,13 @@ org.apache.httpcomponents:httpmime:4.1
org.apache.httpcomponents:httpmime:4.5.2
org.apache.httpcomponents:httpmime:4.5.6
org.apiguardian:apiguardian-api:1.1.0
org.assertj:assertj-core:3.8.0
org.bouncycastle:bcpkix-jdk15on:1.48
org.bouncycastle:bcpkix-jdk15on:1.56
org.bouncycastle:bcprov-jdk15on:1.48
org.bouncycastle:bcprov-jdk15on:1.56
org.bouncycastle:bcprov-jdk15on:1.60
org.bouncycastle:bcprov-jdk15on:1.65
org.checkerframework:checker-qual:2.5.2
org.codehaus.groovy:groovy-all:2.4.15
org.codehaus.mojo:animal-sniffer-annotations:1.14
@ -444,36 +462,60 @@ org.jacoco:org.jacoco.core:0.7.4.201502262128
org.jacoco:org.jacoco.report:0.7.4.201502262128
org.jdom:jdom2:2.0.6
org.jetbrains.intellij.deps:trove4j:1.0.20181211
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.3
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8
org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.4.31
org.jetbrains.kotlin:kotlin-android-extensions:1.3.50
org.jetbrains.kotlin:kotlin-android-extensions:1.4.31
org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.3.50
org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.4.31
org.jetbrains.kotlin:kotlin-build-common:1.3.50
org.jetbrains.kotlin:kotlin-build-common:1.4.31
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.50
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.31
org.jetbrains.kotlin:kotlin-compiler-runner:1.3.50
org.jetbrains.kotlin:kotlin-compiler-runner:1.4.31
org.jetbrains.kotlin:kotlin-daemon-client:1.3.50
org.jetbrains.kotlin:kotlin-daemon-client:1.4.31
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.3.50
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.4.31
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.3.50
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.4.31
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.3.50
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.4.31
org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50
org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.4.31
org.jetbrains.kotlin:kotlin-native-utils:1.3.50
org.jetbrains.kotlin:kotlin-reflect:1.1.3-2
org.jetbrains.kotlin:kotlin-reflect:1.2.0
org.jetbrains.kotlin:kotlin-reflect:1.3.20
org.jetbrains.kotlin:kotlin-reflect:1.3.50
org.jetbrains.kotlin:kotlin-reflect:1.4.31
org.jetbrains.kotlin:kotlin-scripting-common:1.3.50
org.jetbrains.kotlin:kotlin-scripting-common:1.4.31
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.3.50
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.4.31
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.3.50
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.4.31
org.jetbrains.kotlin:kotlin-scripting-jvm:1.3.50
org.jetbrains.kotlin:kotlin-scripting-jvm:1.4.31
org.jetbrains.kotlin:kotlin-script-runtime:1.3.50
org.jetbrains.kotlin:kotlin-script-runtime:1.4.31
org.jetbrains.kotlin:kotlin-stdlib-common:1.2.71
org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20
org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50
org.jetbrains.kotlin:kotlin-stdlib-common:1.4.31
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.71
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.20
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.31
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.71
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.20
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.50
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.31
org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.0
org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.0
org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2
@ -481,26 +523,49 @@ org.jetbrains.kotlin:kotlin-stdlib:1.2.0
org.jetbrains.kotlin:kotlin-stdlib:1.2.71
org.jetbrains.kotlin:kotlin-stdlib:1.3.20
org.jetbrains.kotlin:kotlin-stdlib:1.3.50
org.jetbrains.kotlin:kotlin-stdlib:1.4.31
org.jetbrains.kotlin:kotlin-test-common:1.4.31
org.jetbrains.kotlin:kotlin-test:1.4.31
org.jetbrains.kotlin:kotlin-util-io:1.3.50
org.jetbrains.kotlin:kotlin-util-io:1.4.31
org.jetbrains.kotlin:kotlin-util-klib:1.4.31
org.jetbrains.trove4j:trove4j:20160824
org.jetbrains:annotations:13.0
org.junit.jupiter:junit-jupiter-api:5.7.0
org.junit.platform:junit-platform-commons:1.7.0
org.jvnet.staxex:stax-ex:1.7.7
org.mockito:mockito-core:2.28.2
org.mockito:mockito-core:3.6.28
org.objenesis:objenesis:2.6
org.objenesis:objenesis:3.1
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:5.0.3
org.ow2.asm:asm-analysis:5.1
org.ow2.asm:asm-analysis:6.0
org.ow2.asm:asm-analysis:7.2
org.ow2.asm:asm-commons:5.1
org.ow2.asm:asm-commons:6.0
org.ow2.asm:asm-commons:7.2
org.ow2.asm:asm-debug-all:5.0.1
org.ow2.asm:asm-tree:5.0.3
org.ow2.asm:asm-tree:5.1
org.ow2.asm:asm-tree:6.0
org.ow2.asm:asm-tree:7.2
org.ow2.asm:asm-util:5.1
org.ow2.asm:asm-util:6.0
org.ow2.asm:asm-util:7.2
org.ow2.asm:asm:5.0.3
org.ow2.asm:asm:5.1
org.ow2.asm:asm:6.0
org.ow2.asm:asm:7.2
org.robolectric:annotations:4.4
org.robolectric:junit:4.4
org.robolectric:pluginapi:4.4
org.robolectric:plugins-maven-dependency-resolver:4.4
org.robolectric:resources:4.4
org.robolectric:robolectric:4.4
org.robolectric:sandbox:4.4
org.robolectric:shadowapi:4.4
org.robolectric:shadows-framework:4.4
org.robolectric:utils-reflector:4.4
org.robolectric:utils:4.4

View File

@ -1,28 +1,36 @@
https://dl.google.com/dl/android/maven2/androidx/activity/activity/1.0.0/activity-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/activity/activity/1.1.0/activity-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/annotation/annotation/1.0.0/annotation-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/annotation/annotation/1.0.1/annotation-1.0.1.pom
https://dl.google.com/dl/android/maven2/androidx/annotation/annotation/1.0.2/annotation-1.0.2.pom
https://dl.google.com/dl/android/maven2/androidx/annotation/annotation/1.1.0-rc01/annotation-1.1.0-rc01.pom
https://dl.google.com/dl/android/maven2/androidx/annotation/annotation/1.1.0/annotation-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/appcompat/appcompat-resources/1.1.0/appcompat-resources-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/appcompat/appcompat/1.0.0/appcompat-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/appcompat/appcompat/1.0.2/appcompat-1.0.2.pom
https://dl.google.com/dl/android/maven2/androidx/appcompat/appcompat/1.1.0/appcompat-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/arch/core/core-common/2.0.0/core-common-2.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/arch/core/core-common/2.0.1/core-common-2.0.1.pom
https://dl.google.com/dl/android/maven2/androidx/arch/core/core-common/2.1.0/core-common-2.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/arch/core/core-runtime/2.0.0/core-runtime-2.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/asynclayoutinflater/asynclayoutinflater/1.0.0/asynclayoutinflater-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/cardview/cardview/1.0.0/cardview-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/collection/collection/1.0.0/collection-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/collection/collection/1.1.0/collection-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/constraintlayout/constraintlayout-solver/2.0.4/constraintlayout-solver-2.0.4.pom
https://dl.google.com/dl/android/maven2/androidx/constraintlayout/constraintlayout/2.0.4/constraintlayout-2.0.4.pom
https://dl.google.com/dl/android/maven2/androidx/coordinatorlayout/coordinatorlayout/1.0.0/coordinatorlayout-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/core/core-ktx/1.3.2/core-ktx-1.3.2.pom
https://dl.google.com/dl/android/maven2/androidx/core/core/1.0.0/core-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/core/core/1.0.1/core-1.0.1.pom
https://dl.google.com/dl/android/maven2/androidx/core/core/1.1.0-rc01/core-1.1.0-rc01.pom
https://dl.google.com/dl/android/maven2/androidx/core/core/1.1.0/core-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/core/core/1.3.0/core-1.3.0.pom
https://dl.google.com/dl/android/maven2/androidx/core/core/1.3.1/core-1.3.1.pom
https://dl.google.com/dl/android/maven2/androidx/core/core/1.3.2/core-1.3.2.pom
https://dl.google.com/dl/android/maven2/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/customview/customview/1.0.0/customview-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/databinding/databinding-common/3.2.1/databinding-common-3.2.1.pom
@ -37,26 +45,21 @@ https://dl.google.com/dl/android/maven2/androidx/exifinterface/exifinterface/1.1
https://dl.google.com/dl/android/maven2/androidx/exifinterface/exifinterface/1.1.0-rc01/exifinterface-1.1.0-rc01.pom
https://dl.google.com/dl/android/maven2/androidx/fragment/fragment/1.0.0/fragment-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/fragment/fragment/1.1.0/fragment-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/fragment/fragment/1.2.1/fragment-1.2.1.pom
https://dl.google.com/dl/android/maven2/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/legacy/legacy-support-core-ui/1.0.0/legacy-support-core-ui-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/legacy/legacy-support-v4/1.0.0/legacy-support-v4-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-common/2.0.0/lifecycle-common-2.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-common/2.1.0/lifecycle-common-2.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-livedata-core/2.0.0/lifecycle-livedata-core-2.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-livedata/2.0.0/lifecycle-livedata-2.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-runtime/2.0.0/lifecycle-runtime-2.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-runtime/2.1.0/lifecycle-runtime-2.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-viewmodel-savedstate/2.2.0/lifecycle-viewmodel-savedstate-2.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-viewmodel/2.0.0/lifecycle-viewmodel-2.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-viewmodel/2.1.0/lifecycle-viewmodel-2.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/loader/loader/1.0.0/loader-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/media/media/1.0.0/media-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/multidex/multidex/2.0.1/multidex-2.0.1.pom
https://dl.google.com/dl/android/maven2/androidx/print/print/1.0.0/print-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/recyclerview/recyclerview/1.0.0/recyclerview-1.0.0.pom
@ -65,7 +68,8 @@ https://dl.google.com/dl/android/maven2/androidx/savedstate/savedstate/1.0.0/sav
https://dl.google.com/dl/android/maven2/androidx/slidingpanelayout/slidingpanelayout/1.0.0/slidingpanelayout-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/swiperefreshlayout/swiperefreshlayout/1.0.0/swiperefreshlayout-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/swiperefreshlayout/swiperefreshlayout/1.1.0-alpha02/swiperefreshlayout-1.1.0-alpha02.pom
https://dl.google.com/dl/android/maven2/androidx/transition/transition/1.1.0/transition-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/test/monitor/1.3.0-rc03/monitor-1.3.0-rc03.pom
https://dl.google.com/dl/android/maven2/androidx/transition/transition/1.0.0/transition-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/transition/transition/1.2.0-rc01/transition-1.2.0-rc01.pom
https://dl.google.com/dl/android/maven2/androidx/transition/transition/1.2.0/transition-1.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/vectordrawable/vectordrawable-animated/1.0.0/vectordrawable-animated-1.0.0.pom
@ -96,6 +100,7 @@ https://dl.google.com/dl/android/maven2/com/android/support/animated-vector-draw
https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/26.0.2/appcompat-v7-26.0.2.pom
https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/27.0.1/appcompat-v7-27.0.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/recyclerview-v7/27.0.1/recyclerview-v7-27.0.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/22.2.1/support-annotations-22.2.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/26.0.2/support-annotations-26.0.2.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/26.1.0/support-annotations-26.1.0.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/27.0.1/support-annotations-27.0.1.pom
@ -267,7 +272,8 @@ https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-bas
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-iid/17.0.0/play-services-iid-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/material/material/1.1.0/material-1.1.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/material/material/1.0.0/material-1.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/material/material/1.2.0-alpha03/material-1.2.0-alpha03.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/facebook/fbjni/fbjni-java-only/0.0.3/fbjni-java-only-0.0.3.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/facebook/flipper/flipper-fresco-plugin/0.54.0/flipper-fresco-plugin-0.54.0.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/facebook/flipper/flipper/0.54.0/flipper-0.54.0.pom
@ -284,8 +290,9 @@ https://repository.sonatype.org/content/groups/sonatype-public-grid/com/facebook
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/github/status-im/function/0.0.1/function-0.0.1.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/github/status-im/status-keycard-java/android/3.0.4/android-3.0.4.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/github/status-im/status-keycard-java/lib/3.0.4/lib-3.0.4.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/github/wix-playground/ahbottomnavigation/3.3.0/ahbottomnavigation-3.3.0.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/github/wix-playground/reflow-animator/1.0.6/reflow-animator-1.0.6.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/com/github/yalantis/ucrop/2.2.5-native/ucrop-2.2.5-native.pom
https://repository.sonatype.org/content/groups/sonatype-public-grid/org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824.pom
https://repo.maven.apache.org/maven2/antlr/antlr/2.7.7/antlr-2.7.7.pom
https://repo.maven.apache.org/maven2/commons-cli/commons-cli/1.2/commons-cli-1.2.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.4/commons-codec-1.4.pom
@ -299,6 +306,7 @@ https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.2/commons
https://repo.maven.apache.org/maven2/com/adobe/xmp/xmpcore/5.1.2/xmpcore-5.1.2.pom
https://repo.maven.apache.org/maven2/com/afollestad/material-dialogs/commons/0.9.6.0/commons-0.9.6.0.pom
https://repo.maven.apache.org/maven2/com/afollestad/material-dialogs/core/0.9.6.0/core-0.9.6.0.pom
https://repo.maven.apache.org/maven2/com/almworks/sqlite4java/sqlite4java/0.282/sqlite4java-0.282.pom
https://repo.maven.apache.org/maven2/com/android/databinding/baseLibrary/1.0-rc5/baseLibrary-1.0-rc5.pom
https://repo.maven.apache.org/maven2/com/android/databinding/compilerCommon/1.0-rc5/compilerCommon-1.0-rc5.pom
https://repo.maven.apache.org/maven2/com/android/tools/annotations/24.1.3/annotations-24.1.3.pom
@ -384,11 +392,16 @@ https://repo.maven.apache.org/maven2/com/facebook/soloader/soloader/0.6.0/soload
https://repo.maven.apache.org/maven2/com/facebook/soloader/soloader/0.8.2/soloader-0.8.2.pom
https://repo.maven.apache.org/maven2/com/facebook/soloader/soloader/0.9.0/soloader-0.9.0.pom
https://repo.maven.apache.org/maven2/com/facebook/stetho/stetho/1.3.1/stetho-1.3.1.pom
https://repo.maven.apache.org/maven2/com/github/clans/fab/1.6.4/fab-1.6.4.pom
https://repo.maven.apache.org/maven2/com/github/gundy/semver4j/0.16.4/semver4j-0.16.4.pom
https://repo.maven.apache.org/maven2/com/googlecode/json-simple/json-simple/1.1/json-simple-1.1.pom
https://repo.maven.apache.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.pom
https://repo.maven.apache.org/maven2/com/google/auto/auto-parent/3/auto-parent-3.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-parent/1.7.4/auto-value-parent-1.7.4.pom
https://repo.maven.apache.org/maven2/com/google/auto/auto-parent/6/auto-parent-6.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.6.2/auto-value-annotations-1.6.2.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-parent/1.6.2/auto-value-parent-1.6.2.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-parent/1.8.1/auto-value-parent-1.8.1.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value/1.5.2/auto-value-1.5.2.pom
https://repo.maven.apache.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.pom
https://repo.maven.apache.org/maven2/com/google/code/findbugs/jsr305/2.0.1/jsr305-2.0.1.pom
@ -397,21 +410,23 @@ https://repo.maven.apache.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr30
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.7/gson-parent-2.7.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.8.0/gson-parent-2.8.0.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.8.5/gson-parent-2.8.5.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.8.6/gson-parent-2.8.6.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.2.4/gson-2.2.4.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.3/gson-2.3.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.7/gson-2.7.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.0/gson-2.8.0.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.0.18/error_prone_annotations-2.0.18.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.1.2/error_prone_annotations-2.1.2.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.2.0/error_prone_annotations-2.2.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.3.1/error_prone_annotations-2.3.1.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.5.1/error_prone_annotations-2.5.1.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.0.18/error_prone_parent-2.0.18.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.1.2/error_prone_parent-2.1.2.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.2.0/error_prone_parent-2.2.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.3.1/error_prone_parent-2.3.1.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.5.1/error_prone_parent-2.5.1.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.7.1/error_prone_parent-2.7.1.pom
https://repo.maven.apache.org/maven2/com/google/google/1/google-1.pom
https://repo.maven.apache.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/17.0/guava-parent-17.0.pom
@ -420,14 +435,14 @@ https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/23.0/guava-pa
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/26.0-android/guava-parent-26.0-android.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/26.0-jre/guava-parent-26.0-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/27.0.1-jre/guava-parent-27.0.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/30.1-jre/guava-parent-30.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-testlib/30.1-jre/guava-testlib-30.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/30.1.1-jre/guava-parent-30.1.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-testlib/30.1.1-jre/guava-testlib-30.1.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/17.0/guava-17.0.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/22.0/guava-22.0.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/23.0/guava-23.0.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/26.0-jre/guava-26.0-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/27.0.1-jre/guava-27.0.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/30.1-jre/guava-30.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/30.1.1-jre/guava-30.1.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.pom
https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.pom
https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.pom
@ -441,13 +456,16 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.0.0-rc-
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.0.0/protobuf-parent-3.0.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.4.0/protobuf-parent-3.4.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.0.0-rc-2/protobuf-parent-4.0.0-rc-2.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth-parent/1.1.2/truth-parent-1.1.2.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth/1.1.2/truth-1.1.2.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth-parent/1.1.3/truth-parent-1.1.3.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3.pom
https://repo.maven.apache.org/maven2/com/google/zxing/core/3.3.0/core-3.3.0.pom
https://repo.maven.apache.org/maven2/com/google/zxing/zxing-parent/3.3.0/zxing-parent-3.3.0.pom
https://repo.maven.apache.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.pom
https://repo.maven.apache.org/maven2/com/intellij/annotations/12.0/annotations-12.0.pom
https://repo.maven.apache.org/maven2/com/nhaarman/mockitokotlin2/mockito-kotlin/2.2.0/mockito-kotlin-2.2.0.pom
https://repo.maven.apache.org/maven2/com/parse/bolts/bolts-applinks/1.4.0/bolts-applinks-1.4.0.pom
https://repo.maven.apache.org/maven2/com/parse/bolts/bolts-tasks/1.4.0/bolts-tasks-1.4.0.pom
https://repo.maven.apache.org/maven2/com/squareup/assertj/assertj-android/1.1.1/assertj-android-1.1.1.pom
https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.8.0/javapoet-1.8.0.pom
https://repo.maven.apache.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/3.12.12/okhttp-urlconnection-3.12.12.pom
@ -459,22 +477,22 @@ https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.12.12/parent-
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-parent/1.15.0/okio-parent-1.15.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/1.15.0/okio-1.15.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/2.9.0/okio-2.9.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/3.0.0-alpha.1/okio-3.0.0-alpha.1.pom
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/3.0.0-alpha.6/okio-3.0.0-alpha.6.pom
https://repo.maven.apache.org/maven2/com/sun/activation/all/1.2.0/all-1.2.0.pom
https://repo.maven.apache.org/maven2/com/sun/activation/all/2.0.0/all-2.0.0.pom
https://repo.maven.apache.org/maven2/com/sun/activation/jakarta.activation/2.0.0/jakarta.activation-2.0.0.pom
https://repo.maven.apache.org/maven2/com/sun/activation/all/2.0.1/all-2.0.1.pom
https://repo.maven.apache.org/maven2/com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1.pom
https://repo.maven.apache.org/maven2/com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.pom
https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons-runtime/2.21/istack-commons-runtime-2.21.pom
https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons-runtime/4.0.0/istack-commons-runtime-4.0.0.pom
https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons-runtime/4.0.1/istack-commons-runtime-4.0.1.pom
https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons/2.21/istack-commons-2.21.pom
https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons/4.0.0/istack-commons-4.0.0.pom
https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons/4.0.1/istack-commons-4.0.1.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/jaxb-bom-ext/2.2.11/jaxb-bom-ext-2.2.11.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/jaxb-bom-ext/3.0.0/jaxb-bom-ext-3.0.0.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/jaxb-bom-ext/3.0.2-b01/jaxb-bom-ext-3.0.2-b01.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-parent/2.2.11/jaxb-parent-2.2.11.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-parent/3.0.0/jaxb-parent-3.0.0.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-parent/3.0.2-b01/jaxb-parent-3.0.2-b01.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-runtime-parent/2.2.11/jaxb-runtime-parent-2.2.11.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-txw-parent/2.2.11/jaxb-txw-parent-2.2.11.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-txw-parent/3.0.0/jaxb-txw-parent-3.0.0.pom
https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-txw-parent/3.0.2-b01/jaxb-txw-parent-3.0.2-b01.pom
https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/FastInfoset/1.2.13/FastInfoset-1.2.13.pom
https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/FastInfoset/2.0.0/FastInfoset-2.0.0.pom
https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/fastinfoset-project/1.2.13/fastinfoset-project-1.2.13.pom
@ -487,11 +505,13 @@ https://repo.maven.apache.org/maven2/com/tunnelvisionlabs/antlr4-runtime/4.5/ant
https://repo.maven.apache.org/maven2/com/tunnelvisionlabs/antlr4-runtime/4.9.0/antlr4-runtime-4.9.0.pom
https://repo.maven.apache.org/maven2/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.pom
https://repo.maven.apache.org/maven2/de/undercouch/gradle-download-task/3.4.3/gradle-download-task-3.4.3.pom
https://repo.maven.apache.org/maven2/de/undercouch/gradle-download-task/4.0.2/gradle-download-task-4.0.2.pom
https://repo.maven.apache.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.pom
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api-parent/3.0.0/jakarta.xml.bind-api-parent-3.0.0.pom
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/3.0.0/jakarta.xml.bind-api-3.0.0.pom
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api-parent/3.0.1/jakarta.xml.bind-api-parent-3.0.1.pom
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/3.0.1/jakarta.xml.bind-api-3.0.1.pom
https://repo.maven.apache.org/maven2/javax/activation/activation/1.1/activation-1.1.pom
https://repo.maven.apache.org/maven2/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.pom
https://repo.maven.apache.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.pom
https://repo.maven.apache.org/maven2/javax/inject/javax.inject/1/javax.inject-1.pom
https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api-parent/2.4.0-b180830.0359/jaxb-api-parent-2.4.0-b180830.0359.pom
https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api/2.2.12-b140109.1041/jaxb-api-2.2.12-b140109.1041.pom
@ -500,8 +520,14 @@ https://repo.maven.apache.org/maven2/javax/xml/stream/stax-api/1.0-2/stax-api-1.
https://repo.maven.apache.org/maven2/junit/junit/4.12/junit-4.12.pom
https://repo.maven.apache.org/maven2/junit/junit/4.13.2/junit-4.13.2.pom
https://repo.maven.apache.org/maven2/me/zhanghai/android/materialprogressbar/library/1.4.2/library-1.4.2.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.9.0/byte-buddy-agent-1.9.0.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.9.10/byte-buddy-agent-1.9.10.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.18/byte-buddy-agent-1.10.18.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.9.0/byte-buddy-parent-1.9.0.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.9.10/byte-buddy-parent-1.9.10.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.10.18/byte-buddy-parent-1.10.18.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.9.0/byte-buddy-1.9.0.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.9.10/byte-buddy-1.9.10.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.10.18/byte-buddy-1.10.18.pom
https://repo.maven.apache.org/maven2/net/java/jvnet-parent/1/jvnet-parent-1.pom
https://repo.maven.apache.org/maven2/net/java/jvnet-parent/3/jvnet-parent-3.pom
@ -526,7 +552,11 @@ https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-parent/6.3.0beta1/
https://repo.maven.apache.org/maven2/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.pom
https://repo.maven.apache.org/maven2/org/antlr/ST4/4.0.8/ST4-4.0.8.pom
https://repo.maven.apache.org/maven2/org/antlr/ST4/4.3.1/ST4-4.3.1.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.5.2-1/antlr4-master-4.5.2-1.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.5.3/antlr4-master-4.5.3.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.9.2/antlr4-master-4.9.2.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4-runtime/4.5.2-1/antlr4-runtime-4.5.2-1.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4-runtime/4.9.2/antlr4-runtime-4.9.2.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr-master/3.5.2/antlr-master-3.5.2.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.pom
@ -588,13 +618,18 @@ https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpmime/4.5.6/ht
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/project/4.1.1/project-4.1.1.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/project/7/project-7.pom
https://repo.maven.apache.org/maven2/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.pom
https://repo.maven.apache.org/maven2/org/assertj/assertj-core/1.7.1/assertj-core-1.7.1.pom
https://repo.maven.apache.org/maven2/org/assertj/assertj-core/3.8.0/assertj-core-3.8.0.pom
https://repo.maven.apache.org/maven2/org/assertj/assertj-parent-pom/1.2.6/assertj-parent-pom-1.2.6.pom
https://repo.maven.apache.org/maven2/org/assertj/assertj-parent-pom/2.1.6/assertj-parent-pom-2.1.6.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-jdk15on-1.56.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-jdk15on-1.56.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.60/bcprov-jdk15on-1.60.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/2.5.2/checker-qual-2.5.2.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.11.0/checker-qual-3.11.0.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.14.0/checker-qual-3.14.0.pom
https://repo.maven.apache.org/maven2/org/codehaus/codehaus-parent/4/codehaus-parent-4.pom
https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-all/2.4.15/groovy-all-2.4.15.pom
https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.pom
@ -609,68 +644,97 @@ https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/61/mojo-paren
https://repo.maven.apache.org/maven2/org/conscrypt/conscrypt-android/2.0.0/conscrypt-android-2.0.0.pom
https://repo.maven.apache.org/maven2/org/easymock/easymockclassextension/3.2/easymockclassextension-3.2.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock-parent/3.2/easymock-parent-3.2.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock-parent/4.2/easymock-parent-4.2.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock/4.2/easymock-4.2.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock-parent/4.3/easymock-parent-4.3.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock/4.3/easymock-4.3.pom
https://repo.maven.apache.org/maven2/org/eclipse/ee4j/project/1.0.6/project-1.0.6.pom
https://repo.maven.apache.org/maven2/org/eclipse/ee4j/project/1.0.7/project-1.0.7.pom
https://repo.maven.apache.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.pom
https://repo.maven.apache.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.4/ecj-4.4.pom
https://repo.maven.apache.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-bom/2.2.11/jaxb-bom-2.2.11.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-bom/3.0.0/jaxb-bom-3.0.0.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-bom/3.0.2-b01/jaxb-bom-3.0.2-b01.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-core/2.2.11/jaxb-core-2.2.11.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-core/3.0.0/jaxb-core-3.0.0.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-core/3.0.2-b01/jaxb-core-3.0.2-b01.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-runtime/2.2.11/jaxb-runtime-2.2.11.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.2.11.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/3.0.0/txw2-3.0.0.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/3.0.2-b01/txw2-3.0.2-b01.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/2.2/hamcrest-core-2.2.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-parent/1.3/hamcrest-parent-1.3.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest/2.2/hamcrest-2.2.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.build/0.7.4.201502262128/org.jacoco.build-0.7.4.201502262128.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.build/0.8.6/org.jacoco.build-0.8.6.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.build/0.8.7/org.jacoco.build-0.8.7.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.core/0.8.6/org.jacoco.core-0.8.6.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.core/0.8.7/org.jacoco.core-0.8.7.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.report/0.7.4.201502262128/org.jacoco.report-0.7.4.201502262128.pom
https://repo.maven.apache.org/maven2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.pom
https://repo.maven.apache.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.3/kotlinx-coroutines-android-1.4.3.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.1/kotlinx-coroutines-core-common-1.1.1.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.1/kotlinx-coroutines-core-1.1.1.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.3.8/kotlinx-coroutines-core-1.3.8.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-android-extensions-runtime/1.4.31/kotlin-android-extensions-runtime-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-android-extensions/1.3.50/kotlin-android-extensions-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-android-extensions/1.4.31/kotlin-android-extensions-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-annotation-processing-gradle/1.3.50/kotlin-annotation-processing-gradle-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-annotation-processing-gradle/1.4.31/kotlin-annotation-processing-gradle-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-build-common/1.3.50/kotlin-build-common-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-build-common/1.4.31/kotlin-build-common-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.3.50/kotlin-compiler-embeddable-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.4.31/kotlin-compiler-embeddable-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-compiler-runner/1.3.50/kotlin-compiler-runner-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-compiler-runner/1.4.31/kotlin-compiler-runner-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-daemon-client/1.3.50/kotlin-daemon-client-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-daemon-client/1.4.31/kotlin-daemon-client-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.3.50/kotlin-daemon-embeddable-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.4.31/kotlin-daemon-embeddable-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin-api/1.3.50/kotlin-gradle-plugin-api-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin-api/1.4.31/kotlin-gradle-plugin-api-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin-model/1.3.50/kotlin-gradle-plugin-model-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin-model/1.4.31/kotlin-gradle-plugin-model-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.3.50/kotlin-gradle-plugin-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.4.31/kotlin-gradle-plugin-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-klib-commonizer-embeddable/1.4.31/kotlin-klib-commonizer-embeddable-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-native-utils/1.3.50/kotlin-native-utils-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.1.3-2/kotlin-reflect-1.1.3-2.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.2.0/kotlin-reflect-1.2.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.20/kotlin-reflect-1.3.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.3.50/kotlin-reflect-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.4.31/kotlin-reflect-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.3.50/kotlin-scripting-common-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.4.31/kotlin-scripting-common-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-compiler-embeddable/1.3.50/kotlin-scripting-compiler-embeddable-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-compiler-embeddable/1.4.31/kotlin-scripting-compiler-embeddable-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-compiler-impl-embeddable/1.3.50/kotlin-scripting-compiler-impl-embeddable-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-compiler-impl-embeddable/1.4.31/kotlin-scripting-compiler-impl-embeddable-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-jvm/1.3.50/kotlin-scripting-jvm-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-jvm/1.4.31/kotlin-scripting-jvm-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.3.50/kotlin-script-runtime-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.4.31/kotlin-script-runtime-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.2.71/kotlin-stdlib-common-1.2.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.0/kotlin-stdlib-common-1.3.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.31/kotlin-stdlib-common-1.3.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.50/kotlin-stdlib-common-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.71/kotlin-stdlib-common-1.3.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.10/kotlin-stdlib-common-1.4.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.20/kotlin-stdlib-common-1.4.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.21/kotlin-stdlib-common-1.4.21.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.30/kotlin-stdlib-common-1.4.30.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.31/kotlin-stdlib-common-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.2.71/kotlin-stdlib-jdk7-1.2.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.50/kotlin-stdlib-jdk7-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.20/kotlin-stdlib-jdk7-1.4.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.31/kotlin-stdlib-jdk7-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.2.71/kotlin-stdlib-jdk8-1.2.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.50/kotlin-stdlib-jdk8-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.20/kotlin-stdlib-jdk8-1.4.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.31/kotlin-stdlib-jdk8-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre7/1.2.0/kotlin-stdlib-jre7-1.2.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre8/1.2.0/kotlin-stdlib-jre8-1.2.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.3-2/kotlin-stdlib-1.1.3-2.pom
@ -681,25 +745,41 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.0/ko
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.31/kotlin-stdlib-1.3.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.50/kotlin-stdlib-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.71/kotlin-stdlib-1.3.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.4.10/kotlin-stdlib-1.4.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.4.20/kotlin-stdlib-1.4.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.4.21/kotlin-stdlib-1.4.21.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.4.30/kotlin-stdlib-1.4.30.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.4.31/kotlin-stdlib-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.4.31/kotlin-test-common-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-test/1.4.31/kotlin-test-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-util-io/1.3.50/kotlin-util-io-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-util-io/1.4.31/kotlin-util-io-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-util-klib/1.4.31/kotlin-util-klib-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.7.0/junit-bom-5.7.0.pom
https://repo.maven.apache.org/maven2/org/junit/jupiter/junit-jupiter-api/5.7.0/junit-jupiter-api-5.7.0.pom
https://repo.maven.apache.org/maven2/org/junit/platform/junit-platform-commons/1.7.0/junit-platform-commons-1.7.0.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/2.0.0/stax-ex-2.0.0.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/2.0.1/stax-ex-2.0.1.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/2.23.0/mockito-core-2.23.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/2.28.2/mockito-core-2.28.2.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/3.6.28/mockito-core-3.6.28.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/2.6/objenesis-parent-2.6.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/3.1/objenesis-parent-3.1.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/3.2/objenesis-parent-3.2.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis/3.1/objenesis-3.1.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2.pom
https://repo.maven.apache.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/6.0/asm-analysis-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/9.1/asm-analysis-9.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/6.0/asm-commons-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/9.1/asm-commons-9.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-debug-all/6.0_BETA/asm-debug-all-6.0_BETA.pom
@ -711,18 +791,33 @@ https://repo.maven.apache.org/maven2/org/ow2/asm/asm-parent/6.0_BETA/asm-parent-
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/6.0/asm-tree-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/9.1/asm-tree-9.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/6.0/asm-util-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/5.0.3/asm-5.0.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/6.0/asm-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/7.2/asm-7.2.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.1/asm-9.1.pom
https://repo.maven.apache.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
https://repo.maven.apache.org/maven2/org/ow2/ow2/1.5/ow2-1.5.pom
https://repo.maven.apache.org/maven2/org/robolectric/annotations/4.4/annotations-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/junit/4.4/junit-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/pluginapi/4.4/pluginapi-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.4/plugins-maven-dependency-resolver-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/resources/4.4/resources-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/robolectric/4.4/robolectric-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/sandbox/4.4/sandbox-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/shadowapi/4.4/shadowapi-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/shadows-framework/4.4/shadows-framework-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/utils-reflector/4.4/utils-reflector-4.4.pom
https://repo.maven.apache.org/maven2/org/robolectric/utils/4.4/utils-4.4.pom
https://repo.maven.apache.org/maven2/org/slf4j/jcl-over-slf4j/2.0.0-alpha1/jcl-over-slf4j-2.0.0-alpha1.pom
https://repo.maven.apache.org/maven2/org/slf4j/slf4j-api/2.0.0-alpha1/slf4j-api-2.0.0-alpha1.pom
https://repo.maven.apache.org/maven2/org/slf4j/slf4j-jdk14/2.0.0-alpha1/slf4j-jdk14-2.0.0-alpha1.pom
https://repo.maven.apache.org/maven2/org/slf4j/slf4j-parent/2.0.0-alpha1/slf4j-parent-2.0.0-alpha1.pom
https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/4/oss-parent-4.pom
https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/7/oss-parent-7.pom
https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/9/oss-parent-9.pom

View File

@ -21,12 +21,11 @@ react-native-keychain
react-native-languages
react-native-linear-gradient
react-native-mail
react-native-navigation-bar-color
react-native-navigation
react-native-nfc-manager
react-native-permissions
react-native-reanimated
react-native-safe-area-context
react-native-screens
react-native-shake
react-native-splash-screen
react-native-status

View File

@ -20,9 +20,6 @@
"@react-native-community/netinfo": "^4.4.0",
"@react-native-community/push-notification-ios": "^1.4.1",
"@react-native-community/slider": "^3.0.0",
"@react-navigation/bottom-tabs": "^5.8.0",
"@react-navigation/native": "^5.7.3",
"@react-navigation/stack": "^5.9.0",
"bignumber.js": "git+https://github.com/status-im/bignumber.js.git#v4.0.2-status",
"buffer": "^5.4.2",
"chance": "^1.1.0",
@ -53,12 +50,11 @@
"react-native-languages": "^3.0.2",
"react-native-linear-gradient": "^2.5.6",
"react-native-mail": "git+https://github.com/status-im/react-native-mail.git#v4.0.0-status",
"react-native-navigation-bar-color": "^2.0.1",
"react-native-navigation": "^7.13.0",
"react-native-permissions": "^2.1.5",
"react-native-reanimated": "^1.13.0",
"react-native-redash": "^14.2.2",
"react-native-reanimated": "^2.1.0",
"react-native-redash": "^16.0.11",
"react-native-safe-area-context": "^2.0.0",
"react-native-screens": "^2.10.1",
"react-native-shake": "^3.3.1",
"react-native-splash-screen": "^3.2.0",
"react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#v2.5.35",

View File

@ -24,6 +24,7 @@
:View {}
:RefreshControl {}
:FlatList {}
:SectionList {}
:Text {}
:StatusBar {}
:ScrollView {}
@ -100,7 +101,6 @@
:SafeAreaInsetsContext {:Consumer (fn [])}
:SafeAreaView {}}))
(def react-native-dark-mode #js {"eventEmitter" {} "initialMode" {}})
(def react-native-navigation-bar-color #js {"changeNavigationBarColor" #()})
(def back-handler #js {:addEventListener identity
:removeEventListener identity})
@ -113,6 +113,10 @@
:useFocusEffect identity
:CommonActions #js {}
:StackActions #js {}})
(def react-native-navigation #js {:Navigation #js {:constants (fn [] #js {:then identity})
:events identity}})
(def react-navigation-stack #js {:createStackNavigator identity
:TransitionPresets #js {:ModalPresentationIOS #js {}}})
(def react-navigation-bottom-tabs #js {:createBottomTabNavigator identity})
@ -147,7 +151,7 @@
:event nil
:cond nil
:block nil
:interpolate nil
:interpolateNode nil
:call nil
:timing nil
:onChange nil
@ -156,7 +160,7 @@
:Text #js {}
:Extrapolate #js {:CLAMP nil}
:Code #js {}}
:Easing #js {:bezier identity
:EasingNode #js {:bezier identity
:linear identity}
:clockRunning nil})
(def react-native-gesture-handler #js {:default #js {}
@ -188,6 +192,9 @@
(def react-native-device-info
#js {:getInstallReferrer identity})
(def react-native-camera-kit
#js {:CameraKitCamera #js {}})
(def react-native-push-notification
#js {:localNotification identity
:requestPermission identity})
@ -206,12 +213,11 @@
"react-native-safe-area-context" safe-area-context
"react-native-config" config
"react-native-dark-mode" react-native-dark-mode
"react-native-navigation-bar-color" react-native-navigation-bar-color
"react-native-iphone-x-helper" (clj->js {:getStatusBarHeight (fn [])
:getBottomSpace (fn [])})
"react-native-screens" (clj->js {})
"react-native-reanimated" react-native-reanimated
"react-native-redash" react-native-redash
"react-native-redash/lib/module/v1" react-native-redash
"react-native-fetch-polyfill" fetch
"react-native-status-keycard" status-keycard
"react-native-keychain" keychain
@ -226,7 +232,9 @@
"react-native-device-info" react-native-device-info
"react-native-push-notification" react-native-push-notification
"react-native-linear-gradient" react-native-gradien
"react-native-navigation" react-native-navigation
"@react-native-community/push-notification-ios" push-notification-ios
"react-native-camera-kit" react-native-camera-kit
"./fleets.js" default-fleets
"./chats.js" default-chats
"../translations/ar.json" (js/JSON.parse (slurp "./translations/ar.json"))

View File

@ -4,8 +4,8 @@
[quo.react-native :as rn]
[quo.gesture-handler :as gh]
[oops.core :refer [oget ocall]]
["react-native-reanimated" :default animated :refer (clockRunning Easing)]
["react-native-redash" :as redash]
["react-native-reanimated" :default animated :refer (clockRunning EasingNode)]
["react-native-redash/lib/module/v1" :as redash]
quo.react)
(:require-macros [quo.react :refer [maybe-js-deps]]))
@ -55,8 +55,8 @@
(def start-clock (oget animated "startClock"))
(def stop-clock (oget animated "stopClock"))
(def clock-running clockRunning)
(def bezier (.-bezier ^js Easing))
(def linear (.-linear ^js Easing))
(def bezier (.-bezier ^js EasingNode))
(def linear (.-linear ^js EasingNode))
(def easings {:linear linear
:ease-in (bezier 0.42 0 1 1)
@ -128,7 +128,7 @@
(.block ^js animated (to-array opts)))
(defn interpolate [anim-value config]
(.interpolate ^js animated anim-value (clj->js config)))
(.interpolateNode ^js animated anim-value (clj->js config)))
(defn call* [args callback]
(.call ^js animated (to-array args) callback))

View File

@ -21,8 +21,7 @@
:left 0
:top 0
:right 0
:bottom 0
:background-color (:backdrop @colors/theme)})
:bottom 0})
(defn content-container
[window-height]

View File

@ -7,7 +7,8 @@
[cljs-bean.core :as bean]
[quo.components.safe-area :as safe-area]
[quo.components.bottom-sheet.style :as styles]
[quo.gesture-handler :as gesture-handler]))
[quo.gesture-handler :as gesture-handler]
[quo.design-system.colors :as colors]))
(def opacity-coeff 0.8)
(def close-duration 150)
@ -183,7 +184,6 @@
(reagent/as-element
[modal {:visible @visible
:transparent true
:status-bar-translucent true
:presentation-style :overFullScreen
:hardware-accelerated true
:on-request-close (fn []
@ -195,7 +195,9 @@
[gesture-handler/tap-gesture-handler (merge {:enabled backdrop-dismiss?}
tap-gesture-handler)
[animated/view {:style (merge (styles/backdrop)
{:opacity opacity})}]]
(when platform/ios?
{:opacity opacity
:background-color (:backdrop @colors/theme)}))}]]
[animated/view {:style (merge (styles/content-container window-height)
{:transform [{:translateY translate-y}
{:translateY (* window-height 2)}]})}

View File

@ -68,7 +68,6 @@
optional-haptic (fn []
(when haptic-feedback
(haptic/trigger haptic-type)))]
[animation/pressable (merge {:bg-color background-color
:border-radius border-radius
:type type

View File

@ -9,11 +9,10 @@
[quo.previews.controls :as controls]
[quo.react-native :as rn]
[quo.core :as quo]
[reagent.core :as reagent]
[quo.design-system.colors :as colors]
[quo.theme :as theme]
[status-im.ui.screens.routing.core :as navigation]
[quo.previews.icons :as icons]))
[quo.previews.icons :as icons]
[re-frame.core :as re-frame]))
(def screens [{:name :texts
:insets {:top false}
@ -75,39 +74,10 @@
[rn/view
(for [{:keys [name]} screens]
^{:key name}
[rn/touchable-opacity {:on-press #(navigation/navigate-to name nil)}
[rn/touchable-opacity {:on-press #(re-frame/dispatch [:navigate-to name])}
[rn/view {:style {:padding-vertical 8}}
[quo/text (str "Preview " name)]]])]])
(defonce navigation-state (atom nil))
(defn- persist-state! [state-obj]
(js/Promise.
(fn [resolve _]
(reset! navigation-state state-obj)
(resolve true))))
(defn preview-stack []
(let [stack (navigation/create-stack)]
[stack {}
(into [{:name :main
:insets {:top false}
:component main-screen}]
screens)]))
(defn preview-screens []
[navigation/navigation-container
{:ref navigation/set-navigator-ref
:initial-state @navigation-state
:on-state-change persist-state!}
[preview-stack]])
;; TODO(Ferossgp): Add separate build when shadow-cljs will be integrated
;; NOTE(Ferossgp): Separate app can be used to preview all available
;; and possible state for components, and for UI testing based on screenshots
(defn init []
(.registerComponent ^js rn/app-registry "StatusIm" #(reagent/reactify-component preview-screens)))
(def main-screens [{:name :quo-preview
:insets {:top false}
:component main-screen}])

View File

@ -3,7 +3,8 @@
[cljs-bean.core :as bean]
[quo.platform :as platform]
["react-native" :as rn]
["@react-native-community/hooks" :as hooks]))
["@react-native-community/hooks" :as hooks]
["react-native-navigation" :refer (Navigation)]))
(def app-registry (.-AppRegistry rn))
@ -28,13 +29,22 @@
(def keyboard-avoiding-view-class (reagent/adapt-react-class (.-KeyboardAvoidingView ^js rn)))
(def navigation-const (atom nil))
(.then (.constants Navigation)
(fn [^js consts]
(reset! navigation-const {:top-bar-height (.-topBarHeight consts)
:bottom-tabs-height (.-bottomTabsHeight consts)
:status-bar-height (.-statusBarHeight consts)})))
(defn keyboard-avoiding-view []
(let [this (reagent/current-component)
props (reagent/props this)]
(into [keyboard-avoiding-view-class
(merge (when platform/ios?
{:behavior :padding})
props)]
props
{:keyboardVerticalOffset (+ 44 (:status-bar-height @navigation-const))})]
(reagent/children this))))
(def keyboard (.-Keyboard ^js rn))

View File

@ -33,8 +33,7 @@
[cofx referrer chat-name]
(fx/merge cofx
{::persistence/chat-initalized! true}
(navigation/navigate-to :tabs {:screen :chat-stack
:params {:screen :referral-enclav}})))
(navigation/navigate-to-cofx :referral-enclav nil)))
(fx/defn join-public-chat
[cofx chat-name]

View File

@ -87,7 +87,7 @@
(i18n/label :t/use-valid-contact-code)
:yourself
(i18n/label :t/can-not-add-yourself))
:on-dismiss #(re-frame/dispatch [:navigate-to :home])}})))
:on-dismiss #(re-frame/dispatch [:pop-to-root-tab :chat-stack])}})))
(fx/defn qr-code-scanned
{:events [:contact/qr-code-scanned]}

View File

@ -3,7 +3,8 @@
(fx/defn show-bottom-sheet
[{:keys [db]} {:keys [view options]}]
{:db (assoc db
{:rnn-show-bottom-sheet nil
:db (assoc db
:bottom-sheet/show? true
:bottom-sheet/view view
:bottom-sheet/options options)})
@ -19,4 +20,5 @@
(fx/defn hide-bottom-sheet
{:events [:bottom-sheet/hide]}
[{:keys [db]}]
{:db (assoc db :bottom-sheet/show? false)})
{:rnn-hide-bottom-sheet nil
:db (assoc db :bottom-sheet/show? false)})

View File

@ -321,8 +321,8 @@
(fx/merge cofx
{:db (assoc db :browser/options
{:browser-id (:browser-id browser)})}
(navigation/navigate-to-cofx :browser-stack {:screen :browser
:initial false})
(navigation/change-tab :browser)
(navigation/set-stack-root :browser-stack :browser)
(update-browser browser)
(resolve-url nil)))))
@ -335,7 +335,7 @@
{:db (assoc db :browser/options
{:browser-id browser-id})}
(update-browser browser)
(navigation/navigate-to-cofx :browser nil)
(navigation/set-stack-root :browser-stack :browser)
(resolve-url nil))))
(fx/defn web3-error-callback
@ -555,7 +555,7 @@
{:events [:browser.ui/open-empty-tab]}
[cofx]
(debounce/clear :browser/navigation-state-changed)
(navigation/navigate-to-cofx cofx :empty-tab nil))
(navigation/set-stack-root cofx :browser-stack :empty-tab))
(fx/defn url-input-pressed
{:events [:browser.ui/url-input-pressed]}

View File

@ -182,12 +182,15 @@
(fx/defn close-chat
{:events [:close-chat]}
[{:keys [db] :as cofx}]
[{:keys [db] :as cofx} target-chat-id]
(let [chat-id (:current-chat-id db)]
(chat.state/reset-visible-item)
(fx/merge cofx
{:db (dissoc db :current-chat-id)}
(offload-messages chat-id))))
(if (:ignore-close-chat db)
{:db (dissoc db :ignore-close-chat)}
(when (= target-chat-id chat-id)
(chat.state/reset-visible-item)
(fx/merge cofx
{:db (dissoc db :current-chat-id)}
(offload-messages chat-id))))))
(fx/defn remove-chat
"Removes chat completely from app, producing all necessary effects for that"
@ -197,7 +200,7 @@
(deactivate-chat chat-id)
(offload-messages chat-id)
(when (not (= (:view-id db) :home))
(navigation/navigate-to-cofx :home {}))))
(navigation/pop-to-root-tab :chat-stack))))
(fx/defn preload-chat-data
"Takes chat-id and coeffects map, returns effects necessary when navigating to chat"
@ -210,11 +213,11 @@
{:events [:chat.ui/navigate-to-chat]}
[{db :db :as cofx} chat-id]
(fx/merge cofx
(close-chat)
(close-chat (:current-chat-id db))
(fn [{:keys [db]}]
{:db (assoc db :current-chat-id chat-id)})
{:db (assoc db :current-chat-id chat-id :ignore-close-chat true)})
(preload-chat-data chat-id)
(navigation/navigate-to-cofx :chat-stack {:screen :chat})))
(navigation/navigate-to-cofx :chat nil)))
(fx/defn handle-clear-history-response
{:events [::history-cleared]}
@ -287,7 +290,7 @@
{:db (assoc-in db [:chats chat-id] chat)}))
#(when navigate-to?
{:dispatch-n [[:chat.ui/preload-chat-data chat-id]
[:navigate-to :profile nil]]})))
[:open-modal :profile]]})))
(fx/defn start-profile-chat
"Starts a new profile chat"
@ -335,8 +338,7 @@
{:events [:chat.ui/show-profile]}
[{:keys [db] :as cofx} identity]
(let [my-public-key (get-in db [:multiaccount :public-key])]
(if (= my-public-key identity)
(navigation/navigate-to-cofx cofx :profile-stack {:screen :my-profile})
(when (not= my-public-key identity)
(fx/merge
cofx
{:db (assoc db :contacts/identity identity)}

View File

@ -10,7 +10,8 @@
{:db (assoc db
:commands/select-account
{:message message
:from (ethereum/get-default-account (:multiaccount/accounts db))})})
:from (ethereum/get-default-account (:multiaccount/accounts db))})
:rnn-show-select-acc-sheet nil})
(fx/defn set-selected-account
{:events [::set-selected-account]}
@ -20,7 +21,7 @@
(fx/defn handle-accept-request-address-for-transaction
{:events [::accept-request-address-for-transaction]}
[{:keys [db] :as cofx} message-id address]
[{:keys [db]} message-id address]
{:db (dissoc db :commands/select-account)
::json-rpc/call [{:method (json-rpc/call-ext-method "acceptRequestAddressForTransaction")
:params [message-id address]
@ -29,7 +30,7 @@
(fx/defn handle-decline-request-address-for-transaction
{:events [::decline-request-address-for-transaction]}
[cofx message-id]
[_ message-id]
{::json-rpc/call [{:method (json-rpc/call-ext-method "declineRequestAddressForTransaction")
:params [message-id]
:js-response true

View File

@ -86,7 +86,7 @@
[cofx response-js]
(fx/merge cofx
(handle-response cofx response-js)
(navigation/navigate-to-cofx :home {})))
(navigation/pop-to-root-tab :chat-stack)))
(fx/defn joined
{:events [::joined ::requested-to-join]}
@ -305,7 +305,7 @@
(fx/merge cofx
(reset-community-id-input id)
(bottom-sheet/hide-bottom-sheet)
(navigation/navigate-to :invite-people-community {:invite? true})))
(navigation/open-modal :invite-people-community {:invite? true})))
(fx/defn share-community-pressed
{:events [::share-community-pressed]}
@ -313,7 +313,7 @@
(fx/merge cofx
(reset-community-id-input id)
(bottom-sheet/hide-bottom-sheet)
(navigation/navigate-to :invite-people-community {})))
(navigation/open-modal :invite-people-community {})))
(fx/defn create-channel-pressed
{:events [::create-channel-pressed]}
@ -367,7 +367,7 @@
:membership access
:color color
:editing? true})}
(navigation/navigate-to :communities {:screen :community-edit}))))
(navigation/navigate-to :community-edit :nil))))
(fx/defn community-imported
{:events [::community-imported]}

View File

@ -58,7 +58,7 @@
(re-frame/dispatch [:hide-popover])))
;; reset navigation to avoid going back to non existing one to one chat
(if from-one-to-one-chat?
(navigation/navigate-to-cofx :home {})
(navigation/pop-to-root-tab :chat-stack)
(navigation/navigate-back)))))
(fx/defn unblock-contact

View File

@ -9,7 +9,9 @@
{:events [:contact.ui/send-message-pressed]
:interceptors [(re-frame/inject-cofx :random-id-generator)]}
[cofx {:keys [public-key]}]
(chat/start-chat cofx public-key))
(fx/merge cofx
(navigation/pop-to-root-tab :chat-stack)
(chat/start-chat public-key)))
(fx/defn contact-code-submitted
{:events [:contact.ui/contact-code-submitted]

View File

@ -122,7 +122,7 @@
{:db (assoc db
:group/selected-contacts #{}
:new-chat-name "")}
(navigation/navigate-to-cofx :create-group-chat nil)))
(navigation/navigate-to-cofx :contact-toggle-list nil)))
(fx/defn name-verified
{:events [:contacts/ens-name-verified]}

View File

@ -2,10 +2,9 @@
(:require status-im.utils.db
status-im.events
status-im.subs
[status-im.ui.screens.views :as views]
status-im.navigation.core
[re-frame.core :as re-frame]
[re-frame.interop :as interop]
[reagent.core :as reagent]
[reagent.impl.batching :as batching]
[status-im.notifications.local :as notifications]
[status-im.native-module.core :as status]
@ -14,8 +13,12 @@
[status-im.utils.platform :as platform]
[status-im.utils.snoopy :as snoopy]
[status-im.utils.config :as config]
["react-native-screens" :refer (enableScreens)]
["react-native" :as rn :refer (DevSettings LogBox)]))
[status-im.utils.universal-links.core :as utils.universal-links]
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.react :as react]
["react-native" :refer (DevSettings LogBox)]
["react-native-languages" :default react-native-languages]
["react-native-shake" :as react-native-shake]))
(set! interop/next-tick js/setTimeout)
(set! batching/fake-raf #(js/setTimeout % 0))
@ -24,12 +27,19 @@
(defn init []
(utils.logs/init-logs config/log-level)
(error-handler/register-exception-handler!)
(enableScreens)
(re-frame/dispatch-sync [:init/app-started])
(when platform/android?
(status/set-soft-input-mode status/adjust-resize))
(.registerComponent ^js (.-AppRegistry rn) "StatusIm" #(reagent/reactify-component views/root))
(notifications/listen-notifications)
(.addEventListener ^js react/app-state "change" #(re-frame/dispatch [:app-state-change %]))
(.addEventListener react-native-languages "change" (fn [^js event]
(i18n/set-language (.-language event))))
(.addEventListener react-native-shake "ShakeEvent" #(re-frame/dispatch [:shake-event]))
(re-frame/dispatch-sync [:init/app-started])
(utils.universal-links/initialize)
;;DEV
(snoopy/subscribe!)
(when (and js/goog.DEBUG platform/ios? DevSettings)
;;on Android this method doesn't work

View File

@ -34,11 +34,10 @@
[cofx]
;; we reset navigation so that navigate back doesn't return
;; into the registration flow
(navigation/navigate-reset cofx
{:index 1
:key :profile-stack
:routes [{:name :my-profile}
{:name :ens-confirmation}]}))
(navigation/set-stack-root cofx
:profile-stack
[:my-profile
:ens-confirmation]))
(fx/defn update-ens-tx-state-and-redirect
{:events [:update-ens-tx-state-and-redirect]}
@ -237,9 +236,8 @@
{:db (dissoc db :ens/registration)}
;; we reset navigation so that navigate back doesn't return
;; into the registration flow
(navigation/navigate-reset {:index 1
:routes [{:name :my-profile}
{:name :ens-main}]})))
(navigation/set-stack-root :profile-stack [:my-profile
:ens-main])))
(fx/defn switch-domain-type
{:events [::switch-domain-type]}

View File

@ -244,5 +244,5 @@
[cofx]
(fx/merge
cofx
(navigation/navigate-to :buy-crypto nil)
(navigation/open-modal :buy-crypto nil)
(wallet/keep-watching-history)))

View File

@ -13,14 +13,16 @@
(fx/defn navigate-chat-updated
{:events [:navigate-chat-updated]}
[cofx chat-id]
(if (get-in cofx [:db :chats chat-id :is-active])
(models.chat/navigate-to-chat cofx chat-id)))
(when (get-in cofx [:db :chats chat-id :is-active])
(fx/merge cofx
(navigation/pop-to-root-tab :chat-stack)
(models.chat/navigate-to-chat chat-id))))
(fx/defn handle-chat-removed
{:events [:chat-removed]}
[_ response]
{:dispatch-n [[:sanitize-messages-and-process-response response]
[:navigate-to :home]]})
[:pop-to-root-tab :chat-stack]]})
(fx/defn handle-chat-update
{:events [:chat-updated]}
@ -106,7 +108,7 @@
[cofx chat-id]
(fx/merge cofx
(models.chat/deactivate-chat chat-id)
(navigation/navigate-to-cofx :home {})))
(navigation/pop-to-root-tab :chat-stack)))
(def not-blank?
(complement string/blank?))

View File

@ -8,7 +8,9 @@
[status-im.db :refer [app-db]]
[status-im.utils.fx :as fx]
[status-im.theme.core :as theme]
[status-im.utils.theme :as utils.theme]))
[status-im.utils.theme :as utils.theme]
[status-im.utils.keychain.core :as keychain]
[status-im.navigation :as navigation]))
(fx/defn initialize-app-db
"Initialize db to initial state"
@ -25,16 +27,18 @@
(fx/defn initialize-views
{:events [::initialize-view]}
[cofx {:keys [logout?]}]
[cofx]
(let [{{:multiaccounts/keys [multiaccounts]} :db} cofx]
(when (and (seq multiaccounts) (not logout?))
(if (and (seq multiaccounts))
;; We specifically pass a bunch of fields instead of the whole multiaccount
;; as we want store some fields in multiaccount that are not here
(let [multiaccount (first (sort-by :timestamp > (vals multiaccounts)))]
(multiaccounts.login/open-login cofx
(select-keys
multiaccount
[:key-uid :name :public-key :identicon :images]))))))
(fx/merge cofx
(multiaccounts.login/open-login (select-keys
multiaccount
[:key-uid :name :public-key :identicon :images]))
(keychain/get-auth-method (:key-uid multiaccount))))
(navigation/init-root cofx :intro))))
(fx/defn initialize-multiaccounts
{:events [::initialize-multiaccounts]}
@ -48,14 +52,12 @@
{}
all-multiaccounts)]
(fx/merge cofx
{:db (-> db
(assoc :multiaccounts/multiaccounts multiaccounts)
(assoc :multiaccounts/logout? logout?)
(assoc :multiaccounts/loading false))
;; NOTE: Try to dispatch later navigation because of that https://github.com/react-navigation/react-navigation/issues/6879
:dispatch-later [{:dispatch [::initialize-view {:logout? logout?}]
:ms 100}]
:dispatch [::anon-metrics/fetch-opt-in-screen-displayed?]})))
{:db (-> db
(assoc :multiaccounts/multiaccounts multiaccounts)
(assoc :multiaccounts/logout? logout?)
(assoc :multiaccounts/loading false))
:dispatch-n [[::initialize-view]
[::anon-metrics/fetch-opt-in-screen-displayed?]]})))
(fx/defn start-app
{:events [:init/app-started]}

View File

@ -4,7 +4,6 @@
[status-im.utils.utils :as utils]
[status-im.i18n.i18n :as i18n]
[status-im.ethereum.mnemonic :as mnemonic]
[status-im.multiaccounts.model :as multiaccounts.model]
[status-im.multiaccounts.recover.core :as multiaccounts.recover]
[status-im.navigation :as navigation]
[status-im.signing.core :as signing.core]
@ -17,9 +16,7 @@
(fx/merge cofx
{:db (-> db
(assoc-in [:keycard :creating-backup?] backup-type))}
(if (multiaccounts.model/logged-in? cofx)
(navigation/navigate-to-cofx :seed-phrase nil)
(navigation/navigate-to-cofx :key-storage-stack {:screen :seed-phrase}))))
(navigation/navigate-to-cofx :seed-phrase nil)))
(fx/defn recovery-card-pressed
{:events [:keycard-settings.ui/recovery-card-pressed]}
@ -49,6 +46,7 @@
mnemonic/sanitize-passphrase)
:password nil
:success-event ::create-backup-card}})
(fx/defn create-backup-card
{:events [::create-backup-card]}
[{:keys [db] :as cofx} root-data derived-data]
@ -63,6 +61,4 @@
(assoc-in [:keycard :flow] :recovery)
(update :multiaccounts/key-storage dissoc :seed-phrase))
:dismiss-keyboard nil}
(if (multiaccounts.model/logged-in? cofx)
(navigation/navigate-to-cofx :keycard-onboarding-intro nil)
(navigation/navigate-to-cofx :intro-stack {:screen :keycard-onboarding-intro}))))
(navigation/navigate-to-cofx :keycard-onboarding-intro nil)))

View File

@ -11,7 +11,8 @@
[status-im.utils.types :as types]
[taoensso.timbre :as log]
[status-im.bottom-sheet.core :as bottom-sheet]
[status-im.utils.platform :as platform]))
[status-im.utils.platform :as platform]
[status-im.popover.core :as popover]))
(def default-pin "000000")
@ -168,12 +169,12 @@
(defn keycard-sheet-content [on-cancel connected? params]
(fn []
(keycard-sheet/connect-keycard
[keycard-sheet/connect-keycard
{:on-cancel #(re-frame/dispatch on-cancel)
:connected? connected?
:params params
:on-connect ::on-card-connected
:on-disconnect ::on-card-disconnected})))
:on-disconnect ::on-card-disconnected}]))
(fx/defn show-connection-sheet-component
[{:keys [db] :as cofx} {:keys [on-card-connected on-card-read handler]
@ -376,7 +377,7 @@
cofx
{:db (assoc-in db [:keycard :pin :status] :frozen-card)}
hide-connection-sheet)
{:db (assoc db :popover/popover {:view :frozen-card})}))
(popover/show-popover cofx {:view :frozen-card})))
(fx/defn on-get-keys-error
{:events [:keycard.callback/on-get-keys-error]}
@ -541,8 +542,4 @@
(fx/defn navigete-to-keycard-settings
{:events [::navigate-to-keycard-settings]}
[cofx]
(navigation/navigate-reset
cofx
{:index 1
:routes [{:name :my-profile}
{:name :keycard-settings}]}))
(navigation/set-stack-root :profile-stack [:my-profile :keycard-settings]))

View File

@ -17,7 +17,7 @@
[{:keys [db] :as cofx}]
(fx/merge cofx
{:db db}
(navigation/navigate-to-cofx :multiaccounts nil)))
(navigation/pop-to-root-tab :multiaccounts-stack)))
(fx/defn login-pin-more-icon-pressed
{:events [:keycard.login.pin.ui/more-icon-pressed]}
@ -50,10 +50,6 @@
{:db (assoc-in db [:keycard :flow] :login)}
(navigation/navigate-to-cofx :keycard-recovery-pair nil)))
(fx/defn frozen-keycard-popup
[{:keys [db]}]
{:db (assoc db :popover/popover {:view :frozen-card})})
(fx/defn reset-pin
{:events [::reset-pin]}
[{:keys [db] :as cofx}]
@ -71,9 +67,7 @@
:error nil
:status nil))})
(when-not (:multiaccounts/login db)
(navigation/navigate-to-cofx
:profile-stack
{:screen :keycard-pin}))))
(navigation/navigate-to-cofx :keycard-pin nil))))
(fx/defn dismiss-frozen-keycard-popover
{:events [::frozen-keycard-popover-dismissed]}
@ -124,7 +118,7 @@
(and (zero? pin-retry-counter)
(or (nil? puk-retry-counter)
(pos? puk-retry-counter)))
nil #_(frozen-keycard-popup cofx)
nil
:else
(common/get-keys-from-keycard cofx))))

View File

@ -128,13 +128,23 @@
(navigation/navigate-to-cofx (if platform/android?
:notifications-settings :welcome) nil)))
(fx/defn intro-wizard
{:events [:multiaccounts.create.ui/intro-wizard]}
[{:keys [db] :as cofx}]
(fx/merge cofx
{:db (-> db
(update :keycard dissoc :flow)
(dissoc :restored-account?))}
(multiaccounts.create/prepare-intro-wizard)
(navigation/navigate-to-cofx :get-your-keys nil)))
(fx/defn recovery-no-key
{:events [:keycard.recovery.no-key.ui/generate-key-pressed]}
[{:keys [db] :as cofx}]
(fx/merge cofx
{:db (assoc-in db [:keycard :flow] :create)
:keycard/check-nfc-enabled nil}
(multiaccounts.create/intro-wizard)))
(intro-wizard)))
(fx/defn create-keycard-multiaccount
[{:keys [db] :as cofx}]
@ -170,7 +180,8 @@
(fx/merge cofx
{:db (-> db
(assoc-in [:keycard :setup-step] nil)
(dissoc :intro-wizard))}
(dissoc :intro-wizard))
:init-root-fx :onboarding-notification}
(multiaccounts.create/on-multiaccount-created
{:recovered (or recovered (get-in db [:intro-wizard :recovering?]))
:derived {constants/path-wallet-root-keyword
@ -192,8 +203,7 @@
:keycard-paired-on paired-on
:chat-key whisper-private-key}
encryption-public-key
{})
(navigation/navigate-to-cofx :notifications-onboarding nil)))))
{})))))
(fx/defn return-to-keycard-login
[{:keys [db] :as cofx}]
@ -203,10 +213,8 @@
:status nil
:login [])
(update :keycard dissoc :application-info))}
(navigation/navigate-reset {:index 0
:routes [{:name :intro-stack
:state {:routes [{:name :multiaccounts},
{:name :keycard-login-pin}]}}]})))
(navigation/set-stack-root :multiaccounts-stack [:multiaccounts
:keycard-login-pin])))
(fx/defn on-backup-success
[{:keys [db] :as cofx} backup-type]
@ -216,7 +224,7 @@
:content (i18n/label (if (= backup-type :recovery-card)
:t/keycard-can-use-with-new-passcode :t/keycard-backup-success-body))}}
(if (multiaccounts.model/logged-in? cofx)
(navigation/navigate-to-cofx :profile-stack {:screen :keycard-settings})
(navigation/navigate-to-cofx :keycard-settings nil)
(return-to-keycard-login))))
(fx/defn on-generate-and-load-key-success

View File

@ -1,6 +1,10 @@
(ns status-im.keycard.test-menu
(:require [status-im.ui.components.react :as react]
[status-im.keycard.simulated-keycard :as simulated-keycard]))
[status-im.keycard.simulated-keycard :as simulated-keycard]
[reagent.core :as reagent]
[status-im.utils.random :as random]))
(def ids (reagent/atom []))
(defn button [label accessibility-label handler]
[react/view
@ -14,17 +18,26 @@
:accessibility-label accessibility-label}
label]])
(defn test-menu []
[react/view
{:style {:position :absolute
:top 70
:right 0
:width 50
:justify-content :center
:align-items :center}}
[button "conn" :connect-card simulated-keycard/connect-card]
[button "conn sell" :connect-selected-card simulated-keycard/connect-selected-card]
[button "pair" :connect-pairing-card simulated-keycard/connect-pairing-card]
[button "disc" :disconnect-card simulated-keycard/disconnect-card]
[button "res" :keycard-reset-state simulated-keycard/reset-state]])
(defn test-menu-view [id]
(fn []
(println id @ids)
(when (= id (last @ids))
[react/view
{:style {:position :absolute
:top 70
:right 0
:width 50
:justify-content :center
:align-items :center}}
[button "conn" :connect-card simulated-keycard/connect-card]
[button "conn sell" :connect-selected-card simulated-keycard/connect-selected-card]
[button "pair" :connect-pairing-card simulated-keycard/connect-pairing-card]
[button "disc" :disconnect-card simulated-keycard/disconnect-card]
[button "res" :keycard-reset-state simulated-keycard/reset-state]])))
(defn test-menu []
(let [id (random/id)]
(reagent/create-class
{:component-did-mount (fn [] (swap! ids conj id))
:component-will-unmount (fn [] (reset! ids (vec (remove #(= % id) @ids))))
:reagent-render (test-menu-view id)})))

View File

@ -315,7 +315,7 @@
:on-accept #(do
(reset! showing-connection-error-popup? false)
(re-frame/dispatch [:mailserver.ui/dismiss-connection-error true])
(re-frame/dispatch [:navigate-to :profile-stack {:screen :offline-messaging-settings}]))
(re-frame/dispatch [:navigate-to :offline-messaging-settings]))
:extra-options [{:text (i18n/label :t/mailserver-retry)
:onPress #(do
(reset! showing-connection-error-popup? false)

View File

@ -109,8 +109,7 @@
(fx/merge
cofx
(bottom-sheet/hide-bottom-sheet)
(navigation/navigate-to-cofx :profile-stack {:screen :mobile-network-settings
:initial false})))
(navigation/navigate-to-cofx :mobile-network-settings nil)))
(fx/defn mobile-network-show-offline-sheet
{:events [:mobile-network/show-offline-sheet]}

View File

@ -1,49 +1,18 @@
(ns status-im.multiaccounts.create.core
(:require [clojure.set :refer [map-invert]]
[re-frame.core :as re-frame]
(:require [re-frame.core :as re-frame]
[status-im.constants :as constants]
[status-im.data-store.settings :as data-store.settings]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[status-im.keycard.nfc :as nfc]
[status-im.i18n.i18n :as i18n]
[status-im.native-module.core :as status]
[status-im.node.core :as node]
[status-im.bottom-sheet.core :as bottom-sheet]
[status-im.ui.components.colors :as colors]
[status-im.navigation :as navigation]
[status-im.utils.config :as config]
[status-im.utils.fx :as fx]
[status-im.utils.security :as security]
[status-im.utils.signing-phrase.core :as signing-phrase]
[status-im.utils.types :as types]
[status-im.utils.utils :as utils]
[taoensso.timbre :as log]))
(def step-kw-to-num
{:generate-key 1
:choose-key 2
:select-key-storage 3
:create-code 4})
(defn decrement-step [step]
(let [inverted (map-invert step-kw-to-num)]
(if (and (= step :create-code)
(not (nfc/nfc-supported?)))
:choose-key
(inverted (dec (step-kw-to-num step))))))
(defn inc-step [step]
(let [inverted (map-invert step-kw-to-num)]
(if (and (= step :choose-key)
(not (nfc/nfc-supported?)))
:create-code
(inverted (inc (step-kw-to-num step))))))
;; multiaccounts create module
(defn get-selected-multiaccount [{:keys [db]}]
(let [{:keys [selected-id multiaccounts]} (:intro-wizard db)]
(some #(when (= selected-id (:id %)) %) multiaccounts)))
[status-im.utils.types :as types]))
(defn normalize-derived-data-keys [derived-data]
(->> derived-data
@ -62,131 +31,107 @@
derived
(update :derived normalize-derived-data-keys)))
(re-frame/reg-cofx
::get-signing-phrase
(fn [cofx _]
(assoc cofx :signing-phrase (signing-phrase/generate))))
(re-frame/reg-fx
::store-multiaccount
(fn [[id key-uid hashed-password callback]]
(status/multiaccount-store-derived
id
key-uid
[constants/path-wallet-root
constants/path-eip1581
constants/path-whisper
constants/path-default-wallet]
hashed-password
callback)))
(fx/defn create-multiaccount
{:events [:create-multiaccount]}
[{:keys [db]} key-code]
(let [{:keys [selected-id]} (:intro-wizard db)
key-uid (some
(fn [{:keys [id key-uid]}]
(when (= id selected-id)
key-uid))
(get-in db [:intro-wizard :multiaccounts]))
hashed-password (ethereum/sha3 (security/safe-unmask-data key-code))
callback (fn [result]
(let [derived-data (normalize-derived-data-keys (types/json->clj result))
public-key (get-in derived-data [constants/path-whisper-keyword :public-key])]
(status/gfycat-identicon-async
public-key
(fn [name identicon]
(let [derived-whisper (derived-data constants/path-whisper-keyword)
derived-data-extended (assoc-in derived-data
[constants/path-whisper-keyword]
(merge derived-whisper {:name name :identicon identicon}))]
(re-frame/dispatch [::store-multiaccount-success
key-code derived-data-extended]))))))]
{::store-multiaccount [selected-id key-uid hashed-password callback]}))
(let [{:keys [selected-id]} (:intro-wizard db)]
{::store-multiaccount
[selected-id
(some
(fn [{:keys [id key-uid]}]
(when (= id selected-id)
key-uid))
(get-in db [:intro-wizard :multiaccounts]))
(ethereum/sha3 (security/safe-unmask-data key-code))
(fn [result]
(let [derived-data (normalize-derived-data-keys (types/json->clj result))
public-key (get-in derived-data [constants/path-whisper-keyword :public-key])]
(status/gfycat-identicon-async
public-key
(fn [name identicon]
(let [derived-whisper (derived-data constants/path-whisper-keyword)
derived-data-extended (assoc-in derived-data
[constants/path-whisper-keyword]
(merge derived-whisper {:name name :identicon identicon}))]
(re-frame/dispatch [::store-multiaccount-success key-code derived-data-extended]))))))]}))
(re-frame/reg-fx
:multiaccount-generate-and-derive-addresses
(fn []
(status/multiaccount-generate-and-derive-addresses
5
12
[constants/path-whisper
constants/path-wallet-root
constants/path-default-wallet]
#(re-frame/dispatch [:multiaccount-generate-and-derive-addresses-success
(mapv normalize-multiaccount-data-keys
(types/json->clj %))]))))
(fx/defn multiaccount-generate-and-derive-addresses-success
{:events [:multiaccount-generate-and-derive-addresses-success]}
[{:keys [db]} result]
{:db (update db :intro-wizard
(fn [data]
(-> data
(dissoc :processing?)
(assoc :multiaccounts result
:selected-storage-type :default
:selected-id (-> result first :id)
:step :choose-key))))
:rnn-navigate-to-fx :choose-name})
(fx/defn generate-and-derive-addresses
{:events [:generate-and-derive-addresses]}
[{:keys [db]}]
{:db (assoc-in db [:intro-wizard :processing?] true)
:multiaccount-generate-and-derive-addresses nil})
(fx/defn prepare-intro-wizard
[{:keys [db] :as cofx}]
{:db (assoc db :intro-wizard {:step :generate-key
:back-action :intro-wizard/navigate-back
:forward-action :intro-wizard/step-forward-pressed})})
[{:keys [db]}]
{:db (assoc db :intro-wizard {})})
(fx/defn intro-wizard
{:events [:multiaccounts.create.ui/intro-wizard]}
[{:keys [db] :as cofx}]
(fx/merge cofx
{:db (-> db
(update :keycard dissoc :flow)
(dissoc :restored-account?))}
(prepare-intro-wizard)
(navigation/navigate-to-cofx :create-multiaccount-generate-key nil)))
(fx/defn save-multiaccount-and-login-with-keycard
[_ args]
{:keycard/save-multiaccount-and-login args})
(fx/defn get-new-key
{:events [:multiaccounts.create.ui/get-new-key]}
[{:keys [db] :as cofx}]
(fx/merge cofx
(prepare-intro-wizard)
(bottom-sheet/hide-bottom-sheet)
(navigation/navigate-to-cofx :create-multiaccount-generate-key nil)))
(re-frame/reg-fx
::save-account-and-login
(fn [[key-uid multiaccount-data hashed-password settings config accounts-data]]
(status/save-account-and-login
key-uid
multiaccount-data
hashed-password
settings
config
accounts-data)))
(fx/defn remove-recovery-flag [{:keys [db]}]
{:db (dissoc db :recovered-account?)})
(fx/defn dec-step
{:events [:intro-wizard/dec-step]}
[{:keys [db] :as cofx}]
(let [step (get-in db [:intro-wizard :step])]
(fx/merge cofx
(when (= step :enter-phrase)
remove-recovery-flag)
(if (or (= step :enter-phrase)
(= :generate-key step))
prepare-intro-wizard
(fn [_]
{:db (assoc-in db [:intro-wizard :step] (decrement-step step))})))))
(fx/defn intro-step-back
{:events [:intro-wizard/navigate-back]}
[{:keys [db] :as cofx} skip-alert?]
(let [step (get-in db [:intro-wizard :step])]
(if (and (= step :choose-key) (not skip-alert?))
(utils/show-question
(i18n/label :t/are-you-sure-to-cancel)
(i18n/label :t/you-will-start-from-scratch)
#(re-frame/dispatch [:intro-wizard/navigate-back true]))
(fx/merge cofx
dec-step
navigation/navigate-back))))
(fx/defn exit-wizard
[{:keys [db] :as cofx}]
(fx/merge
cofx
{:db (dissoc db :intro-wizard)}
(navigation/navigate-to-cofx :notifications-onboarding nil)))
(fx/defn init-key-generation
[{:keys [db] :as cofx}]
{:db (assoc-in db [:intro-wizard :processing?] true)
:intro-wizard/start-onboarding nil})
(fx/defn store-key-code [{:keys [db] :as cofx}]
(let [key-code (get-in db [:intro-wizard :key-code])]
{:db (update db :intro-wizard
assoc :stored-key-code key-code
:key-code nil)}))
(fx/defn intro-step-forward
{:events [:intro-wizard/step-forward-pressed]}
[{:keys [db] :as cofx} {:keys [skip? key-code] :as opts}]
(let [{:keys [step selected-storage-type processing?]} (:intro-wizard db)]
(log/debug "[multiaccount.create] intro-step-forward"
"step" step)
(cond (= step :generate-key)
(init-key-generation cofx)
(and (= step :create-code)
(not processing?))
(fx/merge cofx
{:db (assoc-in db [:intro-wizard :processing?] true)}
(create-multiaccount key-code))
(and (= step :create-code)
(:multiaccounts/login db))
(exit-wizard cofx)
(and (= step :select-key-storage)
(= :advanced selected-storage-type))
{:dispatch [:keycard/start-onboarding-flow]}
:else (let [next-step (inc-step step)]
(fx/merge cofx
{:db (update db :intro-wizard
assoc :processing? false
:step next-step)}
(when (= step :create-code)
store-key-code)
(navigation/navigate-to-cofx (->> next-step name (str "create-multiaccount-") keyword) nil))))))
(fx/defn save-account-and-login
[_ key-uid multiaccount-data password settings node-config accounts-data]
{::save-account-and-login [key-uid
(types/clj->json multiaccount-data)
password
(types/clj->json settings)
node-config
(types/clj->json accounts-data)]})
(defn prepare-accounts-data
[multiaccount]
@ -207,19 +152,6 @@
:path constants/path-whisper
:chat true})])
(fx/defn save-multiaccount-and-login-with-keycard
[_ args]
{:keycard/save-multiaccount-and-login args})
(fx/defn save-account-and-login
[_ key-uid multiaccount-data password settings node-config accounts-data]
{::save-account-and-login [key-uid
(types/clj->json multiaccount-data)
password
(types/clj->json settings)
node-config
(types/clj->json accounts-data)]})
(fx/defn on-multiaccount-created
[{:keys [signing-phrase random-guid-generator db] :as cofx}
{:keys [address chat-key keycard-instance-uid key-uid
@ -260,7 +192,7 @@
:installation-id (random-guid-generator)
;; default mailserver (history node) setting
:use-mailservers? true
:recovered (or recovered (get-in db [:intro-wizard :recovering?]))}
:recovered recovered}
config/default-multiaccount)
;; The address from which we derive any chat
;; account/encryption keys
@ -303,90 +235,28 @@
(ethereum/sha3 (security/safe-unmask-data password))
settings
(node/get-new-config db)
accounts-data))
(when (:intro-wizard db)
(intro-step-forward {})))))
accounts-data)))))
(re-frame/reg-fx
:intro-wizard/start-onboarding
(fn []
(status/multiaccount-generate-and-derive-addresses
5
12
[constants/path-whisper
constants/path-wallet-root
constants/path-default-wallet]
#(re-frame/dispatch [:intro-wizard/on-keys-generated
(mapv normalize-multiaccount-data-keys
(types/json->clj %))]))))
(fx/defn on-keys-generated
{:events [:intro-wizard/on-keys-generated]}
[{:keys [db] :as cofx} result]
(fx/merge
{:db (update db :intro-wizard
(fn [data]
(-> data
(dissoc :processing?)
(assoc :multiaccounts result
:selected-storage-type :default
:selected-id (-> result first :id)
:step :choose-key))))}
(navigation/navigate-to-cofx :create-multiaccount-choose-key nil)))
(fx/defn store-multiaccount-success
{:events [::store-multiaccount-success]
:interceptors [(re-frame/inject-cofx :random-guid-generator)
(re-frame/inject-cofx ::get-signing-phrase)]}
[{:keys [db] :as cofx} password derived]
(fx/merge cofx
{:db (dissoc db :intro-wizard)}
(on-multiaccount-created (assoc (let [{:keys [selected-id multiaccounts]} (:intro-wizard db)]
(some #(when (= selected-id (:id %)) %) multiaccounts))
:derived derived
:recovered (get-in db [:intro-wizard :recovering?]))
password
{:save-mnemonic? true})))
(fx/defn on-key-selected
{:events [:intro-wizard/on-key-selected]}
[{:keys [db] :as cofx} id]
[{:keys [db]} id]
{:db (assoc-in db [:intro-wizard :selected-id] id)})
(fx/defn on-key-storage-selected
{:events [:intro-wizard/on-key-storage-selected]}
[{:keys [db] :as cofx} storage-type]
[{:keys [db]} storage-type]
{:db (assoc-in db [:intro-wizard :selected-storage-type] storage-type)})
(fx/defn on-learn-more-pressed
{:events [:intro-wizard/on-learn-more-pressed]}
[{:keys [db] :as cofx}]
{:db (assoc-in db [:intro-wizard :show-learn-more?] true)})
(re-frame/reg-cofx
::get-signing-phrase
(fn [cofx _]
(assoc cofx :signing-phrase (signing-phrase/generate))))
(fx/defn create-multiaccount-success
{:events [::store-multiaccount-success]
:interceptors [(re-frame/inject-cofx :random-guid-generator)
(re-frame/inject-cofx ::get-signing-phrase)]}
[cofx password derived]
(on-multiaccount-created cofx
(assoc
(get-selected-multiaccount cofx)
:derived
derived)
password
{:save-mnemonic? true}))
(re-frame/reg-fx
::store-multiaccount
(fn [[id key-uid hashed-password callback]]
(status/multiaccount-store-derived
id
key-uid
[constants/path-wallet-root
constants/path-eip1581
constants/path-whisper
constants/path-default-wallet]
hashed-password
callback)))
(re-frame/reg-fx
::save-account-and-login
(fn [[key-uid multiaccount-data hashed-password settings config accounts-data]]
(status/save-account-and-login
key-uid
multiaccount-data
hashed-password
settings
config
accounts-data)))

View File

@ -19,10 +19,10 @@
[cofx]
(navigation/navigate-to-cofx
cofx
:key-storage-stack
{:screen (if (multiaccounts.model/logged-in? cofx)
:actions-logged-in
:actions-not-logged-in)}))
(if (multiaccounts.model/logged-in? cofx)
:actions-logged-in
:actions-not-logged-in)
nil))
(fx/defn move-keystore-checked
{:events [::move-keystore-checked]}
@ -46,7 +46,7 @@
(fx/merge
cofx
{:db (assoc db :recovered-account? true)}
(navigation/navigate-to-cofx :key-storage-stack {:screen :seed-phrase})))
(navigation/navigate-to-cofx :seed-phrase nil)))
(fx/defn seed-phrase-input-changed
{:events [::seed-phrase-input-changed]}
@ -180,7 +180,7 @@ We don't need to take the exact steps, just set the required state and redirect
(assoc-in [:keycard :from-key-storage-and-migration?] true)
(dissoc :multiaccounts/key-storage))}
(popover/hide-popover)
(navigation/navigate-to-cofx :intro-stack {:screen :keycard-onboarding-intro})))
(navigation/navigate-to-cofx :keycard-onboarding-intro nil)))
(fx/defn handle-delete-multiaccount-error
{:events [::delete-multiaccount-error]}
@ -192,7 +192,7 @@ We don't need to take the exact steps, just set the required state and redirect
[cofx _]
(fx/merge cofx
(popover/hide-popover)
(navigation/navigate-to-cofx :intro-stack {:screen :multiaccounts})))
(navigation/navigate-to-cofx :multiaccounts nil)))
(comment
;; check import mnemonic output

View File

@ -58,8 +58,7 @@
(is (= :passed-derived-data (get-in res [:db :intro-wizard :derived])))
(is (= :advanced (get-in res [:db :intro-wizard :selected-storage-type]))) ; :advanced storage type means Keycard
(is (= :recovery (get-in res [:db :keycard :flow])))
(is (get-in res [:db :keycard :from-key-storage-and-migration?]))
(is (= {:intro-stack {:screen :keycard-onboarding-intro}} (get-in res [:db :navigation/screen-params]))))))
(is (get-in res [:db :keycard :from-key-storage-and-migration?])))))
(comment
(security/safe-unmask-data (security/mask-data nil)))

View File

@ -21,7 +21,6 @@
[status-im.transport.core :as transport]
[status-im.stickers.core :as stickers]
[status-im.mobile-sync-settings.core :as mobile-network]
[status-im.navigation :as navigation]
[status-im.utils.fx :as fx]
[status-im.utils.keychain.core :as keychain]
[status-im.utils.logging.core :as logging]
@ -36,7 +35,8 @@
[status-im.chat.models.link-preview :as link-preview]
[status-im.utils.mobile-sync :as utils.mobile-sync]
[status-im.async-storage.core :as async-storage]
[status-im.notifications-center.core :as notifications-center]))
[status-im.notifications-center.core :as notifications-center]
[status-im.navigation :as navigation]))
(re-frame/reg-fx
::initialize-communities-enabled
@ -72,9 +72,8 @@
(reduce (fn [acc {:keys [chat type wallet] :as account}]
(if chat
acc
(let [account (cond->
(update account :address
eip55/address->checksum)
(let [account (cond-> (update account :address
eip55/address->checksum)
type
(update :type keyword))]
;; if the account is the default wallet we
@ -316,7 +315,8 @@
{:method "permissions_getDappPermissions"
:on-success #(re-frame/dispatch [::initialize-dapp-permissions %])}
{:method "settings_getSettings"
:on-success #(re-frame/dispatch [::get-settings-callback %])}]}
:on-success #(do (re-frame/dispatch [::get-settings-callback %])
(re-frame/dispatch [:init-root :chat-stack]))}]}
(notifications/load-notification-preferences)
(when save-password?
(keychain/save-user-password key-uid password))
@ -329,10 +329,14 @@
first-account? (and creating?
(empty? multiaccounts))]
(fx/merge cofx
{:db (-> db
(dissoc :multiaccounts/login)
(assoc-in [:multiaccount :multiaccounts/first-account] first-account?))
:dispatch-later [{:ms 2000 :dispatch [::initialize-wallet accounts nil nil (:recovered multiaccount) true]}]}
{:db (-> db
(dissoc :multiaccounts/login)
(assoc-in [:multiaccount :multiaccounts/first-account] first-account?))
:init-root-fx :onboarding-notification
:dispatch-later [{:ms 2000 :dispatch [::initialize-wallet
accounts nil nil
(or (get db :recovered-account?) (:recovered multiaccount))
true]}]}
(finish-keycard-setup)
(transport/start-messenger)
(chat.loading/initialize-chats)
@ -398,17 +402,15 @@
;; the keychain (save-password), this is not very explicit and we should probably
;; make it clearer
(fx/defn open-login
[{:keys [db] :as cofx} override-multiaccount]
(fx/merge cofx
{:db (-> db
(update :multiaccounts/login
merge
override-multiaccount)
(update :multiaccounts/login
dissoc
:error
:password))}
(keychain/get-auth-method (:key-uid override-multiaccount))))
[{:keys [db]} override-multiaccount]
{:db (-> db
(update :multiaccounts/login
merge
override-multiaccount)
(update :multiaccounts/login
dissoc
:error
:password))})
(fx/defn open-login-callback
{:events [:multiaccounts.login.callback/get-user-password-success]}
@ -422,8 +424,8 @@
cofx
{:db (update-in db [:multiaccounts/login] assoc
:password password
:save-password? true)}
(navigation/navigate-to-cofx :intro-stack {:screen :progress})
:save-password? true)
:init-root-fx :progress}
login)
(fx/merge
cofx
@ -432,9 +434,9 @@
(assoc-in [:keycard :pin :enter-step] :login)
(assoc-in [:keycard :pin :status] nil)
(assoc-in [:keycard :pin :login] []))})
(if keycard-account?
(navigation/navigate-to-cofx :intro-stack {:screen :keycard-login-pin})
(navigation/navigate-to-cofx :intro-stack {:screen :login}))))))
#(if keycard-account?
{:init-root-with-component-fx [:multiaccounts-keycard :multiaccounts]}
{:init-root-fx :multiaccounts})))))
(fx/defn get-credentials
[{:keys [db] :as cofx} key-uid]
@ -515,28 +517,27 @@
(popover/show-popover {:view :disable-password-saving})))))))
(fx/defn welcome-lets-go
{:events [::welcome-lets-go]}
{:events [:welcome-lets-go]}
[cofx]
(let [first-account? (get-in cofx [:db :multiaccount :multiaccounts/first-account])]
(fx/merge cofx
{:init-root-fx :chat-stack}
(when first-account?
(acquisition/create))
(if config/metrics-enabled?
(navigation/navigate-to :anon-metrics-opt-in {})
(navigation/navigate-reset {:index 0
:routes [{:name :tabs}]})))))
#(when config/metrics-enabled?
{:dispatch [:navigate-to :anon-metrics-opt-in]}))))
(fx/defn multiaccount-selected
{:events [:multiaccounts.login.ui/multiaccount-selected]}
[{:keys [db] :as cofx} key-uid]
;; We specifically pass a bunch of fields instead of the whole multiaccount
;; as we want store some fields in multiaccount that are not here
(let [multiaccount (get-in db [:multiaccounts/multiaccounts key-uid])]
(let [multiaccount (get-in db [:multiaccounts/multiaccounts key-uid])
keycard-multiaccount? (boolean (:keycard-pairing multiaccount))]
(fx/merge
cofx
{:db (-> db
(dissoc :intro-wizard :recovered-account?)
(update :keycard dissoc :application-info))}
{:db (update db :keycard dissoc :application-info)
:rnn-navigate-to-fx (if keycard-multiaccount? :keycard-login-pin :login)}
(open-login (select-keys multiaccount [:key-uid :name :public-key :identicon :images])))))
(fx/defn hide-keycard-banner

View File

@ -20,8 +20,6 @@
(let [initial-cofx {:db {:auth-method keychain/auth-method-none
:supported-biometric-auth true}}
{:keys [db]} (login/save-password initial-cofx true)]
(test/is (= :secure-with-biometric
(get-in db [:popover/popover :view])))
(test/is (= true (get-in db [:multiaccounts/login :save-password?])))
(test/testing "enable biometric auth"
(let [{:keys [db] :as res} (biometric/enable {:db db})]
@ -46,30 +44,19 @@
"uncheck save password")
(let [initial-cofx {:db {:auth-method keychain/auth-method-none
:supported-biometric-auth true}}
{:keys [db]} (fx/merge
initial-cofx
(login/save-password true)
(biometric/enable)
(biometric/setup-done
{:bioauth-success true
:bioauth-message nil
:bioauth-code nil})
(login/save-password false))]
{:keys [db]} (login/save-password (fx/merge
initial-cofx
(login/save-password true)
(biometric/enable)
(biometric/setup-done
{:bioauth-success true
:bioauth-message nil
:bioauth-code nil}))
false)]
(test/is (= true (get-in db [:multiaccounts/login :save-password?])))
;; case 2 from https://github.com/status-im/status-react/issues/9573
(test/is (= keychain/auth-method-biometric-prepare (:auth-method db)))
(test/testing "disable biometric"
(let [{:keys [db]} (biometric/disable {:db db})]
(test/is (= false (get-in db [:multiaccounts/login :save-password?])))
(test/is (= keychain/auth-method-none) (:auth-method db))))))
(test/testing (str "check save password, skip biometric auth"
"uncheck save password, check again")
(let [initial-cofx {:db {:auth-method keychain/auth-method-none
:supported-biometric-auth true}}
{:keys [db]} (fx/merge
initial-cofx
(login/save-password true)
(login/save-password false)
(login/save-password false))]
;; case 3 from https://github.com/status-im/status-react/issues/9573
(test/is (= :secure-with-biometric (get-in db [:popover/popover :view]))))))
(test/is (= keychain/auth-method-none) (:auth-method db)))))))

View File

@ -16,7 +16,8 @@
(let [key-uid (get-in db [:multiaccount :key-uid])
should-send-metrics? (get-in db [:multiaccount :anon-metrics/should-send?])]
(fx/merge cofx
{::logout nil
{:init-root-fx :progress
::logout nil
::multiaccounts/webview-debug-changed false
::disable-local-notifications nil
:keychain/clear-user-password key-uid

View File

@ -52,7 +52,7 @@
(if error
{:utils/show-popup {:title (i18n/label :t/multiaccount-exists-title)
:content (i18n/label :t/multiaccount-exists-title)
:on-dismiss #(re-frame/dispatch [:navigate-to :multiaccounts])}}
:on-dismiss #(re-frame/dispatch [:pop-to-root-tab :multiaccounts])}}
(let [{:keys [key-uid] :as multiaccount} (get-in db [:intro-wizard :root-key])
keycard-multiaccount? (boolean (get-in db [:multiaccounts/multiaccounts key-uid :keycard-pairing]))]
(if keycard-multiaccount?
@ -116,10 +116,10 @@
:content (i18n/label :t/multiaccount-exists-content)
:confirm-button-text (i18n/label :t/unlock)
:on-accept #(do
(re-frame/dispatch [:navigate-to :multiaccounts])
(re-frame/dispatch [:pop-to-root-tab :multiaccounts])
(re-frame/dispatch
[:multiaccounts.login.ui/multiaccount-selected key-uid]))
:on-cancel #(re-frame/dispatch [:navigate-to :multiaccounts])}})
:on-cancel #(re-frame/dispatch [:pop-to-root-tab :multiaccounts])}})
(fx/defn on-import-multiaccount-success
{:events [::import-multiaccount-success]}
@ -130,8 +130,7 @@
{:db (update db :intro-wizard
assoc :root-key root-data
:derived derived-data
:step :recovery-success
:forward-action :multiaccounts.recover/re-encrypt-pressed)}
:step :recovery-success)}
(when (existing-account? multiaccounts key-uid)
(show-existing-multiaccount-alert key-uid))
(navigation/navigate-to-cofx :recover-multiaccount-success nil))))
@ -148,7 +147,6 @@
:next-button-disabled? true
:weak-password? true
:encrypt-with-password? true
:back-action :intro-wizard/navigate-back
:forward-action :multiaccounts.recover/enter-phrase-next-pressed}
:recovered-account? true)
(update :keycard dissoc :flow))}
@ -222,9 +220,8 @@
;;TODO: fix circular dependency to remove dispatch here
{:dispatch [:recovery.ui/keycard-option-pressed]}
(fx/merge cofx
{:db (update db :intro-wizard assoc :step :create-code
:forward-action :multiaccounts.recover/enter-password-next-pressed)}
(navigation/navigate-to-cofx :recover-multiaccount-enter-password nil)))))
{:db (update db :intro-wizard assoc :step :create-code)}
(navigation/navigate-to-cofx :create-password nil)))))
(fx/defn re-encrypt-pressed
{:events [:multiaccounts.recover/re-encrypt-pressed]}
@ -232,16 +229,15 @@
(fx/merge cofx
{:db (update db :intro-wizard
assoc :step :select-key-storage
:forward-action :multiaccounts.recover/select-storage-next-pressed
:selected-storage-type :default)}
(if (nfc/nfc-supported?)
(navigation/navigate-to-cofx :recover-multiaccount-select-storage nil)
(navigation/navigate-to-cofx :select-key-storage nil)
(select-storage-next-pressed))))
(fx/defn confirm-password-next-button-pressed
{:events [:multiaccounts.recover/enter-password-next-pressed]
:interceptors [(re-frame/inject-cofx :random-guid-generator)]}
[{:keys [db] :as cofx} {:keys [key-code]}]
[cofx key-code]
(store-multiaccount cofx key-code))
(fx/defn count-words

View File

@ -1,34 +1,7 @@
(ns status-im.navigation
(:require [re-frame.core :as re-frame]
[status-im.ui.screens.routing.core :as navigation]
[taoensso.timbre :as log]
[status-im.utils.fx :as fx]
(:require [status-im.utils.fx :as fx]
[status-im.anon-metrics.core :as anon-metrics]))
(re-frame/reg-fx
::navigate-to
(fn [[view-id params]]
(log/debug :navigate-to view-id params)
(navigation/navigate-to (name view-id) params)))
(re-frame/reg-fx
::navigate-back
(fn []
(log/debug :navigate-back)
(navigation/navigate-back)))
(re-frame/reg-fx
::navigate-reset
(fn [config]
(log/debug :navigate-reset config)
(navigation/navigate-reset config)))
(re-frame/reg-fx
::navigate-replace
(fn [[view-id params]]
(log/debug :navigate-replace view-id params)
(navigation/navigate-replace (name view-id) params)))
(defn- all-screens-params [db view screen-params]
(cond-> db
(and (seq screen-params) (:screen screen-params) (:params screen-params))
@ -38,11 +11,11 @@
(assoc-in [:navigation/screen-params view] screen-params)))
(fx/defn navigate-to-cofx
[{:keys [db] :as cofx} go-to-view-id screen-params]
[{:keys [db]} go-to-view-id screen-params]
{:db
(-> (assoc db :view-id go-to-view-id)
(all-screens-params go-to-view-id screen-params))
::navigate-to [go-to-view-id screen-params]
:rnn-navigate-to-fx go-to-view-id
;; simulate a navigate-to event so it can be captured be anon-metrics
::anon-metrics/transform-and-log {:coeffects {:event [:navigate-to go-to-view-id screen-params]}}})
@ -54,19 +27,75 @@
(fx/defn navigate-back
{:events [:navigate-back]}
[_]
{::navigate-back nil})
{:rnn-navigate-back-fx nil})
(fx/defn navigate-reset
{:events [:navigate-reset]}
[_ config]
{::navigate-reset config})
(fx/defn pop-to-root-tab
{:events [:pop-to-root-tab]}
[_ tab]
{:rnn-pop-to-root-tab-fx tab})
(fx/defn set-stack-root
{:events [:set-stack-root]}
[_ stack root]
{:set-stack-root-fx [stack root]})
(fx/defn change-tab
{:events [:navigate-change-tab]}
[_ tab]
{:rnn-change-tab-fx tab})
(fx/defn navigate-replace
{:events [:navigate-replace]
{:events [:navigate-replace]
:interceptors [anon-metrics/interceptor]}
[{:keys [db]} go-to-view-id screen-params]
(let [db (cond-> (assoc db :view-id go-to-view-id)
(seq screen-params)
(assoc-in [:navigation/screen-params go-to-view-id] screen-params))]
{:db db
::navigate-replace [go-to-view-id screen-params]}))
{:db db
:navigate-replace-fx go-to-view-id}))
(fx/defn open-modal
{:events [:open-modal]}
[{:keys [db]} comp screen-params]
{:db (-> (assoc db :view-id comp)
(all-screens-params comp screen-params))
:open-modal-fx comp})
(fx/defn init-root
{:events [:init-root]}
[_ root-id]
{:init-root-fx root-id})
(fx/defn init-root-with-component
{:events [:init-root-with-component]}
[_ root-id comp-id]
{:init-root-with-component-fx [root-id comp-id]})
(fx/defn rnn-navigate-to
{:events [:rnn-navigate-to]}
[_ key]
{:rnn-navigate-to-fx key})
(fx/defn rnn-navigate-back
{:events [:rnn-navigate-back]}
[_]
{:rnn-navigate-back-fx nil})
(fx/defn change-tab-count
{:events [:change-tab-count]}
[_ tab cnt]
{:rnn-change-tab-count-fx [tab cnt]})
(fx/defn hide-signing-sheet
{:events [:hide-signing-sheet]}
[_]
{:rnn-hide-signing-sheet nil})
(fx/defn hide-select-acc-sheet
{:events [:hide-select-acc-sheet]}
[_]
{:rnn-hide-select-acc-sheet nil})

View File

@ -0,0 +1,322 @@
(ns status-im.navigation.core
(:require
[status-im.ui.components.colors :as colors]
[re-frame.core :as re-frame]
[status-im.ui.screens.views :as views]
[status-im.utils.platform :as platform]
[status-im.navigation.roots :as roots]
["react-native-navigation" :refer (Navigation)]
["react-native-gesture-handler" :refer (gestureHandlerRootHOC)]
[status-im.ui.components.react :as react]
[quo.components.text-input :as quo.text-input]
[status-im.ui.components.icons.icons :as icons]
[quo.design-system.colors :as quo.colors]
["react-native" :as rn]))
(def debug? ^boolean js/goog.DEBUG)
(def splash-screen (-> rn .-NativeModules .-SplashScreen))
(defonce root-comp-id (atom nil))
(defonce root-id (atom nil))
(defonce pushed-screen-id (atom nil))
(defonce curr-modal (atom nil))
(defonce modals (atom []))
(defonce dissmissing (atom false))
;; REGISTER COMPONENT (LAZY)
(defn reg-comp [key]
(if-let [comp (get views/components (keyword key))]
(.registerComponent Navigation key (fn [] (views/component comp)))
(let [screen (views/screen key)]
(.registerComponent Navigation key (fn [] (gestureHandlerRootHOC screen)) (fn [] screen)))))
(defonce rset-lazy-reg
(.setLazyComponentRegistrator Navigation reg-comp))
;; PUSH SCREEN
(defn navigate [comp]
(let [{:keys [options]} (get views/screens comp)]
(.push Navigation
(name @root-comp-id)
(clj->js {:component {:id comp
:name comp
:options (merge options
(roots/status-bar-options)
(roots/merge-top-bar (roots/topbar-options) options))}}))
;;if we push the screen from modal, we want to dismiss all modals
(when @curr-modal
(reset! curr-modal false)
(reset! modals [])
(.dismissAllModals Navigation))))
;; OPEN MODAL
(defn update-modal-topbar-options [options]
(merge options
(roots/merge-top-bar {:elevation 0
:noBorder true
:title {:color colors/black}
:background {:color colors/white}
:leftButtonColor colors/black
:leftButtons {:id "dismiss-modal"
:icon (icons/icon-source :main-icons/close)}}
options)))
(defn open-modal [comp]
(let [{:keys [options]} (get views/screens comp)]
(if @dissmissing
(reset! dissmissing comp)
(do
(println "SHOW MODAL" comp)
(reset! curr-modal true)
(swap! modals conj comp)
(.showModal Navigation
(clj->js {:stack {:children
[{:component
{:name comp
:id comp
:options (update-modal-topbar-options
(merge (roots/status-bar-options)
(roots/default-root)
options))}}]}}))))))
(re-frame/reg-fx :open-modal-fx open-modal)
;; DISSMISS MODAL
(defn dissmissModal []
(println "dissmissModal" @modals)
(reset! dissmissing true)
(.dismissModal Navigation (name (last @modals))))
(defonce register-nav-button-reg
(.registerNavigationButtonPressedListener
(.events Navigation)
(fn [^js evn]
(let [id (.-buttonId evn)]
(if (= "dismiss-modal" id)
(do
(when-let [event (get-in views/screens [(last @modals) :on-dissmiss])]
(re-frame/dispatch event))
(dissmissModal))
(when-let [handler (get-in views/screens [(keyword id) :right-handler])]
(handler)))))))
(defonce register-modal-reg
(.registerModalDismissedListener
(.events Navigation)
(fn [_]
(println "DismissedListener" @dissmissing @modals)
(if (> (count @modals) 1)
(let [new-modals (butlast @modals)]
(reset! modals (vec new-modals))
(re-frame/dispatch [:set :view-id (last new-modals)]))
(do
(reset! modals [])
(reset! curr-modal false)
(re-frame/dispatch [:set :view-id @pushed-screen-id])))
(let [comp @dissmissing]
(reset! dissmissing false)
(when (keyword? comp)
(open-modal comp))))))
;; SCREEN DID APPEAR
(defonce screen-appear-reg
(.registerComponentDidAppearListener
(.events Navigation)
(fn [^js evn]
(let [view-id (keyword (.-componentName evn))]
(when-let [{:keys [on-focus]} (get views/screens view-id)]
(when (and (not= view-id :bottom-sheet) (not= view-id :popover))
(re-frame/dispatch [:set :view-id view-id])
(when on-focus
(re-frame/dispatch on-focus))
(when-not @curr-modal
(reset! pushed-screen-id view-id))))))))
;; SCREEN DID DISAPPEAR
(defonce screen-disappear-reg
(.registerComponentDidDisappearListener
(.events Navigation)
(fn [_]
(doseq [[_ {:keys [ref value]}] @quo.text-input/text-input-refs]
(.setNativeProps ^js ref (clj->js {:text value})))
(doseq [[^js text-input default-value] @react/text-input-refs]
(.setNativeProps text-input (clj->js {:text default-value}))))))
;; SET ROOT
(re-frame/reg-fx
:init-root-fx
(fn [new-root-id]
(reset! root-comp-id new-root-id)
(reset! root-id @root-comp-id)
(.setRoot Navigation (clj->js (get (roots/roots) new-root-id)))))
(re-frame/reg-fx
:init-root-with-component-fx
(fn [[new-root-id new-root-comp-id]]
(reset! root-comp-id new-root-comp-id)
(reset! root-id @root-comp-id)
(.setRoot Navigation (clj->js (get (roots/roots) new-root-id)))))
(defonce rset-app-launched
(.registerAppLaunchedListener (.events Navigation)
(fn []
(when @root-id
(reset! root-comp-id @root-id)
(.setRoot Navigation (clj->js (get (roots/roots) @root-id))))
(.hide ^js splash-screen))))
(defn get-screen-component [comp]
(let [{:keys [options]} (get views/screens comp)]
{:component {:id comp
:name comp
:options (merge options
(roots/status-bar-options)
(roots/merge-top-bar (roots/topbar-options) options))}}))
;; SET STACK ROOT
(re-frame/reg-fx
:set-stack-root-fx
(fn [[stack comp]]
(.setStackRoot Navigation
(name stack)
(clj->js (if (vector? comp)
(mapv get-screen-component comp)
(get-screen-component comp))))))
;; BOTTOM TABS
(def tab-root-ids {0 :chat-stack
1 :browser-stack
2 :wallet-stack
3 :status-stack
4 :profile-stack})
(def tab-key-idx {:chat 0
:browser 1
:wallet 2
:status 3
:profile 4})
(re-frame/reg-fx
:rnn-change-tab-fx
(fn [tab]
(reset! root-comp-id (get tab-root-ids (get tab-key-idx tab)))
(.mergeOptions Navigation "tabs-stack" (clj->js {:bottomTabs {:currentTabIndex (get tab-key-idx tab)}}))))
;issue on ios https://github.com/wix/react-native-navigation/issues/7146
(re-frame/reg-fx
:rnn-change-tab-count-fx
(fn [[tab cnt]]
(.mergeOptions Navigation
(name (get tab-root-ids (get tab-key-idx tab)))
(clj->js {:bottomTab (cond
(or (pos? cnt) (pos? (:other cnt)))
(if (and (= :chat tab) platform/ios?)
{:dotIndicator {:visible true}}
{:badge (str (or (:other cnt) cnt)) :dotIndicator {:visible false}})
(pos? (:public cnt))
(if platform/ios?
{:dotIndicator {:visible true}}
{:badge nil :dotIndicator {:visible true}})
:else
(if (and (= :chat tab) platform/ios?)
{:dotIndicator {:visible false}}
{:dotIndicator {:visible false} :badge nil}))}))))
(re-frame/reg-fx
:rnn-pop-to-root-tab-fx
(fn [comp]
(.popToRoot Navigation (name comp))))
(defonce register-bottom-tab-reg
(.registerBottomTabSelectedListener
(.events Navigation)
(fn [^js evn]
(let [comp (get tab-root-ids (.-selectedTabIndex evn))]
(when (and platform/android? (= @root-comp-id comp))
(.popToRoot Navigation (name comp)))
(reset! root-comp-id comp)))))
;; OVERLAY (Popover and bottom sheets)
(defn dissmiss-overlay [comp]
(.dismissOverlay Navigation comp))
(defn show-overlay [comp]
(dissmiss-overlay comp)
(.showOverlay Navigation
(clj->js
{:component {:name comp
:id comp
:options (merge (cond-> (roots/status-bar-options)
(and platform/android? (not (colors/dark?)))
(assoc-in [:statusBar :translucent] true))
{:layout {:componentBackgroundColor (if platform/android?
(:backdrop @quo.colors/theme)
"transparent")}
:overlay {:interceptTouchOutside true}})}})))
;; POPOVER
(defonce popover-reg
(.registerComponent Navigation
"popover"
(fn [] (gestureHandlerRootHOC views/popover-comp))
(fn [] views/popover-comp)))
(re-frame/reg-fx :rnn-show-popover (fn [] (show-overlay "popover")))
(re-frame/reg-fx :rnn-hide-popover (fn [] (dissmiss-overlay "popover")))
;; BOTTOM SHEETS
(defonce bottom-sheet-reg
(.registerComponent Navigation
"bottom-sheet"
(fn [] (gestureHandlerRootHOC views/sheet-comp))
(fn [] views/sheet-comp)))
(re-frame/reg-fx :rnn-show-bottom-sheet (fn [] (show-overlay "bottom-sheet")))
(re-frame/reg-fx :rnn-hide-bottom-sheet (fn [] (dissmiss-overlay "bottom-sheet")))
;; SIGNING
(defonce signing-sheet-reg
(.registerComponent Navigation
"signing-sheet"
(fn [] (gestureHandlerRootHOC views/signing-comp))
(fn [] views/signing-comp)))
(re-frame/reg-fx :rnn-show-signing-sheet (fn [] (show-overlay "signing-sheet")))
(re-frame/reg-fx :rnn-hide-signing-sheet (fn [] (dissmiss-overlay "signing-sheet")))
;; Select account
;; TODO why is this not a regular bottom sheet ?
(defonce select-acc-sheet-reg
(.registerComponent Navigation
"select-acc-sheet"
(fn [] (gestureHandlerRootHOC views/select-acc-comp))
(fn [] views/select-acc-comp)))
(re-frame/reg-fx :rnn-show-select-acc-sheet (fn [] (show-overlay "select-acc-sheet")))
(re-frame/reg-fx :rnn-hide-select-acc-sheet (fn [] (dissmiss-overlay "select-acc-sheet")))
;; NAVIGATION
(re-frame/reg-fx
:rnn-navigate-to-fx
(fn [key]
;;TODO WHY #{:home} ? we need to review all navigations to root screens home, wallet profile etc
(when-not (#{:home} key)
(navigate key))))
(re-frame/reg-fx
:rnn-navigate-back-fx
(fn []
(if @curr-modal
(dissmissModal)
(.pop Navigation (name @root-comp-id)))))
(re-frame/reg-fx
:navigate-replace-fx
(fn [view-id]
(.pop Navigation (name @root-comp-id))
(navigate view-id)))

View File

@ -0,0 +1,171 @@
(ns status-im.navigation.roots
(:require [status-im.ui.components.colors :as colors]
[status-im.utils.platform :as platform]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.screens.views :as views]))
(defn status-bar-options []
(if platform/android?
{:navigationBar {:backgroundColor colors/white}
:statusBar {:backgroundColor colors/white
:style (if (colors/dark?) :light :dark)}}
{:statusBar {:style (if (colors/dark?) :light :dark)}}))
(defn topbar-options []
{:noBorder true
:elevation 0
:title {:color colors/black}
:rightButtonColor colors/black
:background {:color colors/white}
:backButton {:icon (icons/icon-source :main-icons/arrow-left)
:color colors/black}})
(defn bottom-tab-general [icon accessibility]
(merge
{:testID accessibility
:accessibilityLabel accessibility
:fontSize 11
:icon (icons/icon-source icon)
:badgeColor colors/blue
:dotIndicator {:color colors/blue :visible false :size 10}
:iconColor colors/gray :selectedIconColor colors/blue
:textColor colors/gray :selectedTextColor colors/blue}
(when platform/android?
{:badge ""})))
(defn default-root []
{:layout {:componentBackgroundColor colors/white
:backgroundColor colors/white}})
(defn merge-top-bar [root-options options]
(let [options (:topBar options)]
{:topBar
(merge root-options
options
(when (or (:title root-options) (:title options))
{:title (merge (:title root-options) (:title options))})
(when (or (:background root-options) (:background options))
{:background (merge (:background root-options) (:background options))})
(when (or (:backButton root-options) (:backButton options))
{:backButton (merge (:backButton root-options) (:backButton options))})
(when (or (:leftButtons root-options) (:leftButtons options))
{:leftButtons (merge (:leftButtons root-options) (:leftButtons options))})
(when (or (:rightButtons root-options) (:rightButtons options))
{:rightButtons (merge (:rightButtons root-options) (:rightButtons options))}))}))
(defn get-screen-options [screen]
(merge (get-in views/screens [screen :options])
(status-bar-options)
(merge-top-bar (topbar-options)
(get-in views/screens [screen :options]))))
;;TODO problem here is that we have two places for screens, here and in screens ns, and we have handler in navigate
(defn roots []
;;TABS
{:chat-stack
{:root
{:bottomTabs
{:id :tabs-stack
:options (merge (default-root)
{:bottomTabs {:titleDisplayMode :alwaysHide
:backgroundColor colors/white}})
:children [;CHAT STACK
{:stack {:id :chat-stack
:children [{:component {:name :home
:id :home
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/message :home-tab-button)}}}
;BROWSER STACK
{:stack {:id :browser-stack
:children [{:component {:name :empty-tab
:id :empty-tab
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/browser :dapp-tab-button)}}}
;WALLET STACK
{:stack {:id :wallet-stack
:children [{:component {:name :wallet
:id :wallet
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/wallet :wallet-tab-button)}}}
;STATUS STACK
{:stack {:id :status-stack
:children [{:component {:name :status
:id :status
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/status :status-tab-button)}}}
;PROFILE STACK
{:stack {:id :profile-stack
:children [{:component {:name :my-profile
:id :my-profile
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/user-profile :profile-tab-button)}}}]}}}
;;INTRO (onboarding carousel)
:intro
{:root {:stack {:children [{:component {:name :intro
:id :intro
:options (status-bar-options)}}]
:options (merge (default-root)
{:topBar (assoc (topbar-options) :visible false)})}}}
;; ONBOARDING
:onboarding
{:root {:stack {:id :onboarding
:children [{:component {:name :get-your-keys
:id :get-your-keys
:options (status-bar-options)}}]
:options (merge (default-root)
{:topBar (assoc (topbar-options) :elevation 0 :noBorder true :animate false)})}}}
;;PROGRESS
:progress
{:root {:stack {:children [{:component {:name :progress
:id :progress
:options (status-bar-options)}}]
:options (merge (default-root)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;LOGIN
:multiaccounts
{:root {:stack {:id :multiaccounts-stack
:children [{:component {:name :multiaccounts
:id :multiaccounts
:options (get-screen-options :multiaccounts)}}
{:component {:name :login
:id :login
:options (get-screen-options :login)}}]
:options (merge (default-root)
{:topBar (topbar-options)})}}}
:multiaccounts-keycard
{:root {:stack {:id :multiaccounts-stack
:children [{:component {:name :multiaccounts
:id :multiaccounts
:options (get-screen-options :multiaccounts)}}
{:component {:name :keycard-login-pin
:id :keycard-login-pin
:options (get-screen-options :keycard-login-pin)}}]
:options (merge (default-root)
{:topBar (topbar-options)})}}}
;;WELCOME
:welcome
{:root {:stack {:children [{:component {:name :welcome
:id :welcome
:options (status-bar-options)}}]
:options (merge (default-root)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;NOTIFICATIONS
:onboarding-notification
{:root {:stack {:children [{:component {:name :onboarding-notification
:id :onboarding-notification
:options (status-bar-options)}}]
:options (merge (default-root)
{:topBar (assoc (topbar-options) :visible false)})}}}})

View File

@ -3,11 +3,19 @@
(fx/defn show-popover
{:events [:show-popover]}
[{:keys [db]} value]
{:db (assoc db :popover/popover value)
[_ value]
{:rnn-show-popover nil
;;TODO refactor popover just start animation on mount
:dispatch-later [{:ms 250 :dispatch [:show-popover-db value]}]
:dismiss-keyboard nil})
(fx/defn show-popover-db
{:events [:show-popover-db]}
[{:keys [db]} value]
{:db (assoc db :popover/popover value)})
(fx/defn hide-popover
{:events [:hide-popover]}
[{:keys [db]}]
{:db (dissoc db :popover/popover)})
{:db (dissoc db :popover/popover)
:rnn-hide-popover nil})

View File

@ -15,7 +15,7 @@
[_ opts]
{:request-permissions-fx
{:permissions [:camera]
:on-allowed #(re-frame/dispatch [:navigate-to :qr-scanner opts])
:on-allowed #(re-frame/dispatch [:open-modal :qr-scanner opts])
:on-denied (fn []
(utils/set-timeout
#(utils/show-popup (i18n/label :t/error)
@ -59,19 +59,19 @@
(let [own (new-chat.db/own-public-key? db public-key)]
(cond
(and public-key own)
(navigation/navigate-to-cofx cofx :tabs {:screen :profile-stack
:params {:screen :my-profile}})
{:navigate-change-tab-fx :profile
:pop-to-root-tab-fx :profile-stack}
(and public-key (not own))
(fx/merge cofx
{:db (assoc db :contacts/identity public-key)
:dispatch [:navigate-to :profile]}
:dispatch [:open-modal :profile]}
(navigation/navigate-back))
:else
{:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:content (i18n/label :t/ens-name-not-found)
:on-dismiss #(re-frame/dispatch [:navigate-to :home])}})))
:on-dismiss #(re-frame/dispatch [:pop-to-root-tab :chat-stack])}})))
(fx/defn handle-eip681 [cofx data]
(fx/merge cofx
@ -89,7 +89,7 @@
:browser (handle-browse cofx data)
:eip681 (handle-eip681 cofx data)
{:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:on-dismiss #(re-frame/dispatch [:navigate-to :home])}}))
:on-dismiss #(re-frame/dispatch [:pop-to-root-tab :chat-stack])}}))
(fx/defn on-scan
{:events [::on-scan-success]}

View File

@ -13,7 +13,10 @@
(defonce label (reagent/atom ""))
(defn reload []
(when @timeout (js/clearTimeout @timeout))
(reset! timeout (js/setTimeout #(reset! visible false) 500))
(reset! warning? false)
(reset! visible true)
(reset! label "reloading UI")
(re-frame/clear-subscription-cache!)
(swap! cnt inc))
@ -45,12 +48,7 @@
(build-competed)))
(defn reload-view [_]
(fn [cnt]
(when @timeout (js/clearTimeout @timeout))
(when (not= @cnt-prev cnt)
(reset! cnt-prev cnt)
(reset! visible true)
(reset! timeout (js/setTimeout #(reset! visible false) 1000)))
(fn []
(when @visible
[react/view {:pointerEvents :none
:style {:position :absolute :top 0 :left 0 :right 0 :bottom 0

View File

@ -204,19 +204,21 @@
(let [{:signing/keys [queue]} db
{{:keys [gas gasPrice] :as tx-obj} :tx-obj {:keys [data typed? pinless?] :as message} :message :as tx} (last queue)
keycard-multiaccount? (boolean (get-in db [:multiaccount :keycard-pairing]))
wallet-set-up-passed? (get-in db [:multiaccount :wallet-set-up-passed?])
updated-db (if wallet-set-up-passed? db (assoc db :popover/popover {:view :signing-phrase}))]
wallet-set-up-passed? (get-in db [:multiaccount :wallet-set-up-passed?])]
(if message
(fx/merge
cofx
{:db (assoc updated-db
{:db (assoc db
:signing/queue (drop-last queue)
:signing/tx tx
:signing/sign {:type (cond pinless? :pinless
keycard-multiaccount? :keycard
:else :password)
:formatted-data (if typed? (types/json->clj data) (ethereum/hex->text data))
:keycard-step (when pinless? :connect)})}
:keycard-step (when pinless? :connect)})
:rnn-show-signing-sheet nil}
#(when-not wallet-set-up-passed?
{:dispatch-n [[:show-popover {:view :signing-phrase}]]})
(when pinless?
(keycard.card/start-nfc {:on-success #(re-frame/dispatch [:keycard.callback/start-nfc-success])
:on-failure #(re-frame/dispatch [:keycard.callback/start-nfc-failure])})
@ -225,10 +227,13 @@
:on-completed #(re-frame/dispatch [:keycard/store-hash-and-sign-typed %])})))
(fx/merge
cofx
{:db (assoc updated-db
{:db (assoc db
:signing/queue (drop-last queue)
:signing/tx (prepare-tx updated-db tx))
:signing/tx (prepare-tx db tx))
:rnn-show-signing-sheet nil
:dismiss-keyboard nil}
#(when-not wallet-set-up-passed?
{:dispatch-n [[:show-popover {:view :signing-phrase}]]})
(prices/update-prices)
#(when-not gas
{:db (assoc-in (:db %) [:signing/edit-fee :gas-loading?] true)

View File

@ -137,7 +137,7 @@
pack-contract (contracts/get-address db :status/sticker-pack)
address (ethereum/default-address db)]
(fx/merge cofx
(navigation/navigate-to-cofx :stickers-pack-modal {:id id})
(navigation/open-modal :stickers-pack {:id id})
#(when (and contract-address (not pack))
{:stickers/pack-data-fx [contract-address id]
:stickers/owned-packs-fx [pack-contract address]})))))

View File

@ -80,6 +80,7 @@
(reg-root-key-sub :connectivity/ui-status-properties :connectivity/ui-status-properties)
(reg-root-key-sub :logged-in-since :logged-in-since)
(reg-root-key-sub :link-previews-whitelist :link-previews-whitelist)
(reg-root-key-sub :app-state :app-state)
;;NOTE this one is not related to ethereum network
;; it is about cellular network/ wifi network
@ -325,6 +326,13 @@
(fn [db]
(multiaccounts.model/logged-in? {:db db})))
(re-frame/reg-sub
:hide-screen?
:<- [:app-state]
:<- [:multiaccount]
(fn [[state multiaccount]]
(and (= state "inactive") (:preview-privacy? multiaccount))))
;; Intro wizard
(re-frame/reg-sub
:intro-wizard
@ -334,12 +342,6 @@
(assoc wizard-state
:view-height height :view-width width)))
(re-frame/reg-sub
:intro-wizard/generate-key
:<- [:intro-wizard]
(fn [wizard-state]
(select-keys wizard-state [:processing? :view-height])))
(re-frame/reg-sub
:intro-wizard/choose-key
:<- [:intro-wizard]
@ -350,19 +352,7 @@
:intro-wizard/select-key-storage
:<- [:intro-wizard]
(fn [wizard-state]
(merge (select-keys wizard-state [:selected-storage-type :view-height :recovering?])
(if (:recovering? wizard-state)
{:forward-action :multiaccounts.recover/select-storage-next-pressed}
{:forward-action :intro-wizard/step-forward-pressed}))))
(re-frame/reg-sub
:intro-wizard/create-code
:<- [:intro-wizard]
(fn [wizard-state]
(merge (select-keys wizard-state [:processing?])
(if (:recovering? wizard-state)
{:forward-action :multiaccounts.recover/enter-password-next-pressed}
{:forward-action :intro-wizard/step-forward-pressed}))))
(select-keys wizard-state [:selected-storage-type :recovering?])))
(re-frame/reg-sub
:intro-wizard/enter-phrase

View File

@ -1,11 +1,7 @@
(ns status-im.theme.core
(:require [status-im.ui.components.status-bar.view :as status-bar]
[status-im.ui.components.colors :as colors]
[quo.theme :as quo-theme]
["react-native-navigation-bar-color" :default changeNavigationBarColor]))
(:require [status-im.ui.components.colors :as colors]
[quo.theme :as quo-theme]))
(defn change-theme [theme]
(quo-theme/set-theme theme)
(colors/set-theme theme)
(status-bar/set-status-bar nil)
(changeNavigationBarColor colors/white (= theme :light)))
(colors/set-theme theme))

View File

@ -3,7 +3,8 @@
[reagent.core :as reagent]
[status-im.ui.components.animation :as anim]
[status-im.ui.components.colors :as colors]
[status-im.ui.components.react :as react])
[status-im.ui.components.react :as react]
[status-im.utils.platform :as platform])
(:require-macros [status-im.utils.views :as views]))
(def back-listener (atom nil))
@ -42,7 +43,7 @@
:duration 500
:useNativeDriver true})])))
(defn bottom-panel [_ render window-height]
(defn bottom-panel [_ render window-height on-close]
(let [bottom-anim-value (anim/create-value window-height)
alpha-value (anim/create-value 0)
clear-timeout (atom nil)
@ -90,17 +91,23 @@
:else
(do (reset! clear-timeout (js/setTimeout #(reset! current-obj nil) 600))
(hide-panel-anim bottom-anim-value alpha-value (- window-height))))))
:reagent-render (fn []
(when @current-obj
[react/keyboard-avoiding-view {:style {:position :absolute :top 0 :bottom 0 :left 0 :right 0}}
[react/view {:flex 1}
[react/animated-view {:flex 1 :background-color colors/black-persist :opacity alpha-value}]
[react/animated-view {:style {:position :absolute
:transform [{:translateY bottom-anim-value}]
:bottom 0 :left 0 :right 0}}
[react/view {:flex 1}
[render @current-obj]]]]]))})))
:reagent-render (fn []
(if @current-obj
[react/keyboard-avoiding-view {:style {:position :absolute :top 0 :bottom 0 :left 0 :right 0}
:ignore-offset true}
(views/defview animated-bottom-panel [val signing-view]
[react/view {:flex 1}
(when platform/ios?
[react/animated-view {:flex 1 :background-color colors/black-persist :opacity alpha-value}])
[react/animated-view {:style {:position :absolute
:transform [{:translateY bottom-anim-value}]
:bottom 0 :left 0 :right 0}}
[react/view {:flex 1}
[render @current-obj]]]]]
;;TODO this is not great, improve!
#(do (on-close)
nil)))})))
(views/defview animated-bottom-panel [val signing-view on-close]
(views/letsubs [{window-height :height} [:dimensions/window]]
[bottom-panel (when val (select-keys val [:from :contact :amount :token :approve? :message :cancel? :hash])) signing-view window-height]))
[bottom-panel (when val (select-keys val [:from :contact :amount :token :approve? :message :cancel? :hash])) signing-view window-height on-close]))

View File

@ -136,7 +136,7 @@
{:title (i18n/label :t/settings)
:accessibility-label "settings"
:theme :accent
:on-press #(hide-sheet-and-dispatch [:navigate-to :profile-stack {:screen :sync-settings}])
:on-press #(hide-sheet-and-dispatch [:navigate-to :sync-settings])
:icon :main-icons/settings}]
(when mobile
[:<>

View File

@ -84,7 +84,7 @@
:on-success (fn [type data]
(re-frame/dispatch [::get-reward-success address type data]))})
accounts)}
(navigation/navigate-to-cofx :referral-invite nil))))
(navigation/open-modal :referral-invite nil))))
(re-frame/reg-fx
::terms-and-conditions

View File

@ -9,7 +9,6 @@
[quo.design-system.spacing :as spacing]
[quo.design-system.colors :as colors]
[status-im.ui.components.invite.style :as styles]
[status-im.ui.components.topbar :as topbar]
[status-im.ui.components.invite.events :as invite.events]
[status-im.ui.components.invite.utils :refer [transform-tokens]]
[quo.react-native :as rn]
@ -210,10 +209,7 @@
account (or @account* default-account)
reward @(re-frame/subscribe [::invite.events/default-reward])
starter-pack @(re-frame/subscribe [::invite.events/starter-pack])]
[rn/view {:flex 1}
[topbar/topbar {:modal? true
:show-border? true
:title (i18n/label :t/invite-friends)}]
[:<>
[rn/scroll-view {:flex 1}
[reward-item reward :t/invite-reward-you-description]
[friend-reward-item starter-pack :t/invite-reward-friend-description]

View File

@ -10,9 +10,9 @@
[react/safe-area-consumer
(fn [insets]
(let [vertical-offset (+ (oget insets "top")
;; 10 is the margin-top for presentation modal
10)]
;; 20 is the margin-top for presentation modal
20)]
(reagent/as-element
(into [react/keyboard-avoiding-view (merge props
{:keyboard-vertical-offset vertical-offset})]
(into [react/keyboard-avoiding-view (update props :keyboardVerticalOffset
+ vertical-offset)]
children))))]))

View File

@ -11,7 +11,8 @@
["react-native-safe-area-context" :as safe-area-context
:refer (SafeAreaProvider SafeAreaInsetsContext)]
["@react-native-community/clipboard" :default Clipboard]
["react-native-linear-gradient" :default LinearGradient])
["react-native-linear-gradient" :default LinearGradient]
["react-native-navigation" :refer (Navigation)])
(:require-macros [status-im.utils.views :as views]))
(def native-modules (.-NativeModules react-native))
@ -22,8 +23,6 @@
(def app-state (.-AppState react-native))
(def view (reagent/adapt-react-class (.-View react-native)))
(def status-bar-class (.-StatusBar react-native))
(def scroll-view-class (reagent/adapt-react-class (.-ScrollView react-native)))
(def keyboard-avoiding-view-class (reagent/adapt-react-class (.-KeyboardAvoidingView react-native)))
@ -227,10 +226,20 @@
(.then clipboard-contents #(clbk %))))
;; KeyboardAvoidingView
(def navigation-const (atom nil))
(.then (.constants Navigation)
(fn [^js consts]
(reset! navigation-const {:top-bar-height (.-topBarHeight consts)
:bottom-tabs-height (.-bottomTabsHeight consts)
:status-bar-height (.-statusBarHeight consts)})))
(defn keyboard-avoiding-view [props & children]
(into [keyboard-avoiding-view-class
(merge (when platform/ios? {:behavior :padding}) props)]
(merge (when platform/ios? {:behavior :padding})
(if (:ignore-offset props)
props
(update props :keyboardVerticalOffset + 44 (:status-bar-height @navigation-const))))]
children))
(defn scroll-view [props & children]

View File

@ -1,23 +0,0 @@
(ns status-im.ui.components.status-bar.styles
(:require [status-im.ui.components.colors :as colors]
[status-im.utils.styles :as styles]))
(defn- create-status-bar-style [{:keys [background-color bar-style translucent?]
:or {bar-style "light-content"}}]
{:background-color (if translucent? "transparent" background-color)
:translucent translucent?
:bar-style bar-style})
(styles/defn status-bar-default []
{:ios (create-status-bar-style (when-not (colors/dark?)
{:bar-style "dark-content"}))
:android (create-status-bar-style (if (colors/dark?)
{:translucent? true}
{:translucent? true
:bar-style "dark-content"}))})
(styles/defn status-bar-black []
{:ios (create-status-bar-style nil)
:android (create-status-bar-style (if (colors/dark?)
{:translucent? true}
{:background-color colors/black}))})

View File

@ -1,51 +0,0 @@
(ns status-im.ui.components.status-bar.view
(:require [status-im.ui.components.react :as react]
[status-im.ui.components.status-bar.styles :as styles]
[status-im.utils.platform :as platform]))
(def route->bar-type (merge {:qr-scanner {:type :black}
:image-preview {:type :black}}
(when platform/ios?
{:new-chat {:type :black}
:contact-toggle-list {:type :black}
:new-group {:type :black}
:anon-metrics-view-data {:type :black}
:anon-metrics-learn-more {:type :black}
:new-public-chat {:type :black}})))
;; TODO: Integrate into navigation
(defn get-config [view-id]
(get route->bar-type view-id {:type :main}))
(defn set-status-bar
"If more than one `StatusBar` is rendered, the one which was mounted last will
have higher priority
https://facebook.github.io/react-native/docs/statusbar.html
This means that if we have more than one screen rendered at the same time
(which happens due to bottom nav change), it might happen that the screen
which was already rendered before will be reopened but the `StatusBar` from
a different screen which still exists but is blurred will be applied.
Thus we need to set props to `StatusBar` imperatively when a particular screen
is shown. At the same time, the background of `StatusBar` should be rendered
inside the screen in order to have better transitions between screens."
[view-id]
(let [{:keys [type]} (get-config view-id)
{:keys [background-color bar-style hidden
network-activity-indicator-visible
translucent]}
(case type
:black (styles/status-bar-black)
(styles/status-bar-default))]
(when bar-style
(.setBarStyle ^js react/status-bar-class (clj->js bar-style)) true)
(when (and background-color platform/android?)
(.setBackgroundColor ^js react/status-bar-class (clj->js background-color)))
(when hidden
(.setHidden ^js react/status-bar-class (clj->js hidden)))
(when network-activity-indicator-visible
(.setNetworkActivityIndicatorVisible
^js react/status-bar-class
(clj->js network-activity-indicator-visible)))
(when translucent
(.setTranslucent ^js react/status-bar-class (clj->js translucent)))))

View File

@ -1,126 +1,25 @@
(ns status-im.ui.components.tabbar.core
(:require [oops.core :refer [oget]]
[quo.gesture-handler :as gesture-handler]
[re-frame.core :as re-frame]
[reagent.core :as reagent]
[cljs-bean.core :refer [bean]]
[status-im.i18n.i18n :as i18n]
[quo.components.safe-area :as safe-area]
[status-im.ui.screens.routing.core :as navigation]
[quo.animated :as animated]
[quo.react-native :as rn]
[status-im.ui.components.badge :as badge]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.components.react :as react]
[status-im.ui.components.tabbar.styles :as tabs.styles]
(:require [re-frame.core :as re-frame]
[status-im.utils.platform :as platform]))
(defn main-tab? [view-id]
(contains?
#{:chat-stack :browser-stack :wallet-stack :profile-stack :status-stack
:status :home :wallet :empty-tab :my-profile :wallet-onboarding-setup}
view-id))
(defn get-height []
(if platform/android?
56
(if platform/iphone-x?
84
50)))
(def tabs-list-data
(->>
[{:nav-stack :chat-stack
:content {:title (i18n/label :t/chat)
:icon :main-icons/message}
:count-subscription :chats/unread-messages-number
:accessibility-label :home-tab-button}
{:nav-stack :browser-stack
:content {:title (i18n/label :t/browser)
:icon :main-icons/browser}
:accessibility-label :dapp-tab-button}
{:nav-stack :wallet-stack
:content {:title (i18n/label :t/wallet)
:icon :main-icons/wallet}
:accessibility-label :wallet-tab-button}
{:nav-stack :status-stack
:content {:title (i18n/label :t/status)
:icon :main-icons/status}
:accessibility-label :status-tab-button}
{:nav-stack :profile-stack
:content {:title (i18n/label :t/profile)
:icon :main-icons/user-profile}
:count-subscription :get-profile-unread-messages-number
:accessibility-label :profile-tab-button}]
(remove nil?)
(map-indexed vector)))
(defn chat-tab []
(let [count-subscription @(re-frame/subscribe [:chats/unread-messages-number])]
(re-frame/dispatch [:change-tab-count :chat count-subscription])
nil))
(defn tab []
(fn [{:keys [icon label active? nav-stack on-press
accessibility-label count-subscription]}]
(let [count (when count-subscription @(re-frame/subscribe [count-subscription]))]
[react/view {:style tabs.styles/touchable-container}
[gesture-handler/touchable-without-feedback
{:style {:height "100%"
:width "100%"}
:on-press on-press
:accessibility-label accessibility-label}
[react/view {:style tabs.styles/tab-container}
[react/view {:style tabs.styles/icon-container}
[icons/icon icon (tabs.styles/icon active?)]
(when count
(cond
(or (pos? count) (pos? (:other count)))
[react/view {:style (if (= nav-stack :chat-stack)
tabs.styles/message-counter
tabs.styles/counter)}
[badge/message-counter (or (:other count) count) true]]
(pos? (:public count))
[react/view {:style (tabs.styles/counter-public-container)}
[react/view {:style tabs.styles/counter-public
:accessibility-label :public-unread-badge}]]))]
[react/view {:style tabs.styles/tab-title-container}
[react/text {:style (tabs.styles/tab-title active?)}
label]]]]])))
(defn profile-tab []
(let [count-subscription @(re-frame/subscribe [:get-profile-unread-messages-number])]
(re-frame/dispatch [:change-tab-count :profile count-subscription])
nil))
(def tabs
(reagent/adapt-react-class
(fn [props]
(let [{:keys [navigate index route popToTop]} (bean props)
{:keys [keyboard-shown]
:or {keyboard-shown false}} (when platform/android? (rn/use-keyboard))
{:keys [bottom]} (safe-area/use-safe-area)
animated-visible (animated/use-timing-transition
(main-tab? (keyword route))
{:duration 150})
keyboard-visible (animated/use-timing-transition
keyboard-shown
{:duration 200})]
(reagent/as-element
[animated/view {:style (tabs.styles/tabs-wrapper keyboard-shown keyboard-visible)
:pointer-events (if keyboard-shown "none" "auto")}
[animated/view {:style (tabs.styles/space-handler bottom)
:pointer-events "none"}]
[animated/view {:style (tabs.styles/animated-container animated-visible bottom)}
(for [[route-index
{:keys [nav-stack accessibility-label count-subscription content]}]
tabs-list-data
:let [{:keys [icon title]} content]]
^{:key nav-stack}
[tab
{:icon icon
:label title
:on-press #(if (= (str index) (str route-index))
(popToTop)
(navigate (name nav-stack)))
:accessibility-label accessibility-label
:count-subscription count-subscription
:active? (= (str index) (str route-index))
:nav-stack nav-stack}])]
[react/view
{:style (tabs.styles/ios-titles-cover bottom)}]])))))
(defn tabbar [props]
(let [navigate (oget props "navigation" "navigate")
pop-to-top (oget props "navigation" "popToTop")
state (bean (oget props "state"))
index (get state :index)]
(reagent/as-element
[tabs {:navigate navigate
:state (oget props "state")
:popToTop pop-to-top
:route (navigation/get-active-route-name state)
:index index}])))
(defn tabs-counts-subscriptions []
[:<>
[chat-tab]
[profile-tab]])

View File

@ -1,116 +0,0 @@
(ns status-im.ui.components.tabbar.styles
(:require [quo.animated :as animated]
[status-im.ui.components.colors :as colors]
[status-im.utils.platform :as platform]))
(def tabs-height 52)
(def minimized-tabs-height 36)
(def tabs-diff (- tabs-height minimized-tabs-height))
(def counter
{:right 0
:top 0
:position :absolute})
(defn counter-public-container []
{:right 2
:top 0
:position :absolute
:border-radius 8
:width 16
:height 16
:justify-content :center
:align-items :center
:background-color colors/white})
(def counter-public
{:background-color colors/blue
:width 12
:border-radius 6
:height 12})
;; NOTE: Extra padding to allow badge width to be up to 42 (in case of 99+)
;; 42 Max allowed width, 24 icon width as per spec, 16 left pos as per spec.
(def ^:private message-counter-left (+ (/ (- 42 24) 2) 16))
(def message-counter
{:left message-counter-left
:bottom 6
:position :absolute})
(def touchable-container
{:flex 1
:height tabs-height})
(def tab-container
{:flex 1
:height tabs-height
:align-items :center
:padding-top 6
:padding-bottom 5})
(def icon-container
{:height 24
:width 42
:align-items :center
:justify-content :center})
(defn icon [active?]
{:color (if active? colors/blue colors/gray)
:height 24
:width 24})
(def tab-title-container
{:align-self :stretch
:height 13
:margin-top 4
:align-items :center
:justify-content :center})
(defn tab-title [active?]
{:color (if active? colors/blue colors/gray)
:line-height 13
:font-size 11})
(defn animated-container [visible? inset]
(merge
{:flex-direction :row
:background-color colors/white
:position :absolute
:left 0
:right 0
:height tabs-height
:bottom inset
:transform [{:translateY (animated/mix visible? tabs-diff 0)}]}
(if platform/android?
{:border-top-width 1
:border-top-color colors/gray-lighter}
{:shadow-radius 4
:shadow-offset {:width 0 :height -5}
:shadow-opacity 0.3
:shadow-color (if (colors/dark?)
"rgba(0, 0, 0, 0.75)"
"rgba(0, 9, 26, 0.12)")})))
(defn ios-titles-cover [inset]
{:background-color colors/white
:position :absolute
:height tabs-diff
:align-self :stretch
:bottom (- inset tabs-diff)
:right 0
:left 0})
(defn tabs-wrapper [keyboard visible]
(merge {:padding-horizontal 8
:left 0
:right 0
:bottom 0
:transform [{:translateY (animated/mix visible 0 tabs-height)}]}
(when keyboard
{:position :absolute})))
(defn space-handler [inset]
{:height (+ inset minimized-tabs-height)})

View File

@ -5,40 +5,37 @@
[status-im.ui.components.copyable-text :as copyable-text]
[status-im.ui.components.icons.icons :as icons]
[quo.core :as quo]
[status-im.ui.components.react :as react]
[status-im.ui.components.topbar :as topbar])
[status-im.ui.components.react :as react])
(:require-macros [status-im.utils.views :as views]))
(views/defview about-app []
(views/letsubs [app-version [:get-app-short-version]
node-version [:get-app-node-version]]
[react/view {:flex 1 :background-color colors/white}
[topbar/topbar {:title (i18n/label :t/about-app)}]
[react/scroll-view
[react/scroll-view
[quo/list-item
{:size :small
:title (i18n/label :t/privacy-policy)
:accessibility-label :privacy-policy
:on-press
#(re-frame/dispatch
[:privacy-policy/privacy-policy-button-pressed])
:chevron true}]
[copyable-text/copyable-text-view
{:copied-text app-version}
[quo/list-item
{:size :small
:title (i18n/label :t/privacy-policy)
:accessibility-label :privacy-policy
:on-press
#(re-frame/dispatch
[:privacy-policy/privacy-policy-button-pressed])
:chevron true}]
[copyable-text/copyable-text-view
{:copied-text app-version}
[quo/list-item
{:size :small
:accessibility-label :app-version
:title (i18n/label :t/version)
:accessory :text
:accessory-text app-version}]]
[copyable-text/copyable-text-view
{:copied-text node-version}
[quo/list-item
{:size :small
:accessibility-label :node-version
:title (i18n/label :t/node-version)
:accessory :text
:accessory-text node-version}]]]]))
:accessibility-label :app-version
:title (i18n/label :t/version)
:accessory :text
:accessory-text app-version}]]
[copyable-text/copyable-text-view
{:copied-text node-version}
[quo/list-item
{:size :small
:accessibility-label :node-version
:title (i18n/label :t/node-version)
:accessory :text
:accessory-text node-version}]]]))
(views/defview learn-more-sheet []
(views/letsubs [{:keys [title content]} [:bottom-sheet/options]]

View File

@ -6,7 +6,6 @@
[status-im.ui.components.colors :as colors]
[status-im.ui.components.react :as react]
[quo.core :as quo]
[status-im.ui.components.topbar :as topbar]
[status-im.add-new.db :as db]
[status-im.chat.models :as chat.models]
[status-im.ui.components.icons.icons :as icons])
@ -80,31 +79,28 @@
(views/defview new-public-chat []
(views/letsubs [topic [:public-group-topic]
error [:public-chat.new/topic-error-message]]
[react/view {:style {:flex 1}}
[topbar/topbar {:title (i18n/label :t/new-public-group-chat)
:modal? true}]
[react/scroll-view {:style {:flex 1}}
[react/view {:padding-horizontal 16}
[react/view {:align-items :center :padding-vertical 8}
[react/image {:source (:new-chat-header resources/ui)
:style {:width 160 :height 160}}]]
[react/text {:style {:text-align :center :margin-bottom 16 :line-height 22}}
(i18n/label :t/public-chat-description)]
[chat-name-input topic error]]
[react/view {:margin-top 32}
(for [[section chats] (chat.models/chats)]
^{:key section}
[react/view
[react/view {:margin-right 16 :padding-left 16 :padding-vertical 3
:border-bottom-width 1 :border-bottom-color colors/gray-lighter
:border-top-width 1 :border-top-color colors/gray-lighter
:border-right-width 1 :border-right-color colors/gray-lighter
:border-bottom-right-radius 14 :border-top-right-radius 14}
[quo/text {:weight :medium} section]]
[react/view {:flex-direction :row :flex-wrap :wrap :margin-vertical 8 :padding-horizontal 16}
(let [lang-topic (get-language-topic)
chats (if (and (= section-featured section) lang-topic)
(conj chats lang-topic)
chats)]
(for [chat chats]
(render-topic chat)))]])]]]))
[react/scroll-view {:style {:flex 1}}
[react/view {:padding-horizontal 16}
[react/view {:align-items :center :padding-vertical 8}
[react/image {:source (:new-chat-header resources/ui)
:style {:width 160 :height 160}}]]
[react/text {:style {:text-align :center :margin-bottom 16 :line-height 22}}
(i18n/label :t/public-chat-description)]
[chat-name-input topic error]]
[react/view {:margin-top 32}
(for [[section chats] (chat.models/chats)]
^{:key section}
[react/view
[react/view {:margin-right 16 :padding-left 16 :padding-vertical 3
:border-bottom-width 1 :border-bottom-color colors/gray-lighter
:border-top-width 1 :border-top-color colors/gray-lighter
:border-right-width 1 :border-right-color colors/gray-lighter
:border-bottom-right-radius 14 :border-top-right-radius 14}
[quo/text {:weight :medium} section]]
[react/view {:flex-direction :row :flex-wrap :wrap :margin-vertical 8 :padding-horizontal 16}
(let [lang-topic (get-language-topic)
chats (if (and (= section-featured section) lang-topic)
(conj chats lang-topic)
chats)]
(for [chat chats]
(render-topic chat)))]])]]))

View File

@ -4,9 +4,7 @@
[quo.core :as quo]
[status-im.utils.config :as config]
[status-im.utils.platform :as platform]
[status-im.ui.components.list.views :as list]
[status-im.ui.components.react :as react]
[status-im.ui.components.topbar :as topbar])
[status-im.ui.components.list.views :as list])
(:require-macros [status-im.utils.views :as views]))
(defn- normal-mode-settings-data [{:keys [network-name
@ -114,16 +112,14 @@
communities-enabled? [:communities/enabled?]
current-log-level [:log-level/current-log-level]
current-fleet [:fleets/current-fleet]]
[react/view {:flex 1}
[topbar/topbar {:title (i18n/label :t/advanced)}]
[list/flat-list
{:data (flat-list-data
{:network-name network-name
:current-log-level current-log-level
:communities-enabled? communities-enabled?
:current-fleet current-fleet
:dev-mode? false
:waku-bloom-filter-mode waku-bloom-filter-mode
:webview-debug webview-debug})
:key-fn (fn [_ i] (str i))
:render-fn render-item}]]))
[list/flat-list
{:data (flat-list-data
{:network-name network-name
:current-log-level current-log-level
:communities-enabled? communities-enabled?
:current-fleet current-fleet
:dev-mode? false
:waku-bloom-filter-mode waku-bloom-filter-mode
:webview-debug webview-debug})
:key-fn (fn [_ i] (str i))
:render-fn render-item}]))

View File

@ -2,7 +2,6 @@
(:require-macros [status-im.utils.views :as views])
(:require [re-frame.core :as re-frame]
[status-im.ui.components.react :as react]
[status-im.ui.components.topbar :as topbar]
[status-im.react-native.resources :as resources]
[quo.core :as quo]
[status-im.ui.components.colors :as colors]
@ -15,7 +14,10 @@
(defn button [label icon theme selected?]
[react/touchable-highlight
{:on-press #(re-frame/dispatch [:multiaccounts.ui/appearance-switched theme])}
{:on-press #(do (re-frame/dispatch [:multiaccounts.ui/appearance-switched theme])
(re-frame/dispatch [:init-root :chat-stack])
(re-frame/dispatch [:navigate-change-tab :profile])
(re-frame/dispatch [:navigate-to :appearance]))}
[react/view (merge {:align-items :center :padding 8 :border-radius 20}
(when selected?
{:background-color colors/blue-light}))
@ -25,8 +27,7 @@
(views/defview appearance []
(views/letsubs [{:keys [appearance profile-pictures-visibility]} [:multiaccount]]
[react/view {:flex 1}
[topbar/topbar {:title (i18n/label :t/appearance)}]
[:<>
[quo/list-header (i18n/label :t/preference)]
[react/view {:flex-direction :row :padding-horizontal 8
:justify-content :space-between :margin-vertical 16}
@ -51,9 +52,7 @@
(views/defview profile-pic []
(views/letsubs [{:keys [profile-pictures-visibility]} [:multiaccount]]
[react/view {:flex 1}
[topbar/topbar {:title (i18n/label :t/show-profile-pictures)}]
[react/view {:margin-top 8}
[radio-item constants/profile-pictures-visibility-everyone profile-pictures-visibility]
[radio-item constants/profile-pictures-visibility-contacts-only profile-pictures-visibility]
[radio-item constants/profile-pictures-visibility-none profile-pictures-visibility]]]))
[react/view {:margin-top 8}
[radio-item constants/profile-pictures-visibility-everyone profile-pictures-visibility]
[radio-item constants/profile-pictures-visibility-contacts-only profile-pictures-visibility]
[radio-item constants/profile-pictures-visibility-none profile-pictures-visibility]]))

View File

@ -28,7 +28,8 @@
name (get-in manage-bootnode [:name :value])
is-valid? (empty? validation-errors)
invalid-url? (contains? validation-errors :url)]
[react/keyboard-avoiding-view {:flex 1}
[react/keyboard-avoiding-view {:style {:flex 1}
:ignore-offset true}
[topbar/topbar {:title (i18n/label (if id :t/bootnode-details :t/add-bootnode))}]
[react/scroll-view {:keyboard-should-persist-taps :handled}
[react/view styles/edit-bootnode-view

View File

@ -23,7 +23,7 @@
(views/defview bootnodes-settings []
(views/letsubs [bootnodes-enabled [:custom-bootnodes/enabled?]
bootnodes [:custom-bootnodes/network-bootnodes]]
[react/view {:flex 1}
[:<>
[topbar/topbar {:title (i18n/label :t/bootnodes-settings)
:right-accessories
[{:icon :main-icons/add

View File

@ -42,7 +42,7 @@
:title (i18n/label :t/edit)
:accessibility-label :edit-bookmark
:icon :main-icons/edit
:on-press #(hide-sheet-and-dispatch [:navigate-to :new-bookmark bookmark])}]
:on-press #(hide-sheet-and-dispatch [:open-modal :new-bookmark bookmark])}]
[quo/list-item
{:theme :negative
:title (i18n/label :t/delete)
@ -112,7 +112,8 @@
dapps-account [:dapps-account]
url-text (atom nil)]
(let [bookmarks (vals bookmarks)]
[react/keyboard-avoiding-view {:style {:flex 1}}
[react/keyboard-avoiding-view {:style {:flex 1}
:ignore-offset true}
[quo/text-input {:on-change-text #(reset! url-text %)
:on-submit-editing #(re-frame/dispatch [:browser.ui/open-url @url-text])
:placeholder (i18n/label :t/enter-url)

View File

@ -76,7 +76,10 @@
:accessibility-label :open-chat
:title (str "#" topic)
:subtitle (i18n/label :t/open-chat)
:on-press #(hide-sheet-and-dispatch [:chat.ui/start-public-chat topic {:navigation-reset? true}])
:on-press #(do
(re-frame/dispatch [:navigate-change-tab :chat])
(re-frame/dispatch [:pop-to-root-tab :chat-stack])
(hide-sheet-and-dispatch [:chat.ui/start-public-chat topic {:navigation-reset? true}]))
:chevron true}]
[components/separator]])
(if connected?

View File

@ -89,10 +89,7 @@
[chat-icon/custom-icon-view-list (:name dapps-account) (:color dapps-account) 32]]
[react/touchable-highlight
{:on-press #(do
(when empty-tab
(re-frame/dispatch [:navigate-to :browser]))
(re-frame/dispatch [:navigate-to :browser-tabs]))
{:on-press #(re-frame/dispatch [:set-stack-root :browser-stack :browser-tabs])
:accessibility-label :browser-open-tabs}
[icons/icon :main-icons/tabs]]

View File

@ -4,13 +4,12 @@
[cljs-bean.core :as bean]
[quo.design-system.colors :as colors]
[status-im.ui.screens.chat.components.hooks :refer [use-keyboard-dimension]]
[status-im.ui.components.tabbar.styles :as tabs.styles]
[quo.react :as react]
[quo.platform :as platform]
[quo.react-native :as rn]
[status-im.ui.components.tabbar.core :as tabbar]
[quo.components.safe-area :refer [use-safe-area]]))
(def tabbar-height tabs.styles/minimized-tabs-height)
(def duration 250)
(defn create-pan-responder [y pan-active]
@ -52,8 +51,8 @@
visible (or has-panel (pos? keyboard-height))
anim-visible (animated/use-value visible)
kb-on-screen (if platform/android? 0 (* -1 (- keyboard-height bottom tabbar-height)))
panel-on-screen (* -1 (- keyboard-max-height bottom tabbar-height))
kb-on-screen (if platform/android? 0 (* -1 (- keyboard-height bottom (tabbar/get-height))))
panel-on-screen (* -1 (- keyboard-max-height bottom (tabbar/get-height)))
max-delta (min 0 (if has-panel panel-on-screen kb-on-screen))
panel-height (* -1 max-delta)
end-position (- keyboard-end-position (when has-panel keyboard-max-height))
@ -117,7 +116,7 @@
bar-height :height} (rn/use-layout)
visible has-panel
panel-on-screen (* -1 (- keyboard-max-height bottom tabbar-height))
panel-on-screen (* -1 (- keyboard-max-height bottom (tabbar/get-height)))
max-delta (min 0 (if has-panel panel-on-screen 0))
panel-height (* -1 max-delta)
on-update (fn []

View File

@ -59,7 +59,7 @@
:style {:margin-top 2}}
(i18n/label :t/once-enabled-share-metadata)]]
[quo/separator]
[quo/button {:on-press #(re-frame/dispatch [:navigate-to :link-preview-settings])
[quo/button {:on-press #(re-frame/dispatch [:open-modal :link-preview-settings])
:type :secondary}
(i18n/label :enable)]
[quo/separator]

View File

@ -50,6 +50,3 @@
(when (and group-chat (not invitation-admin) (not= chat-type constants/community-chat-type))
[group-last-activity {:contacts contacts
:public? public?}])]]))
(defn toolbar-content-view []
[toolbar-content-view-inner @(re-frame/subscribe [:chats/current-chat])])

View File

@ -8,7 +8,6 @@
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.components.list.views :as list]
[status-im.ui.components.react :as react]
[status-im.ui.screens.chat.sheets :as sheets]
[quo.animated :as animated]
[quo.react-native :as rn]
[status-im.ui.screens.chat.audio-message.views :as audio-message]
@ -32,27 +31,7 @@
[status-im.constants :as constants]
[status-im.utils.platform :as platform]
[status-im.utils.utils :as utils]
[quo.design-system.colors :as quo.colors]))
(defn topbar []
;;we don't use topbar component, because we want chat view as simple (fast) as possible
[react/view {:height 56 :border-bottom-width 1 :border-bottom-color (:ui-01 @quo.colors/theme)}
[react/touchable-highlight {:on-press-in #(re-frame/dispatch [:navigate-back])
:accessibility-label :back-button
:style {:height 56 :width 40 :align-items :center :justify-content :center
:padding-left 16}}
[icons/icon :main-icons/arrow-left]]
[react/view {:flex 1 :left 52 :right 52 :top 0 :bottom 0 :position :absolute}
[toolbar-content/toolbar-content-view]]
[react/touchable-highlight {:on-press-in #(re-frame/dispatch [:bottom-sheet/show-sheet
{:content (fn []
[sheets/current-chat-actions])
:height 256}])
:accessibility-label :chat-menu-button
:style {:right 0 :top 0 :bottom 0 :position :absolute
:height 56 :width 40 :align-items :center :justify-content :center
:padding-right 16}}
[icons/icon :main-icons/more]]])
[status-im.ui.screens.chat.sheets :as sheets]))
(defn invitation-requests [chat-id admins]
(let [current-pk @(re-frame/subscribe [:multiaccount/public-key])
@ -320,8 +299,18 @@
:inverted (when platform/ios? true)
:style (when platform/android? {:scaleY -1})})]))
(defn topbar-button []
(re-frame/dispatch [:bottom-sheet/show-sheet
{:content (fn []
[sheets/current-chat-actions])
:height 256}]))
(defn topbar []
[toolbar-content/toolbar-content-view-inner @(re-frame/subscribe [:chats/current-chat])])
(defn chat []
(let [bottom-space (reagent/atom 0)
(let [curr-chat-id (:chat-id @(re-frame/subscribe [:chats/current-chat-chat-view]))
bottom-space (reagent/atom 0)
panel-space (reagent/atom 52)
active-panel (reagent/atom nil)
position-y (animated/value 0)
@ -333,7 +322,8 @@
set-active-panel (get-set-active-panel active-panel)
on-close #(set-active-panel nil)]
(reagent/create-class
{:component-will-unmount #(re-frame/dispatch-sync [:close-chat])
{:component-will-unmount #(re-frame/dispatch-sync [:close-chat curr-chat-id])
:component-did-mount (fn [] (js/setTimeout #(re-frame/dispatch [:set :ignore-close-chat false]) 200))
:reagent-render
(fn []
(let [{:keys [chat-id show-input? group-chat admins invitation-admin] :as chat}
@ -341,7 +331,6 @@
@(re-frame/subscribe [:chats/current-chat-chat-view])
max-bottom-space (max @bottom-space @panel-space)]
[:<>
[topbar]
[connectivity/loading-indicator]
(when chat-id
(if group-chat

View File

@ -6,8 +6,8 @@
[clojure.string :as string]
[status-im.communities.core :as communities]))
(defn view [route]
(let [chat-id (get-in route [:route :params :chat-id])
(defn view []
(let [{:keys [chat-id]} (<sub [:get-screen-params])
current-chat (<sub [:chat-by-id chat-id])
{:keys [chat-name color description community-id]} current-chat
{:keys [admin]} (<sub [:communities/community community-id])]

View File

@ -194,8 +194,8 @@
[topbar/topbar {:title (i18n/label :t/not-found)}]
[blank-page (i18n/label :t/community-info-not-found)]])
(defn community [route]
(let [{:keys [community-id]} (get-in route [:route :params])
(defn community []
(let [{:keys [community-id]} (<sub [:get-screen-params])
{:keys [id chats name images members permissions color joined can-request-access?
can-join? requested-to-join-at admin]
:as community} (<sub [:communities/community community-id])]

View File

@ -6,7 +6,6 @@
[status-im.utils.handlers :refer [>evt <sub]]
[status-im.communities.core :as communities]
[status-im.ui.components.toolbar :as toolbar]
[status-im.ui.components.topbar :as topbar]
[status-im.utils.image :as utils.image]
[quo.design-system.colors :as colors]
[status-im.ui.components.react :as react]
@ -161,8 +160,7 @@
(defn view []
(let [{:keys [name description]} (<sub [:communities/create])]
[rn/view {:style {:flex 1}}
[topbar/topbar {:title (i18n/label :t/new-community-title)}]
[:<>
[form]
[toolbar/toolbar
{:show-border? true

View File

@ -5,7 +5,6 @@
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.toolbar :as toolbar]
[status-im.communities.core :as communities]
[status-im.ui.components.topbar :as topbar]
[status-im.utils.debounce :as debounce]
[status-im.utils.handlers :refer [>evt <sub]]
[status-im.ui.screens.communities.create :as create]))
@ -46,7 +45,6 @@
(defn view []
(let [{:keys [name description]} (<sub [:communities/create-channel])]
[:<>
[topbar/topbar {:title (i18n/label :t/create-channel-title)}]
[form]
[toolbar/toolbar
{:show-border? true

View File

@ -1,6 +1,5 @@
(ns status-im.ui.screens.communities.edit
(:require [status-im.ui.components.topbar :as topbar]
[quo.core :as quo]
(:require [quo.core :as quo]
[status-im.i18n.i18n :as i18n]
[status-im.ui.screens.communities.create :as community.create]
[status-im.utils.handlers :refer [>evt <sub]]
@ -10,7 +9,6 @@
(defn edit []
(let [{:keys [name description]} (<sub [:communities/create])]
[:<>
[topbar/topbar {:title (i18n/label :t/community-edit-title)}]
[community.create/form]
[toolbar/toolbar
{:show-border? true

View File

@ -5,14 +5,12 @@
[status-im.i18n.i18n :as i18n]
[status-im.utils.handlers :refer [>evt]]
[status-im.communities.core :as communities]
[status-im.ui.components.topbar :as topbar]
[status-im.ui.components.toolbar :as toolbar]))
(defn view []
(let [community-key (reagent/atom "")]
(fn []
[rn/view {:style {:flex 1}}
[topbar/topbar {:title (i18n/label :t/import-community-title)}]
[:<>
[rn/scroll-view {:style {:flex 1}
:content-container-style {:padding 16}}
[rn/view {:style {:padding-bottom 16

View File

@ -42,9 +42,9 @@
(defn invite []
(let [user-pk (reagent/atom "")
contacts-selected (reagent/atom #{})]
(fn [route]
(fn []
(let [contacts-data (<sub [:contacts/active])
invite? (get-in route [:route :params :invite?])
{:keys [invite?]} (<sub [:get-screen-params])
{:keys [permissions
can-manage-users?]} (<sub [:communities/edited-community])
selected @contacts-selected

View File

@ -85,8 +85,8 @@
:title (i18n/label :t/membership-requests)}]
[quo/separator {:style {:margin-vertical 8}}]]))
(defn members [route]
(let [{:keys [community-id]} (get-in route [:route :params])
(defn members []
(let [{:keys [community-id]} (<sub [:get-screen-params])
my-public-key (<sub [:multiaccount/public-key])
{:keys [members
permissions
@ -108,9 +108,9 @@
:key-fn identity
:render-fn render-member}]]))
(defn members-container [route]
(defn members-container []
(reagent/create-class
{:display-name "community-members-view"
:component-did-mount (fn []
(communities/fetch-requests-to-join! (get-in route [:route :params :community-id])))
(communities/fetch-requests-to-join! (get (<sub [:get-screen-params]) :community-id)))
:reagent-render members}))

View File

@ -1,6 +1,5 @@
(ns status-im.ui.screens.communities.membership
(:require [quo.react-native :as rn]
[status-im.ui.components.topbar :as topbar]
[status-im.ui.components.toolbar :as toolbar]
[quo.core :as quo]
[status-im.i18n.i18n :as i18n]
@ -36,7 +35,6 @@
(defn membership []
(let [{:keys [membership]} (<sub [:communities/create])]
[:<>
[topbar/topbar {:title (i18n/label :t/membership-title)}]
[rn/scroll-view {}
(doall
(for [[id o] options]

View File

@ -14,8 +14,8 @@
[quo.react-native :as rn]
[clojure.string :as string]))
(defn management [route]
(let [{:keys [community-id]} (get-in route [:route :params])
(defn management []
(let [{:keys [community-id]} (<sub [:get-screen-params])
requests-to-join (<sub [:communities/requests-to-join-for-community community-id])
community (<sub [:communities/community community-id])
{:keys [color members permissions description name admin]} community
@ -98,9 +98,9 @@
:title (i18n/label :t/delete)
:on-press #(>evt [::communities/delete-community community-id])}])]]]))
(defn management-container [route]
(defn management-container []
(reagent/create-class
{:display-name "community-profile-view"
:component-did-mount (fn []
(communities/fetch-requests-to-join! (get-in route [:route :params :community-id])))
(communities/fetch-requests-to-join! (get (<sub [:get-screen-params]) :community-id)))
:reagent-render management}))

View File

@ -42,9 +42,9 @@
:icon [chat-icon/contact-icon-contacts-tab
(multiaccounts/displayed-photo member)]}]))
(defn requests-to-join [route]
(defn requests-to-join []
(fn []
(let [{:keys [community-id]} (get-in route [:route :params])
(let [{:keys [community-id]} (<sub [:get-screen-params])
requests (<sub [:communities/requests-to-join-for-community community-id])
{:keys [can-manage-users?]} (<sub [:communities/community community-id])]
[:<>
@ -56,9 +56,9 @@
:key-fn :id
:render-fn render-request}]])))
(defn requests-to-join-container [route]
(defn requests-to-join-container []
(reagent/create-class
{:display-name "community-requests-to-join-view"
:component-did-mount (fn []
(communities/fetch-requests-to-join! (get-in route [:route :params :community-id])))
(communities/fetch-requests-to-join! (get (<sub [:get-screen-params]) :community-id)))
:reagent-render requests-to-join}))

View File

@ -122,9 +122,8 @@
(defn communities []
(let [communities (<sub [:communities/section-list])
communities-enabled? (<sub [:communities/enabled?])]
[react/view {:flex 1}
[topbar/topbar (cond-> {:title (i18n/label :t/communities)
:modal? true}
[:<>
[topbar/topbar (cond-> {:title (i18n/label :t/communities)}
communities-enabled?
(assoc :right-accessories [{:icon :main-icons/more
:accessibility-label :chat-menu-button

View File

@ -7,8 +7,7 @@
[status-im.ui.components.chat-icon.screen :as chat-icon.screen]
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.invite.views :as invite]
[quo.core :as quo]
[status-im.ui.components.topbar :as topbar])
[quo.core :as quo])
(:require-macros [status-im.utils.views :refer [defview letsubs]]))
(defn contacts-list-item [{:keys [public-key] :as contact}]
@ -27,49 +26,42 @@
:theme :accent
:title (i18n/label :t/add-new-contact)
:accessibility-label :add-new-contact-button
:on-press #(re-frame/dispatch [:navigate-to :new-contact])}])
:on-press #(re-frame/dispatch [:open-modal :new-contact])}])
(defview contacts-list []
(letsubs [blocked-contacts-count [:contacts/blocked-count]
contacts [:contacts/active]]
[react/view {:flex 1}
[topbar/topbar {:title (i18n/label :t/contacts)}]
[react/scroll-view {:flex 1}
[add-new-contact]
(when (pos? blocked-contacts-count)
[react/view {:margin-vertical 16}
[quo/list-item
{:title (i18n/label :t/blocked-users)
:icon :main-icons/cancel
:theme :negative
:accessibility-label :blocked-users-list-button
:chevron true
:accessory :text
:accessory-text blocked-contacts-count
:on-press #(re-frame/dispatch [:navigate-to :blocked-users-list])}]])
(if (seq contacts)
[list.views/flat-list
{:data contacts
:key-fn :address
:render-fn contacts-list-item}]
[react/view {:align-items :center
:flex 1
:justify-content :center}
[react/text {:style {:color colors/gray :margin-vertical 24}}
(i18n/label :t/you-dont-have-contacts)]
[invite/button]])]]))
[react/scroll-view {:flex 1}
[add-new-contact]
(when (pos? blocked-contacts-count)
[react/view {:margin-vertical 16}
[quo/list-item
{:title (i18n/label :t/blocked-users)
:icon :main-icons/cancel
:theme :negative
:accessibility-label :blocked-users-list-button
:chevron true
:accessory :text
:accessory-text blocked-contacts-count
:on-press #(re-frame/dispatch [:navigate-to :blocked-users-list])}]])
(if (seq contacts)
[list.views/flat-list
{:data contacts
:key-fn :address
:render-fn contacts-list-item}]
[react/view {:align-items :center
:flex 1
:justify-content :center}
[react/text {:style {:color colors/gray :margin-vertical 24}}
(i18n/label :t/you-dont-have-contacts)]
[invite/button]])]))
(defview blocked-users-list []
(letsubs [blocked-contacts [:contacts/blocked]]
[react/view {:flex 1
:background-color colors/white}
[topbar/topbar {:title (i18n/label :t/blocked-users)}]
[react/scroll-view {:style {:background-color colors/white
:padding-vertical 8}}
[list.views/flat-list
{:data blocked-contacts
:key-fn :address
:render-fn contacts-list-item
:default-separator? true
:enableEmptySections true
:keyboardShouldPersistTaps :always}]]]))
[list.views/flat-list
{:data blocked-contacts
:key-fn :address
:render-fn contacts-list-item
:default-separator? true
:enableEmptySections true
:keyboardShouldPersistTaps :always}]))

View File

@ -2,12 +2,10 @@
(:require-macros [status-im.utils.views :as views])
(:require [re-frame.core :as re-frame]
[reagent.core :as reagent]
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.react :as react]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.components.list.views :as list]
[status-im.ui.screens.currency-settings.styles :as styles]
[status-im.ui.components.topbar :as topbar]
[status-im.ui.components.search-input.view :as search-input]))
(defonce search-active? (reagent/atom false))
@ -29,8 +27,7 @@
{:component-will-unmount #(do
(re-frame/dispatch [:search/currency-filter-changed nil])
(reset! search-active? false))}
[react/view {:flex 1}
[topbar/topbar {:title (i18n/label :t/main-currency)}]
[:<>
[react/view {:flex 1}
[react/view {:padding-horizontal 16
:padding-vertical 10}

View File

@ -33,17 +33,15 @@
(views/defview dapps-permissions []
(views/letsubs [permissions [:dapps/permissions]]
[react/view {:flex 1 :background-color colors/white}
[topbar/topbar {:title (i18n/label :t/dapps-permissions)}]
[list/flat-list
{:data (vec (map prepare-items (vals permissions)))
:key-fn (fn [_ i] (str i))
:render-fn quo/list-item}]]))
[list/flat-list
{:data (vec (map prepare-items (vals permissions)))
:key-fn (fn [_ i] (str i))
:render-fn quo/list-item}]))
(views/defview manage []
(views/letsubs [{:keys [dapp permissions]} [:get-screen-params]
{:keys [name]} [:dapps-account]]
[react/view {:flex 1 :background-color colors/white}
[:<>
[topbar/topbar {:title dapp}]
[list/flat-list
{:data (vec (map (prepare-items-manage name) permissions))

View File

@ -4,8 +4,7 @@
[status-im.i18n.i18n :as i18n]
[status-im.constants :as constants]
[quo.core :as quo]
[re-frame.core :as re-frame]
[status-im.ui.components.topbar :as topbar]))
[re-frame.core :as re-frame]))
(def titles {constants/one-day (i18n/label :t/one-day)
constants/three-days (i18n/label :t/three-days)
@ -21,10 +20,8 @@
(views/defview default-sync-period-settings []
(views/letsubs [{:keys [default-sync-period]} [:multiaccount]]
[react/view {:flex 1}
[topbar/topbar {:title (i18n/label :t/default-sync-period)}]
[react/view {:margin-top 8}
[radio-item constants/one-day default-sync-period]
[radio-item constants/three-days default-sync-period]
[radio-item constants/one-week default-sync-period]
[radio-item constants/one-month default-sync-period]]]))
[react/view {:margin-top 8}
[radio-item constants/one-day default-sync-period]
[radio-item constants/three-days default-sync-period]
[radio-item constants/one-week default-sync-period]
[radio-item constants/one-month default-sync-period]]))

View File

@ -79,9 +79,6 @@
:main-icons/username)
{:color colors/white-persist}]])
(defn- toolbar []
[topbar/topbar {:title (i18n/label :t/ens-your-username)}])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; SEARCH SCREEN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -207,7 +204,6 @@
(views/letsubs [{:keys [state custom-domain? username]}
[:ens/search-screen]]
[react/keyboard-avoiding-view {:flex 1}
[toolbar]
[react/scroll-view {:style {:flex 1}
;;NOTE required so that switching custom-domain
;;works on first tap and persists keyboard
@ -282,7 +278,6 @@
chain amount-label sufficient-funds?]}
@(re-frame/subscribe [:ens/checkout-screen])]
[react/keyboard-avoiding-view {:flex 1}
[toolbar]
[react/scroll-view {:style {:flex 1}}
[react/view {:style {:flex 1
:align-items :center
@ -381,7 +376,6 @@
(views/defview confirmation []
(views/letsubs [{:keys [state username]} [:ens/confirmation-screen]]
[react/keyboard-avoiding-view {:flex 1}
[toolbar]
[react/view {:style {:flex 1
:align-items :center
:justify-content :center}}
@ -423,7 +417,6 @@
(views/defview terms []
(views/letsubs [{:keys [contract]} [:get-screen-params :ens-terms]]
[react/scroll-view {:style {:flex 1}}
[topbar/topbar {:title (i18n/label :t/ens-terms-registration)}]
[react/view {:style {:height 136 :background-color colors/gray-lighter :justify-content :center :align-items :center}}
[react/text {:style {:text-align :center :typography :header :letter-spacing -0.275}}
(i18n/label :t/ens-terms-header)]]
@ -683,7 +676,6 @@
(views/defview main []
(views/letsubs [{:keys [names multiaccount show? registrations]} [:ens.main/screen]]
[react/keyboard-avoiding-view {:style {:flex 1}}
[topbar/topbar {:title (i18n/label :t/ens-usernames)}]
(if (or (seq names) registrations)
[registered names multiaccount show? registrations]
[welcome])]))

View File

@ -1,11 +1,9 @@
(ns status-im.ui.screens.fleet-settings.views
(:require [re-frame.core :as re-frame]
[status-im.node.core :as node]
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.components.list.views :as list]
[status-im.ui.components.react :as react]
[status-im.ui.components.topbar :as topbar]
[status-im.ui.screens.fleet-settings.styles :as styles])
(:require-macros [status-im.utils.views :as views]))
@ -34,11 +32,8 @@
(views/defview fleet-settings []
(views/letsubs [custom-fleets [:fleets/custom-fleets]
current-fleet [:fleets/current-fleet]]
[react/view {:flex 1}
[topbar/topbar {:title (i18n/label :t/fleet-settings)}]
[react/view styles/wrapper
[list/flat-list {:data (fleets custom-fleets)
:default-separator? false
:key-fn identity
:render-data (name current-fleet)
:render-fn render-row}]]]))
[list/flat-list {:data (fleets custom-fleets)
:default-separator? false
:key-fn identity
:render-data (name current-fleet)
:render-fn render-row}]))

Some files were not shown because too many files have changed in this diff Show More