diff --git a/android/app/src/main/java/im/status/ethereum/MainActivity.java b/android/app/src/main/java/im/status/ethereum/MainActivity.java index 1c8ba89b49e..25aad2bce66 100644 --- a/android/app/src/main/java/im/status/ethereum/MainActivity.java +++ b/android/app/src/main/java/im/status/ethereum/MainActivity.java @@ -26,14 +26,14 @@ 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 @@ protected void onDestroy() { 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 void onRequestPermissionsResult(int requestCode, String[] permissions, in mPermissionListener = null; } } - - @Override - protected ReactActivityDelegate createReactActivityDelegate() { - return new ReactActivityDelegate(this, getMainComponentName()) { - @Override - protected ReactRootView createRootView() { - return new RNGestureHandlerEnabledRootView(MainActivity.this); - } - }; - } } diff --git a/android/app/src/main/java/im/status/ethereum/MainApplication.java b/android/app/src/main/java/im/status/ethereum/MainApplication.java index d25c9b9f0e2..b518c524056 100644 --- a/android/app/src/main/java/im/status/ethereum/MainApplication.java +++ b/android/app/src/main/java/im/status/ethereum/MainApplication.java @@ -10,8 +10,9 @@ 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.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 ReactNativeHost getReactNativeHost() { @Override public void onCreate() { super.onCreate(); - SoLoader.init(this, /* native exopackage */ false); + WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG_WEBVIEW == "1"); initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); } diff --git a/android/build.gradle b/android/build.gradle index 33b3d984018..b88317c194a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -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. diff --git a/ios/Podfile b/ios/Podfile index 9014ea08922..8adf9294a8d 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -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' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 05d15d818e6..99196b16220 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -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 diff --git a/ios/StatusIm/AppDelegate.m b/ios/StatusIm/AppDelegate.m index 05fd93b432f..e173d553887 100644 --- a/ios/StatusIm/AppDelegate.m +++ b/ios/StatusIm/AppDelegate.m @@ -8,6 +8,7 @@ */ #import "AppDelegate.h" +#import #import #import "ReactNativeConfig.h" @@ -18,7 +19,6 @@ #import #import -#import #import #import @@ -77,21 +77,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( 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]; - - 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]; + [ReactNativeNavigation bootstrapWithDelegate:self launchOptions:launchOptions]; + [RNSplashScreen show]; UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; @@ -116,6 +103,10 @@ - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserAct restorationHandler:restorationHandler]; } +- (NSArray> *)extraModulesForBridge:(RCTBridge *)bridge { + return [ReactNativeNavigation extraModulesForBridge:bridge]; +} + - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG diff --git a/ios/StatusIm/Info.plist b/ios/StatusIm/Info.plist index d5fff3fa832..37a03a47af2 100644 --- a/ios/StatusIm/Info.plist +++ b/ios/StatusIm/Info.plist @@ -126,7 +126,7 @@ UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance - + com.apple.developer.nfc.readersession.iso7816.select-identifiers A00000080400010101 diff --git a/ios/StatusImPR/Info.plist b/ios/StatusImPR/Info.plist index 5066250e5fb..6d292ddc577 100644 --- a/ios/StatusImPR/Info.plist +++ b/ios/StatusImPR/Info.plist @@ -132,7 +132,7 @@ UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance - + com.apple.developer.nfc.readersession.iso7816.select-identifiers A00000080400010101 diff --git a/nix/deps/gradle/deps.json b/nix/deps/gradle/deps.json index 30de2cf0d39..f6c6da26a25 100644 --- a/nix/deps/gradle/deps.json +++ b/nix/deps/gradle/deps.json @@ -14,16 +14,16 @@ }, { - "path": "androidx/activity/activity/1.1.0/activity-1.1.0", + "path": "androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0", "host": "https://dl.google.com/dl/android/maven2", "type": "aar", "pom": { - "sha1": "c133421ae3bcd7a3c341124b2821223015f0f617", - "sha256": "1h6nhaq5s7hymkdphy9wp5rzpgqrcbsi6yngr9vd2ym5qlgh141n" + "sha1": "ebc8cc79af3841ffa6a44ab02f31df2973c9b916", + "sha256": "0ckp9nqa313gs6qfdx0wj0whnb9qi9q6a2v2mg5xdcgl11kgywvb" }, "jar": { - "sha1": "67c7a207d26ea46621e261ca2295ed2e2d311f8f", - "sha256": "1vv7c06cn6ymzjj3vgwyrva7w0r9igi51qi01iyjy0v8cy8kaasg" + "sha1": "fe9ba8247a591ebf8e16f0cf80af7a2045c981e0", + "sha256": "048bdc778pbghhwfkfyzrdndyhr34kyw5y099r9vmr77d2sx46dj" } }, @@ -111,6 +111,34 @@ } }, + { + "path": "androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "2211657bde99e604557ac3cd44464d390c4c26f1", + "sha256": "1y60r75vl26h02cd54w7lrp1baz2l5mkjv78zn7yyjv6qg7di78l" + }, + "jar": { + "sha1": "ad67e51b92364585bb335177664959001644327a", + "sha256": "1r8g22ixla5f0zfj3w2j1g0snqxf1jzg1b2xs71y2ggz0dy2jw64" + } + }, + + { + "path": "androidx/appcompat/appcompat/1.0.0/appcompat-1.0.0", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "5ce716d352f95b3c0ea0ecf9f579691c1a79410f", + "sha256": "0asdria39qs9hf18wwpm11pp2bqvwzci9pr75lpb4ch8p36kyb10" + }, + "jar": { + "sha1": "155b5a7193b5b87c3ece2ec444c85cd8de2347dd", + "sha256": "1kjndp9mip46205znb028ngi7vrvpkca8698dcrd7jrn43hm8hlr" + } + }, + { "path": "androidx/appcompat/appcompat/1.0.2/appcompat-1.0.2", "host": "https://dl.google.com/dl/android/maven2", @@ -139,6 +167,20 @@ } }, + { + "path": "androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "c599cadd6e3ef8d628737532dcb341704b3a4261", + "sha256": "0hmv5vpzskw4zl99f9nxaggdnfdaq79f6ihn90xqa2dn4glcpcwf" + }, + "jar": { + "sha1": "6487c8711252a8680baaa854247141cc1d2098f4", + "sha256": "0w6a1h11c6v5xd9l3d2kkqrsdvqih00y09i15qr7g9v1bajk289x" + } + }, + { "path": "androidx/arch/core/core-common/2.0.0/core-common-2.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -195,20 +237,6 @@ } }, - { - "path": "androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0", - "host": "https://dl.google.com/dl/android/maven2", - "type": "aar", - "pom": { - "sha1": "a86136badfffa9d668106a80ff4cda9ee9c1cc1b", - "sha256": "0pf0b1ljzrnl8w4jqsvw69rw35xnjaryhp81j21s2b6dc00yvi60" - }, - "jar": { - "sha1": "2df0e03029caae7863ccb4825addaadc8ab6780c", - "sha256": "0ljqfpwcpga5mx1pklvw2550pca6mrdz4bdn27xml9yxsddn2xyx" - } - }, - { "path": "androidx/asynclayoutinflater/asynclayoutinflater/1.0.0/asynclayoutinflater-1.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -265,6 +293,34 @@ } }, + { + "path": "androidx/constraintlayout/constraintlayout-solver/2.0.4/constraintlayout-solver-2.0.4", + "host": "https://dl.google.com/dl/android/maven2", + "type": "jar", + "pom": { + "sha1": "ce642efe9f0d3ebbd1a43630140b3a85029dac20", + "sha256": "15qwbdfmv93qipq04fllpdjgalcn9x9i43z5756f36xg0sqz8cvz" + }, + "jar": { + "sha1": "1f001d7db280a89a6c26b26a66eb064bb6d5efeb", + "sha256": "0ikvaa1kw4djb6hag32khdfabpz93fafz21lav3h34vh91a9z8cw" + } + }, + + { + "path": "androidx/constraintlayout/constraintlayout/2.0.4/constraintlayout-2.0.4", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "5a6761d954eaef83dafd69eddd77df09e59bcd8d", + "sha256": "15za4cgzjcf3axghmnd1r6hbcqijx4ps9pr34p41m15436pdnxvi" + }, + "jar": { + "sha1": "fc11f9c864670e5e2d1b02d2092c8811804f3ec7", + "sha256": "13kk5cw8ka4ch0jjmaqzdcdzl2fs8xzvz8kjkhj49zycl6j7jyih" + } + }, + { "path": "androidx/coordinatorlayout/coordinatorlayout/1.0.0/coordinatorlayout-1.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -293,6 +349,20 @@ } }, + { + "path": "androidx/core/core-ktx/1.3.2/core-ktx-1.3.2", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "9d91b5dbed0585f7ad0922014f8e55f7c4140de1", + "sha256": "1d2s5qadplmk02k3lprbzy9s5v0zg0zpnf88mv5z1ym6q5mq0sms" + }, + "jar": { + "sha1": "8bde75fdd6ee03f8cc3eea96fddd3ef52441bcaa", + "sha256": "1j77mzhxkp57m3w44imi96d3qnxj95k90xjr0hy4gr3gp809cc3q" + } + }, + { "path": "androidx/core/core/1.0.0/core-1.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -349,6 +419,48 @@ } }, + { + "path": "androidx/core/core/1.3.0/core-1.3.0", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "5b07a2d6dcf49b2a3080b5163d9d8f690947c7a6", + "sha256": "1mf29clk2cl6vg4ip4xhf7zdlxgvg7bhdb7pqp2zpn9rn46xd99y" + }, + "jar": { + "sha1": "7b02249f15f9366a6d98dd5d6bf613c34810982e", + "sha256": "0qyvmgfgmffrhxim5xzca7lbc6ia85cwgakwpksdi1aiy4k6csqw" + } + }, + + { + "path": "androidx/core/core/1.3.1/core-1.3.1", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "094f0ae90fc01f22fe2ee64545e280d351d4c3cb", + "sha256": "1yzayk6s11ahacyh9z20z3skqagaafs3k57wsdc7r1yhcx9hz1dc" + }, + "jar": { + "sha1": "33ef11f8b162514f0520ebb7f454664eea7911eb", + "sha256": "1dpgh5gda7ai3vjc89lgjhjs44lxpv8m8sjs80yr92fm6xdacbp9" + } + }, + + { + "path": "androidx/core/core/1.3.2/core-1.3.2", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "f2330ce1c60b69f99d55a498f32c0216807214e5", + "sha256": "0829sc72j8g5ps9yh9p3i8pkcdwf446mh7ym9i0fv0yh9m4ymddg" + }, + "jar": { + "sha1": "18a4755efb834c487bac7062e508465f0c853218", + "sha256": "1s8bvpwdwkgm5j7j7p0bhihszspq2n8ca6iyxzvcyl3rsrn1kpll" + } + }, + { "path": "androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -545,20 +657,6 @@ } }, - { - "path": "androidx/fragment/fragment/1.2.1/fragment-1.2.1", - "host": "https://dl.google.com/dl/android/maven2", - "type": "aar", - "pom": { - "sha1": "1b7a728cc3bcb5e59043ec8ff12f17f097e2a856", - "sha256": "18nni56qh3g2dashkrrdvx5n3qzv0blp3j7lh403jskb9jvi27hn" - }, - "jar": { - "sha1": "e9f94f3786e02a0c2d66f460a4497e7c918d757d", - "sha256": "1iiv2x7s68y0wc9jd8n5xnljrvd7zg0yg7dhg5v2374rjf5ccr6k" - } - }, - { "path": "androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -601,6 +699,20 @@ } }, + { + "path": "androidx/legacy/legacy-support-v4/1.0.0/legacy-support-v4-1.0.0", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "a0c16ebb4d57f6ec356dd8756285537c0d8b67dd", + "sha256": "0n3wza06dp618jbnvjqvi12slx23hxbi7plfjaxz4w7v9h9gp27d" + }, + "jar": { + "sha1": "03e1271b351e1209661b9fd769cd6681a31678fe", + "sha256": "1c40ah2qjrdis0zirbj44p6jfwc52qadab82953qlf0gbx4c3zkq" + } + }, + { "path": "androidx/lifecycle/lifecycle-common/2.0.0/lifecycle-common-2.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -629,20 +741,6 @@ } }, - { - "path": "androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0", - "host": "https://dl.google.com/dl/android/maven2", - "type": "jar", - "pom": { - "sha1": "0d038e279eff9df92cdf3e324314ca06d2de3250", - "sha256": "1mlb24nz9wdjh1yr3drsvnb80c17hw3pqx4v2synfdvxm6iahc6c" - }, - "jar": { - "sha1": "4ef09a745007778eef83b92f8f23987a8ea59496", - "sha256": "0jvksdcwy0r7bkcym5hlds3vw9ql9ibc5f6qgrfyrrfgyymqv2b3" - } - }, - { "path": "androidx/lifecycle/lifecycle-livedata-core/2.0.0/lifecycle-livedata-core-2.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -657,20 +755,6 @@ } }, - { - "path": "androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0", - "host": "https://dl.google.com/dl/android/maven2", - "type": "aar", - "pom": { - "sha1": "962f3b9666f789eebafa7b5cdfd0af8f8aed1ab9", - "sha256": "0brclcgaa67av09nqrgckj4sx5py4l2hqsrk45fiyzc1wcdn4lda" - }, - "jar": { - "sha1": "4bcd5721a6358c312b86d219ff57d4a4a841fc50", - "sha256": "057nmgwz91f40wgckfj8j51b4wfsyvdmlmihsg8dga8az4x1yv2m" - } - }, - { "path": "androidx/lifecycle/lifecycle-livedata/2.0.0/lifecycle-livedata-2.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -713,48 +797,6 @@ } }, - { - "path": "androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0", - "host": "https://dl.google.com/dl/android/maven2", - "type": "aar", - "pom": { - "sha1": "283a21b2c7ef1c44075724edd605ccaab55fc293", - "sha256": "0hglx6j0r9aqi4w5sgzjz38v6c986l4b4a7pf0l1djfizrk405bz" - }, - "jar": { - "sha1": "62fab579508713b8bbb6d251b0abff6e538e8f46", - "sha256": "1g70w60v0z3d70r5858arll0ckqbyba4b5csnsdqqfpkl43nr1ig" - } - }, - - { - "path": "androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0", - "host": "https://dl.google.com/dl/android/maven2", - "type": "aar", - "pom": { - "sha1": "cc2f5146a3911e5bce103f06f7fccdb8632b62c0", - "sha256": "05sywvmlkg5si1hz2v5fvj2h9j0kfprj6n1xhia5skrkzfan791p" - }, - "jar": { - "sha1": "9a8d575935acee563f6ac9a069d5863abf59d198", - "sha256": "15xs9h8qm3xbsdkhfqbl2a6779j2d3fdcqbapbrwgkvaz3xymk7l" - } - }, - - { - "path": "androidx/lifecycle/lifecycle-viewmodel-savedstate/2.2.0/lifecycle-viewmodel-savedstate-2.2.0", - "host": "https://dl.google.com/dl/android/maven2", - "type": "aar", - "pom": { - "sha1": "f296a3abc6e55f6da5323ffee00b084503ac8b97", - "sha256": "1cbdb54cib8vwbv399pbz66qzh53r27z24bn0rbl48bvai72accz" - }, - "jar": { - "sha1": "50d7a240847eb488a740939a6c19f689ee1a4a04", - "sha256": "0cvzbvpns389zzybxb20zqrn42lshs94k5wg30pzw81bhbxnds1w" - } - }, - { "path": "androidx/lifecycle/lifecycle-viewmodel/2.0.0/lifecycle-viewmodel-2.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -783,20 +825,6 @@ } }, - { - "path": "androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0", - "host": "https://dl.google.com/dl/android/maven2", - "type": "aar", - "pom": { - "sha1": "5b85f9eedca6f1e45f62c6d3ca150cae66acf366", - "sha256": "07d1d8vahfxmvzi88rk1qhb7c4z8scwzk293kfyf4izz96maz8xa" - }, - "jar": { - "sha1": "695c5e9ee89ee73d69d0981303f138d7680acc01", - "sha256": "09yyxdc4231nmlwvfhxvp3q1ic09rnhw82lc990xsjbc9nrglzln" - } - }, - { "path": "androidx/loader/loader/1.0.0/loader-1.0.0", "host": "https://dl.google.com/dl/android/maven2", @@ -825,6 +853,20 @@ } }, + { + "path": "androidx/media/media/1.0.0/media-1.0.0", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "86e15c4ec92837de49486f1ad9827d689a6186d8", + "sha256": "04blvk2wipmqznwd4vynsci8ryvp6rxl1c2gvj2asschhkvybpww" + }, + "jar": { + "sha1": "7f92bbaf670497a9a1105124122fb20cee61e58c", + "sha256": "1vnr1ir0lr673zmxn9vzipl17r1jf4nrirjifi50r1xc5dxm4fxj" + } + }, + { "path": "androidx/multidex/multidex/2.0.1/multidex-2.0.1", "host": "https://dl.google.com/dl/android/maven2", @@ -938,16 +980,30 @@ }, { - "path": "androidx/transition/transition/1.1.0/transition-1.1.0", + "path": "androidx/test/monitor/1.3.0-rc03/monitor-1.3.0-rc03", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "e8f44da30b31ed576df82443746cbe104ad52935", + "sha256": "05nqj2qkj58cfq858h916zybrrfykznniwlm8vp2g1a992acjrf3" + }, + "jar": { + "sha1": "e77cb00cfaae145134bea0b5fae09ffae00e225a", + "sha256": "1l0rhh0mjyvx6icm78bp6ksq2ncxw4y24m5bcb7i8z7cvqwb8rvw" + } + }, + + { + "path": "androidx/transition/transition/1.0.0/transition-1.0.0", "host": "https://dl.google.com/dl/android/maven2", "type": "aar", "pom": { - "sha1": "0c354a924354ceed91673412fb5b6ce326735a63", - "sha256": "0paa8lci1xhkd631ak7knk87fbxbxi255clphhb3dy9kqvla2k2x" + "sha1": "cba38d22419c84dcf737d666ae0c980f1e521e65", + "sha256": "12v826hkvgrm3hzf3x5il92x50gan60gz7x47cq2ykn97ag8ljz7" }, "jar": { - "sha1": "ee403adc3ae340af6461cdd8151b4518c9f5c1b0", - "sha256": "0y7kx238yghsrh06ywgw9xm9zaw0izjcgkmxjngnalc78by4r3mx" + "sha1": "f3556ce8f251984acb24014c3ba055ff235929ff", + "sha256": "1380yk8978c19d0rl6hi3f0caac9fg5sy3lvvbnbq6j07xv0y2m0" } }, @@ -1371,6 +1427,20 @@ } }, + { + "path": "com/android/support/support-annotations/22.2.1/support-annotations-22.2.1", + "host": "https://dl.google.com/dl/android/maven2", + "type": "jar", + "pom": { + "sha1": "41225769fcf4402f5d7cbd13f168b5a939a03f7d", + "sha256": "1n1pd1acka37s0fb3w85h2bkbj1hblm49vsdv8cm6ba6sp3d5bvj" + }, + "jar": { + "sha1": "61a0ff5c29295ec56d7e0bd3d25d95dbf71b4b2b", + "sha256": "02n77q1r2pir0svvcbkkx4frcsvzngjfqzppn9j8vpfmacxkakqh" + } + }, + { "path": "com/android/support/support-annotations/26.0.2/support-annotations-26.0.2", "host": "https://dl.google.com/dl/android/maven2", @@ -3766,16 +3836,30 @@ }, { - "path": "com/google/android/material/material/1.1.0/material-1.1.0", + "path": "com/google/android/material/material/1.0.0/material-1.0.0", + "host": "https://dl.google.com/dl/android/maven2", + "type": "aar", + "pom": { + "sha1": "2bcf783c3bc66bafc0e1c9ca721d7544659bb6c3", + "sha256": "1aqm6mh1448hszv9agcq85wckpyiwjzhpi85wdfij48wsm0zbzy9" + }, + "jar": { + "sha1": "f83e012c22d2fac8fcf23880d7167832b099fa94", + "sha256": "1p0sq4kgxybslqj8044fh056m9fqmp543r5jk7crhdy0lf0y703n" + } + }, + + { + "path": "com/google/android/material/material/1.2.0-alpha03/material-1.2.0-alpha03", "host": "https://dl.google.com/dl/android/maven2", "type": "aar", "pom": { - "sha1": "eb7940c81a54b428e3c84e2c4c77dddda287cc01", - "sha256": "1cbva0a8nbv1y8cv6bsyrhjr87mb2f6f3w3nyn7izvlz9rk04kfj" + "sha1": "b19834fc7dba44949d5f906136911bb271a708ae", + "sha256": "1gcyl9gbv41jc49b63vk9w69adp63djzllzcb8ljqwbi7771viil" }, "jar": { - "sha1": "0d61ed3259ed48bb0db311d73ab9f358554987b2", - "sha256": "09kvm7nxk4n1mccgwa831q37kkw3vzlqbsiklw0qxv46b5pgpx2q" + "sha1": "05bb1d391bbed501d9ec0de96dbdb3fa1464f255", + "sha256": "003b0mcsdr39rkspl8ai1rxxiw0gpdf7fh930485hpwk450d0cgx" } }, @@ -4004,30 +4088,44 @@ }, { - "path": "com/github/yalantis/ucrop/2.2.5-native/ucrop-2.2.5-native", + "path": "com/github/wix-playground/ahbottomnavigation/3.3.0/ahbottomnavigation-3.3.0", "host": "https://repository.sonatype.org/content/groups/sonatype-public-grid", "type": "aar", "pom": { - "sha1": "54e36a57a744bd8ac522da81284a6366bb6939a6", - "sha256": "19x239zg1bjf97zgkv6jvba1la6sn4j6b76w5rnc4kp5jlh89pql" + "sha1": "3bd510fdc1a32189fdd7dd78f023abbef70d9653", + "sha256": "0yxr2kyr3hfh50hikmdah503zk76pbd8hf8z2i1mrbnk97giqqy8" }, "jar": { - "sha1": "34281fb5e7e7a2681b2482881fcfceba1a322b84", - "sha256": "0nrm55pihyq1fy6iwi21abv7wdsjdz4g9dwsrn1a3dbppwwjbkr1" + "sha1": "d9a85263fb7033898294b64bdd936b2d95b2c771", + "sha256": "1vjyg4vgblhvvyyxpad9wkxh4mdnigz0rwf0f0y23v3x4bm763sm" } }, { - "path": "org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824", + "path": "com/github/wix-playground/reflow-animator/1.0.6/reflow-animator-1.0.6", "host": "https://repository.sonatype.org/content/groups/sonatype-public-grid", - "type": "jar", + "type": "aar", "pom": { - "sha1": "c1859aeb2e27070713ee124c01265ce69199faa6", - "sha256": "03q95m5jv8lybigkfjb2n2czayfcj59f2iqrpvj0s845hnfmlhaw" + "sha1": "4fe3d33c764beebdc477d93a590f63dfa38a5f6b", + "sha256": "13s8bg63v2kp80gaxidsbpp7ajcq3b65li342k1s5gxwrya0shih" }, "jar": { - "sha1": "33c3e174a9c8368d93761d3d12712db18e903959", - "sha256": "1ryvjrjzixf0gwwnv35rn2lgawj5lj3hqs44ll3q6ipbilf8f5qr" + "sha1": "36074a3fcb77c2ba12bd2de7dde81441e0c7504f", + "sha256": "18k3yh4cdiy0dbn7azpsi8wmkpcphf75ayvfvgc2174ff6cq9f26" + } + }, + + { + "path": "com/github/yalantis/ucrop/2.2.5-native/ucrop-2.2.5-native", + "host": "https://repository.sonatype.org/content/groups/sonatype-public-grid", + "type": "aar", + "pom": { + "sha1": "54e36a57a744bd8ac522da81284a6366bb6939a6", + "sha256": "19x239zg1bjf97zgkv6jvba1la6sn4j6b76w5rnc4kp5jlh89pql" + }, + "jar": { + "sha1": "34281fb5e7e7a2681b2482881fcfceba1a322b84", + "sha256": "0nrm55pihyq1fy6iwi21abv7wdsjdz4g9dwsrn1a3dbppwwjbkr1" } }, @@ -4213,6 +4311,20 @@ } }, + { + "path": "com/almworks/sqlite4java/sqlite4java/0.282/sqlite4java-0.282", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d1cd3a5ecbaa6838495edb3ddd02768663075ea9", + "sha256": "1grvxsv5lv77jvjxbgq56pw60ybb8v2d2cs3sy34663rpr9dqk1d" + }, + "jar": { + "sha1": "745a7e2f35fdbe6336922e0d492c979dbbfa74fb", + "sha256": "019wm38b1h9fnv8vcyrs96bj9hn75p77iy1s3s23y0567kc8s7cy" + } + }, + { "path": "com/android/databinding/baseLibrary/1.0-rc5/baseLibrary-1.0-rc5", "host": "https://repo.maven.apache.org/maven2", @@ -5403,6 +5515,34 @@ } }, + { + "path": "com/github/clans/fab/1.6.4/fab-1.6.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "aar", + "pom": { + "sha1": "1211e25e0611566427a6fc5fdcee00a1ddda3dd2", + "sha256": "1kdb3j0h2drrh8bfp68am145lk322x4w9ggrdg7dkzr3yn13n8y6" + }, + "jar": { + "sha1": "8e468a9d9ba05bdb2612eb22d5cd5add9a238c8c", + "sha256": "0j6l599pvmxy4bv4a3dafn85niqi4p302l3q0p8yrczyz0ar64jk" + } + }, + + { + "path": "com/github/gundy/semver4j/0.16.4/semver4j-0.16.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "ca8df209029884f283afdcd7b104fb88576a18b1", + "sha256": "0kb0s5r0z7w1vr5j2308pb8j5rxds4lzyyav3z99scrv8jr1s01j" + }, + "jar": { + "sha1": "de8c77583e97bbbd3cdbe5f406b583e9b081ff56", + "sha256": "0435ff3qzmcxprsm93x3aw9clgfpa871zl41izhijwm3bwib9yfy" + } + }, + { "path": "com/googlecode/json-simple/json-simple/1.1/json-simple-1.1", "host": "https://repo.maven.apache.org/maven2", @@ -5442,26 +5582,60 @@ }, { - "path": "com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4", + "path": "com/google/auto/auto-parent/6/auto-parent-6", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "0f29db646babbca0049636b6724613035bbcedff", + "sha256": "02pa6ibw3gp0adc4zmg6b3ijaiqc41ndb3b1rw0dnrc1ck341xq5" + } + }, + + { + "path": "com/google/auto/value/auto-value-annotations/1.6.2/auto-value-annotations-1.6.2", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "f737dd3756969b2fdc91d3d8a71e68386949b6ba", - "sha256": "11d9ag963730fs06ajwsjim67dhpbqdn500l0idrm4zkzw8nzk8n" + "sha1": "ae1ff98291be961d9e1b14eb26bedaf0b5ac9d15", + "sha256": "1zrzknlx3h4wgnf5rcvdy5nks1jl1lpyh367dnlplvn95x3csxhw" }, "jar": { - "sha1": "eff48ed53995db2dadf0456426cc1f8700136f86", - "sha256": "1lr398wr4k3nvk2bvmg2qyrcx7zflkr85ldjd8pk8v4qnjq5kpgy" + "sha1": "ed193d86e0af90cc2342aedbe73c5d86b03fa09b", + "sha256": "1yx3pv9jgkh7x2ndljyr9c4capwr8gy0cvq3pwrsrs20pbfh92xl" } }, { - "path": "com/google/auto/value/auto-value-parent/1.7.4/auto-value-parent-1.7.4", + "path": "com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "792470b3f1dd45d8f6d2895ccbfb99f72869c014", + "sha256": "0sjz9i9x8p0a0szrn35zhpzndvyc5iswaw5kk1rv8q48369pkwxf" + }, + "jar": { + "sha1": "174878f9cc9cbacb8b464d774afb2ccf938f257b", + "sha256": "0lh866c4c52pszaylhzr43v7347whrfdn9rrs6cmmlvygns0kv1p" + } + }, + + { + "path": "com/google/auto/value/auto-value-parent/1.6.2/auto-value-parent-1.6.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "5eb0685cabce285064a62a7b9c6c256343a58285", + "sha256": "0768gzipyjr709lac0lr1vv61g6r6chbgh0943vczxbr47441di7" + } + }, + + { + "path": "com/google/auto/value/auto-value-parent/1.8.1/auto-value-parent-1.8.1", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "a75e195146275e9ff1a18cd3804cf30cce990cc8", - "sha256": "18qs6cy2mj6ya9n6syip1zrq3k58yssbaxra68mm3r4rnfzjr2v1" + "sha1": "3b5bfac460d9e54937ad692d10016164b1c30f68", + "sha256": "1lmgzs3jl5qvv2xsjjk394xbslxj9cgxg6m65bhyvxyfx7d9p61x" } }, @@ -5565,6 +5739,16 @@ } }, + { + "path": "com/google/code/gson/gson-parent/2.8.6/gson-parent-2.8.6", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "88d12a7aeaeaa9bbc773bc5f32690edf4d3ff9e6", + "sha256": "0x5761zgyz6f6pz244832d26i3rax0599578jmr2c6gcb4w4cdip" + } + }, + { "path": "com/google/code/gson/gson/2.2.4/gson-2.2.4", "host": "https://repo.maven.apache.org/maven2", @@ -5635,6 +5819,20 @@ } }, + { + "path": "com/google/code/gson/gson/2.8.6/gson-2.8.6", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "b9d7e274612598f1e8835d8bbe30baa5b970ca32", + "sha256": "049r21729n48c5cpylgpxa2cqglaf3y1rg84v87x6ckkcid42x11" + }, + "jar": { + "sha1": "9180733b7df8542621dc12e21e87557e8c99b8cb", + "sha256": "0pzjycvfb1yji92yp8lbxclg1qkxm7sx207q6cq0na2d0lwliyy8" + } + }, + { "path": "com/google/errorprone/error_prone_annotations/2.0.18/error_prone_annotations-2.0.18", "host": "https://repo.maven.apache.org/maven2", @@ -5692,16 +5890,16 @@ }, { - "path": "com/google/errorprone/error_prone_annotations/2.5.1/error_prone_annotations-2.5.1", + "path": "com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "d759b1b643583e30d8bb6bb55f4ad434f26c44a4", - "sha256": "0g4x4w79g0smnip1vif6ir6kzk7ci587yir05lggkxm61zzdfflq" + "sha1": "0b0fa22131b64b3985fba347927252af21898984", + "sha256": "09gfcb3scz33nwn25byizbn0i9jybr2xxd2zq25klpww2khp5a1i" }, "jar": { - "sha1": "562d366678b89ce5d6b6b82c1a073880341e3fba", - "sha256": "0v76hz7vg9lh6jdplzydbwpncl4xp96fim7g5cs0japim9mn507z" + "sha1": "458d9042f7aa6fa9a634df902b37f544e15aacac", + "sha256": "1wygw4flzzzwlfj1r27nj7pr5q9bhb5p3bhpi1ighv14ib05flnd" } }, @@ -5746,12 +5944,12 @@ }, { - "path": "com/google/errorprone/error_prone_parent/2.5.1/error_prone_parent-2.5.1", + "path": "com/google/errorprone/error_prone_parent/2.7.1/error_prone_parent-2.7.1", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "3cce581619abb2d892618745ef2f7f19087ecbc7", - "sha256": "0lifkir0mn2j02dqj8rgn7635lxcf801822ybyj52fia91vpcym1" + "sha1": "cca3ba79de44febe5a196510393e1011bd554e0b", + "sha256": "1rldm2fvhvbizz23zdy1qiqqnhqacrlpkqss829q0khh50p28vha" } }, @@ -5840,26 +6038,26 @@ }, { - "path": "com/google/guava/guava-parent/30.1-jre/guava-parent-30.1-jre", + "path": "com/google/guava/guava-parent/30.1.1-jre/guava-parent-30.1.1-jre", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "b732bbf7c4ceb14dfd6af514a8b8b71dd952e53b", - "sha256": "0wvfmm3jqgpl1yqvj6q668gbp0wabn6ah3x9sql27zn4xd3vgbz2" + "sha1": "3d726f4e77f9b282e3b99bb1d62713a44cab3118", + "sha256": "0d1qxmg3paxpb7aagf0717d71vb594r9h9mdiahvz5r4r92vs8h4" } }, { - "path": "com/google/guava/guava-testlib/30.1-jre/guava-testlib-30.1-jre", + "path": "com/google/guava/guava-testlib/30.1.1-jre/guava-testlib-30.1.1-jre", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "a6ba31a6b9a3cf649382ea3b45fd8165db4111ae", - "sha256": "17in8sqnhvsq3vn4ck8p5hmmd3s287xs36nm1wz62wyhwmmhqm4l" + "sha1": "718328d28bf5dcae3d414e2a862d6e594e2fb704", + "sha256": "1x7j2ws804hmbk79pba9g3yr7ff6y96g1y83ywn3182r51dbzcg5" }, "jar": { - "sha1": "798c3827308605cd69697d8f1596a1735d3ef6e2", - "sha256": "1kb8mpdpljv4nlf3x01isdpa3nb4z5rd5zw91zz51f2kn3qizxj1" + "sha1": "f57a75cdd54390c2b648b06828dac53b7b5de070", + "sha256": "16q94j7kj73qkcb027b09jic9izbjg2qi8hcsg8l2x0yzanwjzwa" } }, @@ -5934,16 +6132,16 @@ }, { - "path": "com/google/guava/guava/30.1-jre/guava-30.1-jre", + "path": "com/google/guava/guava/30.1.1-jre/guava-30.1.1-jre", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "4056c9385578a442117d1a68118def38087164da", - "sha256": "09z9pd75vx8f2gxj4ssnqnj38znpfqzmsmbya2z4lk89a36x8iln" + "sha1": "0f55555f43cb33c8c2f911e962ae5e4bc2f522b0", + "sha256": "0nfckp66ygbm7lgaw4bqfjhizd2l6xwz39pynxgqbdyli8ccj63d" }, "jar": { - "sha1": "00d0c3ce2311c9e36e73228da25a6e99b2ab826f", - "sha256": "1aijjkq382fxrwc29zpnra2c3nib8ayq10v80132mq1zklphgpg6" + "sha1": "87e0fd1df874ea3cbe577702fe6f17068b790fd8", + "sha256": "01jghgcy1dpkp4fvnnqr7n8fdmrlxkybnqn3mzrhp23dwaf25kj4" } }, @@ -6110,26 +6308,26 @@ }, { - "path": "com/google/truth/truth-parent/1.1.2/truth-parent-1.1.2", + "path": "com/google/truth/truth-parent/1.1.3/truth-parent-1.1.3", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "487d2acd34ac5f8987f443497856cd93c51f1e79", - "sha256": "0xg70v08sfwch9sfy8a4549k82z58j0hn17wp347kdn2rb3g1k87" + "sha1": "c6d1b2aae7ea915ea285d6224914087775782f3c", + "sha256": "1xg7mzwlbvfwnlphaa7knsajrrsgcllab9nmf3f5a4rpmsq13hls" } }, { - "path": "com/google/truth/truth/1.1.2/truth-1.1.2", + "path": "com/google/truth/truth/1.1.3/truth-1.1.3", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "390514856a5e29e0ce91b7a1a695761f47374336", - "sha256": "0b7pgsnhas3kqy11xhxgqlwyf17b77la2jzk6k5d67f9srjn9xs0" + "sha1": "8cc9b5eacd0afba4d4914cb222c587811f117651", + "sha256": "02v6bxfcr9mrysy08dq0dqajn1p6p1s5455bywgrm2snh8frb21p" }, "jar": { - "sha1": "90621af08df4be0c1619645707460c7065c81c45", - "sha256": "063m7hqq7im9dpma56cgh195y6rx198dkpngc3q811xfnsw06pm8" + "sha1": "5e2491cc44dce7380165963a24e91a0af4556a17", + "sha256": "1wzlp03v254j936ky5291n4xqpnd3pzrxygxvnzsm8l949w6f2zw" } }, @@ -6157,6 +6355,20 @@ } }, + { + "path": "com/ibm/icu/icu4j/53.1/icu4j-53.1", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d13d24dbfb9d48175ebf4fae9cd7d5b7c5937f64", + "sha256": "119l4hsvzjcxgyxw8ncmpab1ns23jhpm5l3val1k3k77xy20sw50" + }, + "jar": { + "sha1": "786d9055d4ca8c1aab4a7d4ac8283f973fd7e41f", + "sha256": "1arbay2k3w8hnvbgcz9wksv6fkig7l3fbf64ql1fpkf5p9kl8yp3" + } + }, + { "path": "com/intellij/annotations/12.0/annotations-12.0", "host": "https://repo.maven.apache.org/maven2", @@ -6171,6 +6383,20 @@ } }, + { + "path": "com/nhaarman/mockitokotlin2/mockito-kotlin/2.2.0/mockito-kotlin-2.2.0", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d1ee54133cd3cedd03474ee07f68e6597345f44d", + "sha256": "0z5dc8rlr1f5kwqg2zsz1mjvy9m6vayd6v6sgip0bl8g713l7mba" + }, + "jar": { + "sha1": "53138f767943304a290855cf1d8b60fc6d1c4bbe", + "sha256": "1xyjf39pyrhfb8ig7zq2p8g4vc68r5mn9zmcymjbaj17yw28vdbm" + } + }, + { "path": "com/parse/bolts/bolts-applinks/1.4.0/bolts-applinks-1.4.0", "host": "https://repo.maven.apache.org/maven2", @@ -6199,6 +6425,20 @@ } }, + { + "path": "com/squareup/assertj/assertj-android/1.1.1/assertj-android-1.1.1", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "0c0b3a5f4fa43469478d87febe64f8959e4617f8", + "sha256": "1dnfyr69kacjm8bq4ijz52fwbzjr5z1zlwfhhryvpz7fa2n283pj" + }, + "jar": { + "sha1": "09cd92cfc8686883ceb2f902d317582b2cc6f8ca", + "sha256": "0hqxibizrl98z5n20nw9w4jfm8lpmvyc6hi60wapq2d50mbgypmm" + } + }, + { "path": "com/squareup/javapoet/1.8.0/javapoet-1.8.0", "host": "https://repo.maven.apache.org/maven2", @@ -6342,16 +6582,16 @@ }, { - "path": "com/squareup/okio/okio/3.0.0-alpha.1/okio-3.0.0-alpha.1", + "path": "com/squareup/okio/okio/3.0.0-alpha.6/okio-3.0.0-alpha.6", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "ede5499134cc85b31b26bb11fd92f37956ffdd03", - "sha256": "1sb0pjwdj8lkq3k7fjwyxhsr22vbv8kzkp82dc4w6mmyxg8nlc91" + "sha1": "09c001509e90dc8a17e756e738bda5c2c16120eb", + "sha256": "0achgkplqlh0dzidlcj45l75kkds06ysa0mr2mvcrd4cm3dq259y" }, "jar": { - "sha1": "8eb3bf1d692377b986f15c80de567d3440aba6ff", - "sha256": "0i3xf2scrzvszmfzxdsbspxqni2dr8yizdws4islxwyn9i9vfn0x" + "sha1": "2e036b46beff62f54920b4302ce517bbcb8fe85e", + "sha256": "1fvi5mjmhcdi0j537wijgbl8f14wwb8rnf2dl135w7kqxsd9bm1i" } }, @@ -6366,26 +6606,26 @@ }, { - "path": "com/sun/activation/all/2.0.0/all-2.0.0", + "path": "com/sun/activation/all/2.0.1/all-2.0.1", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "4011e163e5fcf2b74bfbddf92c65adf86eac2821", - "sha256": "0vpiwamvh2101xgg7hj8mddabs63gjzxy5dmkpm6bkiy3qi3qx9q" + "sha1": "8b029ce3999c61fde1ca9b288a9c0f193ff0690c", + "sha256": "1k5j2rk1r5p0prpvdzlw1ial4r0y1kkxdlnfj3ql4gqmnri5v3b4" } }, { - "path": "com/sun/activation/jakarta.activation/2.0.0/jakarta.activation-2.0.0", + "path": "com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "0bb66fca7b4213dae9c4d3147c8872ab8ae833a1", - "sha256": "1k9bfw45xaqk77mgdsrk5cra4g0ky3jsmnhc17vxrw87b2jvwpy9" + "sha1": "ed23db1def6988479bc74591c885ee1447d9a1f9", + "sha256": "06kq0a2j1vdzp9jsxwd5dv1y6f0l61d642zz0hr8brh8vf98a1la" }, "jar": { - "sha1": "f4e7519148dee347c7666f336210deedb8aca09d", - "sha256": "0rj35a8mmkiznw6y5n6mwwjl02bfryvwjhkrshzw67nnyhq7x76v" + "sha1": "828b80e886a52bb09fe41ff410b10b342f533ce1", + "sha256": "0w986gsfpgfvibcdzqbq9nx6vj9h66z32rd95rb9ax70srylpqmr" } }, @@ -6418,16 +6658,16 @@ }, { - "path": "com/sun/istack/istack-commons-runtime/4.0.0/istack-commons-runtime-4.0.0", + "path": "com/sun/istack/istack-commons-runtime/4.0.1/istack-commons-runtime-4.0.1", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "74d35d998969df9d8236e198d61d2668b35fbded", - "sha256": "0q3m6l77vbrvbmggbj8f07acw4q238j448fpsa9kj0qia2x1ay2b" + "sha1": "12c8552c4977102933f71aad212d3ca8fbae0d01", + "sha256": "1vzfvpkcn5mxx4k83dffbk3vf6sws56chz8zyanlkdfrng0nmyrq" }, "jar": { - "sha1": "2183d068e1199522b39c25ab6bb75adb5c10e6f4", - "sha256": "1h151zkknvkan8b4rp4wqrbmihhypaprbgbhd29lqfvlrkmzavd7" + "sha1": "4e25c41d338aad4a2c92d0020c9ae0335fad5099", + "sha256": "03wr2r6asyaiqv58ap2b7lkh847f2a42rmibaxpqi14k8igi34cz" } }, @@ -6442,12 +6682,12 @@ }, { - "path": "com/sun/istack/istack-commons/4.0.0/istack-commons-4.0.0", + "path": "com/sun/istack/istack-commons/4.0.1/istack-commons-4.0.1", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "08611d08eaa3c6f16276c8bc41af942474327699", - "sha256": "19c3bapq2dpwibk1kznkcgjfvmvfbipyrmla399sj9li3kkg2smm" + "sha1": "d624bd3fb76130394a46ee21fd8d2a1f8546d1f1", + "sha256": "1hhna9rvx2ywknnjf9xgdd3xkq4k2wrpzr4h98x04bicshkcyfyc" } }, @@ -6462,12 +6702,12 @@ }, { - "path": "com/sun/xml/bind/jaxb-bom-ext/3.0.0/jaxb-bom-ext-3.0.0", + "path": "com/sun/xml/bind/jaxb-bom-ext/3.0.2-b01/jaxb-bom-ext-3.0.2-b01", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "e53ed0a79f3d4a9e8fce23678489e53a0bef748e", - "sha256": "1vqzk6wcw868j0l1kkhd9llaai1y2x32p64klpjim3swnq3dvz8s" + "sha1": "cab02da4fe6d9f1fc75ae2c9d39b77eff7615794", + "sha256": "0326v8d4ddy3qyzvrnjvchl5iq9dqvr8lm16xbk5ngkcjh10chkj" } }, @@ -6482,12 +6722,12 @@ }, { - "path": "com/sun/xml/bind/mvn/jaxb-parent/3.0.0/jaxb-parent-3.0.0", + "path": "com/sun/xml/bind/mvn/jaxb-parent/3.0.2-b01/jaxb-parent-3.0.2-b01", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "12c13ce38316192fed380e1348fd09f7aa688543", - "sha256": "0xgfzx5pnh6j1c5rzi6czvxba0h9z0d32d876x7lmqmny963skfy" + "sha1": "065019b03bcce51c0e72092db90baf7ca094d718", + "sha256": "011w8123ypdarqncxj89kdw1x8329q09xzm35x75364i84lx7x42" } }, @@ -6512,12 +6752,12 @@ }, { - "path": "com/sun/xml/bind/mvn/jaxb-txw-parent/3.0.0/jaxb-txw-parent-3.0.0", + "path": "com/sun/xml/bind/mvn/jaxb-txw-parent/3.0.2-b01/jaxb-txw-parent-3.0.2-b01", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "d11d8516d960759bb6ad73a6cb398ccddd4c4705", - "sha256": "0ynvz9w1vnk8rv6r6fs278z9gi8j7ajnw5sp5d65bvl1bny3hy6s" + "sha1": "b0b8872e51522aa5134006bf6aac26e12f045334", + "sha256": "106mvhhcfp84yvph1bi1kx1k1nh0wids47yaz13fsg333g9zhsid" } }, @@ -6673,6 +6913,20 @@ } }, + { + "path": "de/undercouch/gradle-download-task/4.0.2/gradle-download-task-4.0.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "b10fd2808b4fb28de573daecd9231d4db3bd205e", + "sha256": "01ql9iq9bypkdf3j3n4kfzc2lj60fi4y75byfbzbq07mdskwaq81" + }, + "jar": { + "sha1": "2aaf2b081cd0dd5b3cf25fde69a20b043dd46fbd", + "sha256": "0yp86iysar3x116x87a4b29862dg92k5pk15b75yrgi1bz6byb4m" + } + }, + { "path": "it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0", "host": "https://repo.maven.apache.org/maven2", @@ -6688,26 +6942,26 @@ }, { - "path": "jakarta/xml/bind/jakarta.xml.bind-api-parent/3.0.0/jakarta.xml.bind-api-parent-3.0.0", + "path": "jakarta/xml/bind/jakarta.xml.bind-api-parent/3.0.1/jakarta.xml.bind-api-parent-3.0.1", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "0fb4f1bf0b9b03dab37b970c6cd53bb02cf82be2", - "sha256": "1s93rj4bb1dwgk1h9p8klpvvr2rmvvsx0m5s54jlgfpqq781zc16" + "sha1": "b66ff94161e10df7c23005da6db2ba1cfa8c75e2", + "sha256": "0mmdfkvl07x3d1pwhj1pcj0ppslg9fwylfzgcbfqz7rfl3aba7wz" } }, { - "path": "jakarta/xml/bind/jakarta.xml.bind-api/3.0.0/jakarta.xml.bind-api-3.0.0", + "path": "jakarta/xml/bind/jakarta.xml.bind-api/3.0.1/jakarta.xml.bind-api-3.0.1", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "7fff78926a683ff78bd3707a177d8e566232e502", - "sha256": "0fp72x6iv6mbzy8kpjwf1wm8w60x7qrrdfrglvy9dx1wzn3gcmwz" + "sha1": "90295235abb503c257b7ca8d139bc4cdf85390d3", + "sha256": "1spbn2jx4vsz0ybm3cywhbjqkmq6hwli36ffrjfzs4hlfk4xlwx2" }, "jar": { - "sha1": "9275db6e21287df61690989254a0b46d8d31e99a", - "sha256": "1x1mglib4357f02816zabsl60d1i52gimihrc6rnka9kp8gandq0" + "sha1": "5257932df36ff3e4e6de50429dde946490a6a800", + "sha256": "0rxq8s2rgxs60vg1xkqzsjxxf630648q8k8lfzpw3dgm7zp4pyxq" } }, @@ -6739,6 +6993,20 @@ } }, + { + "path": "javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "302fe96ef206b17f82893083b51b479541fa25ab", + "sha256": "15vby0b3gwm1x6g46l98k6j48a18hfp2nyixhpj7hvj0r98s5926" + }, + "jar": { + "sha1": "934c04d3cfef185a8008e7bf34331b79730a9d43", + "sha256": "16xbi6mz75r1maw116njab6ln7hm9mhwrxshav4msmfdbccsajz0" + } + }, + { "path": "javax/inject/javax.inject/1/javax.inject-1", "host": "https://repo.maven.apache.org/maven2", @@ -6847,6 +7115,34 @@ } }, + { + "path": "net/bytebuddy/byte-buddy-agent/1.9.0/byte-buddy-agent-1.9.0", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "19d19e872689333502c7281838e60f7f345a8ad7", + "sha256": "0jmcj8wcpxmvabvvvs36my8khkls0x5r8fv4b59hvh33gycbcxpa" + }, + "jar": { + "sha1": "37b5703b4a6290be3fffc63ae9c6bcaaee0ff856", + "sha256": "0a9jkdbmwfbqlyqp0k6vqd07dkiqpwnlv64ikm9kdbph61bqddgi" + } + }, + + { + "path": "net/bytebuddy/byte-buddy-agent/1.9.10/byte-buddy-agent-1.9.10", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "856c025dc43c6c68ca5ae431ca2d77b5951b9c09", + "sha256": "0lj1wr4265jhw5njrnds93km7d72jpgq3fslc37ida6x7wlprh0f" + }, + "jar": { + "sha1": "9674aba5ee793e54b864952b001166848da0f26b", + "sha256": "10p1lml0gl4150fv2fjly275h1szr7iyilh7sd83441jj793kmwf" + } + }, + { "path": "net/bytebuddy/byte-buddy-agent/1.10.18/byte-buddy-agent-1.10.18", "host": "https://repo.maven.apache.org/maven2", @@ -6861,6 +7157,26 @@ } }, + { + "path": "net/bytebuddy/byte-buddy-parent/1.9.0/byte-buddy-parent-1.9.0", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "c68590af59a4526bb66b571af963ea864ed33d35", + "sha256": "00x72y0lfvdf0ypyaf9ap39sjzcvky7pr4nvfm7i2fdyy3pmk4xq" + } + }, + + { + "path": "net/bytebuddy/byte-buddy-parent/1.9.10/byte-buddy-parent-1.9.10", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "adb368c4cca2acbc8d18380b065f6b5bba0f7b24", + "sha256": "1sp2y20b89awg523cvf0i63ml72lsm5imm17qhjd2i9l3vm27yr9" + } + }, + { "path": "net/bytebuddy/byte-buddy-parent/1.10.18/byte-buddy-parent-1.10.18", "host": "https://repo.maven.apache.org/maven2", @@ -6871,6 +7187,34 @@ } }, + { + "path": "net/bytebuddy/byte-buddy/1.9.0/byte-buddy-1.9.0", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "9618ce809f21346bed03aa7bd352c35d4e8cc975", + "sha256": "1m2p0a3c8bl9s7wmdaib5da7g9ziiy3agxs808ywmrfl58sbs9hs" + }, + "jar": { + "sha1": "8cb0d5baae526c9df46ae17693bbba302640538b", + "sha256": "0h473d80v5fq7c0a8vv3j6xbz6i8gnny53dyqnb124fp63200pb9" + } + }, + + { + "path": "net/bytebuddy/byte-buddy/1.9.10/byte-buddy-1.9.10", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "30e93444089cf78a839290ea30ef36fa892e045d", + "sha256": "0hxy8lkvcinyl5ajk2k7qbri8qc3jsv5rbfc1b0m70s50xwq1mdk" + }, + "jar": { + "sha1": "211a2b4d3df1eeef2a6cacf78d74a1f725e7a840", + "sha256": "1wrbimj9f3m253kz99i7gxpx12qg5lp42qfk91456v3v9nydwdi9" + } + }, + { "path": "net/bytebuddy/byte-buddy/1.10.18/byte-buddy-1.10.18", "host": "https://repo.maven.apache.org/maven2", @@ -7171,6 +7515,16 @@ } }, + { + "path": "org/antlr/antlr4-master/4.5.2-1/antlr4-master-4.5.2-1", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "4e87b0d0b499acf795e1304a58dc68bcdd8ed614", + "sha256": "0x5ngrv4xiay1ks3kjp7gfbhzd03sqqp5z6pmxbsnm95v1wb8n2k" + } + }, + { "path": "org/antlr/antlr4-master/4.5.3/antlr4-master-4.5.3", "host": "https://repo.maven.apache.org/maven2", @@ -7181,6 +7535,44 @@ } }, + { + "path": "org/antlr/antlr4-master/4.9.2/antlr4-master-4.9.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "e5187c4f54155f23d4871af1ed3d4d60f7ab9a03", + "sha256": "0k4hh1i6np6961q26lhryvxgplsasyrw7dyxvzf4cqbf6290bpn6" + } + }, + + { + "path": "org/antlr/antlr4-runtime/4.5.2-1/antlr4-runtime-4.5.2-1", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "6c4013c6b772dd3e8cc00837ccf5edd7619e8d21", + "sha256": "07k6rflqc5yc7sxh80dzrr1ybjx8h8kj8hzd0jcmakbipjvckflk" + }, + "jar": { + "sha1": "7fe31fde811943a1970cc97359557c57747026ef", + "sha256": "1603ap9qds5wggwadf5pfi4vrahxgf97b8f32pcxgvmw0hq42cg8" + } + }, + + { + "path": "org/antlr/antlr4-runtime/4.9.2/antlr4-runtime-4.9.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "726d2331b5f8ada7a0dbde7579c0968d391f324b", + "sha256": "0v8qsyil9k0mpv602dcsjx422kk1w1m53xfv801v5bm597wh2697" + }, + "jar": { + "sha1": "ece33ec76e002dfde574cf7b57451a91a99185c5", + "sha256": "1xkm036832k3rwvjsafkbxdgm7ajfb69wsxcnwyd966mimi5600j" + } + }, + { "path": "org/antlr/antlr4/4.5.3/antlr4-4.5.3", "host": "https://repo.maven.apache.org/maven2", @@ -7887,6 +8279,54 @@ } }, + { + "path": "org/assertj/assertj-core/1.7.1/assertj-core-1.7.1", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "11d0eda427bded80cf03df9a2cf5ad0339f19dd3", + "sha256": "1mda9rj8p060jk0l6j6c81yhidbgdix6816hg01gz0c0zs917lid" + }, + "jar": { + "sha1": "c12282981e9bab2afdd38987295e76b35c33abb2", + "sha256": "1pqaqk2ymhs3wsrwiv743aqwyh1smp23j30ylhr27ma81jb5fwsp" + } + }, + + { + "path": "org/assertj/assertj-core/3.8.0/assertj-core-3.8.0", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "3ca8eaae7256d267834d4cfaaa621910c5a9266c", + "sha256": "0awrzb0g6a6fap1xvxz7snpf7i5lsnmhnrmm16vyqgh36kssdmjq" + }, + "jar": { + "sha1": "b209d90ff2e279bee3e02547ee7b11349c52d0e3", + "sha256": "1a22naafwpwcvzz1qgfcfgrpym05d1zv9fqnm4282czxkky3rc68" + } + }, + + { + "path": "org/assertj/assertj-parent-pom/1.2.6/assertj-parent-pom-1.2.6", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "0bc73395069e4328b44f05c31e86bcef5a54d44b", + "sha256": "095gdjkxdjb7rx34xx8hqm4892vf23vym8pmyzfq6rfg05vgz8xa" + } + }, + + { + "path": "org/assertj/assertj-parent-pom/2.1.6/assertj-parent-pom-2.1.6", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "34e7bb8329cc770a7e07406d290652a5e50712dd", + "sha256": "0l27a4abppgb9hkpn5sfxc3hnxqcd3n6s3zh6gxi0qdfmdmsp8rj" + } + }, + { "path": "org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48", "host": "https://repo.maven.apache.org/maven2", @@ -7957,6 +8397,20 @@ } }, + { + "path": "org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "f96180e47cf5d4e7e911f7d958e5dff0043427a9", + "sha256": "09hf2ac7j7sc2nqlgppha7x69vz4bmr7lshy57dbq56px5k1n8wy" + }, + "jar": { + "sha1": "320b989112f00a63a3bcfa5a98f31a4f865a20fa", + "sha256": "0dr1dvndv2jgcfc6hxzryp3flbzmh3mvbmmj9z4r8v06b7mrd3z7" + } + }, + { "path": "org/checkerframework/checker-qual/2.5.2/checker-qual-2.5.2", "host": "https://repo.maven.apache.org/maven2", @@ -7972,16 +8426,16 @@ }, { - "path": "org/checkerframework/checker-qual/3.11.0/checker-qual-3.11.0", + "path": "org/checkerframework/checker-qual/3.14.0/checker-qual-3.14.0", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "c9e03cb279badecb91f02e619f131c204c927894", - "sha256": "02351b6rx8326xd387cys3hszq837agdfpqxzmnwa27qxh1pzj70" + "sha1": "7b9a3e56974ebd6cb8c5c1c55a0a31f1c34e2206", + "sha256": "0c76kkz1ishn5y1cavyhj5sdnwbnr89chv8fnnjz2nwgd53kgil1" }, "jar": { - "sha1": "897ba3aab19f0008c21e53c3d1e66d8452ebd5ed", - "sha256": "1wnaq05bhxchi0zvyq9zvawi9krnfnnbhcbrklla54q724ljr44n" + "sha1": "882adb1b47ebba2a756d3b10f0eebba03d176482", + "sha256": "1dzda32y1ijg4cr2z2rdsqg9yknac9zbnydxgyvvcxc9hp7vj6lv" } }, @@ -8150,26 +8604,26 @@ }, { - "path": "org/easymock/easymock-parent/4.2/easymock-parent-4.2", + "path": "org/easymock/easymock-parent/4.3/easymock-parent-4.3", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "083c27f220f68cd077a35c02e77ba9e20ff68a7e", - "sha256": "11mm4sm0wlwsnri64kfias31iq4lfzvgain60vfcg46b2abwnwz3" + "sha1": "efbf2d2d75a77ae5f4c88faf83e492f962341700", + "sha256": "0jgk3vj299dgw4qiaqh86nfzidnfgxpz577pg962mkv04wp212c3" } }, { - "path": "org/easymock/easymock/4.2/easymock-4.2", + "path": "org/easymock/easymock/4.3/easymock-4.3", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "14b32543d03b1c60a4d1051c4895e4ebff433dd2", - "sha256": "15v2v77qbqrlvv84yj2xpawkfpliiznwj2gzbv3zp83m6fql0ddd" + "sha1": "a392122f9847ec2d4ae7ce79064b9db5741c44b7", + "sha256": "0vifpca8nkibc0qdk807a4y5v4myml8nbfdjwwdqrx5s25hhw7jh" }, "jar": { - "sha1": "251b26f1b853673c1aac277fd2fb0c8d5844cdc8", - "sha256": "124fzy68m645m4rjahv41sg3qk8yggrbx2bi5gr6xbn9x99s4j5x" + "sha1": "b0dbe2df1a71b8115835561f46a8f06cb168a94f", + "sha256": "010ldl2zss4hp204y2w6dl0kwb9llh0fx7mldfm6lqqiid68cc62" } }, @@ -8183,6 +8637,16 @@ } }, + { + "path": "org/eclipse/ee4j/project/1.0.7/project-1.0.7", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "b0f6c4bc691a0b694a377edc9bc4777871647253", + "sha256": "01gi321g5j0d4s2byxdxa2awz8xk7r44mc5yxxb3bbnb8ad06p10" + } + }, + { "path": "org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2", "host": "https://repo.maven.apache.org/maven2", @@ -8236,12 +8700,12 @@ }, { - "path": "org/glassfish/jaxb/jaxb-bom/3.0.0/jaxb-bom-3.0.0", + "path": "org/glassfish/jaxb/jaxb-bom/3.0.2-b01/jaxb-bom-3.0.2-b01", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "82c5e0bdb44eb72ed58b8e36d6cb5805493f0933", - "sha256": "06hzn2769xcm872xn8v1fimzf5gibpyi0cv4zgap064ah6vmpvi8" + "sha1": "b081fa9124320fa77126e6e6bd3841b868fc4835", + "sha256": "0y53b9yasyg8pi7yrcyshvszvlmhnsyhr49vxhyri3prswcsrkjf" } }, @@ -8260,16 +8724,16 @@ }, { - "path": "org/glassfish/jaxb/jaxb-core/3.0.0/jaxb-core-3.0.0", + "path": "org/glassfish/jaxb/jaxb-core/3.0.2-b01/jaxb-core-3.0.2-b01", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "afce7fea6b74a1c29bfde6c05b0a00e103318eaa", - "sha256": "0cr1jrczxrmgq8nzin92g2kxxx04jbppmq9v4ijdmpln4sdl8ihs" + "sha1": "34c62153185113f28cbb1b88b51a120f05e8a005", + "sha256": "0azmlgz6v3pihs0xmak25b2yxc1sznrcdd11nvqi762qnmfizlai" }, "jar": { - "sha1": "d3e976f31e1a233cac7a9d29ece92ab65c9a5d34", - "sha256": "0zn2apl4db0vylprhlqhrb8zkl4n07qd391pkx0vp8jan5977fbm" + "sha1": "ab713e3e59febd96cc1199d3ca7113e4a86bf696", + "sha256": "0g61w1c2r4jh9arrb7nvdkk9kd9cwdhmazifyxgxrsfa760cqkv0" } }, @@ -8302,16 +8766,16 @@ }, { - "path": "org/glassfish/jaxb/txw2/3.0.0/txw2-3.0.0", + "path": "org/glassfish/jaxb/txw2/3.0.2-b01/txw2-3.0.2-b01", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "9e9b226d784fde930bdb3cafe127a39f0fa7c00e", - "sha256": "0z2cdv6jda884i2ccq31asp55vx4asbm7wh6m41lsk0kb37azlij" + "sha1": "2930daddfe27c2126ec9e7201f54185d331eed8a", + "sha256": "08gw3106yggk172mqxq4kkyc13vgha6ryq7cm5gcfc8vff3hgkv2" }, "jar": { - "sha1": "01d2da507fbae72a98730c5dc19ec41e67f2cccd", - "sha256": "1ch2ypf43g23vrr23lckl97nrbnh9prdagqpy91zz3fh9rnqvzn9" + "sha1": "ebc7528c0776a50b59a78208f0d8e3e33bb8b628", + "sha256": "1wszl1sva2xkv6n56mpgzicijpslwzhh9j29vgs3nns5j7lgr9kx" } }, @@ -8378,12 +8842,12 @@ }, { - "path": "org/jacoco/org.jacoco.build/0.8.6/org.jacoco.build-0.8.6", + "path": "org/jacoco/org.jacoco.build/0.8.7/org.jacoco.build-0.8.7", "host": "https://repo.maven.apache.org/maven2", "type": "pom", "pom": { - "sha1": "3fb028eaf46f792cfd65b2d65be7e5d175623378", - "sha256": "1yahzgqvhsghcvss2nm9pjm53qypv07fr8ndni2irkdqskzpf56r" + "sha1": "492fd345ea752983327442fe383590995e40a7aa", + "sha256": "10xpy6zcpbmmg4dn9hbhlh7xi0zbfnmsfzb4nylq65hfjc3q2h43" } }, @@ -8402,16 +8866,16 @@ }, { - "path": "org/jacoco/org.jacoco.core/0.8.6/org.jacoco.core-0.8.6", + "path": "org/jacoco/org.jacoco.core/0.8.7/org.jacoco.core-0.8.7", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "6f4a9abb3333a92f028bf444b596a7b7648db111", - "sha256": "1pk3rwz5fm9ns70rf4r2nyly56xg5kq10hqqamzsyrvh57ggxfx3" + "sha1": "a26a78c73750f93915a98daac900c5e7a37e4494", + "sha256": "09bqhrgnwlv8gxszfq7xjcv1ip9vl6x67pkgcjpp2q6dv18wfck8" }, "jar": { - "sha1": "8c20544d06b8a54de1a585e4fcd0b101c0b433d9", - "sha256": "1zxn67mkafvk9x5vjdryyzn25yvmk7vgnfp3f2mpdyh1piiwnjwn" + "sha1": "2c2dc2b720a7fb33afcf4f45b05db2eb5b4ffa10", + "sha256": "0g51q5qnxffidcrhzwgi2b82xj2dsm7dglzai8dalsarzfskjxxd" } }, @@ -8471,6 +8935,20 @@ } }, + { + "path": "org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.3/kotlinx-coroutines-android-1.4.3", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "cc19a5073e7e8c7d551a273e5af97672f674d19d", + "sha256": "1nhib9ssb50lxl7q30vvwh9x3f9wd7jx28q37qd1ih5w44i3szvx" + }, + "jar": { + "sha1": "fc952a5fc7fe28aa513cb900873ca57689816d22", + "sha256": "0iypcf1h6bx5vik88ly9x2q7xw53vgvkz7wdi37fckbv8l7af9bi" + } + }, + { "path": "org/jetbrains/kotlinx/kotlinx-coroutines-core-common/1.1.1/kotlinx-coroutines-core-common-1.1.1", "host": "https://repo.maven.apache.org/maven2", @@ -8485,6 +8963,20 @@ } }, + { + "path": "org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "e6b584482b93b3c098e73b5782b06bd404949fec", + "sha256": "0g24xn0lng212vi4ah691dgkqny32y38xpj5jjy30yh2yh4q1n6s" + }, + "jar": { + "sha1": "1051e11eb789ed1df93412bebe0f06e9d29160e4", + "sha256": "0qsif9kbql6qjr1hqp2dlp69k1r28jzssy3vv8h81n3bz3fhigpp" + } + }, + { "path": "org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.1/kotlinx-coroutines-core-1.1.1", "host": "https://repo.maven.apache.org/maven2", @@ -8499,6 +8991,20 @@ } }, + { + "path": "org/jetbrains/kotlinx/kotlinx-coroutines-core/1.3.8/kotlinx-coroutines-core-1.3.8", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "4e6547ff543d0b040169fb1c19a03cd6b78504f2", + "sha256": "1z87920fjdmi9ds7awy0m780sjaaf6rqzrxjkhs97n5pvxdsdzr4" + }, + "jar": { + "sha1": "f62be6d4cbf27781c2969867b4ed952f38378492", + "sha256": "1vklc71fi550k8d9w6ca4b9wqkhxkm9lajg9wlw5wmsabm4bgj7q" + } + }, + { "path": "org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0", "host": "https://repo.maven.apache.org/maven2", @@ -8513,6 +9019,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-android-extensions-runtime/1.4.31/kotlin-android-extensions-runtime-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "3a662d24eb03491a1dcec96bcf35462989f93b34", + "sha256": "067mg332kiw4d0xavmm4zqcas329rh4lq1j4342h6wzi5spjh3an" + }, + "jar": { + "sha1": "14b0c658501829245368d2b8fdef72171e7e3d17", + "sha256": "0xvghalwncbxcna079nccfy7qf2s19jwjjz8yfi6j3lpaz55jlrw" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-android-extensions/1.3.50/kotlin-android-extensions-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8527,6 +9047,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-android-extensions/1.4.31/kotlin-android-extensions-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "e8daca9188d01ff779a7cba95ec9a31ed8d939d8", + "sha256": "05nqxyxjbjaw5f1s95a4pf4gmzbxp17fg6w4bvb06s4slh3xvv79" + }, + "jar": { + "sha1": "5837534e7d15215c816bccc74543737b2c0e82ce", + "sha256": "145pw71g42xxli27krir2dl1siqwl6l0awpm4yfwdc8gss7f1ms8" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-annotation-processing-gradle/1.3.50/kotlin-annotation-processing-gradle-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8542,19 +9076,47 @@ }, { - "path": "org/jetbrains/kotlin/kotlin-build-common/1.3.50/kotlin-build-common-1.3.50", + "path": "org/jetbrains/kotlin/kotlin-annotation-processing-gradle/1.4.31/kotlin-annotation-processing-gradle-1.4.31", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "e5025ee2e0291696a6e239af10f0167d42b6593d", - "sha256": "1qdpx1ajwnjwljzhf9yxcflmfs1al2iq3nsqsgjin9g33iv8y50d" + "sha1": "edff249688821d852797b15631212f6b3ad0d201", + "sha256": "10n3jhc7iap9i3cvbkrchlsirlcqzaz52m5f138zbpq9cqgqaj8s" }, "jar": { - "sha1": "b64ece3ce7fad42f2d8fb74e4687c99ca030fe24", + "sha1": "1d7a4a1aaafe06e8b62bfb5fc04f66c4afeb7281", + "sha256": "0vbh5cd9ilg4q85r2gxjd17ggs6y8q224jn15yxc4ydz7214fp8k" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-build-common/1.3.50/kotlin-build-common-1.3.50", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "e5025ee2e0291696a6e239af10f0167d42b6593d", + "sha256": "1qdpx1ajwnjwljzhf9yxcflmfs1al2iq3nsqsgjin9g33iv8y50d" + }, + "jar": { + "sha1": "b64ece3ce7fad42f2d8fb74e4687c99ca030fe24", "sha256": "0g2xqfnhrggjywq9xj6iyi7c6q9kfq49hdsrgchlvk9gy04afdzw" } }, + { + "path": "org/jetbrains/kotlin/kotlin-build-common/1.4.31/kotlin-build-common-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "130eaad44fe0e343fab6fe02edb86023e0eccd74", + "sha256": "0762q61w7bq56gmqhzskydlnf7rg9vpv6zgszif4m9fwbsk951hc" + }, + "jar": { + "sha1": "10e4800d84cb94d26de22ccb4db7aebe7aea1b38", + "sha256": "1d1ahrs6psi2vmfj9yzwmqhipzr2q325g0s33la24zdm5yaff1fq" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-compiler-embeddable/1.3.50/kotlin-compiler-embeddable-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8569,6 +9131,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-compiler-embeddable/1.4.31/kotlin-compiler-embeddable-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "b2fc49c054b3c13fdbe0efe3c94635e3b3703ea6", + "sha256": "094b7364v1i8rbcxcysmbismrfryl0as2rgm83ijlhngy9kkhrqd" + }, + "jar": { + "sha1": "06451ea797cef544e81f507b0d9959cd97ae09c0", + "sha256": "17irfc3nic63f2z3vnqnmjk0cyvfln27qc8lrpabr5pyfighwjjz" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-compiler-runner/1.3.50/kotlin-compiler-runner-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8583,6 +9159,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-compiler-runner/1.4.31/kotlin-compiler-runner-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "30f2d65c9727e1f195fde3a700525dafb87714e3", + "sha256": "06sv8i5y68vkpk2b0pi1k8ny8r7f1mdby8v1q42jfx74rshna6b2" + }, + "jar": { + "sha1": "8be54c7f3ff7e46e7585e6e756f86c780b3d5e1e", + "sha256": "1hcahwvxxvnffvidfgd2iwi3qdammjlr055j7sd65wy8vk9fgfk1" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-daemon-client/1.3.50/kotlin-daemon-client-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8597,6 +9187,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-daemon-client/1.4.31/kotlin-daemon-client-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "8c777b323d956856c81ee461ef4e596acf109cab", + "sha256": "0g4byjklzq4cym8symyk5hjiaqymr0lk7cfq160q2kgsx65kdlkr" + }, + "jar": { + "sha1": "419157134d513c69d74693334c39f0550b53f546", + "sha256": "02b4xll0j891kx0dn9bn2sb0q33cq74g4rr40sy91p7ibbspw0kx" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-daemon-embeddable/1.3.50/kotlin-daemon-embeddable-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8611,6 +9215,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-daemon-embeddable/1.4.31/kotlin-daemon-embeddable-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "e3886390a4d23c318376d2d5b4d4562d5c988596", + "sha256": "1sz7wc0bxd2jmg5adajydq7rjbd67wgb5yvn2s28vlgbi6sjgpig" + }, + "jar": { + "sha1": "10faf8ac3dd5975ed972b2bc395b4ffc7ffde246", + "sha256": "0dng745x3mk6id6vwspvfxw819ca97cgzmqykddb29gxnh25gp4p" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-gradle-plugin-api/1.3.50/kotlin-gradle-plugin-api-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8625,6 +9243,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-gradle-plugin-api/1.4.31/kotlin-gradle-plugin-api-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "79ca3be91c54d63dbc30cb740b5684bfb0b03067", + "sha256": "1ixwymagkcr2a3gjbjwci6s1wwrgblaphfjfbpq5k0vcgrli821j" + }, + "jar": { + "sha1": "63692dfe4484c4f989319cf3429b357c17f772ae", + "sha256": "0qp21lijl30w2rylk78ycd949cgl52i87sgazws66ph7np9qw2vw" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-gradle-plugin-model/1.3.50/kotlin-gradle-plugin-model-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8639,6 +9271,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-gradle-plugin-model/1.4.31/kotlin-gradle-plugin-model-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "c434bc9afafce644a8a928ddd1862ee3e3329f1c", + "sha256": "1jx7ydh5gg2m9l9v9sia6ydyd3zli32l2nw9f2ylm1vyq6kdajz8" + }, + "jar": { + "sha1": "5ef6cc1555b3cafdc5d1edbb932a823289fd5a56", + "sha256": "1a96b746dr0v22ajdknxvh2ndipxpqsxj8nfv8l16skvwqnc017l" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-gradle-plugin/1.3.50/kotlin-gradle-plugin-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8653,6 +9299,34 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-gradle-plugin/1.4.31/kotlin-gradle-plugin-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "70c103233a7c9b2212d4b60e684ac4620dcfff92", + "sha256": "0gshvrknkkj5y5rbvv0l7g3w1l4psq7sjr4905azdjy2flxk076g" + }, + "jar": { + "sha1": "efd48d079489836346cff69c66c77c81e16985d4", + "sha256": "1kvx3pzld91vb32lrzgxqyh74l5c4x4vvczdx4gpk9g8vddh7jzw" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-klib-commonizer-embeddable/1.4.31/kotlin-klib-commonizer-embeddable-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "06f35542e31797d5b46d5c00eeb372d9bbb4bb60", + "sha256": "1ppssla9sg3zpszhlq9nzb8jx1wi3nrd76b18ffw7g1hdrpq429n" + }, + "jar": { + "sha1": "73c17f8fdf8fe87f39f3c5ab859d4bf6d3c749a1", + "sha256": "1kx5rm78p22rla7q5jqz8f66g404jsyl4c28rqz4kvav9w5alczk" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-native-utils/1.3.50/kotlin-native-utils-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8723,6 +9397,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-reflect/1.4.31/kotlin-reflect-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "5cfd82ac5a5ee1e1d60c94e7390070301f73853e", + "sha256": "15rnc1h2zymcnf2zpgyq468j7jm9572r1qw7bhqmz1fx8fwbljcf" + }, + "jar": { + "sha1": "63db9d66c3d20f7b8f66196e7ba86969daae8b8a", + "sha256": "1wi821w3l7p8wxnpqw9m88a6n5vff02iz9ih3s0xb9vl56sd1yli" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-scripting-common/1.3.50/kotlin-scripting-common-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8737,6 +9425,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-scripting-common/1.4.31/kotlin-scripting-common-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d998790077787c3eff5d835f7823b23eedaf9faa", + "sha256": "1ra08kfzq91svbb9xhvrksdihii1i9ikmnahysnijji45jfpz6s9" + }, + "jar": { + "sha1": "6c072554c2d163012478a93278b208c7228ad9a4", + "sha256": "0g3zjzq98rkwsxyjn60il9cvpj3b15y9s709phn2bcs19d5g8rpc" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-scripting-compiler-embeddable/1.3.50/kotlin-scripting-compiler-embeddable-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8751,6 +9453,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-scripting-compiler-embeddable/1.4.31/kotlin-scripting-compiler-embeddable-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "e6b41e94b17b8e106c629c5b7e73e8cdb5569b50", + "sha256": "05iifwrwwakjgha8kalr12lf8q6b7zjzsfcjq2mx3yvj9v3lrk6k" + }, + "jar": { + "sha1": "f279e1c63640df6e24371ae9e009ddbe1ad8b723", + "sha256": "14kk723sl7362p9xj5jvhqc4vc7n9h68j0gcphksqiii8p18vpyj" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-scripting-compiler-impl-embeddable/1.3.50/kotlin-scripting-compiler-impl-embeddable-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8765,6 +9481,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-scripting-compiler-impl-embeddable/1.4.31/kotlin-scripting-compiler-impl-embeddable-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "fe7a6a6e0a4d4a57e9c165af822fe69edfd6e957", + "sha256": "0l85xgxghp3lir8ig8djvyhx868q9vps88mwrnwcp2bp6cs1snmz" + }, + "jar": { + "sha1": "12bd0e32075f54b774975d3e14715017fc7cb0c0", + "sha256": "01kwp9bw1bcgwzw2vm154kr03y0grbwd8f9jh42f60q3j9n0srm1" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-scripting-jvm/1.3.50/kotlin-scripting-jvm-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8779,6 +9509,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-scripting-jvm/1.4.31/kotlin-scripting-jvm-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "838a90b9a44c4caa7f3c84325bf60db7bcfd3a2d", + "sha256": "0a8zrgbym2h4fi0qp8ndn1rk0lljzzvab838nbsa22ca9wq3a1k7" + }, + "jar": { + "sha1": "90f94e43428b14e99123eea93411d2b8da9aa72c", + "sha256": "1apzrjrpixj5nxrgrcqj29qzkqjpl14nky679g4wjfh8bpx0y3gw" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-script-runtime/1.3.50/kotlin-script-runtime-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -8793,6 +9537,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-script-runtime/1.4.31/kotlin-script-runtime-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d74379b5051a6928a5417871683bb8a9ccd0d073", + "sha256": "11xk9vjsg41fa4y0j40lv1gsbarkd62lg4npj5gph6n82bvcsyq6" + }, + "jar": { + "sha1": "183616b52cfb8ddaa8a2a15bf926e87dfcddcde3", + "sha256": "1yfk92n3c3y7jsii5fs28bdpwijd0dazjsxwaw9nq9qmhf9zmy5p" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-stdlib-common/1.2.71/kotlin-stdlib-common-1.2.71", "host": "https://repo.maven.apache.org/maven2", @@ -8863,6 +9621,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-stdlib-common/1.3.71/kotlin-stdlib-common-1.3.71", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "dc5b708b195cb44fcb098c96c5ed4774a53d5c93", + "sha256": "0hb3yv15d114ypwp1dlrkbd993gfg1i7wj7d8skpvvld2i8cpxck" + }, + "jar": { + "sha1": "e71c3fef58e26affeb03d675e91fd8abdd44aa7b", + "sha256": "1v4jh2lhnh4zr0q1xy9hhlg64wls46mhxzkfm0qdgqzwgfdqlkwp" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-stdlib-common/1.4.10/kotlin-stdlib-common-1.4.10", "host": "https://repo.maven.apache.org/maven2", @@ -8905,6 +9677,34 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-stdlib-common/1.4.30/kotlin-stdlib-common-1.4.30", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "64b410bb466d7cff92e336a26d9872783a5cedca", + "sha256": "0svkqrlglz6mbgrhd7zjz9bgqlm01q6aw33m94lsp2q66d6s9515" + }, + "jar": { + "sha1": "bb9a3173350f55732416ee27956ea8f9b81f4dbb", + "sha256": "1hkl01rykbbxmqnjagfzy9hrn45amhrh9w89sfw32vqa6f1hc09j" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-stdlib-common/1.4.31/kotlin-stdlib-common-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d954657abc560bd88f1045a5aaa1f9349957ccd7", + "sha256": "11ri6m9nqb9ndcglbpcgqqxvmy4r3wy5f5g9na4vpz381c9sp0hm" + }, + "jar": { + "sha1": "6dd50665802f54ba9bc3f70ecb20227d1bc81323", + "sha256": "02270i5smqqmwbnnk6ny0r92bihjhwm8180qh9knnx0s6x22z5jp" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.2.71/kotlin-stdlib-jdk7-1.2.71", "host": "https://repo.maven.apache.org/maven2", @@ -8947,6 +9747,34 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.20/kotlin-stdlib-jdk7-1.4.20", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "2ea19f4ead293c564a3846250ea1952464fa1e42", + "sha256": "1ly405169kfq367hlsjkz9lpm8392jx9q8svyn5zrc16hc2n52rr" + }, + "jar": { + "sha1": "9de2c79e95d4b4699a455e88ba285a95352e0bea", + "sha256": "1rjdbr01r9gbfdm03xrki5qqvcfzhkg8kfl55iicl7m6s6rsvbmm" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.31/kotlin-stdlib-jdk7-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "09ad248cfa8fe2534a9138aaac3c94a12443031c", + "sha256": "06114yfbm6cgb5ygzqmx41kxms4xylh5slhyslipx813pjz54zpn" + }, + "jar": { + "sha1": "84ce8e85f6e84270b2b501d44e9f0ba6ff64fa71", + "sha256": "0r16ym5biiycxna39njc10jldvpkw02cxzaa07bvgx3cx1a6x5hz" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.2.71/kotlin-stdlib-jdk8-1.2.71", "host": "https://repo.maven.apache.org/maven2", @@ -8989,6 +9817,34 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.20/kotlin-stdlib-jdk8-1.4.20", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "22bb65af551e2848a4f0ea71ad79fe66468314d1", + "sha256": "1a6mp73gac8qgd6m68rlj1cbqymss3vlnkbd2ln9b46vibqmx7ly" + }, + "jar": { + "sha1": "756521338269950c2a276f1abe6fef8e1a5e5528", + "sha256": "0ny7yhhac5nxjzc3wl3rlswl8p81ldzshmkpb8vnncqivqckzky7" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.31/kotlin-stdlib-jdk8-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "7ac4821d502469063c8c20fd4f73564b7b4ae215", + "sha256": "0mzldpw8fdab1bn6k9959z41dx0gb9assa6dv3d6ypwzwqkgdr2f" + }, + "jar": { + "sha1": "e613be5465ef1e6fd0468707690b7ebf625ea2fe", + "sha256": "10qnpmn5a0as8vnybrkfg33qxvzx3yhiai4xzw303jzb6m23dy5j" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-stdlib-jre7/1.2.0/kotlin-stdlib-jre7-1.2.0", "host": "https://repo.maven.apache.org/maven2", @@ -9129,6 +9985,20 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-stdlib/1.3.71/kotlin-stdlib-1.3.71", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "47da9a84ba07a4de17cddff5e139f8d120627c62", + "sha256": "1ifq9f9b0bk4v9a0fjyjlizg4iz2f6nsm64h9bx40bdakycfj0zz" + }, + "jar": { + "sha1": "898273189ad22779da6bed88ded39b14cb5fd432", + "sha256": "19z68pkaww0vry4w5jrkdasmff3zja5mbq24mkj2ar590aqj5kjs" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-stdlib/1.4.10/kotlin-stdlib-1.4.10", "host": "https://repo.maven.apache.org/maven2", @@ -9171,6 +10041,62 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-stdlib/1.4.30/kotlin-stdlib-1.4.30", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d03dcc9ab22ef243880b9dc82b0dede8f9d76fcf", + "sha256": "1kvmnmnd48mj3m6pwpv53z0gdksvw5f9z5qmfny9qpdw0cjbyi6c" + }, + "jar": { + "sha1": "d10d1e10f47006ee08162dde039e38ac487de4ac", + "sha256": "03xr90xp972sb58x35wmmfjzh78di1w38ihswrwzmj6jipv0r0d7" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-stdlib/1.4.31/kotlin-stdlib-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "578554985765fe941f4fab7874e27b62dc1918db", + "sha256": "0kmxvnhmicmsqc37rpndvh3a26ig8gmqh171gr901rsymkky66c5" + }, + "jar": { + "sha1": "a58e0fb9812a6a93ca24b5da75e4b5a0cb89c957", + "sha256": "073zp526a6dx36x9lk3ip9939bf64akxmdkr134qlzhnigc9k9bn" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-test-common/1.4.31/kotlin-test-common-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "a37784210c690cc46a3463524c27eae3cec1547b", + "sha256": "05h2vka34i2zvyr2gi197gsgz1frxpc009gdr6ny9psf2gym8j8s" + }, + "jar": { + "sha1": "4230331b5109debc141a9a81e4cadb357692e7ab", + "sha256": "03ggxf76vjf0b4xbs6x43w6wad5l906fma269zyqxs9zyrcd7zvh" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-test/1.4.31/kotlin-test-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "9d245857eab4ac2a1c206dca1f550937cb6fc515", + "sha256": "1n1p3060l6lcg960vy9rc6iq382skf4py0jbld7s8ls2i538lw40" + }, + "jar": { + "sha1": "32778ee611469736a0db1b1b66f1aff964073f63", + "sha256": "0fv1xmnz12vm25256v5rnmxb0cy79j38wdfsfkylm4521dkyaafn" + } + }, + { "path": "org/jetbrains/kotlin/kotlin-util-io/1.3.50/kotlin-util-io-1.3.50", "host": "https://repo.maven.apache.org/maven2", @@ -9185,6 +10111,48 @@ } }, + { + "path": "org/jetbrains/kotlin/kotlin-util-io/1.4.31/kotlin-util-io-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "6ba56a96fd64b7239d55df3c2e88233b00fe65fa", + "sha256": "1mi2yba7wvpfhh1cl8kq0xmq70g3q0rcjk3mzxbhh0qqr7b9x5fh" + }, + "jar": { + "sha1": "b3c8349cb6c6f1ca2c82013d375ca7148337ee1d", + "sha256": "1h2w7a0jidfm3jg5cga05w594349dis23p6kf0fxwplzkwzqx3gg" + } + }, + + { + "path": "org/jetbrains/kotlin/kotlin-util-klib/1.4.31/kotlin-util-klib-1.4.31", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "6d810bafc0d153c4ba839a4298da616744be502e", + "sha256": "0xzpcsx09j5g9nhgx1l727r6mkvfc1nmfb9bd7cirl0zrjfwfmz1" + }, + "jar": { + "sha1": "2c545be047c9863ff560e292c37d00a68925d289", + "sha256": "0vfrdd66j307ln5z0jbpn50p3n7sv13fg3fnibgbd37s7ias3j1b" + } + }, + + { + "path": "org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "5be49445de412640606e639322600e584162f8ff", + "sha256": "1sasg00fjvzz8vlmkk1q3qhqi24h8w9a0iflph4wfw0cg5rhnjy9" + }, + "jar": { + "sha1": "33c3e174a9c8368d93761d3d12712db18e903959", + "sha256": "1ryvjrjzixf0gwwnv35rn2lgawj5lj3hqs44ll3q6ipbilf8f5qr" + } + }, + { "path": "org/junit/junit-bom/5.7.0/junit-bom-5.7.0", "host": "https://repo.maven.apache.org/maven2", @@ -9238,16 +10206,44 @@ }, { - "path": "org/jvnet/staxex/stax-ex/2.0.0/stax-ex-2.0.0", + "path": "org/jvnet/staxex/stax-ex/2.0.1/stax-ex-2.0.1", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "09684093f96943df161bb624a47862c0888b5305", + "sha256": "17hp9qfq5i0yzvp7hz1djvjl0bwrvmyvlnhm1agh4m343nh5bazr" + }, + "jar": { + "sha1": "948f43d7bb3a10fdbb36d7100a3ee00496605d6c", + "sha256": "0mclzq2h8mz5n0gmc4zvwm9j9ircv7y2qkxsyrjc4f8drqm2kmsz" + } + }, + + { + "path": "org/mockito/mockito-core/2.23.0/mockito-core-2.23.0", "host": "https://repo.maven.apache.org/maven2", "type": "jar", "pom": { - "sha1": "5db5be5e11d5b2fe6e0c205dd8ec238814ebe6fe", - "sha256": "1nx9vl5x9841xl54ri77h4da5haj2p23hfi0ha3dpz2z8bagrs0p" + "sha1": "964603d931aead2b097dc54870e2f069fdb46a4e", + "sha256": "0i64ss9cwfn1px1fg8x0m7kgqix0g124aa5bzf9qmmfdfcvji1aw" }, "jar": { - "sha1": "594bbfc0b04d45059a44b864083c8a724a761484", - "sha256": "0f58647wqb07v9pg8incrdvqv5izj8yg3anyhaqr8m7i3ns1h0gy" + "sha1": "497ddb32fd5d01f9dbe99a2ec790aeb931dff1b1", + "sha256": "0hz0vzcixiln7jy4fhvybaqzkb4habpg4476vxx2mpbzqfzr2yb3" + } + }, + + { + "path": "org/mockito/mockito-core/2.28.2/mockito-core-2.28.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "1faf95a65310f3b1cdd239ba19c6bf67b2f5a308", + "sha256": "0lwxwmcavrm4838zq5vsm4s7j3x9hnvxp3fn6m4hav7fpwm35gxk" + }, + "jar": { + "sha1": "91110215a8cb9b77a46e045ee758f77d79167cc0", + "sha256": "09wyxjk1rdnxxwmrylvc37lg9m2gh4fql0nr1iy19hm6sgz3dbxh" } }, @@ -9265,6 +10261,16 @@ } }, + { + "path": "org/objenesis/objenesis-parent/2.6/objenesis-parent-2.6", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "cfc0966402e8174fbacd5c5dd355b5815364a4fe", + "sha256": "1aivk380s7n1lzhd9gxvar92ngk4n33cgpk3n00685rw5b5gw99q" + } + }, + { "path": "org/objenesis/objenesis-parent/3.1/objenesis-parent-3.1", "host": "https://repo.maven.apache.org/maven2", @@ -9275,6 +10281,30 @@ } }, + { + "path": "org/objenesis/objenesis-parent/3.2/objenesis-parent-3.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "833ced74e7fd53408a3915080c5e50f2dc90dc35", + "sha256": "1xrkvx2k9zhkzcw2d4zlryya0j5adw1jr1p5chwv3vzybh6vln88" + } + }, + + { + "path": "org/objenesis/objenesis/2.6/objenesis-2.6", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "b6d1f689e0d2b2d96b0730fad7b5d96902bf64d8", + "sha256": "1wfkl6z4i55ga8bkyd8kbr2axxfyiczm0xghj6yz2bf6kn80f4sc" + }, + "jar": { + "sha1": "639033469776fd37c08358c6b92a4761feb2af4b", + "sha256": "13bhn2p9k0sxy82l1mvvb97dd8k76h6fypxag4yayl62zdl865jy" + } + }, + { "path": "org/objenesis/objenesis/3.1/objenesis-3.1", "host": "https://repo.maven.apache.org/maven2", @@ -9289,6 +10319,20 @@ } }, + { + "path": "org/objenesis/objenesis/3.2/objenesis-3.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d6bda29a6a26aa5207ab880a4f09870aff20e3c6", + "sha256": "033b2sm4h4v82s7z7pp1ymqlid7nc2wmx8dq8ldp333v8zqss42f" + }, + "jar": { + "sha1": "7fadf57620c8b8abdf7519533e5527367cb51f09", + "sha256": "1wrmbs094mnzds44hi4f5gfprdsyl6ni6100xd9wc0zgbayn1n83" + } + }, + { "path": "org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0", "host": "https://repo.maven.apache.org/maven2", @@ -9345,6 +10389,20 @@ } }, + { + "path": "org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "0ca55cd4c856718f2fe48811c7fb391db48daf38", + "sha256": "07w49mj87zak52k8q688b9y1c33yx0k2n7aqa5i4vpmki4sadyki" + }, + "jar": { + "sha1": "b6e6abe057f23630113f4167c34bda7086691258", + "sha256": "1qix8nyx2ma9z68rf2vbdl5bv4kziail8rcfirvg27zzc2p2m4my" + } + }, + { "path": "org/ow2/asm/asm-analysis/9.1/asm-analysis-9.1", "host": "https://repo.maven.apache.org/maven2", @@ -9387,6 +10445,20 @@ } }, + { + "path": "org/ow2/asm/asm-commons/7.2/asm-commons-7.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d0afab50091f94cd0b09c5cc107f80c068ecc798", + "sha256": "13fpq3lx1nz56zwnhs6kp231rfbkcz8980djjsqr81f2m19d63hr" + }, + "jar": { + "sha1": "ca2954e8d92a05bacc28ff465b25c70e0f512497", + "sha256": "0n1mxbcg4d8iwxi4xfc474i7hs8bjvs0y2l838yj5yy5g6qvi1hf" + } + }, + { "path": "org/ow2/asm/asm-commons/9.1/asm-commons-9.1", "host": "https://repo.maven.apache.org/maven2", @@ -9521,6 +10593,20 @@ } }, + { + "path": "org/ow2/asm/asm-tree/7.2/asm-tree-7.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "a06d7d67ffee5819c4e72fe79f428d721447a34a", + "sha256": "0hh4bcgmvihlvid4lmgz3hcvh9aqzgdak1zcywa855yhic55yxjn" + }, + "jar": { + "sha1": "3a23cc36edaf8fc5a89cb100182758ccb5991487", + "sha256": "0mi6dy640fqmx7czpk9y8wclmk0nd3mc5lczsydxqg50gykgaqy0" + } + }, + { "path": "org/ow2/asm/asm-tree/9.1/asm-tree-9.1", "host": "https://repo.maven.apache.org/maven2", @@ -9563,6 +10649,20 @@ } }, + { + "path": "org/ow2/asm/asm-util/7.2/asm-util-7.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "a710cd3e6e179d98d802ebeef7ebd54863aaf89f", + "sha256": "0g2zlb15hnbgclcvg9n4nmr9r4j2r6gicwxg9d6rawrm1ad71hyi" + }, + "jar": { + "sha1": "a3ae34e57fa8a4040e28247291d0cc3d6b8c7bcf", + "sha256": "1y1h8n89cggdy7a7i86g908r8cf7rkhdclz0wzlczyhz08xr293f" + } + }, + { "path": "org/ow2/asm/asm/5.0.3/asm-5.0.3", "host": "https://repo.maven.apache.org/maven2", @@ -9605,6 +10705,20 @@ } }, + { + "path": "org/ow2/asm/asm/7.2/asm-7.2", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "016cc249bcaaeb17f49622826bc3e17518698088", + "sha256": "0qp2hhnq9hyi0rz58s6v1wv7q08kgp95a21qlgv9kijbpnpjkrg9" + }, + "jar": { + "sha1": "fa637eb67eb7628c915d73762b681ae7ff0b9731", + "sha256": "0wk643rhb93647vafi63c6lwsn509hadiijnjgih8kdr5vlwjv3y" + } + }, + { "path": "org/ow2/asm/asm/9.1/asm-9.1", "host": "https://repo.maven.apache.org/maven2", @@ -9639,6 +10753,160 @@ } }, + { + "path": "org/robolectric/annotations/4.4/annotations-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "19f0f6a24e54719efec5d7e0541cc1d61c090372", + "sha256": "1yxvx8w7pk788cz5k1fwk2f2pbdswzg5im1wyagq6ks4qkgwh7d3" + }, + "jar": { + "sha1": "70fc5b1699467dfd7de606fc6c02ff9fc1816d9f", + "sha256": "1zw9kzbq7d5zmnnig4ig34hd28g57gmjynnydl0mlalh3wddgcnj" + } + }, + + { + "path": "org/robolectric/junit/4.4/junit-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "7edfd48c7327c741d4876d2351659e0568beee7c", + "sha256": "1h0518n3yfy45r11kzd26nw89mhqsj85lqrglmw9nbxd20a42ayl" + }, + "jar": { + "sha1": "fbcda51d8e6f3a3897ae5cedc7aa481815745290", + "sha256": "0vl4rsyy79vy1kvjscwf6s573zqz6dlgzzm6jji768cxrwhcpsy5" + } + }, + + { + "path": "org/robolectric/pluginapi/4.4/pluginapi-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "a3b4504a6bd88180bbcba795a787955acbbf1062", + "sha256": "1x939marsx3m2vr6pbm3aggm9r8fbn8mism8dyv5np9flcnjhn3n" + }, + "jar": { + "sha1": "1ee94260f8c51620a35eac33fc1efc01350c751f", + "sha256": "04jm3xjbzf29sy0sp4adfib4czwwjb1xdp37dwvcn0h50vdl7xxj" + } + }, + + { + "path": "org/robolectric/plugins-maven-dependency-resolver/4.4/plugins-maven-dependency-resolver-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "8d97025619ae6a9e5b22a1ce8765d5ce8cbdb0b2", + "sha256": "0gcn9s8wv47qff8mhkr6agms6193b6h9d4l7vf8asycak8cv2glp" + }, + "jar": { + "sha1": "9241a3c4bd01627447c76d9b67614808c78ffdd9", + "sha256": "18s9nxypvxd42fp1916l79c8qqlhr0ya2vdhj4byxcnvdd504yaj" + } + }, + + { + "path": "org/robolectric/resources/4.4/resources-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "7282e54ee19232a5ef0bff396727da0bf2fb4bee", + "sha256": "0xsws3figacvnvsm3cjfpnrxxcwhvxjzqfh6vjvd1pab7wd7bz03" + }, + "jar": { + "sha1": "a2ee1324bcb62724e6cbfa655bdb5683948a554c", + "sha256": "1kxbzhrjjp5p8vhvjpxjg5i0zgs8a75awc2hwvyisml733vn5673" + } + }, + + { + "path": "org/robolectric/robolectric/4.4/robolectric-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "43861e91888ef12a812687df6ce0a5e5cc24bf9e", + "sha256": "1d5vd6psqf2krzba29mbprmylg06png3xx4mrbzjfr8569b14kcw" + }, + "jar": { + "sha1": "418c5bfae392fdbf71cd463a42a3e8c3b839a924", + "sha256": "0pzy23yvnkb0zf044rky0ffy0dhyxc5nf4iwaj76v3d42j4kdq1q" + } + }, + + { + "path": "org/robolectric/sandbox/4.4/sandbox-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "265731f2451b1100a7b106886c31725c3de1e61f", + "sha256": "1ygb5l7zy0qdqfky13wfy2v1pr0m1ap1yxiryn3kliag15r92i1i" + }, + "jar": { + "sha1": "03cedd73c5aedaf79fb9a593552816c9fb3282f2", + "sha256": "1npdri4kqscx12yk1mz2042wn4wz3x7ncgmyii2shg495w0kybz5" + } + }, + + { + "path": "org/robolectric/shadowapi/4.4/shadowapi-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "fb3876bafffe584b22de754d2f0c6cbc8a5b5a18", + "sha256": "1z0akxhycyfhnfqjrwkd12h5909qc4f4zlkivg1hpfhc08xs5hn3" + }, + "jar": { + "sha1": "529649474b53cf8f6f4a483044ade43aebed8a4c", + "sha256": "0gxq4g3iyf8218a528ai9b2vih6rbg35xgiqh6w6wdipj6snmkj8" + } + }, + + { + "path": "org/robolectric/shadows-framework/4.4/shadows-framework-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "c79bb2a3c8bcfcd01e538d007cb232dc3825a7ec", + "sha256": "1ny8yifcm2q2dfpjas2gir0c3ynf0jywrijy48rzb8z978r096sb" + }, + "jar": { + "sha1": "90028766e71353ad6f57d7bcb56ac0d861da18c3", + "sha256": "1w6rwdn1farngg5ya2r6r7ihrn08dl5n1s0c3s1kc430xyxza0h6" + } + }, + + { + "path": "org/robolectric/utils-reflector/4.4/utils-reflector-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "d182c4f939bc3455d33cbc31b7ede682cb2b7b93", + "sha256": "1hcisbgw3nw72mskj0clxldw5fdpv5bd7yzd63bh32iip6gvibv9" + }, + "jar": { + "sha1": "44c40ac0d2ef1e7c8b0f6c4e224ef26d356170f1", + "sha256": "0sdqknmk23vwh68f65xx0yqfq22z98awnxamp6ciwicspdjpi9rm" + } + }, + + { + "path": "org/robolectric/utils/4.4/utils-4.4", + "host": "https://repo.maven.apache.org/maven2", + "type": "jar", + "pom": { + "sha1": "c479f6a83e7defeb5ad118fa3afbd05d34781638", + "sha256": "1hgzi5jb8fcmjfjaxyvh228p73m7n2w46sibwpcq81gvpjf9zvfw" + }, + "jar": { + "sha1": "c54b2638d64e7bd4e1e45c4fe8038305402bd711", + "sha256": "1nb9gpgmy4jxxxgvbdsy1g9pf7xschmsap56apnfjshiaxf6nxgr" + } + }, + { "path": "org/slf4j/jcl-over-slf4j/2.0.0-alpha1/jcl-over-slf4j-2.0.0-alpha1", "host": "https://repo.maven.apache.org/maven2", @@ -9691,6 +10959,16 @@ } }, + { + "path": "org/sonatype/oss/oss-parent/4/oss-parent-4", + "host": "https://repo.maven.apache.org/maven2", + "type": "pom", + "pom": { + "sha1": "281323f0e2b10184d6c6b230909401166b437e01", + "sha256": "1vh6hjqq03hpwqvx7kf4lnzg2avvjf4narns9wyj3n8ry1f9j4y5" + } + }, + { "path": "org/sonatype/oss/oss-parent/7/oss-parent-7", "host": "https://repo.maven.apache.org/maven2", diff --git a/nix/deps/gradle/deps.list b/nix/deps/gradle/deps.list index 9af48d2d0e6..4d8f1f7278e 100644 --- a/nix/deps/gradle/deps.list +++ b/nix/deps/gradle/deps.list @@ -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 diff --git a/nix/deps/gradle/deps.urls b/nix/deps/gradle/deps.urls index f8179df3b54..c87b546496e 100644 --- a/nix/deps/gradle/deps.urls +++ b/nix/deps/gradle/deps.urls @@ -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 diff --git a/nix/deps/gradle/proj.list b/nix/deps/gradle/proj.list index e3bf84d24cb..8dbf8ba74f3 100644 --- a/nix/deps/gradle/proj.list +++ b/nix/deps/gradle/proj.list @@ -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 diff --git a/package.json b/package.json index 7f246a88e66..f9b9b0c71d0 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/mocks/js_dependencies.cljs b/src/mocks/js_dependencies.cljs index 4bb883c8b87..0dc48b62ce6 100644 --- a/src/mocks/js_dependencies.cljs +++ b/src/mocks/js_dependencies.cljs @@ -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")) diff --git a/src/quo/animated.cljs b/src/quo/animated.cljs index 4c17b130b82..33e312a3865 100644 --- a/src/quo/animated.cljs +++ b/src/quo/animated.cljs @@ -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)) diff --git a/src/quo/components/bottom_sheet/style.cljs b/src/quo/components/bottom_sheet/style.cljs index 67d30257015..49a7c442ef8 100644 --- a/src/quo/components/bottom_sheet/style.cljs +++ b/src/quo/components/bottom_sheet/style.cljs @@ -21,8 +21,7 @@ :left 0 :top 0 :right 0 - :bottom 0 - :background-color (:backdrop @colors/theme)}) + :bottom 0}) (defn content-container [window-height] diff --git a/src/quo/components/bottom_sheet/view.cljs b/src/quo/components/bottom_sheet/view.cljs index 078d1ea4016..c021bab84cf 100644 --- a/src/quo/components/bottom_sheet/view.cljs +++ b/src/quo/components/bottom_sheet/view.cljs @@ -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)}]})} diff --git a/src/quo/components/button/view.cljs b/src/quo/components/button/view.cljs index af095d0877f..e3a4a50442d 100644 --- a/src/quo/components/button/view.cljs +++ b/src/quo/components/button/view.cljs @@ -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 diff --git a/src/quo/previews/main.cljs b/src/quo/previews/main.cljs index f09d182495f..7905ea19ec1 100644 --- a/src/quo/previews/main.cljs +++ b/src/quo/previews/main.cljs @@ -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}]) diff --git a/src/quo/react_native.cljs b/src/quo/react_native.cljs index eee8912a1b4..50b032e2370 100644 --- a/src/quo/react_native.cljs +++ b/src/quo/react_native.cljs @@ -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)) diff --git a/src/status_im/acquisition/chat.cljs b/src/status_im/acquisition/chat.cljs index e343d2cacfe..17b93555169 100644 --- a/src/status_im/acquisition/chat.cljs +++ b/src/status_im/acquisition/chat.cljs @@ -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] diff --git a/src/status_im/add_new/core.cljs b/src/status_im/add_new/core.cljs index 3e63780e3c3..c2b25c249c6 100644 --- a/src/status_im/add_new/core.cljs +++ b/src/status_im/add_new/core.cljs @@ -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]} diff --git a/src/status_im/bottom_sheet/core.cljs b/src/status_im/bottom_sheet/core.cljs index 1aa5ae4617c..a33f232d292 100644 --- a/src/status_im/bottom_sheet/core.cljs +++ b/src/status_im/bottom_sheet/core.cljs @@ -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)}) diff --git a/src/status_im/browser/core.cljs b/src/status_im/browser/core.cljs index 81760338ebc..1ad363da830 100644 --- a/src/status_im/browser/core.cljs +++ b/src/status_im/browser/core.cljs @@ -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]} diff --git a/src/status_im/chat/models.cljs b/src/status_im/chat/models.cljs index f09ab81e0cc..3f4be8ac969 100644 --- a/src/status_im/chat/models.cljs +++ b/src/status_im/chat/models.cljs @@ -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)} diff --git a/src/status_im/commands/core.cljs b/src/status_im/commands/core.cljs index 21f2f9cdc47..1b87863d1d7 100644 --- a/src/status_im/commands/core.cljs +++ b/src/status_im/commands/core.cljs @@ -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 diff --git a/src/status_im/communities/core.cljs b/src/status_im/communities/core.cljs index 649a7292e0d..d4d530ba624 100644 --- a/src/status_im/communities/core.cljs +++ b/src/status_im/communities/core.cljs @@ -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]} diff --git a/src/status_im/contact/block.cljs b/src/status_im/contact/block.cljs index 895e12f394a..f81afbd490e 100644 --- a/src/status_im/contact/block.cljs +++ b/src/status_im/contact/block.cljs @@ -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 diff --git a/src/status_im/contact/chat.cljs b/src/status_im/contact/chat.cljs index 11a53bb1a11..0b771993c03 100644 --- a/src/status_im/contact/chat.cljs +++ b/src/status_im/contact/chat.cljs @@ -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] diff --git a/src/status_im/contact/core.cljs b/src/status_im/contact/core.cljs index da810c9850d..1b393710ed4 100644 --- a/src/status_im/contact/core.cljs +++ b/src/status_im/contact/core.cljs @@ -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]} diff --git a/src/status_im/core.cljs b/src/status_im/core.cljs index f3c6698317d..621456e4fec 100644 --- a/src/status_im/core.cljs +++ b/src/status_im/core.cljs @@ -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 diff --git a/src/status_im/ens/core.cljs b/src/status_im/ens/core.cljs index c3fdda634a9..0c64d608522 100644 --- a/src/status_im/ens/core.cljs +++ b/src/status_im/ens/core.cljs @@ -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]} diff --git a/src/status_im/events.cljs b/src/status_im/events.cljs index 0a66c2bcbfc..5634d6344a8 100644 --- a/src/status_im/events.cljs +++ b/src/status_im/events.cljs @@ -244,5 +244,5 @@ [cofx] (fx/merge cofx - (navigation/navigate-to :buy-crypto nil) + (navigation/open-modal :buy-crypto nil) (wallet/keep-watching-history))) diff --git a/src/status_im/group_chats/core.cljs b/src/status_im/group_chats/core.cljs index fddff626933..ba9dc2db249 100644 --- a/src/status_im/group_chats/core.cljs +++ b/src/status_im/group_chats/core.cljs @@ -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?)) diff --git a/src/status_im/init/core.cljs b/src/status_im/init/core.cljs index e08d4e39cca..21ab4c33e58 100644 --- a/src/status_im/init/core.cljs +++ b/src/status_im/init/core.cljs @@ -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]} diff --git a/src/status_im/keycard/backup_key.cljs b/src/status_im/keycard/backup_key.cljs index e2dbab210f5..c99890a0a7a 100644 --- a/src/status_im/keycard/backup_key.cljs +++ b/src/status_im/keycard/backup_key.cljs @@ -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))) diff --git a/src/status_im/keycard/common.cljs b/src/status_im/keycard/common.cljs index e879e0141b3..c1e44b5f1e9 100644 --- a/src/status_im/keycard/common.cljs +++ b/src/status_im/keycard/common.cljs @@ -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])) diff --git a/src/status_im/keycard/login.cljs b/src/status_im/keycard/login.cljs index 9f8d9b1b21f..d3d3aa34c0a 100644 --- a/src/status_im/keycard/login.cljs +++ b/src/status_im/keycard/login.cljs @@ -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)))) diff --git a/src/status_im/keycard/recovery.cljs b/src/status_im/keycard/recovery.cljs index 5e0480ba4c5..b4452265227 100644 --- a/src/status_im/keycard/recovery.cljs +++ b/src/status_im/keycard/recovery.cljs @@ -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 diff --git a/src/status_im/keycard/test_menu.cljs b/src/status_im/keycard/test_menu.cljs index f42edfc443c..8997694c8e6 100644 --- a/src/status_im/keycard/test_menu.cljs +++ b/src/status_im/keycard/test_menu.cljs @@ -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)}))) diff --git a/src/status_im/mailserver/core.cljs b/src/status_im/mailserver/core.cljs index 9b71cf43592..76421d1dab6 100644 --- a/src/status_im/mailserver/core.cljs +++ b/src/status_im/mailserver/core.cljs @@ -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) diff --git a/src/status_im/mobile_sync_settings/core.cljs b/src/status_im/mobile_sync_settings/core.cljs index 617d2a8910c..0b1b7db8429 100644 --- a/src/status_im/mobile_sync_settings/core.cljs +++ b/src/status_im/mobile_sync_settings/core.cljs @@ -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]} diff --git a/src/status_im/multiaccounts/create/core.cljs b/src/status_im/multiaccounts/create/core.cljs index d1de8a2481c..e81c56915b6 100644 --- a/src/status_im/multiaccounts/create/core.cljs +++ b/src/status_im/multiaccounts/create/core.cljs @@ -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))) -(fx/defn 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]})) - -(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})}) - -(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 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))) - -(fx/defn remove-recovery-flag [{:keys [db]}] - {:db (dissoc db :recovered-account?)}) +(re-frame/reg-cofx + ::get-signing-phrase + (fn [cofx _] + (assoc cofx :signing-phrase (signing-phrase/generate)))) -(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))}))))) +(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 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 create-multiaccount + {:events [:create-multiaccount]} + [{:keys [db]} key-code] + (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]))))))]})) -(fx/defn exit-wizard - [{:keys [db] :as cofx}] - (fx/merge - cofx - {:db (dissoc db :intro-wizard)} - (navigation/navigate-to-cofx :notifications-onboarding nil))) +(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 init-key-generation - [{:keys [db] :as cofx}] +(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) - :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) + :multiaccount-generate-and-derive-addresses nil}) - (and (= step :create-code) - (not processing?)) - (fx/merge cofx - {:db (assoc-in db [:intro-wizard :processing?] true)} - (create-multiaccount key-code)) +(fx/defn prepare-intro-wizard + [{:keys [db]}] + {:db (assoc db :intro-wizard {})}) - (and (= step :create-code) - (:multiaccounts/login db)) - (exit-wizard cofx) +(fx/defn save-multiaccount-and-login-with-keycard + [_ args] + {:keycard/save-multiaccount-and-login args}) - (and (= step :select-key-storage) - (= :advanced selected-storage-type)) - {:dispatch [:keycard/start-onboarding-flow]} +(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))) - :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 {}))))) - -(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 %))])))) + accounts-data))))) -(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))) diff --git a/src/status_im/multiaccounts/key_storage/core.cljs b/src/status_im/multiaccounts/key_storage/core.cljs index d210501d286..a434a71aaf7 100644 --- a/src/status_im/multiaccounts/key_storage/core.cljs +++ b/src/status_im/multiaccounts/key_storage/core.cljs @@ -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 diff --git a/src/status_im/multiaccounts/key_storage/core_test.cljs b/src/status_im/multiaccounts/key_storage/core_test.cljs index e67bdb8586a..0455cb36489 100644 --- a/src/status_im/multiaccounts/key_storage/core_test.cljs +++ b/src/status_im/multiaccounts/key_storage/core_test.cljs @@ -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))) diff --git a/src/status_im/multiaccounts/login/core.cljs b/src/status_im/multiaccounts/login/core.cljs index 9660b25f4e9..3f2ec2be904 100644 --- a/src/status_im/multiaccounts/login/core.cljs +++ b/src/status_im/multiaccounts/login/core.cljs @@ -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 diff --git a/src/status_im/multiaccounts/login/core_test.cljs b/src/status_im/multiaccounts/login/core_test.cljs index 3976aeb97c1..da9ad8d9839 100644 --- a/src/status_im/multiaccounts/login/core_test.cljs +++ b/src/status_im/multiaccounts/login/core_test.cljs @@ -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))))))) \ No newline at end of file diff --git a/src/status_im/multiaccounts/logout/core.cljs b/src/status_im/multiaccounts/logout/core.cljs index a7fef36fdd7..0c48a3a7567 100644 --- a/src/status_im/multiaccounts/logout/core.cljs +++ b/src/status_im/multiaccounts/logout/core.cljs @@ -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 diff --git a/src/status_im/multiaccounts/recover/core.cljs b/src/status_im/multiaccounts/recover/core.cljs index c9e74031c3a..a28d59cbc8d 100644 --- a/src/status_im/multiaccounts/recover/core.cljs +++ b/src/status_im/multiaccounts/recover/core.cljs @@ -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 diff --git a/src/status_im/navigation.cljs b/src/status_im/navigation.cljs index c605877e271..cd1e0114cac 100644 --- a/src/status_im/navigation.cljs +++ b/src/status_im/navigation.cljs @@ -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 pop-to-root-tab + {:events [:pop-to-root-tab]} + [_ tab] + {:rnn-pop-to-root-tab-fx tab}) -(fx/defn navigate-reset - {:events [:navigate-reset]} - [_ config] - {::navigate-reset config}) +(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}) + + + + diff --git a/src/status_im/navigation/core.cljs b/src/status_im/navigation/core.cljs new file mode 100644 index 00000000000..3802687c522 --- /dev/null +++ b/src/status_im/navigation/core.cljs @@ -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))) diff --git a/src/status_im/navigation/roots.cljs b/src/status_im/navigation/roots.cljs new file mode 100644 index 00000000000..10c831692f7 --- /dev/null +++ b/src/status_im/navigation/roots.cljs @@ -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)})}}}}) \ No newline at end of file diff --git a/src/status_im/popover/core.cljs b/src/status_im/popover/core.cljs index 424f390f349..e8fa41190d7 100644 --- a/src/status_im/popover/core.cljs +++ b/src/status_im/popover/core.cljs @@ -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}) diff --git a/src/status_im/qr_scanner/core.cljs b/src/status_im/qr_scanner/core.cljs index 574077287a4..ff223b39547 100644 --- a/src/status_im/qr_scanner/core.cljs +++ b/src/status_im/qr_scanner/core.cljs @@ -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]} diff --git a/src/status_im/reloader.cljs b/src/status_im/reloader.cljs index 1346299e62e..f822f560d32 100644 --- a/src/status_im/reloader.cljs +++ b/src/status_im/reloader.cljs @@ -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 diff --git a/src/status_im/signing/core.cljs b/src/status_im/signing/core.cljs index b18c877f450..561bf6b893e 100644 --- a/src/status_im/signing/core.cljs +++ b/src/status_im/signing/core.cljs @@ -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) diff --git a/src/status_im/stickers/core.cljs b/src/status_im/stickers/core.cljs index 45343df3234..1713c11490f 100644 --- a/src/status_im/stickers/core.cljs +++ b/src/status_im/stickers/core.cljs @@ -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]}))))) diff --git a/src/status_im/subs.cljs b/src/status_im/subs.cljs index 0b077baa277..703dc14f6a3 100644 --- a/src/status_im/subs.cljs +++ b/src/status_im/subs.cljs @@ -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 diff --git a/src/status_im/theme/core.cljs b/src/status_im/theme/core.cljs index e9c0a2f4df1..2f8353c8136 100644 --- a/src/status_im/theme/core.cljs +++ b/src/status_im/theme/core.cljs @@ -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)) diff --git a/src/status_im/ui/components/bottom_panel/views.cljs b/src/status_im/ui/components/bottom_panel/views.cljs index b4062ccaead..3a55525974c 100644 --- a/src/status_im/ui/components/bottom_panel/views.cljs +++ b/src/status_im/ui/components/bottom_panel/views.cljs @@ -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])) diff --git a/src/status_im/ui/components/connectivity/view.cljs b/src/status_im/ui/components/connectivity/view.cljs index e0cc2138d6b..899ddd4429d 100644 --- a/src/status_im/ui/components/connectivity/view.cljs +++ b/src/status_im/ui/components/connectivity/view.cljs @@ -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 [:<> diff --git a/src/status_im/ui/components/invite/events.cljs b/src/status_im/ui/components/invite/events.cljs index a8bc6b3f3f3..87ce7a5b345 100644 --- a/src/status_im/ui/components/invite/events.cljs +++ b/src/status_im/ui/components/invite/events.cljs @@ -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 diff --git a/src/status_im/ui/components/invite/views.cljs b/src/status_im/ui/components/invite/views.cljs index 435cff23197..f3ba47623dd 100644 --- a/src/status_im/ui/components/invite/views.cljs +++ b/src/status_im/ui/components/invite/views.cljs @@ -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] diff --git a/src/status_im/ui/components/keyboard_avoid_presentation.cljs b/src/status_im/ui/components/keyboard_avoid_presentation.cljs index 33aa1967c72..e691617bd3e 100644 --- a/src/status_im/ui/components/keyboard_avoid_presentation.cljs +++ b/src/status_im/ui/components/keyboard_avoid_presentation.cljs @@ -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))))])) diff --git a/src/status_im/ui/components/react.cljs b/src/status_im/ui/components/react.cljs index e88816dad65..7be5d2522d5 100644 --- a/src/status_im/ui/components/react.cljs +++ b/src/status_im/ui/components/react.cljs @@ -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] diff --git a/src/status_im/ui/components/status_bar/styles.cljs b/src/status_im/ui/components/status_bar/styles.cljs deleted file mode 100644 index 2b5dc5a1ef9..00000000000 --- a/src/status_im/ui/components/status_bar/styles.cljs +++ /dev/null @@ -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}))}) diff --git a/src/status_im/ui/components/status_bar/view.cljs b/src/status_im/ui/components/status_bar/view.cljs index 3ab0e569f8e..e69de29bb2d 100644 --- a/src/status_im/ui/components/status_bar/view.cljs +++ b/src/status_im/ui/components/status_bar/view.cljs @@ -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))))) diff --git a/src/status_im/ui/components/tabbar/core.cljs b/src/status_im/ui/components/tabbar/core.cljs index 78e8544f414..efa4a6e0255 100644 --- a/src/status_im/ui/components/tabbar/core.cljs +++ b/src/status_im/ui/components/tabbar/core.cljs @@ -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]]) \ No newline at end of file diff --git a/src/status_im/ui/components/tabbar/styles.cljs b/src/status_im/ui/components/tabbar/styles.cljs deleted file mode 100644 index f311eb17608..00000000000 --- a/src/status_im/ui/components/tabbar/styles.cljs +++ /dev/null @@ -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)}) diff --git a/src/status_im/ui/screens/about_app/views.cljs b/src/status_im/ui/screens/about_app/views.cljs index 6eae16e2709..d335e25dc2d 100644 --- a/src/status_im/ui/screens/about_app/views.cljs +++ b/src/status_im/ui/screens/about_app/views.cljs @@ -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]] diff --git a/src/status_im/ui/screens/add_new/new_public_chat/view.cljs b/src/status_im/ui/screens/add_new/new_public_chat/view.cljs index 94f519aa3d8..630a8ca6757 100644 --- a/src/status_im/ui/screens/add_new/new_public_chat/view.cljs +++ b/src/status_im/ui/screens/add_new/new_public_chat/view.cljs @@ -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)))]])]])) diff --git a/src/status_im/ui/screens/advanced_settings/views.cljs b/src/status_im/ui/screens/advanced_settings/views.cljs index 9e78cccf91d..875cfe284a5 100644 --- a/src/status_im/ui/screens/advanced_settings/views.cljs +++ b/src/status_im/ui/screens/advanced_settings/views.cljs @@ -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}])) diff --git a/src/status_im/ui/screens/appearance/views.cljs b/src/status_im/ui/screens/appearance/views.cljs index 0eb619c3483..639f830fe54 100644 --- a/src/status_im/ui/screens/appearance/views.cljs +++ b/src/status_im/ui/screens/appearance/views.cljs @@ -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]]])) \ No newline at end of file + [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]])) \ No newline at end of file diff --git a/src/status_im/ui/screens/bootnodes_settings/edit_bootnode/views.cljs b/src/status_im/ui/screens/bootnodes_settings/edit_bootnode/views.cljs index 7a0c5f458f2..2a1105eebe8 100644 --- a/src/status_im/ui/screens/bootnodes_settings/edit_bootnode/views.cljs +++ b/src/status_im/ui/screens/bootnodes_settings/edit_bootnode/views.cljs @@ -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 diff --git a/src/status_im/ui/screens/bootnodes_settings/views.cljs b/src/status_im/ui/screens/bootnodes_settings/views.cljs index a2b8cb9f999..7341523c72f 100644 --- a/src/status_im/ui/screens/bootnodes_settings/views.cljs +++ b/src/status_im/ui/screens/bootnodes_settings/views.cljs @@ -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 diff --git a/src/status_im/ui/screens/browser/empty_tab/views.cljs b/src/status_im/ui/screens/browser/empty_tab/views.cljs index d76545d2ca8..c75a92d9b34 100644 --- a/src/status_im/ui/screens/browser/empty_tab/views.cljs +++ b/src/status_im/ui/screens/browser/empty_tab/views.cljs @@ -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) diff --git a/src/status_im/ui/screens/browser/options/views.cljs b/src/status_im/ui/screens/browser/options/views.cljs index 3d71293ed8f..c5bb03e6eb5 100644 --- a/src/status_im/ui/screens/browser/options/views.cljs +++ b/src/status_im/ui/screens/browser/options/views.cljs @@ -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? diff --git a/src/status_im/ui/screens/browser/views.cljs b/src/status_im/ui/screens/browser/views.cljs index 2d04d4d24d5..05c8564bde1 100644 --- a/src/status_im/ui/screens/browser/views.cljs +++ b/src/status_im/ui/screens/browser/views.cljs @@ -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]] diff --git a/src/status_im/ui/screens/chat/components/accessory.cljs b/src/status_im/ui/screens/chat/components/accessory.cljs index a9f7f01a312..78177206836 100644 --- a/src/status_im/ui/screens/chat/components/accessory.cljs +++ b/src/status_im/ui/screens/chat/components/accessory.cljs @@ -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 [] diff --git a/src/status_im/ui/screens/chat/message/link_preview.cljs b/src/status_im/ui/screens/chat/message/link_preview.cljs index 488698bd4d6..adb022bccfa 100644 --- a/src/status_im/ui/screens/chat/message/link_preview.cljs +++ b/src/status_im/ui/screens/chat/message/link_preview.cljs @@ -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] diff --git a/src/status_im/ui/screens/chat/toolbar_content.cljs b/src/status_im/ui/screens/chat/toolbar_content.cljs index 26fc5a6ae76..3d5162ac961 100644 --- a/src/status_im/ui/screens/chat/toolbar_content.cljs +++ b/src/status_im/ui/screens/chat/toolbar_content.cljs @@ -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])]) diff --git a/src/status_im/ui/screens/chat/views.cljs b/src/status_im/ui/screens/chat/views.cljs index c5b3732af89..22e8c1daeee 100644 --- a/src/status_im/ui/screens/chat/views.cljs +++ b/src/status_im/ui/screens/chat/views.cljs @@ -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 diff --git a/src/status_im/ui/screens/communities/channel_details.cljs b/src/status_im/ui/screens/communities/channel_details.cljs index 27697ed1e7e..f4fc58701e4 100644 --- a/src/status_im/ui/screens/communities/channel_details.cljs +++ b/src/status_im/ui/screens/communities/channel_details.cljs @@ -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]} (evt [form] [toolbar/toolbar {:show-border? true diff --git a/src/status_im/ui/screens/communities/create_channel.cljs b/src/status_im/ui/screens/communities/create_channel.cljs index b1fd04f8d0f..ca525512587 100644 --- a/src/status_im/ui/screens/communities/create_channel.cljs +++ b/src/status_im/ui/screens/communities/create_channel.cljs @@ -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 - [topbar/topbar {:title (i18n/label :t/create-channel-title)}] [form] [toolbar/toolbar {:show-border? true diff --git a/src/status_im/ui/screens/communities/edit.cljs b/src/status_im/ui/screens/communities/edit.cljs index 3d2024ea966..58a3291e6c3 100644 --- a/src/status_im/ui/screens/communities/edit.cljs +++ b/src/status_im/ui/screens/communities/edit.cljs @@ -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 - [topbar/topbar {:title (i18n/label :t/community-edit-title)}] [community.create/form] [toolbar/toolbar {:show-border? true diff --git a/src/status_im/ui/screens/communities/import.cljs b/src/status_im/ui/screens/communities/import.cljs index 604341c7a8c..8bb88d86526 100644 --- a/src/status_im/ui/screens/communities/import.cljs +++ b/src/status_im/ui/screens/communities/import.cljs @@ -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 diff --git a/src/status_im/ui/screens/communities/invite.cljs b/src/status_im/ui/screens/communities/invite.cljs index feb76734112..b534af0ba56 100644 --- a/src/status_im/ui/screens/communities/invite.cljs +++ b/src/status_im/ui/screens/communities/invite.cljs @@ -42,9 +42,9 @@ (defn invite [] (let [user-pk (reagent/atom "") contacts-selected (reagent/atom #{})] - (fn [route] + (fn [] (let [contacts-data ( - [topbar/topbar {:title (i18n/label :t/membership-title)}] [rn/scroll-view {} (doall (for [[id o] options] diff --git a/src/status_im/ui/screens/communities/profile.cljs b/src/status_im/ui/screens/communities/profile.cljs index b117a158d45..15229b27d69 100644 --- a/src/status_im/ui/screens/communities/profile.cljs +++ b/src/status_im/ui/screens/communities/profile.cljs @@ -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]} (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 ( @@ -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 ( {: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 diff --git a/src/status_im/ui/screens/contacts_list/views.cljs b/src/status_im/ui/screens/contacts_list/views.cljs index eed5a43e502..1df903cc5ac 100644 --- a/src/status_im/ui/screens/contacts_list/views.cljs +++ b/src/status_im/ui/screens/contacts_list/views.cljs @@ -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}])) diff --git a/src/status_im/ui/screens/currency_settings/views.cljs b/src/status_im/ui/screens/currency_settings/views.cljs index 896580ce2f7..3c85dc742a5 100644 --- a/src/status_im/ui/screens/currency_settings/views.cljs +++ b/src/status_im/ui/screens/currency_settings/views.cljs @@ -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} diff --git a/src/status_im/ui/screens/dapps_permissions/views.cljs b/src/status_im/ui/screens/dapps_permissions/views.cljs index d5974d5471f..d2e352d78e1 100644 --- a/src/status_im/ui/screens/dapps_permissions/views.cljs +++ b/src/status_im/ui/screens/dapps_permissions/views.cljs @@ -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)) diff --git a/src/status_im/ui/screens/default_sync_period_settings/view.cljs b/src/status_im/ui/screens/default_sync_period_settings/view.cljs index bc9179d9d60..edc63e17b3f 100644 --- a/src/status_im/ui/screens/default_sync_period_settings/view.cljs +++ b/src/status_im/ui/screens/default_sync_period_settings/view.cljs @@ -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]])) diff --git a/src/status_im/ui/screens/ens/views.cljs b/src/status_im/ui/screens/ens/views.cljs index bf21c79298a..23a0f76ee7a 100644 --- a/src/status_im/ui/screens/ens/views.cljs +++ b/src/status_im/ui/screens/ens/views.cljs @@ -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])])) diff --git a/src/status_im/ui/screens/fleet_settings/views.cljs b/src/status_im/ui/screens/fleet_settings/views.cljs index 4f15654af71..e3d23ad375e 100644 --- a/src/status_im/ui/screens/fleet_settings/views.cljs +++ b/src/status_im/ui/screens/fleet_settings/views.cljs @@ -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}])) diff --git a/src/status_im/ui/screens/glossary/view.cljs b/src/status_im/ui/screens/glossary/view.cljs index 1802da9fb7e..d3446393ecc 100644 --- a/src/status_im/ui/screens/glossary/view.cljs +++ b/src/status_im/ui/screens/glossary/view.cljs @@ -2,7 +2,6 @@ (:require [status-im.ui.components.react :as react] [status-im.ui.components.list.views :as list] [status-im.ui.components.colors :as colors] - [status-im.ui.components.topbar :as topbar] [status-im.i18n.i18n :as i18n])) (def messages [{:title :t/account-title @@ -48,13 +47,10 @@ (map (fn [[k v]] {:title k :data v})))] - [react/view {:flex 1 - :background-color colors/white} - [topbar/topbar {:title (i18n/label :t/glossary)}] - [list/section-list - {:contentContainerStyle {:padding-horizontal 16 - :padding-bottom 16} - :stickySectionHeadersEnabled true - :sections sections - :render-fn render-element - :render-section-header-fn render-section-header}]])) + [list/section-list + {:contentContainerStyle {:padding-horizontal 16 + :padding-bottom 16} + :stickySectionHeadersEnabled true + :sections sections + :render-fn render-element + :render-section-header-fn render-section-header}])) diff --git a/src/status_im/ui/screens/group/views.cljs b/src/status_im/ui/screens/group/views.cljs index ab4aa0cf6cf..acdbc652585 100644 --- a/src/status_im/ui/screens/group/views.cljs +++ b/src/status_im/ui/screens/group/views.cljs @@ -101,7 +101,8 @@ (views/letsubs [contacts [:selected-group-contacts] group-name [:new-chat-name]] (let [group-name-empty? (not (spec/valid? :global/not-empty-string group-name))] - [kb-presentation/keyboard-avoiding-view {:style styles/group-container} + [react/keyboard-avoiding-view {:style styles/group-container + :ignore-offset true} [react/view {:flex 1} [topbar/topbar {:use-insets false :title (i18n/label :t/new-group-chat) @@ -162,7 +163,8 @@ (views/defview contact-toggle-list [] (views/letsubs [contacts [:contacts/active] selected-contacts-count [:selected-contacts-count]] - [kb-presentation/keyboard-avoiding-view {:style styles/group-container} + [react/keyboard-avoiding-view {:style styles/group-container + :ignore-offset true} [topbar/topbar {:use-insets false :border-bottom false :title (i18n/label :t/new-group-chat) @@ -217,9 +219,6 @@ (views/letsubs [{:keys [name chat-id]} [:chats/current-chat] new-group-chat-name (reagent/atom nil)] [kb-presentation/keyboard-avoiding-view {:style styles/group-container} - [topbar/topbar - {:title (i18n/label :t/edit-group) - :modal? true}] [react/scroll-view {:style {:padding 16 :flex 1}} [quo/text-input diff --git a/src/status_im/ui/screens/help_center/views.cljs b/src/status_im/ui/screens/help_center/views.cljs index e3d416d118f..fb94d026cb4 100644 --- a/src/status_im/ui/screens/help_center/views.cljs +++ b/src/status_im/ui/screens/help_center/views.cljs @@ -4,8 +4,6 @@ [quo.core :as quo] [status-im.ui.components.react :as react] [status-im.ui.components.list.views :as list] - [status-im.ui.components.colors :as colors] - [status-im.ui.components.topbar :as topbar] [status-im.constants :as constants])) (def data @@ -38,9 +36,7 @@ :chevron true}]) (defn help-center [] - [react/view {:flex 1 :background-color colors/white} - [topbar/topbar {:title (i18n/label :t/need-help)}] - [list/flat-list - {:data data - :key-fn (fn [_ i] (str i)) - :render-fn quo/list-item}]]) + [list/flat-list + {:data data + :key-fn (fn [_ i] (str i)) + :render-fn quo/list-item}]) diff --git a/src/status_im/ui/screens/home/sheet/views.cljs b/src/status_im/ui/screens/home/sheet/views.cljs index 45c4dff13f6..9dafbd19c7e 100644 --- a/src/status_im/ui/screens/home/sheet/views.cljs +++ b/src/status_im/ui/screens/home/sheet/views.cljs @@ -33,7 +33,7 @@ :title (i18n/label :t/start-new-chat) :accessibility-label :start-1-1-chat-button :icon :main-icons/one-on-one-chat - :on-press #(hide-sheet-and-dispatch [:navigate-to :new-chat])}] + :on-press #(hide-sheet-and-dispatch [:open-modal :new-chat])}] (when config/group-chat-enabled? [quo/list-item {:theme :accent @@ -46,14 +46,14 @@ :title (i18n/label :t/new-public-group-chat) :accessibility-label :join-public-chat-button :icon :main-icons/public-chat - :on-press #(hide-sheet-and-dispatch [:navigate-to :new-public-chat])}] + :on-press #(hide-sheet-and-dispatch [:open-modal :new-public-chat])}] (when @(re-frame/subscribe [:communities/enabled?]) [quo/list-item {:theme :accent :title (i18n/label :t/communities-alpha) :accessibility-label :communities-button :icon :main-icons/communities - :on-press #(hide-sheet-and-dispatch [:navigate-to :communities {:screen :communities}])}]) + :on-press #(hide-sheet-and-dispatch [:navigate-to :communities])}]) [invite/list-item {:accessibility-label :chats-menu-invite-friends-button}]]) diff --git a/src/status_im/ui/screens/home/styles.cljs b/src/status_im/ui/screens/home/styles.cljs index deebd9e05c9..c015207a885 100644 --- a/src/status_im/ui/screens/home/styles.cljs +++ b/src/status_im/ui/screens/home/styles.cljs @@ -40,14 +40,6 @@ :line-height 22 :text-align :center}) -(def welcome-view - {:flex 1 - :justify-content :flex-end}) - -(def welcome-text - {:typography :header - :text-align :center}) - (def welcome-blank-text {:font-size 15 :width 270 @@ -55,13 +47,6 @@ :text-align :center :color colors/gray}) -(def welcome-text-description - {:margin-top 16 - :margin-bottom 32 - :text-align :center - :margin-horizontal 40 - :color colors/gray}) - (def empty-chats-header-container {:align-items :center :justify-content :center}) @@ -92,3 +77,20 @@ :background-color colors/gray :align-items :center :justify-content :center}) + +(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}) diff --git a/src/status_im/ui/screens/home/views.cljs b/src/status_im/ui/screens/home/views.cljs index 8e5db87f33f..0ee55677a9f 100644 --- a/src/status_im/ui/screens/home/views.cljs +++ b/src/status_im/ui/screens/home/views.cljs @@ -20,41 +20,13 @@ [status-im.add-new.db :as db] [status-im.utils.debounce :as debounce] [status-im.utils.utils :as utils] - [cljs-bean.core :as bean] - [status-im.multiaccounts.login.core :as multiaccounts.login] [status-im.ui.components.invite.views :as invite] [status-im.ui.components.topbar :as topbar] [status-im.ui.components.plus-button :as components.plus-button] - [status-im.ui.components.tabbar.styles :as tabs.styles] - [status-im.ui.screens.chat.sheets :as sheets]) + [status-im.ui.screens.chat.sheets :as sheets] + [status-im.ui.components.tabbar.core :as tabbar]) (:require-macros [status-im.utils.views :as views])) -(defn welcome-image-wrapper [] - (let [dimensions (reagent/atom {})] - (fn [] - [react/view {:on-layout (fn [^js e] - (reset! dimensions (bean/->clj (-> e .-nativeEvent .-layout)))) - :style {:align-items :center - :justify-content :center - :flex 1}} - (let [padding 0 - image-size (- (min (:width @dimensions) (:height @dimensions)) padding)] - [react/image {:source (resources/get-theme-image :welcome) - :resize-mode :contain - :style {:width image-size :height image-size}}])]))) - -(defn welcome [] - [react/view {:style styles/welcome-view} - [welcome-image-wrapper] - [react/i18n-text {:style styles/welcome-text :key :welcome-to-status}] - [react/view - [react/i18n-text {:style styles/welcome-text-description - :key :welcome-to-status-description}]] - [react/view {:align-items :center :margin-bottom 50} - [quo/button {:on-press #(re-frame/dispatch [::multiaccounts.login/welcome-lets-go]) - :accessibility-label :lets-go-button} - (i18n/label :t/lets-go)]]]) - (defn home-tooltip-view [] [react/view (styles/chat-tooltip) [react/view {:style {:flex-direction :row}} @@ -221,17 +193,19 @@ :theme :icon} :main-icons/notification] (when (pos? notif-count) - [react/view {:style (merge (tabs.styles/counter-public-container) {:top 5 :right 5}) + [react/view {:style (merge (styles/counter-public-container) {:top 5 :right 5}) :pointer-events :none} - [react/view {:style tabs.styles/counter-public + [react/view {:style styles/counter-public :accessibility-label :notifications-unread-badge}]])])) (defn home [] - [react/keyboard-avoiding-view {:style {:flex 1}} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [topbar/topbar {:title (i18n/label :t/chat) :navigation :none :right-component [react/view {:flex-direction :row :margin-right 16} [connectivity/connectivity-button] [notifications-button]]}] [chats-list] - [plus-button]]) + [plus-button] + [tabbar/tabs-counts-subscriptions]]) diff --git a/src/status_im/ui/screens/intro/carousel.cljs b/src/status_im/ui/screens/intro/carousel.cljs deleted file mode 100644 index 299ae9a48b9..00000000000 --- a/src/status_im/ui/screens/intro/carousel.cljs +++ /dev/null @@ -1,133 +0,0 @@ -(ns status-im.ui.screens.intro.carousel - (:require [quo.animated :as animated] - [quo.react-native :as rn] - [quo.core :as quo] - [reagent.core :as r] - [status-im.i18n.i18n :as i18n] - [status-im.ui.screens.intro.styles :as styles])) - -(defn code [val] - ^{:key val} - [animated/code {:exec val}]) - -(defn dot [] - (let [active (animated/value 0) - active-transition (animated/with-timing-transition active {:duration 100})] - (fn [{:keys [selected progress]}] - [animated/view {:style (styles/dot-style active-transition)} - [code (animated/set active (if selected 1 0))] - [animated/view {:style (styles/dot-progress active-transition progress)}]]))) - -(defn dots-selector [{:keys [n selected progress]}] - [rn/view {:style (styles/dot-selector)} - (for [i (range n)] - ^{:key i} - [dot {:progress progress - :selected (= selected i)}])]) - -(defn viewer [slides window-height _] - (let [scroll-x (r/atom 0) - scroll-view-ref (atom nil) - width (r/atom 0) - height (r/atom 0) - text-height (r/atom 0) - index (r/atom 0) - manual-scroll (atom false) - text-temp-height (atom 0) - text-temp-timer (atom nil) - bottom-margin (if (> window-height 600) 32 16) - progress (animated/value 1) - autoscroll (animated/value 1) - finished (animated/value 0) - clock (animated/clock) - go-next (fn [] - (let [x (if (>= @scroll-x (* (dec (count slides)) - @width)) - 0 - (+ @scroll-x @width))] - (reset! index (Math/round (/ x @width))) - (some-> ^js @scroll-view-ref (.scrollTo #js {:x x :animated true})))) - code (animated/block - [(animated/cond* (animated/and* (animated/not* (animated/clock-running clock)) - autoscroll) - (animated/start-clock clock)) - (animated/cond* (animated/and* (animated/clock-running clock) - (animated/not* autoscroll)) - [(animated/stop-clock clock) - (animated/set finished 1)]) - (animated/set progress (animated/cancelable-loop - {:clock clock - :finished finished - :duration 4000 - :on-reach go-next}))]) - cancel-animation (fn [] - (reset! manual-scroll true) - (animated/set-value autoscroll 0)) - restart-animation (fn [] - (animated/set-value autoscroll 1))] - (fn [_ _ view-id] - (let [current-screen? (or (nil? view-id) (= view-id :intro))] - [rn/view {:style {:align-items :center - :flex 1 - :margin-bottom bottom-margin - :justify-content :flex-end} - :on-layout (fn [^js e] - (when current-screen? - (reset! width (-> e .-nativeEvent .-layout .-width))))} - (when current-screen? - [animated/code {:exec code}]) - [rn/scroll-view {:horizontal true - :paging-enabled true - :ref #(reset! scroll-view-ref %) - :shows-vertical-scroll-indicator false - :shows-horizontal-scroll-indicator false - :pinch-gesture-enabled false - :scroll-event-throttle 16 - :on-scroll #(let [x (.-nativeEvent.contentOffset.x ^js %)] - (when @manual-scroll - ;; NOTE: Will be not synced if velocity is big - (reset! index (Math/round (/ x @width)))) - (reset! scroll-x x)) - :on-scroll-begin-drag cancel-animation - :on-scroll-end-drag restart-animation - :on-momentum-scroll-end #(reset! manual-scroll false) - :style {:margin-bottom bottom-margin}} - (doall - (for [s slides] - ^{:key (:title s)} - [rn/view {:style {:flex 1 - :width @width - :justify-content :flex-end - :align-items :center - :padding-horizontal 32}} - (let [size (min @width @height)] - [rn/view {:style {:flex 1} - :on-layout (fn [^js e] - (let [new-height (-> e .-nativeEvent .-layout .-height)] - (when current-screen? - (swap! height #(if (pos? %) (min % new-height) new-height)))))} - [rn/image {:source (:image s) - :resize-mode :contain - :style {:width size - :height size}}]]) - [quo/text {:style styles/wizard-title - :align :center - :weight :bold - :size :x-large} - (i18n/label (:title s))] - [quo/text {:style (styles/wizard-text-with-height @text-height) - :on-layout - (fn [^js e] - (let [new-height (-> e .-nativeEvent .-layout .-height)] - (when (and current-screen? - (not= new-height @text-temp-height) - (not (zero? new-height)) - (< new-height 200)) - (swap! text-temp-height #(if (pos? %) (max % new-height) new-height)) - (when @text-temp-timer (js/clearTimeout @text-temp-timer)) - (reset! text-temp-timer - (js/setTimeout #(reset! text-height @text-temp-height) 500)))))} - (i18n/label (:text s))]]))] - [dots-selector {:selected @index - :progress progress - :n (count slides)}]])))) diff --git a/src/status_im/ui/screens/intro/views.cljs b/src/status_im/ui/screens/intro/views.cljs deleted file mode 100644 index cf41549d2e7..00000000000 --- a/src/status_im/ui/screens/intro/views.cljs +++ /dev/null @@ -1,413 +0,0 @@ -(ns status-im.ui.screens.intro.views - (:require [re-frame.core :as re-frame] - [reagent.core :as r] - [status-im.constants :as constants] - [status-im.i18n.i18n :as i18n] - [status-im.multiaccounts.create.core :refer [step-kw-to-num]] - [status-im.privacy-policy.core :as privacy-policy] - [status-im.react-native.resources :as resources] - [status-im.ui.components.colors :as colors] - [status-im.ui.components.icons.icons :as icons] - [status-im.ui.components.radio :as radio] - [status-im.ui.components.react :as react] - [status-im.ui.components.topbar :as topbar] - [status-im.ui.screens.intro.styles :as styles] - [status-im.ui.components.toolbar :as toolbar] - [status-im.utils.gfycat.core :as gfy] - [status-im.utils.identicon :as identicon] - [status-im.utils.security :as security] - [status-im.utils.debounce :refer [dispatch-and-chill]] - [quo.core :as quo] - [status-im.ui.screens.intro.carousel :as carousel] - [status-im.utils.utils :as utils] - [status-im.utils.datetime :as datetime]) - (:require-macros [status-im.utils.views :refer [defview letsubs]])) - -(defview intro [] - (letsubs [{window-height :height} [:dimensions/window] - view-id [:view-id]] - [react/view {:style styles/intro-view} - [carousel/viewer [{:image (resources/get-theme-image :chat) - :title :intro-title1 - :text :intro-text1} - {:image (resources/get-theme-image :wallet) - :title :intro-title2 - :text :intro-text2} - {:image (resources/get-theme-image :browser) - :title :intro-title3 - :text :intro-text3}] window-height view-id] - [react/view styles/buttons-container - [react/view {:style (assoc styles/bottom-button :margin-bottom 16)} - [quo/button {:on-press #(re-frame/dispatch [:multiaccounts.create.ui/intro-wizard])} - (i18n/label :t/get-started)]] - [react/nested-text - {:style styles/welcome-text-bottom-note} - (i18n/label :t/intro-privacy-policy-note1) - [{:style (assoc styles/welcome-text-bottom-note :color colors/blue) - :on-press privacy-policy/open-privacy-policy-link!} - (i18n/label :t/intro-privacy-policy-note2)]]]])) - -(defn generate-key [] - (let [dimensions (r/atom {})] - (fn [] - [react/view {:on-layout (fn [^js e] - (reset! dimensions (js->clj (-> e .-nativeEvent .-layout) :keywordize-keys true))) - :style {:align-items :center - :justify-content :center - :flex 1}} - (let [padding 40 - image-size (- (min (:width @dimensions) (:height @dimensions)) padding)] - [react/image {:source (resources/get-theme-image :keys) - :resize-mode :contain - :style {:width image-size :height image-size}}])]))) - -(defn choose-key [{:keys [multiaccounts selected-id]}] - [react/view - {:style {:flex 1 - :justify-content :center}} - [react/scroll-view - {:style {:max-height 410} - :content-container-style {:justify-content :flex-start}} - (for [[acc accessibility-n] (map vector multiaccounts (range (count multiaccounts)))] - (let [selected? (= (:id acc) selected-id) - public-key (get-in acc [:derived constants/path-whisper-keyword :public-key])] - ^{:key public-key} - [quo/list-item {:accessibility-label (keyword (str "select-account-button-" accessibility-n)) - :active selected? - :title [quo/text {:number-of-lines 2 - :weight :medium - :ellipsize-mode :middle - :accessibility-label :username} - (gfy/generate-gfy public-key)] - :subtitle [quo/text {:weight :monospace - :color :secondary} - (utils/get-shortened-address public-key)] - :accessory :radio - :on-press #(re-frame/dispatch [:intro-wizard/on-key-selected (:id acc)]) - :icon [react/image {:source {:uri (identicon/identicon public-key)} - :resize-mode :cover - :style styles/multiaccount-image}]}]))]]) - -(defn storage-entry [{:keys [type icon icon-width icon-height - image image-selected image-width image-height - title desc]} selected-storage-type] - (let [selected? (= type selected-storage-type)] - [react/view - {:style {:flex 1 - :padding-top 14}} - [react/view {:style {:padding-bottom 4}} - [react/text {:style (assoc styles/wizard-text :text-align :left :margin-left 16)} - (i18n/label type)]] - [react/touchable-highlight - {:accessibility-label (keyword (str "select-storage-" type)) - :on-press #(re-frame/dispatch - [:intro-wizard/on-key-storage-selected - type])} - [react/view (assoc (styles/list-item selected?) - :align-items :flex-start - :padding-top 16 - :padding-bottom 12) - (if image - [react/image - {:source (resources/get-image (if selected? image-selected image)) - :style {:width image-width :height image-height}}] - [icons/icon icon {:color (if selected? colors/blue colors/gray) - :width icon-width :height icon-height}]) - [react/view {:style {:margin-horizontal 16 :flex 1}} - [react/text {:style (assoc styles/wizard-text :font-weight "500" :color colors/black :text-align :left)} - (i18n/label title)] - [react/view {:style {:min-height 4 :max-height 4}}] - [react/text {:style (assoc styles/wizard-text :text-align :left)} - (i18n/label desc)]] - [radio/radio selected?]]]])) - -(defn select-key-storage [{:keys [selected-storage-type]}] - (let [storage-types [{:type :default - :icon :main-icons/mobile - :icon-width 24 - :icon-height 24 - :title :this-device - :desc :this-device-desc} - {:type :advanced - :image :keycard-logo-gray - :image-selected :keycard-logo-blue - :image-width 24 - :image-height 24 - :title :keycard - :desc :keycard-desc}]] - [react/view - {:style {:flex 1 - :justify-content :center}} - [react/view - {:style - {:max-height 420 - :flex 1 - :justify-content :flex-start}} - [react/view {:style {:justify-content :flex-start - :height 264}} - [storage-entry (first storage-types) selected-storage-type] - [react/view {:style {:flex 1 - :max-height 16}}] - [storage-entry (second storage-types) selected-storage-type]]]])) - -(defn bottom-bar [{:keys [step weak-password? - forward-action - next-button-disabled? - processing? existing-account?]}] - [react/view {:style {:align-items :center}} - (cond (and (#{:generate-key :recovery-success} step) processing?) - [react/view {:min-height 46 :max-height 46 :align-self :stretch :margin-bottom 16} - [react/activity-indicator {:animating true - :size :large}]] - (#{:generate-key :recovery-success} step) - (let [label-kw (case step - :generate-key :t/generate-a-key - :recovery-success :t/re-encrypt-key - :intro-wizard-title6)] - [react/view {:style (assoc styles/bottom-button :margin-bottom 16)} - [quo/button - {:disabled existing-account? - :on-press #(re-frame/dispatch [forward-action]) - :accessibility-label :onboarding-next-button} - (i18n/label label-kw)]]) - :else - [toolbar/toolbar - {:show-border? true - :right [quo/button - {:on-press #(dispatch-and-chill [forward-action] 300) - :accessibility-label :onboarding-next-button - :disabled (or processing? - (and (= step :create-code) weak-password?) - (and (= step :enter-phrase) next-button-disabled?)) - :type :secondary - :after :main-icons/next} - (i18n/label :t/next)]}]) - (when (and (= :generate-key step) (not processing?)) - [react/view {:padding-vertical 8} - [quo/button - {:on-press #(re-frame/dispatch - [:multiaccounts.recover.ui/recover-multiaccount-button-pressed]) - :type :secondary} - (i18n/label :t/access-existing-keys)]]) - (when (or (= :generate-key step) (and processing? (= :recovery-success step))) - [react/text {:style (assoc styles/wizard-text :margin-top 20 :margin-bottom 16)} - (i18n/label (cond (= :recovery-success step) - :t/processing - processing? :t/generating-keys - :else :t/this-will-take-few-seconds))])]) - -(defn top-bar [{:keys [step]}] - (let [hide-subtitle? (or (= step :enter-phrase))] - [react/view {:style {:margin-top 16 - :margin-horizontal 32}} - - [react/text {:style (cond-> styles/wizard-title - hide-subtitle? - (assoc :margin-bottom 0))} - (i18n/label - (cond (= step :enter-phrase) - :t/multiaccounts-recover-enter-phrase-title - (= step :recovery-success) - :t/keycard-recovery-success-header - :else (keyword (str "intro-wizard-title" (step-kw-to-num step)))))] - (cond (#{:choose-key :select-key-storage} step) - ; Use nested text for the "Learn more" link - [react/nested-text {:style (merge styles/wizard-text - {:height 60})} - (str (i18n/label (keyword (str "intro-wizard-text" (step-kw-to-num step)))) " ") - [{:on-press #(re-frame/dispatch [:bottom-sheet/show-sheet :learn-more - {:title (i18n/label (if (= step :choose-key) :t/about-names-title :t/about-key-storage-title)) - :content (i18n/label (if (= step :choose-key) :t/about-names-content :t/about-key-storage-content))}]) - :style {:color colors/blue} - :accessibility-label :learn-more} - (i18n/label :learn-more)]] - (not hide-subtitle?) - [react/text {:style styles/wizard-text} - (i18n/label (cond (= step :recovery-success) - :t/recovery-success-text - :else (keyword (str "intro-wizard-text" - (step-kw-to-num step)))))] - :else nil)])) - -(defn enter-phrase [_] - (let [show-bip39-password? (reagent.core/atom false) - pressed-in-at (atom nil)] - (fn [{:keys [processing? - passphrase-word-count - next-button-disabled? - passphrase-error]}] - [react/keyboard-avoiding-view {:flex 1 - :background-color colors/white} - [react/pressable - {:style {:background-color colors/white - :flex 1 - :justify-content :center - :padding-horizontal 16} - ;; BIP39 password input will be shown only after pressing on screen - ;; for longer than 2 seconds - :on-press-in (fn [] - (reset! pressed-in-at (datetime/now))) - :on-press-out (fn [] - (when (>= (datetime/seconds-ago @pressed-in-at) 2) - (reset! show-bip39-password? true)))} - [react/view - [quo/text-input - {:on-change-text #(re-frame/dispatch [:multiaccounts.recover/enter-phrase-input-changed (security/mask-data %)]) - :auto-focus true - :error (when passphrase-error (i18n/label passphrase-error)) - :accessibility-label :passphrase-input - :placeholder (i18n/label :t/seed-phrase-placeholder) - :show-cancel false - :bottom-value 40 - :multiline true - :auto-correct false - :monospace true}] - [react/view {:align-items :flex-end} - [react/view {:flex-direction :row - :align-items :center - :padding-vertical 8 - :opacity (if passphrase-word-count 1 0)} - [quo/text {:color (if next-button-disabled? :secondary :main) - :size :small} - (when-not next-button-disabled? - "✓ ") - (i18n/label-pluralize passphrase-word-count :t/words-n)]]] - (when @show-bip39-password? - ;; BIP39 password (`passphrase` in BIP39 https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#from-mnemonic-to-seed) - ;; is an advanced security feature which allows to add an arbitrary - ;; extra word to your existing mnemonic. The password is an empty - ;; string if not provided. If the password is added a completely - ;; different key will be created. - [quo/text-input - {:on-change-text - #(re-frame/dispatch [:multiaccounts.recover/enter-passphrase-input-changed - (security/mask-data %)]) - :placeholder (i18n/label :t/bip39-password-placeholder) - :show-cancel false}])]] - [react/view {:align-items :center} - [react/text {:style {:color colors/gray - :font-size 14 - :margin-bottom 8 - :text-align :center}} - (i18n/label :t/multiaccounts-recover-enter-phrase-text)] - (when processing? - [react/view {:flex 1 :align-items :center} - [react/activity-indicator {:size :large - :animating true}] - [react/text {:style {:color colors/gray - :margin-top 8}} - (i18n/label :t/processing)]])]]))) - -(defn recovery-success [pubkey name photo-path] - [react/view {:flex 1 - :justify-content :space-between - :background-color colors/white} - [react/view {:flex 1 - :justify-content :space-between - :align-items :center} - [react/view {:flex-direction :column - :flex 1 - :justify-content :center - :align-items :center} - [react/view {:margin-horizontal 16 - :flex-direction :column} - [react/view {:justify-content :center - :align-items :center - :margin-bottom 11} - [react/image {:source {:uri photo-path} - :style {:width 61 - :height 61 - :border-radius 30 - :border-width 1 - :border-color colors/black-transparent}}]] - [react/text {:style {:text-align :center - :color colors/black - :font-weight "500"} - :number-of-lines 1 - :ellipsize-mode :middle} - name] - [quo/text {:style {:margin-top 4} - :monospace true - :color :secondary - :align :center - :number-of-lines 1 - :ellipsize-mode :middle} - (utils/get-shortened-address pubkey)]]]]]) - -(defview wizard-generate-key [] - (letsubs [wizard-state [:intro-wizard/generate-key]] - [react/view {:style {:flex 1}} - [topbar/topbar - {:border-bottom false - :navigation - {:on-press #(re-frame/dispatch [:intro-wizard/navigate-back])}}] - [react/view {:style {:flex 1 - :justify-content :space-between}} - [top-bar {:step :generate-key}] - [generate-key] - [bottom-bar {:step :generate-key - :forward-action :intro-wizard/step-forward-pressed - :processing? (:processing? wizard-state)}]]])) - -(defview wizard-choose-key [] - (letsubs [wizard-state [:intro-wizard/choose-key]] - [react/view {:style {:flex 1}} - [topbar/topbar - {:border-bottom false - :navigation - {:label (i18n/label :t/cancel) - :on-press #(re-frame/dispatch [:intro-wizard/navigate-back])}}] - [react/view {:style {:flex 1 - :justify-content :space-between}} - [top-bar {:step :choose-key}] - [choose-key wizard-state] - [bottom-bar {:step :choose-key - :forward-action :intro-wizard/step-forward-pressed}]]])) - -(defview wizard-select-key-storage [] - (letsubs [wizard-state [:intro-wizard/select-key-storage]] - [react/view {:style {:flex 1}} - [topbar/topbar - {:navigation - (if (:recovering? wizard-state) - {:label (i18n/label :t/cancel) - :on-press #(re-frame/dispatch [:intro-wizard/navigate-back])} - {:on-press #(re-frame/dispatch [:intro-wizard/navigate-back])})}] - [react/view {:style {:flex 1 - :justify-content :space-between}} - [top-bar {:step :select-key-storage}] - [select-key-storage wizard-state] - [bottom-bar {:step :select-key-storage - :forward-action (:forward-action wizard-state)}]]])) - -(defview wizard-enter-phrase [] - (letsubs [wizard-state [:intro-wizard/enter-phrase]] - [react/keyboard-avoiding-view {:style {:flex 1}} - [topbar/topbar - {:border-bottom false - :navigation - {:on-press #(re-frame/dispatch [:intro-wizard/navigate-back])}}] - [react/view {:style {:flex 1 - :justify-content :space-between}} - [top-bar {:step :enter-phrase}] - [enter-phrase wizard-state] - [bottom-bar (merge {:step :enter-phrase - :forward-action :multiaccounts.recover/enter-phrase-next-pressed} - wizard-state)]]])) - -(defview wizard-recovery-success [] - (letsubs [{:keys [pubkey processing? name identicon]} [:intro-wizard/recovery-success] - existing-account? [:intro-wizard/recover-existing-account?]] - [react/view {:style {:flex 1}} - [topbar/topbar - {:border-bottom false - :navigation - {:on-press #(re-frame/dispatch [:intro-wizard/navigate-back])}}] - [react/view {:style {:flex 1 - :justify-content :space-between}} - [top-bar {:step :recovery-success}] - [recovery-success pubkey name identicon] - [bottom-bar {:step :recovery-success - :forward-action :multiaccounts.recover/re-encrypt-pressed - :processing? processing? - :existing-account? existing-account?}]]])) diff --git a/src/status_im/ui/screens/keycard/onboarding/views.cljs b/src/status_im/ui/screens/keycard/onboarding/views.cljs index d672532ba0f..b477bec2c8e 100644 --- a/src/status_im/ui/screens/keycard/onboarding/views.cljs +++ b/src/status_im/ui/screens/keycard/onboarding/views.cljs @@ -19,63 +19,60 @@ (defview intro [] (letsubs [flow [:keycard-flow] {:keys [from-key-storage-and-migration? factory-reset-card?]} [:keycard]] - [react/view styles/container - (when-not from-key-storage-and-migration? - [topbar/topbar]) - [react/view {:flex 1 - :align-items :center - :margin-top (when from-key-storage-and-migration? 80)} - [react/view {:align-items :center} - [react/view - [react/view {:align-items :center - :justify-content :center - :margin-top 16} - [react/image {:source (resources/get-image :keycard) - :style {:width 120 - :height 95}}]]] - [react/view {:margin-top 16} - [react/text {:style {:typography :header}} - (i18n/label :t/keycard-onboarding-intro-header)]] - [react/view {:margin-top 16 - :width 311} - [react/text {:style {:font-size 15 - :line-height 22 - :color colors/gray - :text-align :center}} - (i18n/label :t/keycard-onboarding-intro-text)]] - [react/view - [react/touchable-highlight {:on-press #(.openURL ^js react/linking - constants/keycard-integration-link)} - [react/view {:flex-direction :row - :align-items :center - :justify-content :center} - [react/text {:style {:text-align :center - :color colors/blue}} - (i18n/label :t/learn-more-about-keycard)] - [icons/tiny-icon :tiny-icons/tiny-external {:color colors/blue - :container-style {:margin-left 5}}]]]]] + [react/view {:flex 1 + :align-items :center + :margin-top (when from-key-storage-and-migration? 80)} + [react/view {:align-items :center} + [react/view + [react/view {:align-items :center + :justify-content :center + :margin-top 16} + [react/image {:source (resources/get-image :keycard) + :style {:width 120 + :height 95}}]]] + [react/view {:margin-top 16} + [react/text {:style {:typography :header}} + (i18n/label :t/keycard-onboarding-intro-header)]] [react/view {:margin-top 16 - :margin-left 24 - :margin-right 24} - [react/text {:style {:typography :main-medium + :width 311} + [react/text {:style {:font-size 15 :line-height 22 - :text-align :left}} - (i18n/label :t/keycard-onboarding-pin-text)] - (when (not= flow :recovery) - [react/text {:style {:typography :main-medium - :margin-top 16 - :line-height 22 - :text-align :left}} - (i18n/label :t/keycard-onboarding-mnemonic-text)])] - [react/view {:style {:flex-direction :row - :margin-top 24}} - [checkbox/checkbox {:checked? factory-reset-card? - :style {:margin-right 10} - :on-value-change #(re-frame/dispatch [:keycard.onboarding.intro.ui/factory-reset-card-toggle %])}] - [react/text (i18n/label :t/keycard-factory-reset)]] - [react/view {:margin-top 40} - [quo/button {:on-press #(re-frame/dispatch [:keycard.onboarding.intro.ui/begin-setup-pressed])} - (i18n/label :t/begin-set-up)]]]])) + :color colors/gray + :text-align :center}} + (i18n/label :t/keycard-onboarding-intro-text)]] + [react/view + [react/touchable-highlight {:on-press #(.openURL ^js react/linking + constants/keycard-integration-link)} + [react/view {:flex-direction :row + :align-items :center + :justify-content :center} + [react/text {:style {:text-align :center + :color colors/blue}} + (i18n/label :t/learn-more-about-keycard)] + [icons/tiny-icon :tiny-icons/tiny-external {:color colors/blue + :container-style {:margin-left 5}}]]]]] + [react/view {:margin-top 16 + :margin-left 24 + :margin-right 24} + [react/text {:style {:typography :main-medium + :line-height 22 + :text-align :left}} + (i18n/label :t/keycard-onboarding-pin-text)] + (when (not= flow :recovery) + [react/text {:style {:typography :main-medium + :margin-top 16 + :line-height 22 + :text-align :left}} + (i18n/label :t/keycard-onboarding-mnemonic-text)])] + [react/view {:style {:flex-direction :row + :margin-top 24}} + [checkbox/checkbox {:checked? factory-reset-card? + :style {:margin-right 10} + :on-value-change #(re-frame/dispatch [:keycard.onboarding.intro.ui/factory-reset-card-toggle %])}] + [react/text (i18n/label :t/keycard-factory-reset)]] + [react/view {:margin-top 40} + [quo/button {:on-press #(re-frame/dispatch [:keycard.onboarding.intro.ui/begin-setup-pressed])} + (i18n/label :t/begin-set-up)]]])) (defview puk-code [] (letsubs [secrets [:keycard-secrets] @@ -272,7 +269,8 @@ input-word [:keycard-recovery-phrase-input-word] error [:keycard-recovery-phrase-confirm-error]] (let [{:keys [idx]} word] - [react/view styles/container + [react/keyboard-avoiding-view {:style styles/container + :ignore-offset true} [topbar/topbar {:navigation {:on-press #(re-frame/dispatch [::keycard.onboarding/cancel-pressed]) :accessibility-label :cancel-keycard-setup diff --git a/src/status_im/ui/screens/keycard/recovery/views.cljs b/src/status_im/ui/screens/keycard/recovery/views.cljs index 78b2f9502d1..e5607194436 100644 --- a/src/status_im/ui/screens/keycard/recovery/views.cljs +++ b/src/status_im/ui/screens/keycard/recovery/views.cljs @@ -20,8 +20,7 @@ (:require-macros [status-im.utils.views :refer [defview letsubs]])) (defn intro [] - [react/view styles/container - [topbar/topbar] + [:<> [react/view {:flex 1 :flex-direction :column :justify-content :space-between @@ -108,51 +107,48 @@ (letsubs [pair-code [:keycard-pair-code] error [:keycard-setup-error] {:keys [free-pairing-slots]} [:keycard-application-info]] - [react/view styles/container - [topbar/topbar {:title (i18n/label :t/step-i-of-n {:number 2 - :step 1})}] - [react/view {:flex 1 - :flex-direction :column - :justify-content :space-between - :align-items :center} - [react/view {:flex-direction :column - :align-items :center} - [react/view {:margin-top 16} - [react/text {:style {:typography :header - :text-align :center}} - (i18n/label :t/enter-pair-code)]] - [react/view {:margin-top 16 - :width "85%" - :align-items :center} - [react/text {:style {:color colors/gray - :text-align :center}} - (i18n/label :t/enter-pair-code-description)]] - (when free-pairing-slots - [react/view {:align-items :center - :margin-top 20} - [react/text {:style {:text-align :center - :color (if (> 3 free-pairing-slots) colors/red colors/gray)}} - (i18n/label :t/keycard-free-pairing-slots {:n free-pairing-slots})]])] - [react/view - [react/view {:padding 16 - :justify-content :center - :margin-bottom 100} - [quo/text-input - {:on-change-text #(re-frame/dispatch [:keycard.onboarding.pair.ui/input-changed %]) - :auto-focus true - :on-submit-editing #(re-frame/dispatch [:keycard.onboarding.pair.ui/input-submitted]) - :placeholder (i18n/label :t/pair-code-placeholder) - :monospace true}]] - [react/view {:margin-top 5 - :width 250} - [tooltip/tooltip error]]] - [bottom-toolbar/toolbar - {:right - [quo/button {:on-press #(re-frame/dispatch [:keycard.onboarding.pair.ui/next-pressed]) - :disabled (empty? pair-code) - :type :secondary - :after :main-icon/next} - (i18n/label :t/pair-card)]}]]])) + [react/view {:flex 1 + :flex-direction :column + :justify-content :space-between + :align-items :center} + [react/view {:flex-direction :column + :align-items :center} + [react/view {:margin-top 16} + [react/text {:style {:typography :header + :text-align :center}} + (i18n/label :t/enter-pair-code)]] + [react/view {:margin-top 16 + :width "85%" + :align-items :center} + [react/text {:style {:color colors/gray + :text-align :center}} + (i18n/label :t/enter-pair-code-description)]] + (when free-pairing-slots + [react/view {:align-items :center + :margin-top 20} + [react/text {:style {:text-align :center + :color (if (> 3 free-pairing-slots) colors/red colors/gray)}} + (i18n/label :t/keycard-free-pairing-slots {:n free-pairing-slots})]])] + [react/view + [react/view {:padding 16 + :justify-content :center + :margin-bottom 100} + [quo/text-input + {:on-change-text #(re-frame/dispatch [:keycard.onboarding.pair.ui/input-changed %]) + :auto-focus true + :on-submit-editing #(re-frame/dispatch [:keycard.onboarding.pair.ui/input-submitted]) + :placeholder (i18n/label :t/pair-code-placeholder) + :monospace true}]] + [react/view {:margin-top 5 + :width 250} + [tooltip/tooltip error]]] + [bottom-toolbar/toolbar + {:right + [quo/button {:on-press #(re-frame/dispatch [:keycard.onboarding.pair.ui/next-pressed]) + :disabled (empty? pair-code) + :type :secondary + :after :main-icon/next} + (i18n/label :t/pair-card)]}]])) (defview success [] (letsubs [address [:keycard-multiaccount-wallet-address] diff --git a/src/status_im/ui/screens/keycard/settings/views.cljs b/src/status_im/ui/screens/keycard/settings/views.cljs index 8811548ebe0..0604038ebfb 100644 --- a/src/status_im/ui/screens/keycard/settings/views.cljs +++ b/src/status_im/ui/screens/keycard/settings/views.cljs @@ -6,7 +6,6 @@ [status-im.react-native.resources :as resources] [status-im.ui.components.colors :as colors] [quo.core :as quo] - [status-im.ui.components.topbar :as topbar] [status-im.constants :as constants] [status-im.ui.screens.keycard.views :as keycard.views] [status-im.keycard.common :as keycard.common])) @@ -29,31 +28,28 @@ (defview reset-card [] (letsubs [disabled? [:keycard-reset-card-disabled?]] - [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/reset-card)}] - [react/view {:flex 1 - :background-color colors/white} - [react/view {:margin-top 71 - :flex 1 - :align-items :center} - [react/image {:source (resources/get-image :warning-sign) - :style {:width 160 - :height 160}}]] - [react/view {:flex 1 - :padding-horizontal 30} - [react/text {:style {:typography :header - :text-align :center}} - (i18n/label :t/reset-card-description)] - [activity-indicator disabled?]] - [react/view {:flex-direction :row - :justify-content :space-between - :align-items :center - :width "100%" - :height 68 - :border-top-width 1 - :border-color colors/black-transparent} - [react/view {:flex 1}] - [reset-card-next-button disabled?]]]])) + [:<> + [react/view {:margin-top 71 + :flex 1 + :align-items :center} + [react/image {:source (resources/get-image :warning-sign) + :style {:width 160 + :height 160}}]] + [react/view {:flex 1 + :padding-horizontal 30} + [react/text {:style {:typography :header + :text-align :center}} + (i18n/label :t/reset-card-description)] + [activity-indicator disabled?]] + [react/view {:flex-direction :row + :justify-content :space-between + :align-items :center + :width "100%" + :height 68 + :border-top-width 1 + :border-color colors/black-transparent} + [react/view {:flex 1}] + [reset-card-next-button disabled?]]])) (defn- card-blocked [] [react/view @@ -66,54 +62,52 @@ (letsubs [paired-on [:keycard-paired-on] puk-retry-counter [:keycard/puk-retry-counter] pairing [:keycard-multiaccount-pairing]] - [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/status-keycard)}] - [react/scroll-view {:flex 1} - [react/view {:margin-top 47 - :align-items :center} - [react/image {:source (resources/get-image :keycard-card) - :style {:width 255 - :height 160}}] - (when paired-on - [react/view {:margin-top 27} - [react/text - (i18n/label :t/linked-on {:date paired-on})]])] - [react/view {:padding-vertical 16} - (if (zero? puk-retry-counter) - [card-blocked] - [:<> - [quo/list-item {:icon :main-icons/help - :size :small - :title (i18n/label :t/help-capitalized) - :on-press #(.openURL ^js react/linking - constants/faq-keycard)}] - (when pairing - [:<> - [quo/list-item {:icon :main-icons/add - :size :small - :title (i18n/label :t/change-pin) - :on-press #(re-frame/dispatch [:keycard-settings.ui/change-credentials-pressed :pin])}] - [quo/list-item {:icon :main-icons/security - :size :small - :title (i18n/label :t/change-puk) - :accessibility-label "change-puk" - :on-press #(re-frame/dispatch [:keycard-settings.ui/change-credentials-pressed :puk])}] - [quo/list-item {:icon :main-icons/password - :size :small - :title (i18n/label :t/change-pairing) - :accessibility-label "change-pairing" - :on-press #(re-frame/dispatch [:keycard-settings.ui/change-credentials-pressed :pairing])}] - [quo/list-item {:icon :main-icons/keycard - :size :small - :title (i18n/label :t/keycard-backup) - :accessibility-label "create-backup-keycard" - :on-press #(re-frame/dispatch [:keycard-settings.ui/backup-card-pressed :backup-card])}] - ;; TODO(rasom): uncomment this when unpairing will be enabled - ;; https://github.com/status-im/status-react/issues/9227 - #_[quo/list-item {:icon :main-icons/close - :size :small - :title (i18n/label :t/unpair-card) - :on-press #(re-frame/dispatch [:keycard-settings.ui/unpair-card-pressed])}]])])]]])) + [react/scroll-view {:flex 1} + [react/view {:margin-top 47 + :align-items :center} + [react/image {:source (resources/get-image :keycard-card) + :style {:width 255 + :height 160}}] + (when paired-on + [react/view {:margin-top 27} + [react/text + (i18n/label :t/linked-on {:date paired-on})]])] + [react/view {:padding-vertical 16} + (if (zero? puk-retry-counter) + [card-blocked] + [:<> + [quo/list-item {:icon :main-icons/help + :size :small + :title (i18n/label :t/help-capitalized) + :on-press #(.openURL ^js react/linking + constants/faq-keycard)}] + (when pairing + [:<> + [quo/list-item {:icon :main-icons/add + :size :small + :title (i18n/label :t/change-pin) + :on-press #(re-frame/dispatch [:keycard-settings.ui/change-credentials-pressed :pin])}] + [quo/list-item {:icon :main-icons/security + :size :small + :title (i18n/label :t/change-puk) + :accessibility-label "change-puk" + :on-press #(re-frame/dispatch [:keycard-settings.ui/change-credentials-pressed :puk])}] + [quo/list-item {:icon :main-icons/password + :size :small + :title (i18n/label :t/change-pairing) + :accessibility-label "change-pairing" + :on-press #(re-frame/dispatch [:keycard-settings.ui/change-credentials-pressed :pairing])}] + [quo/list-item {:icon :main-icons/keycard + :size :small + :title (i18n/label :t/keycard-backup) + :accessibility-label "create-backup-keycard" + :on-press #(re-frame/dispatch [:keycard-settings.ui/backup-card-pressed :backup-card])}] + ;; TODO(rasom): uncomment this when unpairing will be enabled + ;; https://github.com/status-im/status-react/issues/9227 + #_[quo/list-item {:icon :main-icons/close + :size :small + :title (i18n/label :t/unpair-card) + :on-press #(re-frame/dispatch [:keycard-settings.ui/unpair-card-pressed])}]])])]])) (defn reset-pin [] [keycard.views/login-pin diff --git a/src/status_im/ui/screens/keycard/views.cljs b/src/status_im/ui/screens/keycard/views.cljs index 4c984f7a544..4d70c1c7302 100644 --- a/src/status_im/ui/screens/keycard/views.cljs +++ b/src/status_im/ui/screens/keycard/views.cljs @@ -14,10 +14,13 @@ [status-im.ui.screens.chat.photos :as photos] [status-im.ui.screens.keycard.pin.views :as pin.views] [status-im.ui.screens.keycard.styles :as styles] - [status-im.ui.screens.intro.styles :as intro-styles] [status-im.constants :as constants] [status-im.keycard.login :as keycard.login] - [status-im.ui.screens.keycard.frozen-card.view :as frozen-card.view]) + [status-im.utils.fx :as fx] + [status-im.ui.screens.keycard.frozen-card.view :as frozen-card.view] + [status-im.multiaccounts.create.core :as multiaccounts.create] + [status-im.bottom-sheet.core :as bottom-sheet] + [status-im.navigation :as navigation]) (:require-macros [status-im.utils.views :refer [defview letsubs]])) ;; NOTE(Ferossgp): Seems like it should be in popover @@ -204,7 +207,8 @@ [react/view {:style {:width 260 :margin-bottom 15}} - [react/view intro-styles/buttons-container + [react/view {:align-items :center + :padding-horizontal 32} [quo/button {:on-press #(re-frame/dispatch [::keycard.login/login-after-reset])} (i18n/label :t/open)]]])]) @@ -370,15 +374,21 @@ :type :secondary} (i18n/label :t/recover-key)]}])]]))) +(fx/defn get-new-key + {:events [:multiaccounts.create.ui/get-new-key]} + [{:keys [db] :as cofx}] + (fx/merge cofx + (multiaccounts.create/prepare-intro-wizard) + (bottom-sheet/hide-bottom-sheet) + (navigation/navigate-to-cofx :get-your-keys nil))) + (defn- more-sheet-content [] [react/view {:flex 1} [quo/list-item {:theme :accent :title (i18n/label :t/create-new-key) :icon :main-icons/profile - :on-press #(do - (re-frame/dispatch [:bottom-sheet/hide]) - (re-frame/dispatch [:multiaccounts.create.ui/get-new-key]))}]]) + :on-press #(re-frame/dispatch [:multiaccounts.create.ui/get-new-key])}]]) (def more-sheet {:content more-sheet-content}) diff --git a/src/status_im/ui/screens/link_previews_settings/views.cljs b/src/status_im/ui/screens/link_previews_settings/views.cljs index fc4defab77d..90f8a3beeee 100644 --- a/src/status_im/ui/screens/link_previews_settings/views.cljs +++ b/src/status_im/ui/screens/link_previews_settings/views.cljs @@ -6,7 +6,6 @@ [status-im.ui.components.list.views :as list] [quo.core :as quo] [status-im.react-native.resources :as resources] - [status-im.ui.components.topbar :as topbar] [status-im.ui.screens.link-previews-settings.styles :as styles] [status-im.chat.models.link-preview :as link-preview])) @@ -25,8 +24,7 @@ (views/letsubs [link-previews-whitelist [:link-previews-whitelist] link-previews-enabled-sites [:link-preview/enabled-sites]] (let [all-enabled (= (count link-previews-whitelist) (count link-previews-enabled-sites))] - [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/chat-link-previews)}] + [:<> [react/image {:source (resources/get-theme-image :unfurl) :style styles/link-preview-settings-image}] [quo/text {:style {:margin 16}} diff --git a/src/status_im/ui/screens/log_level_settings/views.cljs b/src/status_im/ui/screens/log_level_settings/views.cljs index 7c44c1b9d82..9482aa55d5d 100644 --- a/src/status_im/ui/screens/log_level_settings/views.cljs +++ b/src/status_im/ui/screens/log_level_settings/views.cljs @@ -1,11 +1,9 @@ (ns status-im.ui.screens.log-level-settings.views (:require [re-frame.core :as re-frame] - [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.screens.log-level-settings.styles :as styles] - [status-im.ui.components.topbar :as topbar]) + [status-im.ui.screens.log-level-settings.styles :as styles]) (:require-macros [status-im.utils.views :as views])) (defn- log-level-icon [current?] @@ -43,11 +41,8 @@ (views/defview log-level-settings [] (views/letsubs [current-log-level [:log-level/current-log-level]] - [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/log-level-settings)}] - [react/view styles/wrapper - [list/flat-list {:data log-levels - :default-separator? false - :key-fn :name - :render-data current-log-level - :render-fn render-row}]]])) + [list/flat-list {:data log-levels + :default-separator? false + :key-fn :name + :render-data current-log-level + :render-fn render-row}])) diff --git a/src/status_im/ui/screens/mobile_network_settings/view.cljs b/src/status_im/ui/screens/mobile_network_settings/view.cljs index 874570df92d..54b49f8555d 100644 --- a/src/status_im/ui/screens/mobile_network_settings/view.cljs +++ b/src/status_im/ui/screens/mobile_network_settings/view.cljs @@ -6,8 +6,7 @@ [re-frame.core :as re-frame] status-im.mobile-sync-settings.core [status-im.ui.screens.profile.components.views :as profile.components] - [status-im.ui.screens.mobile-network-settings.sheets :as sheets] - [status-im.ui.components.topbar :as topbar])) + [status-im.ui.screens.mobile-network-settings.sheets :as sheets])) (defn hide-sheet-and-dispatch [event] (re-frame/dispatch [:bottom-sheet/hide]) @@ -23,8 +22,7 @@ [{:keys [syncing-on-mobile-network? remember-syncing-choice?]} [:multiaccount]] - [react/view {:style styles/container} - [topbar/topbar {:title (i18n/label :t/mobile-network-settings)}] + [:<> [react/view {:style styles/switch-container :accessibility-label "mobile-network-use-mobile"} [profile.components/settings-switch-item diff --git a/src/status_im/ui/screens/multiaccounts/key_storage/views.cljs b/src/status_im/ui/screens/multiaccounts/key_storage/views.cljs index f01135e2363..5bd564b2d5c 100644 --- a/src/status_im/ui/screens/multiaccounts/key_storage/views.cljs +++ b/src/status_im/ui/screens/multiaccounts/key_storage/views.cljs @@ -105,7 +105,8 @@ (letsubs [{:keys [seed-word-count seed-shape-invalid?]} [:multiaccounts/key-storage] {:keys [creating-backup?]} [:keycard]] - [react/keyboard-avoiding-view {:flex 1} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [local-topbar (i18n/label :t/enter-seed-phrase) ::multiaccounts.key-storage/navigate-back] [multiaccounts.views/seed-phrase-input {:on-change-event [::multiaccounts.key-storage/seed-phrase-input-changed] diff --git a/src/status_im/ui/screens/multiaccounts/login/views.cljs b/src/status_im/ui/screens/multiaccounts/login/views.cljs index 7205d526d5b..e730543cb91 100644 --- a/src/status_im/ui/screens/multiaccounts/login/views.cljs +++ b/src/status_im/ui/screens/multiaccounts/login/views.cljs @@ -13,7 +13,6 @@ [quo.core :as quo] [status-im.ui.components.icons.icons :as icons] [status-im.ui.components.toolbar :as toolbar] - [status-im.ui.components.topbar :as topbar] [status-im.ui.components.colors :as colors] [status-im.ui.screens.multiaccounts.key-storage.views :as key-storage]) (:require-macros [status-im.utils.views :refer [defview letsubs]])) @@ -38,6 +37,10 @@ :style styles/login-badge-pubkey} (utils/get-shortened-address public-key)]]]) +(defn topbar-button [] + (react/dismiss-keyboard!) + (re-frame/dispatch [:multiaccounts.recover.ui/recover-multiaccount-button-pressed])) + (defview login [] (letsubs [{:keys [error processing save-password?] :as multiaccount} [:multiaccounts/login] password-text-input (atom nil) @@ -48,12 +51,6 @@ keycard? [:keycard-multiaccount?] banner-hidden [:keycard/banner-hidden]] [react/keyboard-avoiding-view {:style ast/multiaccounts-view} - [topbar/topbar {:border-bottom false - :right-accessories [{:icon :more - :accessibility-label "sign-in-options" - :on-press #(do - (react/dismiss-keyboard!) - (re-frame/dispatch [:multiaccounts.recover.ui/recover-multiaccount-button-pressed]))}]}] [react/scroll-view {:keyboardShouldPersistTaps :always :style styles/login-view} [react/view styles/login-badge-container diff --git a/src/status_im/ui/screens/multiaccounts/recover/views.cljs b/src/status_im/ui/screens/multiaccounts/recover/views.cljs index df6fd740b13..fe3cc418f8b 100644 --- a/src/status_im/ui/screens/multiaccounts/recover/views.cljs +++ b/src/status_im/ui/screens/multiaccounts/recover/views.cljs @@ -97,8 +97,6 @@ (comment ;; Recover with seed to device UI flow (do - ;; Press get-started on welcome screen - (re-frame/dispatch [:multiaccounts.create.ui/intro-wizard]) ;; Goto seed screen (re-frame/dispatch [::multiaccounts.recover/enter-phrase-pressed]) @@ -117,4 +115,4 @@ (re-frame/dispatch [:multiaccounts.recover/select-storage-next-pressed]) ;; Enter password (need to wait for a moment for this to finish) - (re-frame/dispatch [:multiaccounts.recover/enter-password-next-pressed {:key-code "111111"}]))) + (re-frame/dispatch [:multiaccounts.recover/enter-password-next-pressed "111111"]))) diff --git a/src/status_im/ui/screens/multiaccounts/sheets.cljs b/src/status_im/ui/screens/multiaccounts/sheets.cljs index 376055016e4..9e7f963f6d1 100644 --- a/src/status_im/ui/screens/multiaccounts/sheets.cljs +++ b/src/status_im/ui/screens/multiaccounts/sheets.cljs @@ -1,14 +1,12 @@ (ns status-im.ui.screens.multiaccounts.sheets (:require [quo.core :as quo] [status-im.i18n.i18n :as i18n] - [status-im.ui.components.react :as react] [re-frame.core :as re-frame])) (defn actions-sheet [] - [react/view - [quo/list-item {:theme :accent - :on-press #(do (re-frame/dispatch [:bottom-sheet/hide]) - (re-frame/dispatch [:multiaccounts.create.ui/intro-wizard])) - :icon :main-icons/add - :accessibility-label :generate-a-new-key - :title (i18n/label :t/generate-a-new-key)}]]) + [quo/list-item {:theme :accent + :on-press #(do (re-frame/dispatch [:bottom-sheet/hide]) + (re-frame/dispatch [:generate-and-derive-addresses])) + :icon :main-icons/add + :accessibility-label :generate-a-new-key + :title (i18n/label :t/generate-a-new-key)}]) diff --git a/src/status_im/ui/screens/multiaccounts/views.cljs b/src/status_im/ui/screens/multiaccounts/views.cljs index 9e592abb17a..4e9718fbadc 100644 --- a/src/status_im/ui/screens/multiaccounts/views.cljs +++ b/src/status_im/ui/screens/multiaccounts/views.cljs @@ -9,7 +9,6 @@ [status-im.utils.security :as security] [status-im.i18n.i18n :as i18n] [status-im.ui.components.colors :as colors] - [status-im.ui.components.topbar :as topbar] [status-im.ui.components.toolbar :as toolbar] [quo.core :as quo] [status-im.ui.screens.multiaccounts.sheets :as sheets] @@ -36,15 +35,13 @@ :height 19}}]]) :chevron true}]) +(defn topbar-button [] + (re-frame/dispatch [:bottom-sheet/show-sheet + {:content sheets/actions-sheet}])) + (defview multiaccounts [] (letsubs [multiaccounts [:multiaccounts/multiaccounts]] - [react/view styles/multiaccounts-view - [topbar/topbar {:navigation :none - :title (i18n/label :t/your-keys) - :right-accessories [{:icon :more - :accessibility-label :your-keys-more-icon - :on-press #(re-frame/dispatch [:bottom-sheet/show-sheet - {:content sheets/actions-sheet}])}]}] + [:<> [react/view styles/multiaccounts-container [list/flat-list {:data (vals multiaccounts) :contentContainerStyle styles/multiaccounts-list-container diff --git a/src/status_im/ui/screens/network/edit_network/views.cljs b/src/status_im/ui/screens/network/edit_network/views.cljs index fa351c705f8..f719034013e 100644 --- a/src/status_im/ui/screens/network/edit_network/views.cljs +++ b/src/status_im/ui/screens/network/edit_network/views.cljs @@ -6,8 +6,7 @@ [status-im.ui.screens.network.edit-network.styles :as styles] [status-im.ui.components.list.views :as list] [status-im.ui.components.react :as react] - [quo.core :as quo] - [status-im.ui.components.topbar :as topbar]) + [quo.core :as quo]) (:require-macros [status-im.utils.views :as views])) (defn- render-network-type [type _ _ manage-network] @@ -26,42 +25,40 @@ (views/letsubs [manage-network [:networks/manage] is-valid? [:manage-network-valid?]] (let [custom? (= (get-in manage-network [:chain :value]) :custom)] - [react/view styles/container - [react/keyboard-avoiding-view {:flex 1} - [topbar/topbar {:title (i18n/label :t/add-network)}] - [react/scroll-view - [react/view styles/edit-network-view - [react/view {:padding-vertical 8} - [quo/text-input - {:label (i18n/label :t/name) - :placeholder (i18n/label :t/specify-name) - :default-value (get-in manage-network [:name :value]) - :on-change-text #(re-frame/dispatch [::network/input-changed :name %]) - :auto-focus true}]] - [react/view {:padding-vertical 8} - [quo/text-input - {:label (i18n/label :t/rpc-url) - :placeholder (i18n/label :t/specify-rpc-url) - :default-value (get-in manage-network [:url :value]) - :on-change-text #(re-frame/dispatch [::network/input-changed :url (string/lower-case %)])}]] - [react/view {:padding-vertical 8} - [react/i18n-text {:key :network-chain}] - [list/flat-list {:data [:mainnet :testnet :rinkeby :custom] - :key-fn (fn [_ i] (str i)) - :separator list/base-separator - :render-data manage-network - :render-fn render-network-type}]] - (when custom? - [react/view {:padding-vertical 8} - [quo/text-input - {:label (i18n/label :t/network-id) - :placeholder (i18n/label :t/specify-network-id) - :on-change-text #(re-frame/dispatch [::network/input-changed :network-id %])}]])]] - [react/view styles/bottom-container - [react/view {:flex 1}] - [quo/button - {:after :main-icons/next - :type :secondary - :disabled (not is-valid?) - :on-press #(re-frame/dispatch [::network/save-network-pressed])} - (i18n/label :t/save)]]]]))) + [react/keyboard-avoiding-view {:flex 1} + [react/scroll-view + [react/view styles/edit-network-view + [react/view {:padding-vertical 8} + [quo/text-input + {:label (i18n/label :t/name) + :placeholder (i18n/label :t/specify-name) + :default-value (get-in manage-network [:name :value]) + :on-change-text #(re-frame/dispatch [::network/input-changed :name %]) + :auto-focus true}]] + [react/view {:padding-vertical 8} + [quo/text-input + {:label (i18n/label :t/rpc-url) + :placeholder (i18n/label :t/specify-rpc-url) + :default-value (get-in manage-network [:url :value]) + :on-change-text #(re-frame/dispatch [::network/input-changed :url (string/lower-case %)])}]] + [react/view {:padding-vertical 8} + [react/i18n-text {:key :network-chain}] + [list/flat-list {:data [:mainnet :testnet :rinkeby :custom] + :key-fn (fn [_ i] (str i)) + :separator list/base-separator + :render-data manage-network + :render-fn render-network-type}]] + (when custom? + [react/view {:padding-vertical 8} + [quo/text-input + {:label (i18n/label :t/network-id) + :placeholder (i18n/label :t/specify-network-id) + :on-change-text #(re-frame/dispatch [::network/input-changed :network-id %])}]])]] + [react/view styles/bottom-container + [react/view {:flex 1}] + [quo/button + {:after :main-icons/next + :type :secondary + :disabled (not is-valid?) + :on-press #(re-frame/dispatch [::network/save-network-pressed])} + (i18n/label :t/save)]]]))) diff --git a/src/status_im/ui/screens/network/network_details/views.cljs b/src/status_im/ui/screens/network/network_details/views.cljs index 2634a32c25f..d5eb1a2d02e 100644 --- a/src/status_im/ui/screens/network/network_details/views.cljs +++ b/src/status_im/ui/screens/network/network_details/views.cljs @@ -6,7 +6,6 @@ [status-im.ui.screens.network.styles :as st] [status-im.ui.screens.network.views :as network-settings] [status-im.ui.components.react :as react] - [status-im.ui.components.topbar :as topbar] [status-im.utils.debounce :refer [dispatch-and-chill]]) (:require-macros [status-im.utils.views :as views])) @@ -17,28 +16,26 @@ (let [{:keys [id name config]} selected-network connected? (= id current-network) custom? (seq (filter #(= (:id %) id) (:custom networks)))] - [react/view st/container + [:<> [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/network-details)}] - [react/view {:flex 1} - [network-settings/network-badge - {:name name - :connected? connected?}] - (when-not connected? - [react/touchable-highlight {:on-press #(dispatch-and-chill [::network/connect-network-pressed id] 1000)} - [react/view st/connect-button-container - [react/view {:style st/connect-button - :accessibility-label :network-connect-button} - [react/text {:style st/connect-button-label} - (i18n/label :t/connect)]] - [react/i18n-text {:style st/connect-button-description - :key :connecting-requires-login}]]]) - [react/view (st/network-config-container) - [react/text {:style st/network-config-text - :accessibility-label :network-details-text} - config]]] - (when custom? - [react/view st/bottom-container - [react/view {:flex 1} - [quo/button {:on-press #(re-frame/dispatch [::network/delete-network-pressed id])} - (i18n/label :t/delete)]]])]]))) + [network-settings/network-badge + {:name name + :connected? connected?}] + (when-not connected? + [react/touchable-highlight {:on-press #(dispatch-and-chill [::network/connect-network-pressed id] 1000)} + [react/view st/connect-button-container + [react/view {:style st/connect-button + :accessibility-label :network-connect-button} + [react/text {:style st/connect-button-label} + (i18n/label :t/connect)]] + [react/i18n-text {:style st/connect-button-description + :key :connecting-requires-login}]]]) + [react/view (st/network-config-container) + [react/text {:style st/network-config-text + :accessibility-label :network-details-text} + config]]] + (when custom? + [react/view st/bottom-container + [react/view {:flex 1} + [quo/button {:on-press #(re-frame/dispatch [::network/delete-network-pressed id])} + (i18n/label :t/delete)]]])]))) diff --git a/src/status_im/ui/screens/network/views.cljs b/src/status_im/ui/screens/network/views.cljs index 1616cd56e29..25298cd4f2e 100644 --- a/src/status_im/ui/screens/network/views.cljs +++ b/src/status_im/ui/screens/network/views.cljs @@ -42,7 +42,7 @@ (views/defview network-settings [] (views/letsubs [current-network [:networks/current-network] networks [:get-networks]] - [react/view {:flex 1} + [:<> [topbar/topbar {:title (i18n/label :t/network-settings) :right-accessories [{:icon :main-icons/add diff --git a/src/status_im/ui/screens/network_info/views.cljs b/src/status_im/ui/screens/network_info/views.cljs index 71657664fb3..bebf3c11988 100644 --- a/src/status_im/ui/screens/network_info/views.cljs +++ b/src/status_im/ui/screens/network_info/views.cljs @@ -1,7 +1,5 @@ (ns status-im.ui.screens.network-info.views - (:require [status-im.ui.components.topbar :as topbar] - [status-im.ui.components.react :as react] - [status-im.i18n.i18n :as i18n] + (:require [status-im.ui.components.react :as react] [re-frame.core :as re-frame] [reagent.core :as reagent] [status-im.ethereum.json-rpc :as json-rpc] @@ -79,7 +77,4 @@ "PRESS TO REFRESH"))])]))) (defn network-info [] - [react/view {:flex 1} - [topbar/topbar - {:title (i18n/label :t/network-info)}] - [check-lag]]) + [check-lag]) diff --git a/src/status_im/ui/screens/notifications_center/views.cljs b/src/status_im/ui/screens/notifications_center/views.cljs index affc79a8266..b69b9885924 100644 --- a/src/status_im/ui/screens/notifications_center/views.cljs +++ b/src/status_im/ui/screens/notifications_center/views.cljs @@ -80,7 +80,8 @@ :component-did-mount #(re-frame/dispatch [:get-activity-center-notifications]) :reagent-render (fn [] (let [{:keys [notifications]} @(re-frame/subscribe [:activity.center/notifications])] - [react/keyboard-avoiding-view {:style {:flex 1}} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [topbar/topbar {:navigation {:on-press #(do (reset-state) (re-frame/dispatch [:close-notifications-center]) diff --git a/src/status_im/ui/screens/notifications_settings/views.cljs b/src/status_im/ui/screens/notifications_settings/views.cljs index 5ad892e3e94..bbe90749967 100644 --- a/src/status_im/ui/screens/notifications_settings/views.cljs +++ b/src/status_im/ui/screens/notifications_settings/views.cljs @@ -7,10 +7,7 @@ [quo.platform :as platform] [quo.design-system.colors :as quo-colors] [status-im.notifications.core :as notifications] - [status-im.ui.components.colors :as colors] - [status-im.react-native.resources :as resources] - [status-im.ui.components.react :as react] - [status-im.ui.components.topbar :as topbar])) + [status-im.ui.components.react :as react])) (defonce server (reagent/atom "")) @@ -80,72 +77,46 @@ [local-notifications]])) (defn notifications-settings [] - [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/notification-settings)}] - [react/scroll-view {:style {:flex 1} - :content-container-style {:padding-vertical 8}} - (if platform/ios? - [notifications-settings-ios] - [notifications-settings-android])]]) + [react/scroll-view {:style {:flex 1} + :content-container-style {:padding-vertical 8}} + (if platform/ios? + [notifications-settings-ios] + [notifications-settings-android])]) (defn notifications-advanced-settings [] (let [{:keys [remote-push-notifications-enabled? send-push-notifications? push-notifications-server-enabled?]} @(re-frame/subscribe [:multiaccount])] - [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/notification-settings)}] - [react/scroll-view {:style {:flex 1} - :content-container-style {:padding-vertical 8}} - [quo/list-item - {:size :small - :title (i18n/label :t/send-push-notifications) - :accessibility-label :send-push-notifications-button - :active send-push-notifications? - :on-press #(re-frame/dispatch - [::notifications/switch-send-push-notifications (not send-push-notifications?)]) - :accessory :switch}] - [quo/list-footer - (i18n/label :t/send-push-notifications-description)] - [quo/separator {:style {:margin-vertical 8}}] - [quo/list-item - {:size :small - :title (i18n/label :t/push-notifications-server-enabled) - :accessibility-label :send-push-notifications-button - :active (and remote-push-notifications-enabled? - push-notifications-server-enabled?) - :on-press #(re-frame/dispatch - [::notifications/switch-push-notifications-server-enabled (not push-notifications-server-enabled?)]) - :accessory :switch}] - [quo/list-item - {:size :small - :title (i18n/label :t/push-notifications-servers) - :accessibility-label :send-push-notifications-button - :chevron true - :on-press #(re-frame/dispatch - [:navigate-to :notifications-servers])}]]])) - -(defn notifications-onboarding [] - [react/view {:flex 1 :background-color colors/white - :align-items :center :padding-bottom 16} - [react/text {:style {:margin-top 72 :margin-bottom 16 - :typography :header}} - (i18n/label :t/private-notifications)] - [react/text {:style {:color colors/gray :text-align :center :margin-horizontal 24}} - (i18n/label :t/private-notifications-descr)] - [react/view {:flex 1 :align-items :center :justify-content :center} - [react/image {:source (resources/get-image :notifications) - :style {:width 118 - :height 118}}]] - [quo/button {:on-press #(do (re-frame/dispatch - [::notifications/switch true]) - (re-frame/dispatch [:navigate-to :welcome])) - :accessibility-label :enable-notifications} - (i18n/label :t/intro-wizard-title6)] - [quo/button {:type :secondary :style {:margin-top 8} - :accessibility-label :maybe-later - :on-press #(re-frame/dispatch [:navigate-to :welcome])} - (i18n/label :t/maybe-later)]]) + [react/scroll-view {:style {:flex 1} + :content-container-style {:padding-vertical 8}} + [quo/list-item + {:size :small + :title (i18n/label :t/send-push-notifications) + :accessibility-label :send-push-notifications-button + :active send-push-notifications? + :on-press #(re-frame/dispatch + [::notifications/switch-send-push-notifications (not send-push-notifications?)]) + :accessory :switch}] + [quo/list-footer + (i18n/label :t/send-push-notifications-description)] + [quo/separator {:style {:margin-vertical 8}}] + [quo/list-item + {:size :small + :title (i18n/label :t/push-notifications-server-enabled) + :accessibility-label :send-push-notifications-button + :active (and remote-push-notifications-enabled? + push-notifications-server-enabled?) + :on-press #(re-frame/dispatch + [::notifications/switch-push-notifications-server-enabled (not push-notifications-server-enabled?)]) + :accessory :switch}] + [quo/list-item + {:size :small + :title (i18n/label :t/push-notifications-servers) + :accessibility-label :send-push-notifications-button + :chevron true + :on-press #(re-frame/dispatch + [:navigate-to :notifications-servers])}]])) (defn server-view [{:keys [public-key type registered]}] [quo/list-item @@ -163,23 +134,21 @@ (defview notifications-servers [] (letsubs [servers [:push-notifications/servers]] {:component-did-mount #(re-frame/dispatch [::notifications/fetch-servers])} - [react/view {:flex 1} - [topbar/topbar {:title :t/notification-servers}] - [react/scroll-view {:style {:flex 1} - :content-container-style {:padding-vertical 8}} - (map server-view servers) - [react/keyboard-avoiding-view {} - [react/view {:style {:padding-horizontal 20}} - [quo/text-input - {:label (i18n/label :t/server) - :placeholder (i18n/label :t/specify-server-public-key) - :value @server - :on-change-text #(reset! server %) - :auto-focus true}]] - [quo/button {:type :secondary - :after :main-icon/next - :disabled (empty? @server) - :on-press #(do - (re-frame/dispatch [::notifications/add-server @server]) - (reset! server ""))} - (i18n/label :t/save)]]]])) + [react/scroll-view {:style {:flex 1} + :content-container-style {:padding-vertical 8}} + (map server-view servers) + [react/keyboard-avoiding-view {} + [react/view {:style {:padding-horizontal 20}} + [quo/text-input + {:label (i18n/label :t/server) + :placeholder (i18n/label :t/specify-server-public-key) + :value @server + :on-change-text #(reset! server %) + :auto-focus true}]] + [quo/button {:type :secondary + :after :main-icon/next + :disabled (empty? @server) + :on-press #(do + (re-frame/dispatch [::notifications/add-server @server]) + (reset! server ""))} + (i18n/label :t/save)]]])) diff --git a/src/status_im/ui/screens/offline_messaging_settings/edit_mailserver/views.cljs b/src/status_im/ui/screens/offline_messaging_settings/edit_mailserver/views.cljs index eb324f81749..f5df062f79d 100644 --- a/src/status_im/ui/screens/offline_messaging_settings/edit_mailserver/views.cljs +++ b/src/status_im/ui/screens/offline_messaging_settings/edit_mailserver/views.cljs @@ -37,7 +37,8 @@ (not (string/blank? name)) (empty? validation-errors)) invalid-url? (contains? validation-errors :url)] - [react/keyboard-avoiding-view {:style {:flex 1}} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [topbar/topbar {:title (i18n/label (if id :t/mailserver-details :t/add-mailserver))}] [react/scroll-view {:keyboard-should-persist-taps :handled} [react/view styles/edit-mailserver-view diff --git a/src/status_im/ui/screens/offline_messaging_settings/views.cljs b/src/status_im/ui/screens/offline_messaging_settings/views.cljs index 79d9ed01b67..0f7a6ac2422 100644 --- a/src/status_im/ui/screens/offline_messaging_settings/views.cljs +++ b/src/status_im/ui/screens/offline_messaging_settings/views.cljs @@ -53,8 +53,6 @@ [react/view {:style styles/wrapper} [topbar/topbar {:title (i18n/label :t/history-nodes) - ;; Navigate to profile as we might be coming from home to this view - :navigation {:on-press #(re-frame/dispatch [:navigate-to :profile-stack {:screen :sync-settings}])} :right-accessories [{:icon :main-icons/add-circle :on-press #(re-frame/dispatch [:mailserver.ui/add-pressed])}]}] diff --git a/src/status_im/ui/screens/intro/styles.cljs b/src/status_im/ui/screens/onboarding/intro/styles.cljs similarity index 61% rename from src/status_im/ui/screens/intro/styles.cljs rename to src/status_im/ui/screens/onboarding/intro/styles.cljs index 07e22a63c3a..6062d08bc7b 100644 --- a/src/status_im/ui/screens/intro/styles.cljs +++ b/src/status_im/ui/screens/onboarding/intro/styles.cljs @@ -1,6 +1,6 @@ -(ns status-im.ui.screens.intro.styles - (:require [status-im.ui.components.colors :as colors] - [quo.animated :as animated])) +(ns status-im.ui.screens.onboarding.intro.styles + (:require [quo.animated :as animated] + [status-im.ui.components.colors :as colors])) (def dot-size 6) (def progress-size 36) @@ -13,6 +13,7 @@ (defn dot-selector [] {:flex-direction :row :justify-content :space-between + :margin-bottom 16 :align-items :center}) (defn dot-style [active] @@ -31,44 +32,15 @@ :opacity (animated/mix active 0 1) :transform [{:translateX (animated/mix progress (- progress-size) 0)}]}) -(def wizard-title - {:margin-bottom 16 - :typography :header - :text-align :center}) - -(def wizard-text - {:color colors/gray - :text-align :center}) - (defn wizard-text-with-height [height] - (merge wizard-text + (merge {:color colors/gray + :text-align :center} (when-not (zero? height) {:height height}))) -(def welcome-text-bottom-note - {:typography :caption - :color colors/gray - :text-align :center}) - -(defn list-item [selected?] - {:flex-direction :row - :align-items :center - :justify-content :space-between - :padding-left 16 - :padding-right 10 - :background-color (if selected? colors/blue-light colors/white) - :padding-vertical 12}) - -(def multiaccount-image - {:width 40 - :height 40 - :border-radius 20 - :border-width 1 - :border-color colors/black-transparent}) - -(defn password-text-input [width] - {:typography :header - :width width}) +(def wizard-title + {:margin-bottom 16 + :text-align :center}) (def buttons-container {:align-items :center @@ -79,3 +51,8 @@ :justify-content :center :align-items :center :flex-direction :row}) + +(def welcome-text-bottom-note + {:typography :caption + :color colors/gray + :text-align :center}) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/intro/views.cljs b/src/status_im/ui/screens/onboarding/intro/views.cljs new file mode 100644 index 00000000000..241714136d3 --- /dev/null +++ b/src/status_im/ui/screens/onboarding/intro/views.cljs @@ -0,0 +1,158 @@ +(ns status-im.ui.screens.onboarding.intro.views + (:require [quo.animated :as animated] + [status-im.ui.screens.onboarding.intro.styles :as styles] + [status-im.ui.components.react :as react] + [reagent.core :as reagent] + [status-im.i18n.i18n :as i18n] + [status-im.react-native.resources :as resources] + [quo.core :as quo] + [re-frame.core :as re-frame] + [status-im.privacy-policy.core :as privacy-policy] + [status-im.ui.components.colors :as colors])) + +(defonce index (reagent/atom 0)) + +(defn code [val] + ^{:key val} + [animated/code {:exec val}]) + +(defn dot [] + (let [active (animated/value 0) + active-transition (animated/with-timing-transition active {:duration 100})] + (fn [{:keys [selected progress]}] + [animated/view {:style (styles/dot-style active-transition)} + [code (animated/set active (if selected 1 0))] + [animated/view {:style (styles/dot-progress active-transition progress)}]]))) + +(defn dots-selector [{:keys [n progress]}] + (let [selected @index] + [react/view {:style (styles/dot-selector)} + (for [i (range n)] + ^{:key i} + [dot {:progress progress + :selected (= selected i)}])])) + +(defn slides-view [slides width] + (let [height (reagent/atom 0) + text-height (reagent/atom 0) + text-temp-height (atom 0) + text-temp-timer (atom nil)] + (fn [_] + [:<> + (doall + (for [s slides] + ^{:key (:title s)} + [react/view {:style {:flex 1 + :width width + :justify-content :flex-end + :align-items :center + :padding-horizontal 32}} + (let [size (min width @height)] + [react/view {:style {:flex 1} + :on-layout (fn [^js e] + (let [new-height (-> e .-nativeEvent .-layout .-height)] + (swap! height #(if (pos? %) (min % new-height) new-height))))} + [react/image {:source (:image s) + :resize-mode :contain + :style {:width size + :height size}}]]) + [quo/text {:style styles/wizard-title + :align :center + :weight :bold + :size :x-large} + (i18n/label (:title s))] + [quo/text {:style (styles/wizard-text-with-height @text-height) + :on-layout + (fn [^js e] + (let [new-height (-> e .-nativeEvent .-layout .-height)] + (when (and (not= new-height @text-temp-height) + (not (zero? new-height)) + (< new-height 200)) + (swap! text-temp-height #(if (pos? %) (max % new-height) new-height)) + (when @text-temp-timer (js/clearTimeout @text-temp-timer)) + (reset! text-temp-timer + (js/setTimeout #(reset! text-height @text-temp-height) 500)))))} + (i18n/label (:text s))]]))]))) + +(defn carousel [slides width] + ;;TODO this is really not the best implementation, must be a better way + (let [scroll-x (reagent/atom 0) + scroll-view-ref (atom nil) + + manual-scroll (atom false) + progress (animated/value 1) + autoscroll (animated/value 1) + finished (animated/value 0) + clock (animated/clock) + go-next (fn [] + (let [x (if (>= @scroll-x (- (* (dec (count slides)) + width) 5)) + 0 + (+ @scroll-x width))] + (reset! index (Math/round (/ x width))) + (some-> ^js @scroll-view-ref (.scrollTo #js {:x x :animated true})))) + code (animated/block + [(animated/cond* (animated/and* (animated/not* (animated/clock-running clock)) + autoscroll) + (animated/start-clock clock)) + (animated/cond* (animated/and* (animated/clock-running clock) + (animated/not* autoscroll)) + [(animated/stop-clock clock) + (animated/set finished 1)]) + (animated/set progress (animated/cancelable-loop + {:clock clock + :finished finished + :duration 4000 + :on-reach go-next}))]) + cancel-animation (fn [] + (reset! manual-scroll true) + (animated/set-value autoscroll 0)) + restart-animation (fn [] + (animated/set-value autoscroll 1))] + (fn [_ _] + [react/view {:style {:align-items :center + :flex 1 + :justify-content :flex-end}} + [animated/code {:exec code}] + [react/scroll-view {:horizontal true + :paging-enabled true + :ref #(reset! scroll-view-ref %) + :shows-vertical-scroll-indicator false + :shows-horizontal-scroll-indicator false + :pinch-gesture-enabled false + :scroll-event-throttle 16 + :on-scroll #(let [x (.-nativeEvent.contentOffset.x ^js %)] + (when @manual-scroll + ;; NOTE: Will be not synced if velocity is big + (reset! index (Math/round (/ x width)))) + (reset! scroll-x x)) + :on-scroll-begin-drag cancel-animation + :on-scroll-end-drag restart-animation + :on-momentum-scroll-end #(reset! manual-scroll false) + :style {:margin-bottom 16}} + [slides-view slides width]] + [dots-selector {:progress progress + :n (count slides)}]]))) + +(defn intro [] + [react/view {:style styles/intro-view} + [carousel [{:image (resources/get-theme-image :chat) + :title :intro-title1 + :text :intro-text1} + {:image (resources/get-theme-image :wallet) + :title :intro-title2 + :text :intro-text2} + {:image (resources/get-theme-image :browser) + :title :intro-title3 + :text :intro-text3}] + @(re-frame/subscribe [:dimensions/window-width])] + [react/view styles/buttons-container + [react/view {:style (assoc styles/bottom-button :margin-bottom 16)} + [quo/button {:on-press #(re-frame/dispatch [:init-root :onboarding])} + (i18n/label :t/get-started)]] + [react/nested-text + {:style styles/welcome-text-bottom-note} + (i18n/label :t/intro-privacy-policy-note1) + [{:style (assoc styles/welcome-text-bottom-note :color colors/blue) + :on-press privacy-policy/open-privacy-policy-link!} + (i18n/label :t/intro-privacy-policy-note2)]]]]) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/keys/views.cljs b/src/status_im/ui/screens/onboarding/keys/views.cljs new file mode 100644 index 00000000000..9b6e0371304 --- /dev/null +++ b/src/status_im/ui/screens/onboarding/keys/views.cljs @@ -0,0 +1,96 @@ +(ns status-im.ui.screens.onboarding.keys.views + (:require [re-frame.core :as re-frame] + [status-im.constants :as constants] + [status-im.i18n.i18n :as i18n] + [status-im.react-native.resources :as resources] + [status-im.ui.components.react :as react] + [status-im.ui.screens.onboarding.styles :as styles] + [status-im.utils.gfycat.core :as gfy] + [status-im.utils.identicon :as identicon] + [status-im.utils.debounce :refer [dispatch-and-chill]] + [quo.core :as quo] + [status-im.utils.utils :as utils] + [status-im.ui.screens.onboarding.views :as ui] + [status-im.ui.components.topbar :as topbar] + [reagent.core :as reagent]) + (:require-macros [status-im.utils.views :refer [defview letsubs]])) + +(defview choose-a-chat-name [] + (letsubs [{:keys [multiaccounts selected-id]} [:intro-wizard/choose-key]] + [:<> + [topbar/topbar + {:border-bottom false + :navigation {:label (i18n/label :t/cancel) + :on-press (fn [] + (utils/show-question + (i18n/label :t/are-you-sure-to-cancel) + (i18n/label :t/you-will-start-from-scratch) + #(re-frame/dispatch [:rnn-navigate-back])))}}] + [ui/title-with-description :t/intro-wizard-title2 :t/intro-wizard-text2] + [ui/learn-more :t/about-names-title :t/about-names-content] + [react/view {:style {:flex 1 + :justify-content :center}} + [react/scroll-view + {:style {:max-height 410} + :content-container-style {:justify-content :flex-start}} + (for [[acc accessibility-n] (map vector multiaccounts (range (count multiaccounts)))] + (let [selected? (= (:id acc) selected-id) + public-key (get-in acc [:derived constants/path-whisper-keyword :public-key])] + ^{:key public-key} + [quo/list-item {:accessibility-label (keyword (str "select-account-button-" accessibility-n)) + :active selected? + :title [quo/text {:number-of-lines 2 + :weight :medium + :ellipsize-mode :middle + :accessibility-label :username} + (gfy/generate-gfy public-key)] + :subtitle [quo/text {:weight :monospace + :color :secondary} + (utils/get-shortened-address public-key)] + :accessory :radio + :on-press #(re-frame/dispatch [:intro-wizard/on-key-selected (:id acc)]) + :icon [react/image {:source {:uri (identicon/identicon public-key)} + :resize-mode :cover + :style styles/multiaccount-image}]}]))]] + [ui/next-button #(dispatch-and-chill [:rnn-navigate-to :select-key-storage] 300) false]])) + +(defn get-your-keys-image [] + (let [dimensions (reagent/atom {})] + (fn [] + ;;TODO this is not really the best way to do it, resize is visible, we need to find a better way + [react/view {:on-layout (fn [^js e] + (reset! dimensions (js->clj (-> e .-nativeEvent .-layout) :keywordize-keys true))) + :style {:align-items :center + :justify-content :center + :flex 1}} + (let [image-size (- (min (:width @dimensions) (:height @dimensions)) 40)] + [react/image {:source (resources/get-theme-image :keys) + :resize-mode :contain + :style {:width image-size :height image-size}}])]))) + +(defview get-your-keys [] + (letsubs [{:keys [processing?]} [:intro-wizard/choose-key]] + [:<> + [ui/title-with-description :t/intro-wizard-title1 :t/intro-wizard-text1] + [get-your-keys-image] + (if processing? + [react/view {:style {:align-items :center}} + [react/view {:min-height 46 :max-height 46 :align-self :stretch :margin-bottom 16} + [react/activity-indicator {:animating true + :size :large}]] + [react/text {:style (assoc (styles/wizard-text) :margin-top 20 :margin-bottom 16)} + (i18n/label :t/generating-keys)]] + [react/view {:style {:align-items :center}} + [react/view {:style (assoc styles/bottom-button :margin-bottom 16)} + [quo/button + {;:disabled existing-account? + :on-press #(re-frame/dispatch [:generate-and-derive-addresses]) + :accessibility-label :onboarding-next-button} + (i18n/label :t/generate-a-key)]] + [react/view {:padding-vertical 8} + [quo/button + {:on-press #(re-frame/dispatch [:bottom-sheet/show-sheet :recover-sheet]) + :type :secondary} + (i18n/label :t/access-existing-keys)]] + [react/text {:style (assoc (styles/wizard-text) :margin-top 20 :margin-bottom 16)} + (i18n/label :t/this-will-take-few-seconds)]])])) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/notifications/views.cljs b/src/status_im/ui/screens/onboarding/notifications/views.cljs new file mode 100644 index 00000000000..b72dacefeed --- /dev/null +++ b/src/status_im/ui/screens/onboarding/notifications/views.cljs @@ -0,0 +1,29 @@ +(ns status-im.ui.screens.onboarding.notifications.views + (:require [status-im.ui.components.react :as react] + [status-im.ui.components.colors :as colors] + [status-im.i18n.i18n :as i18n] + [status-im.react-native.resources :as resources] + [re-frame.core :as re-frame] + [quo.core :as quo] + [status-im.notifications.core :as notifications])) + +(defn notifications-onboarding [] + [react/view {:flex 1 :background-color colors/white + :align-items :center :padding-bottom 16} + [react/text {:style {:margin-top 72 :margin-bottom 16 + :typography :header}} + (i18n/label :t/private-notifications)] + [react/text {:style {:color colors/gray :text-align :center :margin-horizontal 24}} + (i18n/label :t/private-notifications-descr)] + [react/view {:flex 1 :align-items :center :justify-content :center} + [react/image {:source (resources/get-image :notifications) + :style {:width 118 + :height 118}}]] + [quo/button {:on-press #(do (re-frame/dispatch [::notifications/switch true]) + (re-frame/dispatch [:init-root :welcome])) + :accessibility-label :enable-notifications} + (i18n/label :t/intro-wizard-title6)] + [quo/button {:type :secondary :style {:margin-top 8} + :accessibility-label :maybe-later + :on-press #(re-frame/dispatch [:init-root :welcome])} + (i18n/label :t/maybe-later)]]) \ No newline at end of file diff --git a/src/status_im/ui/screens/intro/password.cljs b/src/status_im/ui/screens/onboarding/password/views.cljs similarity index 79% rename from src/status_im/ui/screens/intro/password.cljs rename to src/status_im/ui/screens/onboarding/password/views.cljs index 9d63fac0ae2..225b65ddda5 100644 --- a/src/status_im/ui/screens/intro/password.cljs +++ b/src/status_im/ui/screens/onboarding/password/views.cljs @@ -1,7 +1,6 @@ -(ns status-im.ui.screens.intro.password +(ns status-im.ui.screens.onboarding.password.views (:require [re-frame.core :as re-frame] [reagent.core :as reagent] - [status-im.ui.components.topbar :as topbar] [status-im.ui.components.toolbar :as toolbar] [status-im.i18n.i18n :as i18n] [status-im.constants :as const] @@ -18,36 +17,31 @@ (defn screen [] (let [password (reagent/atom nil) confirm (reagent/atom nil) + processing? (reagent/atom nil) show-error (reagent/atom nil) confirm-ref (atom nil)] (fn [] - (let [{:keys [forward-action processing?]} - @(re-frame/subscribe [:intro-wizard/create-code]) - valid-password (validate-password @password) + (let [valid-password (validate-password @password) valid-form (confirm-password @password @confirm) + {:keys [recovering?]} @(re-frame/subscribe [:intro-wizard]) on-submit (fn [] - (when (not processing?) + (when (not @processing?) (if (and valid-password valid-form) (do (reset! show-error false) - (re-frame/dispatch [forward-action {:key-code @password}])) + (reset! processing? true) + (if recovering? + (re-frame/dispatch [:multiaccounts.recover/enter-password-next-pressed @password]) + (re-frame/dispatch [:create-multiaccount @password]))) (reset! show-error true))))] [rn/keyboard-avoiding-view {:flex 1} - [topbar/topbar - {:border-bottom false - :navigation - {:icon :main-icons/back - :accessibility-label :back-button - :on-press #(re-frame/dispatch [:intro-wizard/navigate-back])}}] [rn/view {:style {:flex 1 :justify-content :space-between :padding-vertical 16 :padding-horizontal 16}} - - [rn/view - [quo/text {:weight :bold - :align :center - :size :x-large} - (i18n/label :intro-wizard-title-alt4)]] + [quo/text {:weight :bold + :align :center + :size :x-large} + (i18n/label :intro-wizard-title-alt4)] [rn/view [rn/view {:style {:padding 16}} [quo/text-input {:secure-text-entry true @@ -84,14 +78,13 @@ (reset! show-error true) :else (reset! show-error false)))}]]] - [rn/view - [quo/text {:color :secondary - :align :center - :size :small} - (i18n/label :t/password-description)]]] + [quo/text {:color :secondary + :align :center + :size :small} + (i18n/label :t/password-description)]] [toolbar/toolbar (merge {:show-border? true} - (if processing? + (if @processing? {:center [rn/view {:align-items :center :justify-content :center @@ -108,7 +101,7 @@ :disabled (or (nil? @confirm) (not valid-password) (not valid-form) - processing?) + @processing?) :type :secondary :after :main-icons/next} - (i18n/label :t/next)]}))]])))) + (i18n/label :t/next)]}))]])))) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/phrase/view.cljs b/src/status_im/ui/screens/onboarding/phrase/view.cljs new file mode 100644 index 00000000000..ff561485dbc --- /dev/null +++ b/src/status_im/ui/screens/onboarding/phrase/view.cljs @@ -0,0 +1,136 @@ +(ns status-im.ui.screens.onboarding.phrase.view + (:require-macros [status-im.utils.views :refer [defview letsubs]]) + (:require [status-im.ui.components.react :as react] + [status-im.ui.components.colors :as colors] + [status-im.i18n.i18n :as i18n] + [re-frame.core :as re-frame] + [status-im.utils.security :as security] + [quo.core :as quo] + [status-im.utils.datetime :as datetime] + [status-im.ui.screens.onboarding.views :as ui] + [status-im.utils.debounce :refer [dispatch-and-chill]] + [status-im.utils.utils :as utils] + [reagent.core :as reagent])) + +(defview wizard-recovery-success [] + (letsubs [{:keys [pubkey processing? name identicon]} [:intro-wizard/recovery-success] + existing-account? [:intro-wizard/recover-existing-account?]] + [react/view {:style {:flex 1 + :justify-content :space-between}} + [ui/title-with-description :t/keycard-recovery-success-header :t/recovery-success-text] + [react/view {:flex 1 + :justify-content :space-between + :background-color colors/white} + [react/view {:flex 1 + :justify-content :space-between + :align-items :center} + [react/view {:flex-direction :column + :flex 1 + :justify-content :center + :align-items :center} + [react/view {:margin-horizontal 16 + :flex-direction :column} + [react/view {:justify-content :center + :align-items :center + :margin-bottom 11} + [react/image {:source {:uri identicon} + :style {:width 61 + :height 61 + :border-radius 30 + :border-width 1 + :border-color colors/black-transparent}}]] + [react/text {:style {:text-align :center + :color colors/black + :font-weight "500"} + :number-of-lines 1 + :ellipsize-mode :middle} + name] + [quo/text {:style {:margin-top 4} + :monospace true + :color :secondary + :align :center + :number-of-lines 1 + :ellipsize-mode :middle} + (utils/get-shortened-address pubkey)]]]]] + [ui/next-button + #(dispatch-and-chill [:multiaccounts.recover/re-encrypt-pressed] 300) + (or processing? existing-account?)]])) + +(defn enter-phrase [_] + (let [show-bip39-password? (reagent/atom false) + pressed-in-at (atom nil)] + (fn [] + (let [{:keys [processing? + passphrase-word-count + next-button-disabled? + passphrase-error]} + @(re-frame/subscribe [:intro-wizard/enter-phrase])] + [react/keyboard-avoiding-view {:flex 1} + [quo/text {:weight :bold + :align :center + :size :x-large} + (i18n/label :t/multiaccounts-recover-enter-phrase-title)] + [react/pressable + {:style {:background-color colors/white + :flex 1 + :justify-content :center + :padding-horizontal 16} + ;; BIP39 password input will be shown only after pressing on screen + ;; for longer than 2 seconds + :on-press-in (fn [] + (reset! pressed-in-at (datetime/now))) + :on-press-out (fn [] + (when (>= (datetime/seconds-ago @pressed-in-at) 2) + (reset! show-bip39-password? true)))} + [react/view + [quo/text-input + {:on-change-text #(re-frame/dispatch [:multiaccounts.recover/enter-phrase-input-changed + (security/mask-data %)]) + :auto-focus true + :error (when passphrase-error (i18n/label passphrase-error)) + :accessibility-label :passphrase-input + :placeholder (i18n/label :t/seed-phrase-placeholder) + :show-cancel false + :bottom-value 40 + :multiline true + :auto-correct false + :monospace true}] + [react/view {:align-items :flex-end} + [react/view {:flex-direction :row + :align-items :center + :padding-vertical 8 + :opacity (if passphrase-word-count 1 0)} + [quo/text {:color (if next-button-disabled? :secondary :main) + :size :small} + (when-not next-button-disabled? + "✓ ") + (i18n/label-pluralize passphrase-word-count :t/words-n)]]] + (when @show-bip39-password? + ;; BIP39 password (`passphrase` in BIP39 + ;; https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#from-mnemonic-to-seed) + ;; is an advanced security feature which allows to add an arbitrary + ;; extra word to your existing mnemonic. The password is an empty + ;; string if not provided. If the password is added a completely + ;; different key will be created. + [quo/text-input + {:on-change-text + #(re-frame/dispatch [:multiaccounts.recover/enter-passphrase-input-changed + (security/mask-data %)]) + :placeholder (i18n/label :t/bip39-password-placeholder) + :show-cancel false}])]] + [react/view {:align-items :center} + [react/text {:style {:color colors/gray + :font-size 14 + :margin-bottom 8 + :text-align :center}} + (i18n/label :t/multiaccounts-recover-enter-phrase-text)] + (when processing? + [react/view {:flex 1 :align-items :center} + [react/activity-indicator {:size :large + :animating true}] + [react/text {:style {:color colors/gray + :margin-top 8}} + (i18n/label :t/processing)]])] + [ui/next-button + #(dispatch-and-chill [:multiaccounts.recover/enter-phrase-next-pressed] 300) + next-button-disabled?]])))) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/storage/views.cljs b/src/status_im/ui/screens/onboarding/storage/views.cljs new file mode 100644 index 00000000000..62ab78960a2 --- /dev/null +++ b/src/status_im/ui/screens/onboarding/storage/views.cljs @@ -0,0 +1,48 @@ +(ns status-im.ui.screens.onboarding.storage.views + (:require [re-frame.core :as re-frame] + [status-im.i18n.i18n :as i18n] + [status-im.ui.components.react :as react] + [status-im.utils.debounce :refer [dispatch-and-chill]] + [quo.core :as quo] + [status-im.ui.screens.onboarding.views :as ui]) + (:require-macros [status-im.utils.views :refer [defview letsubs]])) + +(defn storage-entry [{:keys [type icon title desc]} selected-storage-type] + [:<> + [quo/list-header (i18n/label type)] + [quo/list-item {:accessibility-label (keyword (str "select-storage-" type)) + :on-press #(re-frame/dispatch [:intro-wizard/on-key-storage-selected type]) + :icon icon + :accessory :radio + :active (= type selected-storage-type) + :title (i18n/label title) + :subtitle (i18n/label desc) + :subtitle-max-lines 2}]]) + +(defview select-key-storage [] + (letsubs [{:keys [selected-storage-type recovering?]} [:intro-wizard/select-key-storage]] + [:<> + [react/view {:style {:flex 1}} + [ui/title-with-description :t/intro-wizard-title3 :t/intro-wizard-text3] + [ui/learn-more :t/about-key-storage-title :t/about-key-storage-content] + [react/view {:style {:margin-top 60}} + [storage-entry {:type :default + :icon :main-icons/mobile + :title :t/this-device + :desc :t/this-device-desc} + selected-storage-type] + [react/view {:style {:height 16}}] + [storage-entry {:type :advanced + :icon :main-icons/keycard + :title :t/keycard + :desc :t/keycard-desc} + selected-storage-type]]] + [ui/next-button + #(dispatch-and-chill + (if (= :advanced selected-storage-type) + (if recovering? + [:multiaccounts.recover/select-storage-next-pressed] + [:keycard/start-onboarding-flow]) + [:rnn-navigate-to :create-password]) + 300) + false]])) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/styles.cljs b/src/status_im/ui/screens/onboarding/styles.cljs new file mode 100644 index 00000000000..68621b0e617 --- /dev/null +++ b/src/status_im/ui/screens/onboarding/styles.cljs @@ -0,0 +1,32 @@ +(ns status-im.ui.screens.onboarding.styles + (:require [status-im.ui.components.colors :as colors])) + +(def wizard-title + {:margin-bottom 16 + :text-align :center}) + +(defn wizard-text [] + {:color colors/gray + :text-align :center}) + +(def bottom-button + {:padding-horizontal 24 + :justify-content :center + :align-items :center + :flex-direction :row}) + +(def multiaccount-image + {:width 40 + :height 40 + :border-radius 20 + :border-width 1 + :border-color colors/black-transparent}) + +(defn list-item [selected?] + {:flex-direction :row + :align-items :center + :justify-content :space-between + :padding-left 16 + :padding-right 10 + :background-color (if selected? colors/blue-light colors/white) + :padding-vertical 12}) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/views.cljs b/src/status_im/ui/screens/onboarding/views.cljs new file mode 100644 index 00000000000..a003bf8808d --- /dev/null +++ b/src/status_im/ui/screens/onboarding/views.cljs @@ -0,0 +1,38 @@ +(ns status-im.ui.screens.onboarding.views + (:require [status-im.ui.components.react :as react] + [re-frame.core :as re-frame] + [status-im.ui.screens.onboarding.styles :as styles] + [status-im.i18n.i18n :as i18n] + [status-im.ui.components.colors :as colors] + [quo.core :as quo] + [status-im.ui.components.toolbar :as toolbar])) + +(defn learn-more [title content] + [react/text {:on-press #(re-frame/dispatch [:bottom-sheet/show-sheet :learn-more + {:title (i18n/label title) + :content (i18n/label content)}]) + :style (merge (styles/wizard-text) {:color colors/blue}) + :accessibility-label :learn-more} + (i18n/label :learn-more)]) + +(defn title-with-description [title description] + [react/view {:style {:margin-vertical 16 + :margin-horizontal 32}} + [quo/text {:style styles/wizard-title + :align :center + :weight :bold + :size :x-large} + (i18n/label title)] + [react/text {:style (styles/wizard-text)} + (i18n/label description)]]) + +(defn next-button [handler disabled] + [toolbar/toolbar + {:show-border? true + :right [quo/button + {:on-press handler + :accessibility-label :onboarding-next-button + :type :secondary + :disabled disabled + :after :main-icons/next} + (i18n/label :t/next)]}]) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/welcome/styles.cljs b/src/status_im/ui/screens/onboarding/welcome/styles.cljs new file mode 100644 index 00000000000..7746d735ffa --- /dev/null +++ b/src/status_im/ui/screens/onboarding/welcome/styles.cljs @@ -0,0 +1,17 @@ +(ns status-im.ui.screens.onboarding.welcome.styles + (:require [status-im.ui.components.colors :as colors])) + +(def welcome-view + {:flex 1 + :justify-content :flex-end}) + +(def welcome-text + {:typography :header + :text-align :center}) + +(def welcome-text-description + {:margin-top 16 + :margin-bottom 32 + :text-align :center + :margin-horizontal 40 + :color colors/gray}) \ No newline at end of file diff --git a/src/status_im/ui/screens/onboarding/welcome/views.cljs b/src/status_im/ui/screens/onboarding/welcome/views.cljs new file mode 100644 index 00000000000..d5507e21e00 --- /dev/null +++ b/src/status_im/ui/screens/onboarding/welcome/views.cljs @@ -0,0 +1,34 @@ +(ns status-im.ui.screens.onboarding.welcome.views + (:require [status-im.ui.components.react :as react] + [reagent.core :as reagent] + [cljs-bean.core :as bean] + [status-im.react-native.resources :as resources] + [re-frame.core :as re-frame] + [status-im.i18n.i18n :as i18n] + [quo.core :as quo] + [status-im.ui.screens.onboarding.welcome.styles :as styles])) + +(defn welcome-image-wrapper [] + (let [dimensions (reagent/atom {})] + (fn [] + [react/view {:on-layout (fn [^js e] + (reset! dimensions (bean/->clj (-> e .-nativeEvent .-layout)))) + :style {:align-items :center + :justify-content :center + :flex 1}} + (let [padding 0 + image-size (- (min (:width @dimensions) (:height @dimensions)) padding)] + [react/image {:source (resources/get-theme-image :welcome) + :resize-mode :contain + :style {:width image-size :height image-size}}])]))) + +(defn welcome [] + [react/view {:style styles/welcome-view} + [welcome-image-wrapper] + [react/i18n-text {:style styles/welcome-text :key :welcome-to-status}] + [react/i18n-text {:style styles/welcome-text-description + :key :welcome-to-status-description}] + [react/view {:align-items :center :margin-bottom 50} + [quo/button {:on-press #(re-frame/dispatch [:welcome-lets-go]) + :accessibility-label :lets-go-button} + (i18n/label :t/lets-go)]]]) \ No newline at end of file diff --git a/src/status_im/ui/screens/pairing/views.cljs b/src/status_im/ui/screens/pairing/views.cljs index 6109d625605..6992e854b49 100644 --- a/src/status_im/ui/screens/pairing/views.cljs +++ b/src/status_im/ui/screens/pairing/views.cljs @@ -8,8 +8,7 @@ [status-im.ui.components.list.views :as list] [status-im.ui.components.react :as react] [quo.core :as quo] - [status-im.ui.screens.pairing.styles :as styles] - [status-im.ui.components.topbar :as topbar])) + [status-im.ui.screens.pairing.styles :as styles])) (def syncing (reagent/atom false)) (def installation-name (reagent/atom "")) @@ -130,8 +129,7 @@ (views/defview installations [] (views/letsubs [installations [:pairing/installations]] - [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/devices)}] + [:<> [react/scroll-view (if (string/blank? (-> installations first :name)) [edit-installation-name] diff --git a/src/status_im/ui/screens/popover/views.cljs b/src/status_im/ui/screens/popover/views.cljs index 50707d022e7..e76e0a74fa0 100644 --- a/src/status_im/ui/screens/popover/views.cljs +++ b/src/status_im/ui/screens/popover/views.cljs @@ -96,8 +96,9 @@ (when @current-popover (let [{:keys [view style]} @current-popover] [react/view {:position :absolute :top 0 :bottom 0 :left 0 :right 0} - [react/animated-view - {:style {:flex 1 :background-color colors/black-persist :opacity alpha-value}}] + (when platform/ios? + [react/animated-view + {:style {:flex 1 :background-color colors/black-persist :opacity alpha-value}}]) [react/animated-view {:style {:position :absolute :height window-height diff --git a/src/status_im/ui/screens/privacy_and_security_settings/delete_profile.cljs b/src/status_im/ui/screens/privacy_and_security_settings/delete_profile.cljs index 47387bf0519..4330c767151 100644 --- a/src/status_im/ui/screens/privacy_and_security_settings/delete_profile.cljs +++ b/src/status_im/ui/screens/privacy_and_security_settings/delete_profile.cljs @@ -4,7 +4,6 @@ [status-im.multiaccounts.core :as multiaccounts] [status-im.ui.components.chat-icon.screen :as chat-icon.screen] [re-frame.core :as re-frame] - [status-im.ui.components.topbar :as topbar] [status-im.i18n.i18n :as i18n] [reagent.core :as reagent] [status-im.utils.security :as security] @@ -34,72 +33,68 @@ keep-keys-on-keycard? @(re-frame/subscribe [:delete-profile/keep-keys-on-keycard?])] (when (and @text-input-ref error (not @password)) (.clear ^js @text-input-ref)) - [react/view {:flex 1} - [topbar/topbar {:modal? true}] - [react/view - {:style {:flex 1 - :justify-content :space-between}} - [react/scroll-view {:style {:flex 1}} - [react/view {:style {:align-items :center}} - [quo/text {:weight :bold - :size :x-large} - (i18n/label :t/delete-profile)]] - [quo/list-item - {:title (multiaccounts/displayed-name multiaccount) - :icon [chat-icon.screen/contact-icon-contacts-tab - (multiaccounts/displayed-photo multiaccount)]}] - (when keycard? - [react/view - [quo/list-header (i18n/label :t/actions)] - [quo/list-item {:title (i18n/label :t/delete-keys-keycard) - :accessory :checkbox - :active (not keep-keys-on-keycard?) - :on-press #(re-frame/dispatch [::delete-profile/keep-keys-on-keycard (not keep-keys-on-keycard?)])}] - [quo/list-item {:title (i18n/label :t/unpair-keycard) - :subtitle (i18n/label :t/unpair-keycard-warning) - :subtitle-max-lines 4 - :disabled true - :active true - :accessory :checkbox}] - [quo/list-item {:title (i18n/label :t/reset-database) - :subtitle (i18n/label :t/reset-database-warning-keycard) - :subtitle-max-lines 4 - :disabled true - :active true - :accessory :checkbox}]]) - (when-not keycard? - [quo/text {:style {:margin-horizontal 24} - :align :center - :color :negative} - (i18n/label :t/delete-profile-warning)]) - (when-not keycard? - [quo/text-input - {:style {:margin-horizontal 36 - :margin-top 36} - :show-cancel false - :secure-text-entry true - :return-key-type :next - :on-submit-editing nil - :auto-focus true - :on-change-text #(reset! password (security/mask-data %)) - :bottom-value 36 - :get-ref #(reset! text-input-ref %) - :error (when (and error (not @password)) - (if (= :wrong-password error) - (i18n/label :t/wrong-password) - (str error)))}])] + [react/keyboard-avoiding-view {:style {:flex 1}} + [react/scroll-view {:style {:flex 1}} [react/view {:style {:align-items :center}} - (when-not keycard? - [quo/separator]) - (when (and keycard? (not keep-keys-on-keycard?)) - [quo/text {:style {:margin-horizontal 24 :margin-bottom 16} - :align :center - :color :negative} - (i18n/label :t/delete-profile-warning)]) - [react/view - {:style {:margin-vertical 8}} - [quo/button {:on-press (if keycard? (on-delete-keycard-profile keep-keys-on-keycard?) (on-delete-profile password)) - :theme :negative - :accessibility-label :delete-profile-confirm - :disabled (and (not keycard?) ((complement valid-password?) @password))} - (i18n/label :t/delete-profile)]]]]])))) + [quo/text {:weight :bold + :size :x-large} + (i18n/label :t/delete-profile)]] + [quo/list-item + {:title (multiaccounts/displayed-name multiaccount) + :icon [chat-icon.screen/contact-icon-contacts-tab + (multiaccounts/displayed-photo multiaccount)]}] + (when keycard? + [react/view + [quo/list-header (i18n/label :t/actions)] + [quo/list-item {:title (i18n/label :t/delete-keys-keycard) + :accessory :checkbox + :active (not keep-keys-on-keycard?) + :on-press #(re-frame/dispatch [::delete-profile/keep-keys-on-keycard (not keep-keys-on-keycard?)])}] + [quo/list-item {:title (i18n/label :t/unpair-keycard) + :subtitle (i18n/label :t/unpair-keycard-warning) + :subtitle-max-lines 4 + :disabled true + :active true + :accessory :checkbox}] + [quo/list-item {:title (i18n/label :t/reset-database) + :subtitle (i18n/label :t/reset-database-warning-keycard) + :subtitle-max-lines 4 + :disabled true + :active true + :accessory :checkbox}]]) + (when-not keycard? + [quo/text {:style {:margin-horizontal 24} + :align :center + :color :negative} + (i18n/label :t/delete-profile-warning)]) + (when-not keycard? + [quo/text-input + {:style {:margin-horizontal 36 + :margin-top 36} + :show-cancel false + :secure-text-entry true + :return-key-type :next + :on-submit-editing nil + :auto-focus true + :on-change-text #(reset! password (security/mask-data %)) + :bottom-value 36 + :get-ref #(reset! text-input-ref %) + :error (when (and error (not @password)) + (if (= :wrong-password error) + (i18n/label :t/wrong-password) + (str error)))}])] + [react/view {:style {:align-items :center}} + (when-not keycard? + [quo/separator]) + (when (and keycard? (not keep-keys-on-keycard?)) + [quo/text {:style {:margin-horizontal 24 :margin-bottom 16} + :align :center + :color :negative} + (i18n/label :t/delete-profile-warning)]) + [react/view + {:style {:margin-vertical 8}} + [quo/button {:on-press (if keycard? (on-delete-keycard-profile keep-keys-on-keycard?) (on-delete-profile password)) + :theme :negative + :accessibility-label :delete-profile-confirm + :disabled (and (not keycard?) ((complement valid-password?) @password))} + (i18n/label :t/delete-profile)]]]])))) diff --git a/src/status_im/ui/screens/privacy_and_security_settings/messages_from_contacts_only.cljs b/src/status_im/ui/screens/privacy_and_security_settings/messages_from_contacts_only.cljs index 6767b77ec5e..7429b39aa0a 100644 --- a/src/status_im/ui/screens/privacy_and_security_settings/messages_from_contacts_only.cljs +++ b/src/status_im/ui/screens/privacy_and_security_settings/messages_from_contacts_only.cljs @@ -4,7 +4,6 @@ [status-im.utils.fx :as fx] [status-im.ui.components.react :as react] [status-im.multiaccounts.update.core :as multiaccounts.update] - [status-im.ui.components.topbar :as topbar] [status-im.i18n.i18n :as i18n] [quo.core :as quo])) @@ -16,18 +15,16 @@ (views/defview messages-from-contacts-only [] (views/letsubs [{:keys [messages-from-contacts-only]} [:multiaccount]] - [react/view {:flex 1} - [topbar/topbar {:title (i18n/label :t/accept-new-chats-from)}] - [react/view {:margin-top 8} - [quo/list-item - {:active (not messages-from-contacts-only) - :accessory :radio - :title (i18n/label :t/anyone) - :on-press #(re-frame/dispatch [::messages-from-contacts-only-switched false])}] - [quo/list-item - {:active messages-from-contacts-only - :accessory :radio - :title (i18n/label :t/contacts) - :subtitle (i18n/label :t/messages-from-contacts-only-subtitle) - :subtitle-max-lines 4 - :on-press #(re-frame/dispatch [::messages-from-contacts-only-switched true])}]]])) + [react/view {:margin-top 8} + [quo/list-item + {:active (not messages-from-contacts-only) + :accessory :radio + :title (i18n/label :t/anyone) + :on-press #(re-frame/dispatch [::messages-from-contacts-only-switched false])}] + [quo/list-item + {:active messages-from-contacts-only + :accessory :radio + :title (i18n/label :t/contacts) + :subtitle (i18n/label :t/messages-from-contacts-only-subtitle) + :subtitle-max-lines 4 + :on-press #(re-frame/dispatch [::messages-from-contacts-only-switched true])}]])) diff --git a/src/status_im/ui/screens/privacy_and_security_settings/views.cljs b/src/status_im/ui/screens/privacy_and_security_settings/views.cljs index cdcd1b35f90..c3a2e4e8a00 100644 --- a/src/status_im/ui/screens/privacy_and_security_settings/views.cljs +++ b/src/status_im/ui/screens/privacy_and_security_settings/views.cljs @@ -2,12 +2,10 @@ (:require [re-frame.core :as re-frame] [status-im.i18n.i18n :as i18n] [quo.core :as quo] - [status-im.ui.components.colors :as colors] [status-im.ui.components.common.common :as components.common] [status-im.ui.components.react :as react] [status-im.utils.config :as config] [status-im.multiaccounts.biometric.core :as biometric] - [status-im.ui.components.topbar :as topbar] [status-im.utils.platform :as platform]) (:require-macros [status-im.utils.views :as views])) @@ -21,86 +19,84 @@ webview-allow-permission-requests?]} [:multiaccount] supported-biometric-auth [:supported-biometric-auth] auth-method [:auth-method]] - [react/view {:flex 1 :background-color colors/white} - [topbar/topbar {:title (i18n/label :t/privacy-and-security)}] - [react/scroll-view {:padding-vertical 8} - [quo/list-header (i18n/label :t/security)] - [quo/list-item {:size :small - :title (i18n/label :t/back-up-seed-phrase) - :accessibility-label :back-up-recovery-phrase-button - :disabled (not mnemonic) - :chevron (boolean mnemonic) - :accessory (when mnemonic [components.common/counter {:size 22} 1]) - :on-press #(re-frame/dispatch [:navigate-to :backup-seed])}] - (when supported-biometric-auth - [quo/list-item - {:size :small - :title (str (i18n/label :t/lock-app-with) " " (biometric/get-label supported-biometric-auth)) - :active (= auth-method "biometric") - :accessibility-label :biometric-auth-settings-switch - :accessory :switch - :on-press #(re-frame/dispatch [:multiaccounts.ui/biometric-auth-switched - ((complement boolean) (= auth-method "biometric"))])}]) - [separator] - ;; TODO - uncomment when implemented - ;; {:size :small - ;; :title (i18n/label :t/change-password) - ;; :chevron true} - ;; {:size :small - ;; :title (i18n/label :t/change-passcode) - ;; :chevron true} + [react/scroll-view {:padding-vertical 8} + [quo/list-header (i18n/label :t/security)] + [quo/list-item {:size :small + :title (i18n/label :t/back-up-seed-phrase) + :accessibility-label :back-up-recovery-phrase-button + :disabled (not mnemonic) + :chevron (boolean mnemonic) + :accessory (when mnemonic [components.common/counter {:size 22} 1]) + :on-press #(re-frame/dispatch [:navigate-to :backup-seed])}] + (when supported-biometric-auth + [quo/list-item + {:size :small + :title (str (i18n/label :t/lock-app-with) " " (biometric/get-label supported-biometric-auth)) + :active (= auth-method "biometric") + :accessibility-label :biometric-auth-settings-switch + :accessory :switch + :on-press #(re-frame/dispatch [:multiaccounts.ui/biometric-auth-switched + ((complement boolean) (= auth-method "biometric"))])}]) + [separator] + ;; TODO - uncomment when implemented + ;; {:size :small + ;; :title (i18n/label :t/change-password) + ;; :chevron true} + ;; {:size :small + ;; :title (i18n/label :t/change-passcode) + ;; :chevron true} - [quo/list-header (i18n/label :t/privacy)] - [quo/list-item {:size :small - :title (i18n/label :t/set-dapp-access-permissions) - :on-press #(re-frame/dispatch [:navigate-to :dapps-permissions]) - :accessibility-label :dapps-permissions-button - :chevron true}] - [quo/list-item {:size :small - :title (if platform/android? - (i18n/label :t/hide-content-when-switching-apps) - (i18n/label :t/hide-content-when-switching-apps-ios)) - :container-margin-bottom 8 - :active preview-privacy? - :accessory :switch - :on-press #(re-frame/dispatch - [:multiaccounts.ui/preview-privacy-mode-switched - ((complement boolean) preview-privacy?)])}] - [quo/list-item {:size :small - :title (i18n/label :t/chat-link-previews) - :chevron true - :on-press #(re-frame/dispatch [:navigate-to :link-previews-settings]) - :accessibility-label :chat-link-previews}] - [quo/list-item {:size :small - :title (i18n/label :t/accept-new-chats-from) - :chevron true - :accessory :text - :accessory-text (i18n/label (if messages-from-contacts-only - :t/contacts - :t/anyone)) - :on-press #(re-frame/dispatch [:navigate-to :messages-from-contacts-only]) - :accessibility-label :accept-new-chats-from}] - (when config/metrics-enabled? - [quo/list-item {:size :small - :title (i18n/label :t/anonymous-usage-data) - :chevron true - :on-press #(re-frame/dispatch [:navigate-to :anonymous-metrics-settings]) - :accessibility-label :anonymous-usage-data}]) - (when platform/android? - [quo/list-item {:size :small - :title (i18n/label :t/webview-camera-permission-requests) - :active webview-allow-permission-requests? - :accessory :switch - :subtitle (i18n/label :t/webview-camera-permission-requests-subtitle) - :subtitle-max-lines 2 - :on-press #(re-frame/dispatch - [:multiaccounts.ui/webview-permission-requests-switched - ((complement boolean) webview-allow-permission-requests?)])}]) - [separator] - [quo/list-item - {:size :small - :theme :negative - :title (i18n/label :t/delete-my-profile) - :on-press #(re-frame/dispatch [:navigate-to :delete-profile]) - :accessibility-label :dapps-permissions-button - :chevron true}]]])) + [quo/list-header (i18n/label :t/privacy)] + [quo/list-item {:size :small + :title (i18n/label :t/set-dapp-access-permissions) + :on-press #(re-frame/dispatch [:navigate-to :dapps-permissions]) + :accessibility-label :dapps-permissions-button + :chevron true}] + [quo/list-item {:size :small + :title (if platform/android? + (i18n/label :t/hide-content-when-switching-apps) + (i18n/label :t/hide-content-when-switching-apps-ios)) + :container-margin-bottom 8 + :active preview-privacy? + :accessory :switch + :on-press #(re-frame/dispatch + [:multiaccounts.ui/preview-privacy-mode-switched + ((complement boolean) preview-privacy?)])}] + [quo/list-item {:size :small + :title (i18n/label :t/chat-link-previews) + :chevron true + :on-press #(re-frame/dispatch [:navigate-to :link-previews-settings]) + :accessibility-label :chat-link-previews}] + [quo/list-item {:size :small + :title (i18n/label :t/accept-new-chats-from) + :chevron true + :accessory :text + :accessory-text (i18n/label (if messages-from-contacts-only + :t/contacts + :t/anyone)) + :on-press #(re-frame/dispatch [:navigate-to :messages-from-contacts-only]) + :accessibility-label :accept-new-chats-from}] + (when config/metrics-enabled? + [quo/list-item {:size :small + :title (i18n/label :t/anonymous-usage-data) + :chevron true + :on-press #(re-frame/dispatch [:navigate-to :anonymous-metrics-settings]) + :accessibility-label :anonymous-usage-data}]) + (when platform/android? + [quo/list-item {:size :small + :title (i18n/label :t/webview-camera-permission-requests) + :active webview-allow-permission-requests? + :accessory :switch + :subtitle (i18n/label :t/webview-camera-permission-requests-subtitle) + :subtitle-max-lines 2 + :on-press #(re-frame/dispatch + [:multiaccounts.ui/webview-permission-requests-switched + ((complement boolean) webview-allow-permission-requests?)])}]) + [separator] + [quo/list-item + {:size :small + :theme :negative + :title (i18n/label :t/delete-my-profile) + :on-press #(re-frame/dispatch [:navigate-to :delete-profile]) + :accessibility-label :dapps-permissions-button + :chevron true}]])) diff --git a/src/status_im/ui/screens/profile/contact/views.cljs b/src/status_im/ui/screens/profile/contact/views.cljs index 79606cf03e1..2634f1fe5fc 100644 --- a/src/status_im/ui/screens/profile/contact/views.cljs +++ b/src/status_im/ui/screens/profile/contact/views.cljs @@ -90,7 +90,7 @@ :accessibility-label :profile-nickname-item :accessory :text :accessory-text (or (:nickname names) (i18n/label :t/none)) - :on-press #(re-frame/dispatch [:navigate-to :nickname]) + :on-press #(re-frame/dispatch [:open-modal :nickname]) :chevron true}]) (defn save-nickname [public-key nickname] diff --git a/src/status_im/ui/screens/profile/group_chat/views.cljs b/src/status_im/ui/screens/profile/group_chat/views.cljs index 7a754a3922a..ec3b0e29821 100644 --- a/src/status_im/ui/screens/profile/group_chat/views.cljs +++ b/src/status_im/ui/screens/profile/group_chat/views.cljs @@ -97,7 +97,7 @@ {:title (i18n/label :t/add-members) :icon :main-icons/add-contact :theme :accent - :on-press #(re-frame/dispatch [:navigate-to :add-participants-toggle-list])}]) + :on-press #(re-frame/dispatch [:open-modal :add-participants-toggle-list])}]) [chat-group-members-view chat-id admin? current-pk]]) (defn hide-sheet-and-dispatch [event] @@ -196,7 +196,7 @@ :right-accessories (when (and admin? joined?) [{:icon :icons/edit :accessibility-label :edit-button - :on-press #(re-frame/dispatch [:navigate-to :edit-group-chat-name])}]) + :on-press #(re-frame/dispatch [:open-modal :edit-group-chat-name])}]) :extended-header (profile-header/extended-header {:title chat-name :color color diff --git a/src/status_im/ui/screens/profile/seed/views.cljs b/src/status_im/ui/screens/profile/seed/views.cljs index 8ee629cd53d..b782b19ee61 100644 --- a/src/status_im/ui/screens/profile/seed/views.cljs +++ b/src/status_im/ui/screens/profile/seed/views.cljs @@ -139,7 +139,8 @@ (defview backup-seed [] (letsubs [current-multiaccount [:multiaccount] {:keys [step first-word second-word error word]} [:my-profile/recovery]] - [react/keyboard-avoiding-view {:style {:flex 1}} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [topbar/topbar {:title (i18n/label :t/backup-recovery-phrase) :subtitle (i18n/label :t/step-i-of-n {:step (steps-numbers step) :number 3}) :navigation (if (= :finish step) diff --git a/src/status_im/ui/screens/progress/styles.cljs b/src/status_im/ui/screens/progress/styles.cljs deleted file mode 100644 index fb6838f9bca..00000000000 --- a/src/status_im/ui/screens/progress/styles.cljs +++ /dev/null @@ -1,9 +0,0 @@ -(ns status-im.ui.screens.progress.styles - (:require [status-im.ui.components.colors :as colors])) - -(defn container [] - {:flex 1 - :align-items :center - :justify-content :center - :background-color colors/white}) - diff --git a/src/status_im/ui/screens/progress/views.cljs b/src/status_im/ui/screens/progress/views.cljs index 47dd940909d..149dec0c503 100644 --- a/src/status_im/ui/screens/progress/views.cljs +++ b/src/status_im/ui/screens/progress/views.cljs @@ -1,9 +1,12 @@ (ns status-im.ui.screens.progress.views (:require-macros [status-im.utils.views :refer [defview]]) - (:require [status-im.ui.screens.progress.styles :as styles] - [status-im.ui.components.react :as react])) + (:require [status-im.ui.components.react :as react] + [status-im.ui.components.colors :as colors])) ;; a simple view with animated progress indicator in its center (defview progress [_] - [react/keyboard-avoiding-view {:style (styles/container)} + [react/view {:flex 1 + :align-items :center + :justify-content :center + :background-color colors/white} [react/activity-indicator {:animating true}]]) diff --git a/src/status_im/ui/screens/referrals/home_item.cljs b/src/status_im/ui/screens/referrals/home_item.cljs index b0301a05e64..566e69df96a 100644 --- a/src/status_im/ui/screens/referrals/home_item.cljs +++ b/src/status_im/ui/screens/referrals/home_item.cljs @@ -54,7 +54,6 @@ (utils/truncate-str chat-name 30)]]] :title-accessibility-label :chat-name-text :subtitle (i18n/label :t/invite-public-chat-home) - :on-press #(re-frame/dispatch [:navigate-to :tabs {:screen :chat-stack - :params {:screen :referral-enclav}}]) + :on-press #(re-frame/dispatch [:navigate-to :chat]) :on-long-press #(re-frame/dispatch [:bottom-sheet/show-sheet {:content referral-sheet}])}]))) diff --git a/src/status_im/ui/screens/referrals/public_chat.cljs b/src/status_im/ui/screens/referrals/public_chat.cljs index 7f0f1f4d5a7..ec7bf0e60c2 100644 --- a/src/status_im/ui/screens/referrals/public_chat.cljs +++ b/src/status_im/ui/screens/referrals/public_chat.cljs @@ -83,8 +83,7 @@ :group-chat true}] [:<> [topbar/topbar - {:content [toolbar-content/toolbar-content-view-inner chat-info] - :navigation {:on-press #(re-frame/dispatch [:navigate-to :home])}}] + {:content [toolbar-content/toolbar-content-view-inner chat-info]}] [rn/scroll-view {:style {:flex 1} :center-content true :content-container-style {:padding 16}} diff --git a/src/status_im/ui/screens/routing/browser_stack.cljs b/src/status_im/ui/screens/routing/browser_stack.cljs deleted file mode 100644 index d8e1e053808..00000000000 --- a/src/status_im/ui/screens/routing/browser_stack.cljs +++ /dev/null @@ -1,23 +0,0 @@ -(ns status-im.ui.screens.routing.browser-stack - (:require [status-im.ui.screens.routing.core :as navigation] - [status-im.ui.screens.browser.empty-tab.views :as empty-tab] - [status-im.ui.screens.browser.views :as browser] - [status-im.ui.screens.browser.tabs.views :as browser.tabs] - [status-im.ui.components.tabbar.styles :as tabbar.styles])) - -(defonce stack (navigation/create-stack)) - -(defn browser-stack [] - [stack {:initial-route-name :empty-tab - :header-mode :none} - [{:name :empty-tab - :insets {:top true} - :style {:padding-bottom tabbar.styles/tabs-diff} - :component empty-tab/empty-tab} - {:name :browser - :back-handler :noop - :options {:animationEnabled false} - :component browser/browser} - {:name :browser-tabs - :insets {:top true} - :component browser.tabs/tabs}]]) diff --git a/src/status_im/ui/screens/routing/chat_stack.cljs b/src/status_im/ui/screens/routing/chat_stack.cljs deleted file mode 100644 index 8383e0f2694..00000000000 --- a/src/status_im/ui/screens/routing/chat_stack.cljs +++ /dev/null @@ -1,104 +0,0 @@ -(ns status-im.ui.screens.routing.chat-stack - (:require [status-im.ui.screens.routing.core :as navigation] - [status-im.ui.screens.home.views :as home] - [status-im.ui.screens.chat.views :as chat] - [status-im.ui.screens.group.views :as group] - [status-im.ui.screens.referrals.public-chat :as referrals.public-chat] - [status-im.ui.screens.communities.views :as communities] - [status-im.ui.screens.communities.community :as community] - [status-im.ui.screens.communities.create :as communities.create] - [status-im.ui.screens.communities.import :as communities.import] - [status-im.ui.screens.communities.profile :as community.profile] - [status-im.ui.screens.communities.channel-details :as communities.channel-details] - [status-im.ui.screens.communities.edit :as community.edit] - [status-im.ui.screens.communities.create-channel :as create-channel] - [status-im.ui.screens.communities.edit-channel :as edit-channel] - [status-im.ui.screens.communities.membership :as membership] - [status-im.ui.screens.communities.members :as members] - [status-im.ui.screens.communities.requests-to-join :as requests-to-join] - [status-im.ui.screens.profile.group-chat.views :as profile.group-chat] - [status-im.ui.components.tabbar.styles :as tabbar.styles] - [status-im.ui.screens.stickers.views :as stickers] - [status-im.ui.screens.notifications-center.views :as notifications-center])) - -(defonce stack (navigation/create-stack)) -(defonce group-stack (navigation/create-stack)) -(defonce communities-stack (navigation/create-stack)) - -(defn chat-stack [] - [stack {:initial-route-name :home - :header-mode :none} - [{:name :home - :style {:padding-bottom tabbar.styles/tabs-diff} - :component home/home} - {:name :referral-enclav - :component referrals.public-chat/view} - {:name :chat - :component chat/chat} - {:name :group-chat-profile - :insets {:top false} - :component profile.group-chat/group-chat-profile} - {:name :group-chat-invite - :component profile.group-chat/group-chat-invite} - {:name :stickers - :component stickers/packs} - {:name :stickers-pack - :component stickers/pack} - {:name :notifications-center - :component notifications-center/center} - ;; Community - {:name :community - :component community/community} - {:name :community-management - :insets {:top false} - :component community.profile/management-container} - {:name :community-members - :component members/members-container} - {:name :community-requests-to-join - :component requests-to-join/requests-to-join-container} - {:name :community-channel-details - :insets {:top false} - :component communities.channel-details/view}]]) - -(defn communities [] - [communities-stack {:header-mode :none} - [{:name :communities - :insets {:bottom true - :top false} - :component communities/communities} - {:name :community-import - :insets {:bottom true - :top false} - :component communities.import/view} - {:name :community-edit - :insets {:bottom true - :top false} - :component community.edit/edit} - {:name :community-create - :insets {:bottom true - :top false} - :component communities.create/view} - {:name :community-membership - :insets {:bottom true - :top false} - :component membership/membership} - {:name :create-community-channel - :insets {:bottom true - :top false} - :component create-channel/view} - {:name :edit-community-channel - :insets {:bottom true - :top false} - :component edit-channel/view}]]) - -(defn new-group-chat [] - [group-stack {:header-mode :none - :initial-route-name :contact-toggle-list} - [{:name :contact-toggle-list - :insets {:top false - :bottom true} - :component group/contact-toggle-list} - {:name :new-group - :insets {:top false - :bottom true} - :component group/new-group}]]) diff --git a/src/status_im/ui/screens/routing/core.cljs b/src/status_im/ui/screens/routing/core.cljs deleted file mode 100644 index 9d7bfe9b03b..00000000000 --- a/src/status_im/ui/screens/routing/core.cljs +++ /dev/null @@ -1,173 +0,0 @@ -(ns status-im.ui.screens.routing.core - (:require ["react" :refer (useCallback useEffect)] - ["react-native" :refer (BackHandler)] - ["@react-navigation/native" :refer (NavigationContainer StackActions CommonActions useFocusEffect) :as react-navigation] - ["@react-navigation/stack" :refer (createStackNavigator TransitionPresets)] - ["@react-navigation/bottom-tabs" :refer (createBottomTabNavigator)] - [reagent.core :as reagent] - [cljs-bean.core :refer [bean]] - [status-im.ui.components.colors :as colors] - [re-frame.core :as re-frame] - [taoensso.timbre :as log] - [status-im.utils.platform :as platform] - [status-im.ui.components.react :as react] - ;; NOTE(Ferossgp): This is temporary to mimic the behaviour of old input - [quo.components.text-input :as quo] - [oops.core :refer [ocall oget]])) - -(def navigation-container (reagent/adapt-react-class NavigationContainer)) - -(def use-focus-effect useFocusEffect) -(def use-callback useCallback) -(def use-effect useEffect) - -(defn add-back-handler-listener - [callback] - (.addEventListener BackHandler "hardwareBackPress" callback)) - -(defn remove-back-handler-listener - [callback] - (.removeEventListener BackHandler "hardwareBackPress" callback)) - -(defn get-active-route-name [{:keys [index routes]}] - (let [route (bean (get routes index))] - (if-let [inner-state (get route :state)] - (get-active-route-name (bean inner-state)) - (some-> (get route :name) keyword)))) - -(defn get-index-route-name [index {:keys [routes]}] - (let [route (bean (get routes index))] - (if-let [inner-state (get route :state)] - (get-active-route-name (bean inner-state)) - (some-> (get route :name) keyword)))) - -(def transition-presets TransitionPresets) - -(def modal-presentation-ios (merge (js->clj (.-ModalPresentationIOS ^js transition-presets)) - {:gestureEnabled true - :cardOverlayEnabled true})) - -;; TODO(Ferossgp): Unify with topbar back icon. Maybe dispatch the same event and move the all logic inside the event. -(defn handle-on-screen-focus - [{:keys [back-handler on-focus name]}] - (use-focus-effect - (use-callback - (fn [] - (log/debug :on-screen-focus name) - (let [on-back-press (fn [] - (if (fn? back-handler) - (back-handler) - (do - (when (and back-handler - (vector? back-handler) - (not= back-handler :noop)) - (re-frame/dispatch back-handler)) - (boolean back-handler))))] - (when on-focus (re-frame/dispatch on-focus)) - (add-back-handler-listener on-back-press) - (fn [] - (remove-back-handler-listener on-back-press)))) - #js []))) - -(defn handle-on-screen-blur [navigation] - (use-effect - (fn [] - (ocall navigation "addListener" "blur" - (fn [] - ;; Reset currently mounted text inputs to their default values - ;; on navigating away; this is a privacy measure - (doseq [[_ {:keys [ref value]}] @quo/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})))))) - #js [navigation])) - -(defn wrapped-screen-style [{:keys [insets style]} insets-obj] - (merge - {:background-color colors/white - :flex 1} - style - (when (get insets :bottom) - {:padding-bottom (+ (oget insets-obj "bottom") - (get style :padding-bottom) - (get style :padding-vertical))}) - (when (get insets :top true) - {:padding-top (+ (oget insets-obj "top") - (get style :padding-top) - (get style :padding-vertical))}))) - -(defn presentation-type [{:keys [transition] :as opts}] - (if (and platform/ios? (= transition :presentation-ios)) - (-> opts - (update :options merge modal-presentation-ios) - (assoc-in [:insets :top] false)) - opts)) - -(defn wrap-screen [{:keys [component] :as options}] - (assoc options :component - (fn [props] - (handle-on-screen-blur - (oget props "navigation")) - (handle-on-screen-focus options) - (let [props' (js->clj props :keywordize-keys true) - focused? (oget props "navigation" "isFocused")] - (reagent/as-element - [react/safe-area-consumer - (fn [insets] - (reagent/as-element - [react/view {:style (wrapped-screen-style options insets)} - [component props' (focused?)]]))]))))) - -(defn- get-screen [navigator] - (let [screen (reagent/adapt-react-class (oget navigator "Screen"))] - (fn [props] - [screen (-> props presentation-type wrap-screen)]))) - -(defn- get-navigator [nav-object] - (let [navigator (reagent/adapt-react-class (oget nav-object "Navigator")) - screen (get-screen nav-object)] - (fn [props children] - (into [navigator props] - (mapv screen children))))) - -(defn create-stack [] - (let [nav-obj (createStackNavigator)] - (get-navigator nav-obj))) - -(defn create-bottom-tabs [] - (let [nav-obj (createBottomTabNavigator)] - (get-navigator nav-obj))) - -(def common-actions CommonActions) -(def stack-actions StackActions) - -(defonce navigator-ref (reagent/atom nil)) - -(defn set-navigator-ref [ref] - (reset! navigator-ref ref)) - -(defn can-be-called? [] - (boolean @navigator-ref)) - -(defn navigate-to [route params] - (when (can-be-called?) - (ocall @navigator-ref "dispatch" - (ocall common-actions "navigate" - #js {:name (name route) - :params (clj->js params)})))) - -(defn navigate-reset [state] - (when (can-be-called?) - (ocall @navigator-ref "dispatch" - (ocall common-actions "reset" - (clj->js state))))) - -(defn navigate-back [] - (when (can-be-called?) - (ocall @navigator-ref "dispatch" - (ocall common-actions "goBack")))) - -(defn navigate-replace [route params] - (when (can-be-called?) - (ocall @navigator-ref "dispatch" - (ocall stack-actions "replace" (name route) (clj->js params))))) diff --git a/src/status_im/ui/screens/routing/intro_login_stack.cljs b/src/status_im/ui/screens/routing/intro_login_stack.cljs deleted file mode 100644 index aedf2a79fb3..00000000000 --- a/src/status_im/ui/screens/routing/intro_login_stack.cljs +++ /dev/null @@ -1,111 +0,0 @@ -(ns status-im.ui.screens.routing.intro-login-stack - (:require-macros [status-im.utils.views :as views]) - (:require [status-im.ui.screens.multiaccounts.login.views :as login] - [status-im.ui.screens.progress.views :as progress] - [status-im.ui.screens.multiaccounts.views :as multiaccounts] - [status-im.ui.screens.intro.views :as intro] - [status-im.keycard.core :as keycard.core] - [status-im.ui.screens.routing.key-storage-stack :as key-storage-stack] - [status-im.ui.screens.keycard.onboarding.views :as keycard.onboarding] - [status-im.ui.screens.keycard.recovery.views :as keycard.recovery] - [status-im.ui.screens.keycard.views :as keycard] - [status-im.ui.screens.intro.password :as password] - [status-im.ui.screens.keycard.authentication-method.views - :as - keycard.authentication] - [status-im.ui.screens.routing.core :as navigation])) - -(defonce stack (navigation/create-stack)) - -;; NOTE(Ferossgp): There is a point at init when we do not know if there are -;; multiaccounts or no, and we show intro - we could show progress at this time -;; for a better UX -(views/defview intro-stack [] - (views/letsubs [multiaccounts [:multiaccounts/multiaccounts] - loading [:multiaccounts/loading]] - [stack {:header-mode :none} - [(cond - loading - {:name :progress-start - :component progress/progress} - - (empty? multiaccounts) - {:name :intro - :component intro/intro} - - :else - {:name :multiaccounts - :component multiaccounts/multiaccounts}) - {:name :progress - :component progress/progress} - {:name :login - :component login/login} - {:name :create-multiaccount-generate-key - :component intro/wizard-generate-key} - {:name :create-multiaccount-choose-key - :back-handler :noop - :component intro/wizard-choose-key} - {:name :create-multiaccount-select-key-storage - :back-handler :noop - :component intro/wizard-select-key-storage} - {:name :create-multiaccount-create-code - :back-handler :noop - :component password/screen} - {:name :recover-multiaccount-enter-phrase - :component intro/wizard-enter-phrase} - {:name :recover-multiaccount-select-storage - :back-handler :noop - :component intro/wizard-select-key-storage} - {:name :recover-multiaccount-enter-password - :back-handler :noop - :component password/screen} - {:name :recover-multiaccount-success - :back-handler :noop - :component intro/wizard-recovery-success} - {:name :keycard-onboarding-intro - :back-handler keycard.core/onboarding-intro-back-handler - :component keycard.onboarding/intro} - {:name :keycard-onboarding-puk-code - :back-handler :noop - :component keycard.onboarding/puk-code} - {:name :keycard-onboarding-pin - :back-handler :noop - :component keycard.onboarding/pin} - {:name :keycard-onboarding-recovery-phrase - :back-handler :noop - :component keycard.onboarding/recovery-phrase} - {:name :keycard-onboarding-recovery-phrase-confirm-word1 - :back-handler :noop - :component keycard.onboarding/recovery-phrase-confirm-word} - {:name :keycard-onboarding-recovery-phrase-confirm-word2 - :back-handler :noop - :component keycard.onboarding/recovery-phrase-confirm-word} - {:name :keycard-recovery-intro - :back-handler :noop - :component keycard.recovery/intro} - {:name :keycard-recovery-pair - :back-handler :noop - :component keycard.recovery/pair} - {:name :keycard-recovery-success - :back-handler :noop - :insets {:bottom true} - :component keycard.recovery/success} - {:name :keycard-recovery-no-key - :component keycard.recovery/no-key} - {:name :keycard-recovery-pin - :component keycard.recovery/pin} - {:name :keycard-authentication-method - :component keycard.authentication/keycard-authentication-method} - {:name :keycard-login-pin - :component keycard/login-pin} - {:name :keycard-blank - :component keycard/blank} - {:name :keycard-wrong - :component keycard/wrong} - {:name :keycard-unpaired - :component keycard/unpaired} - {:name :not-keycard - :component keycard/not-keycard} - {:name :key-storage-stack - :insets {:top false} - :component key-storage-stack/key-storage-stack}]])) diff --git a/src/status_im/ui/screens/routing/key_storage_stack.cljs b/src/status_im/ui/screens/routing/key_storage_stack.cljs deleted file mode 100644 index e7fce55afab..00000000000 --- a/src/status_im/ui/screens/routing/key_storage_stack.cljs +++ /dev/null @@ -1,18 +0,0 @@ -(ns status-im.ui.screens.routing.key-storage-stack - "Manage flow required to change key-storage location" - (:require [status-im.ui.screens.routing.core :as navigation] - [status-im.ui.screens.multiaccounts.key-storage.views :as key-storage.views])) - -(defonce stack (navigation/create-stack)) - -(defn key-storage-stack [] - [stack {:initial-route-name :actions-not-logged-in - :header-mode :none} - [{:name :actions-not-logged-in - :component key-storage.views/actions-not-logged-in} - {:name :actions-logged-in - :component key-storage.views/actions-logged-in} - {:name :seed-phrase - :component key-storage.views/seed-phrase} - {:name :storage - :component key-storage.views/storage}]]) diff --git a/src/status_im/ui/screens/routing/main.cljs b/src/status_im/ui/screens/routing/main.cljs deleted file mode 100644 index 04d5a559621..00000000000 --- a/src/status_im/ui/screens/routing/main.cljs +++ /dev/null @@ -1,211 +0,0 @@ -(ns status-im.ui.screens.routing.main - (:require-macros [status-im.utils.views :as views]) - (:require [status-im.ui.screens.add-new.new-public-chat.view :as new-public-chat] - [status-im.ui.screens.wallet.recipient.views :as recipient] - [status-im.ui.screens.qr-scanner.views :as qr-scanner] - [status-im.ui.screens.stickers.views :as stickers] - [status-im.ui.screens.home.views :as home] - [status-im.ui.screens.add-new.new-chat.views :as new-chat] - [status-im.ui.screens.anonymous-metrics-settings.views :as anon-metrics-settings] - [status-im.add-new.core :as new-chat.events] - [status-im.ui.screens.routing.intro-login-stack :as intro-login-stack] - [status-im.ui.screens.routing.chat-stack :as chat-stack] - [status-im.ui.screens.routing.wallet-stack :as wallet-stack] - [status-im.ui.screens.wallet.buy-crypto.views :as wallet.buy-crypto] - [status-im.ui.screens.group.views :as group-chat] - [status-im.ui.screens.routing.profile-stack :as profile-stack] - [status-im.ui.screens.routing.browser-stack :as browser-stack] - [status-im.ui.components.tabbar.core :as tabbar] - [status-im.ui.components.invite.views :as invite] - [status-im.ui.screens.routing.core :as navigation] - [status-im.utils.platform :as platform] - [quo.previews.main :as quo.preview] - [status-im.utils.config :as config] - [status-im.ui.screens.profile.contact.views :as contact] - [status-im.ui.screens.notifications-settings.views :as notifications-settings] - [status-im.ui.screens.wallet.send.views :as wallet] - [status-im.ui.screens.link-previews-settings.views :as link-previews] - [status-im.ui.screens.status.new.views :as status.new] - [status-im.ui.screens.browser.bookmarks.views :as bookmarks] - [status-im.ui.screens.routing.status-stack :as status-stack] - [status-im.ui.screens.communities.invite :as communities.invite] - [status-im.ui.screens.keycard.onboarding.views :as keycard.onboarding] - [status-im.ui.screens.keycard.recovery.views :as keycard.recovery] - [status-im.keycard.core :as keycard.core] - [status-im.ui.screens.keycard.views :as keycard] - [status-im.ui.screens.multiaccounts.key-storage.views :as key-storage.views])) - -(defonce main-stack (navigation/create-stack)) -(defonce bottom-tabs (navigation/create-bottom-tabs)) - -;; TODO(Ferossgp): Add two-pane navigator on chat-stack -(defn tabs [] - [bottom-tabs {:initial-route-name :chat-stack - :lazy true - :header-mode :none - :tab-bar tabbar/tabbar} - [{:name :chat-stack - :insets {:top false} - :component chat-stack/chat-stack} - {:name :browser-stack - :insets {:top false} - :component browser-stack/browser-stack} - {:name :wallet-stack - :insets {:top false} - :component wallet-stack/wallet-stack} - {:name :status-stack - :insets {:top false} - :component status-stack/status-stack} - {:name :profile-stack - :insets {:top false} - :component profile-stack/profile-stack}]]) - -(views/defview main-nav-component [] - (views/letsubs [logged-in? [:multiaccount/logged-in?] - keycard-account? [:multiaccounts/keycard-account?]] - [main-stack (merge {:header-mode :none} - ;; https://github.com/react-navigation/react-navigation/issues/6520 - (when platform/ios? - {:mode :modal})) - (concat - [(if logged-in? - {:name :tabs - :insets {:top false} - :component tabs} - {:name :intro-stack - :insets {:top false - :bottom true} - :component intro-login-stack/intro-stack}) - {:name :stickers-pack-modal - :component stickers/pack-modal} - {:name :welcome - :back-handler :noop - :component home/welcome} - {:name :anon-metrics-opt-in - :back-handler :noop - :component anon-metrics-settings/new-account-opt-in} - {:name :new-chat - :on-focus [::new-chat.events/new-chat-focus] - :transition :presentation-ios - :component new-chat/new-chat} - {:name :new-contact - :on-focus [::new-chat.events/new-chat-focus] - :transition :presentation-ios - :component new-chat/new-contact} - {:name :link-preview-settings - :transition :presentation-ios - :component link-previews/link-previews-settings} - {:name :new-public-chat - :transition :presentation-ios - :insets {:bottom true} - :component new-public-chat/new-public-chat} - {:name :nickname - :transition :presentation-ios - :insets {:bottom true} - :component contact/nickname} - {:name :edit-group-chat-name - :transition :presentation-ios - :insets {:bottom true} - :component group-chat/edit-group-chat-name} - {:name :create-group-chat - :transition :presentation-ios - :component chat-stack/new-group-chat} - {:name :communities - :transition :presentation-ios - :component chat-stack/communities} - {:name :referral-invite - :transition :presentation-ios - :insets {:bottom true} - :component invite/referral-invite} - {:name :add-participants-toggle-list - :on-focus [:group/add-participants-toggle-list] - :transition :presentation-ios - :insets {:bottom true} - :component group-chat/add-participants-toggle-list} - {:name :recipient - :transition :presentation-ios - :insets {:bottom true} - :component recipient/recipient} - {:name :new-favourite - :transition :presentation-ios - :insets {:bottom true} - :component recipient/new-favourite} - {:name :qr-scanner - :insets {:top false :bottom false} - :component qr-scanner/qr-scanner} - {:name :notifications-settings - :back-handler :noop - :insets {:bottom true} - :component notifications-settings/notifications-settings} - {:name :notifications-advanced-settings - :back-handler :noop - :insets {:bottom true} - :component notifications-settings/notifications-advanced-settings} - {:name :notifications-onboarding - :back-handler :noop - :insets {:bottom true} - :component notifications-settings/notifications-onboarding} - {:name :prepare-send-transaction - :transition :presentation-ios - :insets {:bottom true} - :component wallet/prepare-send-transaction} - {:name :request-transaction - :transition :presentation-ios - :insets {:bottom true} - :component wallet/request-transaction} - {:name :my-status - :transition :presentation-ios - :insets {:bottom true} - :component status.new/my-status} - {:name :new-bookmark - :transition :presentation-ios - :insets {:bottom true} - :component bookmarks/new-bookmark} - {:name :profile - :transition :presentation-ios - :insets {:bottom true} - :component contact/profile} - {:name :buy-crypto - :transition :presentation-ios - :insets {:bottom true} - :component wallet.buy-crypto/container} - {:name :buy-crypto-website - :transition :presentation-ios - :insets {:bottom true} - :component wallet.buy-crypto/website} - {:name :invite-people-community - :component communities.invite/invite - :insets {:bottom true}} - {:name :anon-metrics-learn-more - :transition :presentation-ios - :component anon-metrics-settings/learn-more} - {:name :anon-metrics-view-data - :transition :presentation-ios - :component anon-metrics-settings/view-data}] - - (when config/quo-preview-enabled? - [{:name :quo-preview - :insets {:top false :bottom false} - :component quo.preview/preview-stack}]) - - (when keycard-account? - [{:name :keycard-onboarding-intro - :back-handler keycard.core/onboarding-intro-back-handler - :component keycard.onboarding/intro} - {:name :keycard-onboarding-puk-code - :back-handler :noop - :component keycard.onboarding/puk-code} - {:name :keycard-onboarding-pin - :back-handler :noop - :component keycard.onboarding/pin} - {:name :keycard-recovery-pair - :back-handler :noop - :component keycard.recovery/pair} - {:name :seed-phrase - :component key-storage.views/seed-phrase} - {:name :keycard-recovery-pin - :component keycard.recovery/pin} - {:name :keycard-wrong - :component keycard/wrong} - {:name :not-keycard - :component keycard/not-keycard}]))])) diff --git a/src/status_im/ui/screens/routing/profile_stack.cljs b/src/status_im/ui/screens/routing/profile_stack.cljs deleted file mode 100644 index f8c003a39e7..00000000000 --- a/src/status_im/ui/screens/routing/profile_stack.cljs +++ /dev/null @@ -1,151 +0,0 @@ -(ns status-im.ui.screens.routing.profile-stack - (:require [status-im.ui.screens.profile.user.views :as profile.user] - [status-im.ui.screens.ens.views :as ens] - [status-im.ui.screens.contacts-list.views :as contacts-list] - [status-im.ui.screens.bootnodes-settings.edit-bootnode.views - :as - edit-bootnode] - [status-im.ui.screens.bootnodes-settings.views :as bootnodes-settings] - [status-im.ui.screens.pairing.views :as pairing] - [status-im.ui.screens.offline-messaging-settings.edit-mailserver.views - :as - edit-mailserver] - [status-im.ui.screens.offline-messaging-settings.views - :as - offline-messaging-settings] - [status-im.ui.screens.dapps-permissions.views :as dapps-permissions] - [status-im.ui.screens.link-previews-settings.views :as link-previews-settings] - [status-im.ui.screens.anonymous-metrics-settings.views :as anonymous-metrics-settings] - [status-im.ui.screens.privacy-and-security-settings.views :as privacy-and-security] - [status-im.ui.screens.privacy-and-security-settings.messages-from-contacts-only :as messages-from-contacts-only] - [status-im.ui.screens.sync-settings.views :as sync-settings] - [status-im.ui.screens.advanced-settings.views :as advanced-settings] - [status-im.ui.screens.help-center.views :as help-center] - [status-im.ui.screens.glossary.view :as glossary] - [status-im.ui.screens.about-app.views :as about-app] - [status-im.ui.screens.mobile-network-settings.view - :as - mobile-network-settings] - [status-im.ui.screens.default-sync-period-settings.view - :as - default-sync-period-settings] - [status-im.ui.screens.network.edit-network.views :as edit-network] - [status-im.ui.screens.network.views :as network] - [status-im.ui.screens.network.network-details.views :as network-details] - [status-im.ui.screens.network-info.views :as network-info] - [status-im.ui.screens.rpc-usage-info :as rpc-usage-info] - [status-im.ui.screens.log-level-settings.views :as log-level-settings] - [status-im.ui.screens.fleet-settings.views :as fleet-settings] - [status-im.ui.screens.profile.seed.views :as profile.seed] - [status-im.ui.screens.keycard.pin.views :as keycard.pin] - [status-im.ui.screens.keycard.pairing.views :as keycard.pairing] - [status-im.ui.screens.keycard.settings.views :as keycard.settings] - [status-im.ui.components.tabbar.styles :as tabbar.styles] - [status-im.ui.screens.routing.core :as navigation] - [status-im.ui.screens.appearance.views :as appearance] - [status-im.ui.screens.notifications-settings.views :as notifications-settings] - [status-im.ui.screens.privacy-and-security-settings.delete-profile :as delete-profile])) - -(defonce stack (navigation/create-stack)) - -(defn profile-stack [] - [stack {:initial-route-name :my-profile - :header-mode :none} - [{:name :my-profile - :insets {:top false} - :style {:padding-bottom tabbar.styles/tabs-diff} - :component profile.user/my-profile} - {:name :contacts-list - :component contacts-list/contacts-list} - {:name :ens-main - :component ens/main} - {:name :ens-search - :component ens/search} - {:name :ens-checkout - :component ens/checkout} - {:name :ens-confirmation - :component ens/confirmation} - {:name :ens-terms - :component ens/terms} - {:name :ens-name-details - :component ens/name-details} - {:name :blocked-users-list - :component contacts-list/blocked-users-list} - {:name :bootnodes-settings - :component bootnodes-settings/bootnodes-settings} - {:name :installations - :component pairing/installations} - {:name :edit-bootnode - :component edit-bootnode/edit-bootnode} - {:name :offline-messaging-settings - :component offline-messaging-settings/offline-messaging-settings} - {:name :edit-mailserver - :component edit-mailserver/edit-mailserver} - {:name :dapps-permissions - :component dapps-permissions/dapps-permissions} - {:name :link-previews-settings - :component link-previews-settings/link-previews-settings} - {:name :anonymous-metrics-settings - :component anonymous-metrics-settings/settings} - {:name :privacy-and-security - :component privacy-and-security/privacy-and-security} - {:name :messages-from-contacts-only - :component messages-from-contacts-only/messages-from-contacts-only} - {:name :appearance - :component appearance/appearance} - {:name :appearance-profile-pic - :component appearance/profile-pic} - {:name :notifications - :component notifications-settings/notifications-settings} - {:name :notifications-servers - :component notifications-settings/notifications-servers} - {:name :sync-settings - :component sync-settings/sync-settings} - {:name :advanced-settings - :component advanced-settings/advanced-settings} - {:name :help-center - :component help-center/help-center} - {:name :glossary - :component glossary/glossary} - {:name :about-app - :component about-app/about-app} - {:name :manage-dapps-permissions - :component dapps-permissions/manage} - {:name :network-settings - :component network/network-settings} - {:name :network-details - :component network-details/network-details} - {:name :network-info - :component network-info/network-info} - {:name :rpc-usage-info - :component rpc-usage-info/usage-info} - {:name :edit-network - :component edit-network/edit-network} - {:name :log-level-settings - :component log-level-settings/log-level-settings} - {:name :fleet-settings - :component fleet-settings/fleet-settings} - {:name :mobile-network-settings - :component mobile-network-settings/mobile-network-settings} - {:name :default-sync-period-settings - :component default-sync-period-settings/default-sync-period-settings} - {:name :backup-seed - :component profile.seed/backup-seed} - {:name :delete-profile - :transition :presentation-ios - :insets {:bottom true} - :component delete-profile/delete-profile} - ;; {:name:my-profile-ext-settings - ;; :component} - - ;; KEYCARD - {:name :keycard-settings - :component keycard.settings/keycard-settings} - {:name :reset-card - :component keycard.settings/reset-card} - {:name :keycard-pin - :component keycard.settings/reset-pin} - {:name :enter-pin-settings - :component keycard.pin/enter-pin} - {:name :change-pairing-code - :component keycard.pairing/change-pairing-code}]]) diff --git a/src/status_im/ui/screens/routing/status_stack.cljs b/src/status_im/ui/screens/routing/status_stack.cljs deleted file mode 100644 index 166e7df0095..00000000000 --- a/src/status_im/ui/screens/routing/status_stack.cljs +++ /dev/null @@ -1,15 +0,0 @@ -(ns status-im.ui.screens.routing.status-stack - (:require [status-im.ui.screens.routing.core :as navigation] - [status-im.ui.components.tabbar.styles :as tabbar.styles] - [status-im.ui.screens.status.views :as status.views])) - -(defonce stack (navigation/create-stack)) - -(defn status-stack [] - [stack {:initial-route-name :status - :header-mode :none} - [{:name :status - :on-focus [:init-timeline-chat] - :insets {:top true} - :style {:padding-bottom tabbar.styles/tabs-diff} - :component status.views/timeline}]]) diff --git a/src/status_im/ui/screens/routing/wallet_stack.cljs b/src/status_im/ui/screens/routing/wallet_stack.cljs deleted file mode 100644 index 158aa42de93..00000000000 --- a/src/status_im/ui/screens/routing/wallet_stack.cljs +++ /dev/null @@ -1,41 +0,0 @@ -(ns status-im.ui.screens.routing.wallet-stack - (:require [status-im.ui.screens.currency-settings.views :as currency-settings] - [status-im.ui.screens.wallet.settings.views :as wallet-settings] - [status-im.ui.screens.wallet.transactions.views :as wallet-transactions] - [status-im.ui.screens.wallet.custom-tokens.views :as custom-tokens] - [status-im.ui.screens.wallet.accounts.views :as wallet.accounts] - [status-im.ui.screens.wallet.account.views :as wallet.account] - [status-im.ui.screens.wallet.add-new.views :as add-account] - [status-im.ui.screens.wallet.account-settings.views :as account-settings] - [status-im.ui.components.tabbar.styles :as tabbar.styles] - [status-im.ui.screens.routing.core :as navigation])) - -(defonce stack (navigation/create-stack)) - -(defn wallet-stack [] - [stack {:initial-route-name :wallet - :header-mode :none} - [{:name :wallet - :insets {:top false} - :style {:padding-bottom tabbar.styles/tabs-diff} - :on-focus [:wallet/tab-opened] - :component wallet.accounts/accounts-overview} - {:name :wallet-account - :component wallet.account/account} - {:name :add-new-account - :component add-account/add-account} - {:name :add-new-account-pin - :component add-account/pin} - {:name :account-settings - :component account-settings/account-settings} - {:name :wallet-transaction-details - :component wallet-transactions/transaction-details} - {:name :wallet-settings-assets - :component wallet-settings/manage-assets} - {:name :wallet-add-custom-token - :on-focus [:wallet/wallet-add-custom-token] - :component custom-tokens/add-custom-token} - {:name :wallet-custom-token-details - :component custom-tokens/custom-token-details} - {:name :currency-settings - :component currency-settings/currency-settings}]]) diff --git a/src/status_im/ui/screens/rpc_usage_info.cljs b/src/status_im/ui/screens/rpc_usage_info.cljs index 901b3589411..38e764a135f 100644 --- a/src/status_im/ui/screens/rpc_usage_info.cljs +++ b/src/status_im/ui/screens/rpc_usage_info.cljs @@ -1,6 +1,5 @@ (ns status-im.ui.screens.rpc-usage-info - (:require [status-im.ui.components.topbar :as topbar] - [status-im.ui.components.react :as react] + (:require [status-im.ui.components.react :as react] [status-im.i18n.i18n :as i18n] [quo.core :as quo.core] [quo.react-native :as quo.react-native] @@ -104,8 +103,6 @@ methods-filter @(re-frame/subscribe [:rpc-usage/filter])] [react/view {:flex 1 :margin-horizontal 8} - [topbar/topbar - {:title (i18n/label :t/rpc-usage-info)}] [quo.react-native/view {:style {:flex-direction :row :margin-top 8 diff --git a/src/status_im/ui/screens/screens.cljs b/src/status_im/ui/screens/screens.cljs new file mode 100644 index 00000000000..ef0ee298478 --- /dev/null +++ b/src/status_im/ui/screens/screens.cljs @@ -0,0 +1,798 @@ +(ns status-im.ui.screens.screens + (:require [status-im.ui.screens.add-new.new-public-chat.view :as new-public-chat] + [status-im.ui.screens.wallet.recipient.views :as recipient] + [status-im.ui.screens.qr-scanner.views :as qr-scanner] + [status-im.ui.screens.stickers.views :as stickers] + [status-im.ui.screens.add-new.new-chat.views :as new-chat] + [status-im.add-new.core :as new-chat.events] + [status-im.ui.screens.wallet.buy-crypto.views :as wallet.buy-crypto] + [status-im.ui.screens.group.views :as group-chat] + [status-im.ui.components.invite.views :as invite] + [quo.previews.main :as quo.preview] + [status-im.ui.screens.profile.contact.views :as contact] + [status-im.ui.screens.notifications-settings.views :as notifications-settings] + [status-im.ui.screens.wallet.send.views :as wallet] + [status-im.ui.screens.status.new.views :as status.new] + [status-im.ui.screens.browser.bookmarks.views :as bookmarks] + [status-im.ui.screens.communities.invite :as communities.invite] + [status-im.ui.screens.keycard.onboarding.views :as keycard.onboarding] + [status-im.ui.screens.keycard.recovery.views :as keycard.recovery] + [status-im.keycard.core :as keycard.core] + [status-im.ui.screens.keycard.views :as keycard] + [status-im.ui.screens.multiaccounts.key-storage.views :as key-storage.views] + [status-im.ui.screens.home.views :as home] + [status-im.ui.screens.chat.views :as chat] + [status-im.ui.screens.referrals.public-chat :as referrals.public-chat] + [status-im.ui.screens.communities.views :as communities] + [status-im.ui.screens.communities.community :as community] + [status-im.ui.screens.communities.create :as communities.create] + [status-im.ui.screens.communities.import :as communities.import] + [status-im.ui.screens.communities.profile :as community.profile] + [status-im.ui.screens.communities.edit :as community.edit] + [status-im.ui.screens.communities.create-channel :as create-channel] + [status-im.ui.screens.communities.membership :as membership] + [status-im.ui.screens.communities.members :as members] + [status-im.ui.screens.communities.requests-to-join :as requests-to-join] + [status-im.ui.screens.profile.group-chat.views :as profile.group-chat] + [status-im.ui.screens.notifications-center.views :as notifications-center] + [status-im.ui.screens.browser.empty-tab.views :as empty-tab] + [status-im.ui.screens.browser.views :as browser] + [status-im.ui.screens.browser.tabs.views :as browser.tabs] + [status-im.ui.screens.multiaccounts.login.views :as login] + [status-im.ui.screens.progress.views :as progress] + [status-im.ui.screens.multiaccounts.views :as multiaccounts] + [status-im.ui.screens.keycard.authentication-method.views :as keycard.authentication] + [status-im.ui.screens.onboarding.intro.views :as onboarding.intro] + [status-im.ui.screens.onboarding.keys.views :as onboarding.keys] + [status-im.ui.screens.onboarding.password.views :as onboarding.password] + [status-im.ui.screens.onboarding.storage.views :as onboarding.storage] + [status-im.ui.screens.onboarding.notifications.views :as onboarding.notifications] + [status-im.ui.screens.onboarding.welcome.views :as onboarding.welcome] + [status-im.ui.screens.onboarding.phrase.view :as onboarding.phrase] + [status-im.ui.screens.currency-settings.views :as currency-settings] + [status-im.ui.screens.wallet.settings.views :as wallet-settings] + [status-im.ui.screens.wallet.transactions.views :as wallet-transactions] + [status-im.ui.screens.wallet.custom-tokens.views :as custom-tokens] + [status-im.ui.screens.wallet.accounts.views :as wallet.accounts] + [status-im.ui.screens.wallet.account.views :as wallet.account] + [status-im.ui.screens.wallet.add-new.views :as add-account] + [status-im.ui.screens.wallet.account-settings.views :as account-settings] + [status-im.i18n.i18n :as i18n] + [status-im.ui.screens.status.views :as status.views] + [status-im.ui.screens.profile.user.views :as profile.user] + [status-im.ui.screens.ens.views :as ens] + [status-im.ui.screens.contacts-list.views :as contacts-list] + [status-im.ui.screens.bootnodes-settings.edit-bootnode.views + :as + edit-bootnode] + [status-im.ui.screens.bootnodes-settings.views :as bootnodes-settings] + [status-im.ui.screens.pairing.views :as pairing] + [status-im.ui.screens.offline-messaging-settings.edit-mailserver.views + :as + edit-mailserver] + [status-im.ui.screens.offline-messaging-settings.views + :as + offline-messaging-settings] + [status-im.ui.screens.dapps-permissions.views :as dapps-permissions] + [status-im.ui.screens.link-previews-settings.views :as link-previews-settings] + [status-im.ui.screens.privacy-and-security-settings.views :as privacy-and-security] + [status-im.ui.screens.privacy-and-security-settings.messages-from-contacts-only :as messages-from-contacts-only] + [status-im.ui.screens.sync-settings.views :as sync-settings] + [status-im.ui.screens.advanced-settings.views :as advanced-settings] + [status-im.ui.screens.help-center.views :as help-center] + [status-im.ui.screens.glossary.view :as glossary] + [status-im.ui.screens.about-app.views :as about-app] + [status-im.ui.screens.mobile-network-settings.view + :as + mobile-network-settings] + [status-im.ui.screens.network.edit-network.views :as edit-network] + [status-im.ui.screens.network.views :as network] + [status-im.ui.screens.network.network-details.views :as network-details] + [status-im.ui.screens.network-info.views :as network-info] + [status-im.ui.screens.rpc-usage-info :as rpc-usage-info] + [status-im.ui.screens.log-level-settings.views :as log-level-settings] + [status-im.ui.screens.fleet-settings.views :as fleet-settings] + [status-im.ui.screens.profile.seed.views :as profile.seed] + [status-im.ui.screens.keycard.pin.views :as keycard.pin] + [status-im.ui.screens.keycard.pairing.views :as keycard.pairing] + [status-im.ui.screens.keycard.settings.views :as keycard.settings] + [status-im.ui.screens.appearance.views :as appearance] + [status-im.ui.screens.privacy-and-security-settings.delete-profile :as delete-profile] + [status-im.ui.screens.default-sync-period-settings.view :as default-sync-period-settings] + [status-im.ui.screens.communities.channel-details :as communities.channel-details] + [status-im.ui.screens.communities.edit-channel :as edit-channel] + [status-im.ui.screens.anonymous-metrics-settings.views :as anonymous-metrics-settings] + [status-im.ui.components.colors :as colors] + [status-im.ui.components.icons.icons :as icons])) + +(def components + [{:name :chat-toolbar + :component chat/topbar}]) + +(defn right-button-options [id icon] + {:id id + :icon (icons/icon-source icon)}) + +(def screens + (concat [;;INTRO, ONBOARDING, LOGIN + + ;Multiaccounts + {:name :multiaccounts + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/your-keys)} + :rightButtons (right-button-options :multiaccounts :more)}} + :right-handler multiaccounts/topbar-button + :component multiaccounts/multiaccounts} + + ;Login + {:name :login + :insets {:bottom true} + :options {:topBar {:rightButtons (right-button-options :login :more)}} + :right-handler login/topbar-button + :component login/login} + + {:name :progress + :component progress/progress} + + ;[Onboarding] + {:name :intro + :insets {:bottom true} + :component onboarding.intro/intro} + + ;[Onboarding] + {:name :get-your-keys + :insets {:bottom true} + :component onboarding.keys/get-your-keys} + + ;[Onboarding] + {:name :choose-name + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :insets {:bottom true} + :component onboarding.keys/choose-a-chat-name} + + ;[Onboarding] + {:name :select-key-storage + :insets {:bottom true} + :options {:popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :component onboarding.storage/select-key-storage} + + ;[Onboarding] Create Password + {:name :create-password + :options {:popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :insets {:bottom true} + :component onboarding.password/screen} + + ;[Onboarding] Welcome + {:name :welcome + :options {:popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :insets {:bottom true} + :component onboarding.welcome/welcome} + + ;[Onboarding] Notification + {:name :onboarding-notification + :options {:popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :insets {:bottom true} + :component onboarding.notifications/notifications-onboarding} + + ;[Onboarding] Recovery + {:name :recover-multiaccount-enter-phrase + :insets {:bottom true} + :component onboarding.phrase/enter-phrase} + {:name :recover-multiaccount-success + :options {:popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :insets {:bottom true} + :component onboarding.phrase/wizard-recovery-success} + + ;;CHAT + + ;Home + {:name :home + :component home/home} + + ;Chat + {:name :chat + :options {:topBar {:title {:component {:name :chat-toolbar :id :chat-toolbar} + :alignment :fill} + :rightButtons (right-button-options :chat :more)}} + :right-handler chat/topbar-button + :component chat/chat} + + {:name :group-chat-profile + :insets {:top false} + ;;TODO animated-header + :options {:topBar {:visible false}} + :component profile.group-chat/group-chat-profile} + {:name :group-chat-invite + ;;TODO parameter in the event + :options {:topBar {:visible false}} + :component profile.group-chat/group-chat-invite} + + {:name :stickers + :options {:topBar {:title {:text (i18n/label :t/sticker-market)}}} + :component stickers/packs} + + {:name :stickers-pack + :component stickers/pack} + + {:name :notifications-center + ;;TODO custom nav + :options {:topBar {:visible false}} + :component notifications-center/center} + ;; Community + {:name :community + ;TODO custom + :options {:topBar {:visible false}} + :component community/community} + {:name :community-management + :insets {:top false} + ;TODO animated-header + :options {:topBar {:visible false}} + :component community.profile/management-container} + {:name :community-members + ;TODO custom subtitle + :options {:topBar {:visible false}} + :component members/members-container} + {:name :community-requests-to-join + ;TODO custom subtitle + :options {:topBar {:visible false}} + :component requests-to-join/requests-to-join-container} + {:name :create-community-channel + ;TODO custom + :options {:topBar {:visible false}} + :component create-channel/view} + {:name :community-channel-details + ;TODO custom + :options {:topBar {:visible false}} + :component communities.channel-details/view} + {:name :edit-community-channel + :insets {:bottom true} + :component edit-channel/view} + {:name :contact-toggle-list + ;TODO custom subtitle + :options {:topBar {:visible false}} + :component group-chat/contact-toggle-list} + {:name :new-group + :options {:topBar {:visible false}} + ;TODO custom subtitle + :component group-chat/new-group} + {:name :referral-enclav + ;;TODO custom content + :options {:topBar {:visible false}} + :component referrals.public-chat/view} + {:name :communities + ;;TODO custom + :options {:topBar {:visible false}} + :component communities/communities} + {:name :community-import + :options {:topBar {:title {:text (i18n/label :t/import-community-title)}}} + :component communities.import/view} + {:name :community-edit + :options {:topBar {:title {:text (i18n/label :t/community-edit-title)}}} + :component community.edit/edit} + {:name :community-create + :options {:topBar {:title {:text (i18n/label :t/new-community-title)}}} + :component communities.create/view} + {:name :community-membership + :options {:topBar {:title {:text (i18n/label :t/membership-title)}}} + :component membership/membership} + + ;;BROWSER + + {:name :empty-tab + :insets {:top true} + :options {:topBar {:visible false} + :hardwareBackButton {:popStackOnPress false}} + :component empty-tab/empty-tab} + {:name :browser + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :component browser/browser} + {:name :browser-tabs + :insets {:top true} + :options {:topBar {:visible false} + :hardwareBackButton {:popStackOnPress false}} + :component browser.tabs/tabs} + + ;;WALLET + + {:name :wallet + :insets {:top false} + :on-focus [:wallet/tab-opened] + :component wallet.accounts/accounts-overview} + {:name :wallet-account + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component wallet.account/account} + {:name :add-new-account + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component add-account/add-account} + {:name :add-new-account-pin + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component add-account/pin} + {:name :account-settings + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component account-settings/account-settings} + {:name :wallet-transaction-details + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component wallet-transactions/transaction-details} + {:name :wallet-settings-assets + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component wallet-settings/manage-assets} + {:name :wallet-add-custom-token + :on-focus [:wallet/wallet-add-custom-token] + :options {:topBar {:title {:text (i18n/label :t/add-custom-token)}}} + :component custom-tokens/add-custom-token} + {:name :wallet-custom-token-details + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component custom-tokens/custom-token-details} + {:name :currency-settings + :options {:topBar {:title {:text (i18n/label :t/main-currency)}}} + :component currency-settings/currency-settings} + + ;;MY STATUS + + {:name :status + :on-focus [:init-timeline-chat] + :insets {:top true} + :component status.views/timeline} + + ;;PROFILE + + {:name :my-profile + :insets {:top false} + :component profile.user/my-profile} + {:name :contacts-list + :options {:topBar {:title {:text (i18n/label :t/contacts)}}} + :component contacts-list/contacts-list} + {:name :ens-main + :options {:topBar {:title {:text (i18n/label :t/ens-usernames)}}} + :component ens/main} + {:name :ens-search + :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} + :component ens/search} + {:name :ens-checkout + :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} + :component ens/checkout} + {:name :ens-confirmation + :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} + :component ens/confirmation} + {:name :ens-terms + :options {:topBar {:title {:text (i18n/label :t/ens-terms-registration)}}} + :component ens/terms} + {:name :ens-name-details + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component ens/name-details} + {:name :blocked-users-list + :options {:topBar {:title {:text (i18n/label :t/blocked-users)}}} + :component contacts-list/blocked-users-list} + {:name :bootnodes-settings + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component bootnodes-settings/bootnodes-settings} + {:name :installations + :options {:topBar {:title {:text (i18n/label :t/devices)}}} + :component pairing/installations} + {:name :edit-bootnode + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component edit-bootnode/edit-bootnode} + {:name :offline-messaging-settings + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component offline-messaging-settings/offline-messaging-settings} + {:name :edit-mailserver + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component edit-mailserver/edit-mailserver} + {:name :dapps-permissions + :options {:topBar {:title {:text (i18n/label :t/dapps-permissions)}}} + :component dapps-permissions/dapps-permissions} + {:name :link-previews-settings + :options {:topBar {:title {:text (i18n/label :t/chat-link-previews)}}} + :component link-previews-settings/link-previews-settings} + {:name :privacy-and-security + :options {:topBar {:title {:text (i18n/label :t/privacy-and-security)}}} + :component privacy-and-security/privacy-and-security} + {:name :messages-from-contacts-only + :options {:topBar {:title {:text (i18n/label :t/accept-new-chats-from)}}} + :component messages-from-contacts-only/messages-from-contacts-only} + {:name :appearance + :options {:topBar {:title {:text (i18n/label :t/appearance)}}} + :component appearance/appearance} + {:name :appearance-profile-pic + :options {:topBar {:title {:text (i18n/label :t/show-profile-pictures)}}} + :component appearance/profile-pic} + {:name :notifications + :options {:topBar {:title {:text (i18n/label :t/notification-settings)}}} + :component notifications-settings/notifications-settings} + {:name :notifications-servers + :options {:topBar {:title {:text (i18n/label :t/notification-servers)}}} + :component notifications-settings/notifications-servers} + {:name :sync-settings + :options {:topBar {:title {:text (i18n/label :t/sync-settings)}}} + :component sync-settings/sync-settings} + {:name :advanced-settings + :options {:topBar {:title {:text (i18n/label :t/advanced)}}} + :component advanced-settings/advanced-settings} + {:name :help-center + :options {:topBar {:title {:text (i18n/label :t/need-help)}}} + :component help-center/help-center} + {:name :glossary + :options {:topBar {:title {:text (i18n/label :t/glossary)}}} + :component glossary/glossary} + {:name :about-app + :options {:topBar {:title {:text (i18n/label :t/about-app)}}} + :component about-app/about-app} + {:name :manage-dapps-permissions + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component dapps-permissions/manage} + {:name :network-settings + ;;TODO accessories + :options {:topBar {:visible false}} + :component network/network-settings} + {:name :network-details + :options {:topBar {:title {:text (i18n/label :t/network-details)}}} + :component network-details/network-details} + {:name :network-info + :options {:topBar {:title {:text (i18n/label :t/network-info)}}} + :component network-info/network-info} + {:name :rpc-usage-info + :options {:topBar {:title {:text (i18n/label :t/rpc-usage-info)}}} + :component rpc-usage-info/usage-info} + {:name :edit-network + :options {:topBar {:title {:text (i18n/label :t/add-network)}}} + :component edit-network/edit-network} + {:name :log-level-settings + :options {:topBar {:title {:text (i18n/label :t/log-level-settings)}}} + :component log-level-settings/log-level-settings} + {:name :fleet-settings + :options {:topBar {:title {:text (i18n/label :t/fleet-settings)}}} + :component fleet-settings/fleet-settings} + {:name :mobile-network-settings + :options {:topBar {:title {:text (i18n/label :t/mobile-network-settings)}}} + :component mobile-network-settings/mobile-network-settings} + {:name :backup-seed + ;;TODO dynamic navigation + :options {:topBar {:visible false}} + :component profile.seed/backup-seed} + {:name :delete-profile + :insets {:bottom true} + :component delete-profile/delete-profile} + {:name :default-sync-period-settings + :options {:topBar {:title {:text (i18n/label :t/default-sync-period)}}} + :component default-sync-period-settings/default-sync-period-settings} + {:name :anonymous-metrics-settings + :component anonymous-metrics-settings/settings} + {:name :anon-metrics-learn-more + :component anonymous-metrics-settings/learn-more} + {:name :anon-metrics-view-data + :component anonymous-metrics-settings/view-data} + {:name :anon-metrics-opt-in + :back-handler :noop + :component anonymous-metrics-settings/new-account-opt-in} + + ;;MODALS + + ;[Chat] New Chat + {:name :new-chat + :on-focus [::new-chat.events/new-chat-focus] + ;;TODO accessories + :options {:topBar {:visible false}} + :component new-chat/new-chat} + + ;[Chat] New Public chat + {:name :new-public-chat + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/new-public-group-chat)}}} + :component new-public-chat/new-public-chat} + + ;[Chat] Link preview settings + {:name :link-preview-settings + :options {:topBar {:title {:text (i18n/label :t/chat-link-previews)}}} + :component link-previews-settings/link-previews-settings} + + ;[Chat] Edit nickname + {:name :nickname + :insets {:bottom true} + ;;TODO dyn subtitle + :options {:topBar {:visible false}} + :component contact/nickname} + + ;[Group chat] Edit group chat name + {:name :edit-group-chat-name + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/edit-group)}}} + :component group-chat/edit-group-chat-name} + + ;[Group chat] Add participants + {:name :add-participants-toggle-list + :on-focus [:group/add-participants-toggle-list] + :insets {:bottom true} + ;;TODO dyn subtitle + :options {:topBar {:visible false}} + :component group-chat/add-participants-toggle-list} + + ;[Communities] Invite people + {:name :invite-people-community + :component communities.invite/invite + :insets {:bottom true}} + + ;New Contact + {:name :new-contact + :on-focus [::new-chat.events/new-chat-focus] + ;;TODO accessories + :options {:topBar {:visible false}} + :component new-chat/new-contact} + + ;Refferal invite + {:name :referral-invite + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/invite-friends)}}} + :component invite/referral-invite} + + ;[Wallet] Recipient + {:name :recipient + :insets {:bottom true} + ;;TODO accessories + :options {:topBar {:visible false}} + :component recipient/recipient} + + ;[Wallet] New favourite + {:name :new-favourite + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/new-favourite)}}} + :component recipient/new-favourite} + + ;QR Scanner + {:name :qr-scanner + :insets {:top false :bottom false} + ;;TODO custom topbar + :options {:topBar {:visible false} + :navigationBar {:backgroundColor colors/black-persist} + :statusBar {:backgroundColor colors/black-persist + :style :light}} + :component qr-scanner/qr-scanner} + + ;;TODO WHY MODAL? + ;[Profile] Notifications settings + {:name :notifications-settings + :options {:topBar {:title {:text (i18n/label :t/notification-settings)}} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :insets {:bottom true} + :component notifications-settings/notifications-settings} + + ;;TODO WHY MODAL? + ;[Profile] Notifications Advanced settings + {:name :notifications-advanced-settings + :options {:topBar {:title {:text (i18n/label :t/notification-settings)}} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :insets {:bottom true} + :component notifications-settings/notifications-advanced-settings} + + ;[Wallet] Prepare Transaction + {:name :prepare-send-transaction + :insets {:bottom true} + :on-dissmiss [:wallet/cancel-transaction-command] + :options {:topBar {:title {:text (i18n/label :t/send-transaction)}} + :swipeToDismiss false + :hardwareBackButton {:dismissModalOnPress false}} + :component wallet/prepare-send-transaction} + + ;[Wallet] Request Transaction + {:name :request-transaction + :insets {:bottom true} + :on-dissmiss [:wallet/cancel-transaction-command] + :options {:topBar {:title {:text (i18n/label :t/request-transaction)}} + :swipeToDismiss false + :hardwareBackButton {:dismissModalOnPress false}} + :component wallet/request-transaction} + + ;[Wallet] Buy crypto + {:name :buy-crypto + :insets {:bottom true} + :component wallet.buy-crypto/container} + + ;[Wallet] Buy crypto website + {:name :buy-crypto-website + :insets {:bottom true} + ;;TODO subtitle + :options {:topBar {:visible false}} + :component wallet.buy-crypto/website} + + ;My Status + {:name :my-status + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/my-status)}}} + :component status.new/my-status} + + ;[Browser] New bookmark + {:name :new-bookmark + :insets {:bottom true} + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component bookmarks/new-bookmark} + + ;Profile + {:name :profile + :insets {:bottom true} + ;;TODO custom toolbar + :options {:topBar {:visible false}} + :component contact/profile} + + ;KEYCARD + {:name :keycard-onboarding-intro + :insets {:bottom true} + :back-handler keycard.core/onboarding-intro-back-handler + :component keycard.onboarding/intro} + {:name :keycard-onboarding-puk-code + :insets {:bottom true} + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + ;;TODO dynamic + :component keycard.onboarding/puk-code} + {:name :keycard-onboarding-pin + :insets {:bottom true} + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + ;;TODO dynamic + :component keycard.onboarding/pin} + {:name :keycard-recovery-pair + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/step-i-of-n {:number 2 :step 1})}} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :component keycard.recovery/pair} + {:name :seed-phrase + :insets {:bottom true} + ;;TODO subtitle + :options {:topBar {:visible false}} + :component key-storage.views/seed-phrase} + {:name :keycard-recovery-pin + :insets {:bottom true} + ;;TODO dynamic + :options {:topBar {:visible false}} + :component keycard.recovery/pin} + {:name :keycard-wrong + :insets {:bottom true} + ;;TODO move to popover? + :options {:topBar {:visible false}} + :component keycard/wrong} + {:name :not-keycard + :insets {:bottom true} + :options {:topBar {:visible false}} + ;;TODO move to popover? + :component keycard/not-keycard} + {:name :keycard-onboarding-recovery-phrase + :insets {:bottom true} + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :component keycard.onboarding/recovery-phrase} + {:name :keycard-onboarding-recovery-phrase-confirm-word1 + :insets {:bottom true} + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :component keycard.onboarding/recovery-phrase-confirm-word} + {:name :keycard-onboarding-recovery-phrase-confirm-word2 + :insets {:bottom true} + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :component keycard.onboarding/recovery-phrase-confirm-word} + {:name :keycard-recovery-intro + :insets {:bottom true} + :component keycard.recovery/intro} + {:name :keycard-recovery-success + :insets {:bottom true} + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :component keycard.recovery/success} + {:name :keycard-recovery-no-key + :insets {:bottom true} + :options {:topBar {:visible false} + :popGesture false + :hardwareBackButton {:dismissModalOnPress false + :popStackOnPress false}} + :component keycard.recovery/no-key} + {:name :keycard-authentication-method + :insets {:bottom true} + :options {:topBar {:visible false}} + :component keycard.authentication/keycard-authentication-method} + {:name :keycard-login-pin + :insets {:bottom true} + :options {:topBar {:visible false}} + :component keycard/login-pin} + {:name :keycard-blank + :insets {:bottom true} + :options {:topBar {:visible false}} + :component keycard/blank} + {:name :keycard-unpaired + :insets {:bottom true} + :options {:topBar {:visible false}} + :component keycard/unpaired} + {:name :keycard-settings + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/status-keycard)}}} + :component keycard.settings/keycard-settings} + {:name :reset-card + :insets {:bottom true} + :options {:topBar {:title {:text (i18n/label :t/reset-card)}}} + :component keycard.settings/reset-card} + {:name :keycard-pin + :insets {:bottom true} + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component keycard.settings/reset-pin} + {:name :enter-pin-settings + :insets {:bottom true} + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component keycard.pin/enter-pin} + {:name :change-pairing-code + :insets {:bottom true} + ;;TODO dynamic title + :options {:topBar {:visible false}} + :component keycard.pairing/change-pairing-code} + + ;;KEYSTORAGE + {:name :actions-not-logged-in + ;;TODO: topbar + :insets {:bottom true} + :options {:topBar {:visible false}} + ;;TODO move to popover? + :component key-storage.views/actions-not-logged-in} + {:name :actions-logged-in + ;;TODO: topbar + :options {:topBar {:visible false}} + :insets {:bottom true} + ;;TODO move to popover? + :component key-storage.views/actions-logged-in} + {:name :storage + ;;TODO: topbar + :options {:topBar {:visible false}} + :insets {:bottom true} + ;;TODO move to popover? + :component key-storage.views/storage}] + + (when js/goog.DEBUG + quo.preview/screens) + (when js/goog.DEBUG + quo.preview/main-screens))) \ No newline at end of file diff --git a/src/status_im/ui/screens/signing/views.cljs b/src/status_im/ui/screens/signing/views.cljs index 11d67a3a31a..0d54ade38dd 100644 --- a/src/status_im/ui/screens/signing/views.cljs +++ b/src/status_im/ui/screens/signing/views.cljs @@ -453,4 +453,5 @@ (when tx (select-keys tx [:from :contact :amount :token :approve? :message :cancel? :hash])) #(if (:message %) [message-sheet] - [sheet %])])) + [sheet %]) + #(re-frame/dispatch [:hide-signing-sheet])])) diff --git a/src/status_im/ui/screens/status/new/views.cljs b/src/status_im/ui/screens/status/new/views.cljs index 0f207755f61..2f98dfa29e2 100644 --- a/src/status_im/ui/screens/status/new/views.cljs +++ b/src/status_im/ui/screens/status/new/views.cljs @@ -2,7 +2,6 @@ (:require-macros [status-im.utils.views :refer [defview letsubs]]) (:require [status-im.ui.components.keyboard-avoid-presentation :as kb-presentation] [status-im.ui.components.react :as react] - [status-im.ui.components.topbar :as topbar] [status-im.i18n.i18n :as i18n] [re-frame.core :as re-frame] [status-im.ui.components.toolbar :as toolbar] @@ -57,11 +56,7 @@ (fn [] (let [{:keys [uri]} (first (vals @sending-image))] [kb-presentation/keyboard-avoiding-view {:style {:flex 1}} - [react/view {:flex 1} - [topbar/topbar - {:modal? true - :border-bottom true - :title (i18n/label :t/my-status)}] + [:<> [react/scroll-view {:style {:flex 1} :ref #(reset! scroll %) :on-layout #(reset! scroll-height diff --git a/src/status_im/ui/screens/status/views.cljs b/src/status_im/ui/screens/status/views.cljs index a20a7377f46..6462ad865fc 100644 --- a/src/status_im/ui/screens/status/views.cljs +++ b/src/status_im/ui/screens/status/views.cljs @@ -215,4 +215,4 @@ :header [react/view {:height 8}] :footer [react/view {:height 68}]}])) [components.plus-button/plus-button - {:on-press #(re-frame/dispatch [:navigate-to :my-status])}]])) + {:on-press #(re-frame/dispatch [:open-modal :my-status])}]])) diff --git a/src/status_im/ui/screens/stickers/views.cljs b/src/status_im/ui/screens/stickers/views.cljs index 70558a10c22..e5d26a12bb0 100644 --- a/src/status_im/ui/screens/stickers/views.cljs +++ b/src/status_im/ui/screens/stickers/views.cljs @@ -6,8 +6,7 @@ [status-im.ui.components.react :as react] [status-im.ui.screens.stickers.styles :as styles] [status-im.utils.contenthash :as contenthash] - [status-im.utils.money :as money] - [status-im.ui.components.topbar :as topbar]) + [status-im.utils.money :as money]) (:require-macros [status-im.utils.views :refer [defview letsubs]])) (defn- thumbnail-icon [uri size] @@ -59,7 +58,6 @@ (letsubs [packs [:stickers/all-packs]] [react/view styles/screen [react/keyboard-avoiding-view {:flex 1} - [topbar/topbar {:title (i18n/label :t/sticker-market)}] (if (seq packs) [react/scroll-view {:keyboard-should-persist-taps :handled :style {:padding 16}} [react/view @@ -71,13 +69,12 @@ (def sticker-icon-size 60) -(defview pack-main [modal?] +(defview pack-main [] (letsubs [{:keys [id name author price thumbnail stickers installed owned pending] :as pack} [:stickers/get-current-pack]] [react/keyboard-avoiding-view {:flex 1} - [topbar/topbar {:modal? modal?}] (if pack [react/view {:flex 1} [react/view {:height 74 :align-items :center :flex-direction :row :padding-horizontal 16} @@ -99,7 +96,4 @@ [react/activity-indicator {:animating true}]])])) (defview pack [] - [pack-main false]) - -(defview pack-modal [] - [pack-main true]) + [pack-main]) diff --git a/src/status_im/ui/screens/sync_settings/views.cljs b/src/status_im/ui/screens/sync_settings/views.cljs index e8672c47530..8daefbc2558 100644 --- a/src/status_im/ui/screens/sync_settings/views.cljs +++ b/src/status_im/ui/screens/sync_settings/views.cljs @@ -5,57 +5,53 @@ [status-im.i18n.i18n :as i18n] [status-im.constants :as constants] [status-im.ui.components.colors :as colors] - [status-im.ui.components.react :as react] - [status-im.ui.components.topbar :as topbar])) + [status-im.ui.components.react :as react])) (views/defview sync-settings [] (views/letsubs [{:keys [syncing-on-mobile-network? default-sync-period use-mailservers?]} [:multiaccount] current-mailserver-name [:mailserver/current-name]] - [react/view {:style {:flex 1 :background-color colors/white}} - [topbar/topbar {:title (i18n/label :t/sync-settings) - :navigation {:on-press #(re-frame/dispatch [:navigate-to :profile-stack {:screen :my-profile}])}}] - [react/scroll-view - [quo/list-header (i18n/label :t/data-syncing)] - [quo/list-item {:size :small - :title (i18n/label :t/mobile-network-settings) - :accessibility-label :notifications-button - :on-press #(re-frame/dispatch [:navigate-to :mobile-network-settings]) - :chevron true - :accessory :text - :accessory-text (if syncing-on-mobile-network? - (i18n/label :t/mobile-network-use-mobile) - (i18n/label :t/mobile-network-use-wifi))}] - [quo/list-item {:size :small - :title (i18n/label :t/default-sync-period) - :accessibility-label :default-sync-period-button - :on-press #(re-frame/dispatch [:navigate-to :default-sync-period-settings]) - :chevron true - :accessory :text - :accessory-text (cond - (= default-sync-period constants/one-day) - (i18n/label :t/one-day) - (= default-sync-period constants/three-days) - (i18n/label :t/three-days) - (= default-sync-period constants/one-week) - (i18n/label :t/one-week) - (= default-sync-period constants/one-month) - (i18n/label :t/one-month))}] - [quo/list-item {:size :small - :accessibility-label :offline-messages-settings-button - :title (i18n/label :t/history-nodes) - :on-press #(re-frame/dispatch [:navigate-to :offline-messaging-settings]) - :accessory :text - :accessory-text (when use-mailservers? current-mailserver-name) - :chevron true}] - ;; TODO(Ferossgp): Devider componemt - [react/view {:height 1 - :background-color colors/gray-lighter - :margin-top 8}] - [quo/list-header (i18n/label :t/device-syncing)] - [quo/list-item {:size :small - :title (i18n/label :t/devices) - :accessibility-label :pairing-settings-button - :on-press #(re-frame/dispatch [:navigate-to :installations]) - :chevron true}]]])) + [react/scroll-view + [quo/list-header (i18n/label :t/data-syncing)] + [quo/list-item {:size :small + :title (i18n/label :t/mobile-network-settings) + :accessibility-label :notifications-button + :on-press #(re-frame/dispatch [:navigate-to :mobile-network-settings]) + :chevron true + :accessory :text + :accessory-text (if syncing-on-mobile-network? + (i18n/label :t/mobile-network-use-mobile) + (i18n/label :t/mobile-network-use-wifi))}] + [quo/list-item {:size :small + :title (i18n/label :t/default-sync-period) + :accessibility-label :default-sync-period-button + :on-press #(re-frame/dispatch [:navigate-to :default-sync-period-settings]) + :chevron true + :accessory :text + :accessory-text (cond + (= default-sync-period constants/one-day) + (i18n/label :t/one-day) + (= default-sync-period constants/three-days) + (i18n/label :t/three-days) + (= default-sync-period constants/one-week) + (i18n/label :t/one-week) + (= default-sync-period constants/one-month) + (i18n/label :t/one-month))}] + [quo/list-item {:size :small + :accessibility-label :offline-messages-settings-button + :title (i18n/label :t/history-nodes) + :on-press #(re-frame/dispatch [:navigate-to :offline-messaging-settings]) + :accessory :text + :accessory-text (when use-mailservers? current-mailserver-name) + :chevron true}] + ;; TODO(Ferossgp): Devider componemt + [react/view {:height 1 + :background-color colors/gray-lighter + :margin-top 8}] + [quo/list-header (i18n/label :t/device-syncing)] + [quo/list-item {:size :small + :title (i18n/label :t/devices) + :accessibility-label :pairing-settings-button + :on-press #(re-frame/dispatch [:navigate-to :installations]) + :chevron true}]])) diff --git a/src/status_im/ui/screens/views.cljs b/src/status_im/ui/screens/views.cljs index f852bd204af..3ae4a732967 100644 --- a/src/status_im/ui/screens/views.cljs +++ b/src/status_im/ui/screens/views.cljs @@ -1,92 +1,126 @@ (ns status-im.ui.screens.views - (:require [status-im.utils.universal-links.core :as utils.universal-links] - [re-frame.core :as re-frame] - [cljs-bean.core :refer [bean]] - [status-im.ui.components.react :as react] - [status-im.ui.screens.routing.core :as navigation] + (:require [status-im.ui.components.react :as react] [reagent.core :as reagent] - [status-im.ui.screens.routing.main :as routing] - [status-im.ui.screens.signing.views :as signing] + [status-im.reloader :as reloader] + [status-im.ui.screens.screens :as screens] + [oops.core :refer [oget]] [status-im.ui.screens.popover.views :as popover] - [status-im.ui.screens.wallet.send.views :as wallet] - [status-im.ui.components.status-bar.view :as statusbar] - [status-im.ui.components.colors :as colors] - [status-im.keycard.test-menu :as keycard.test-menu] [status-im.ui.screens.bottom-sheets.views :as bottom-sheets] + [status-im.ui.screens.signing.views :as signing] + [status-im.ui.screens.wallet.send.views :as wallet.send.views] + [re-frame.core :as re-frame] + [status-im.ui.components.colors :as colors] [status-im.utils.config :as config] - [status-im.reloader :as reloader] - [status-im.i18n.i18n :as i18n] - ["react-native" :as rn] - ["react-native-languages" :default react-native-languages] - ["react-native-shake" :as react-native-shake])) + [status-im.keycard.test-menu :as keycard.test-menu] + [status-im.utils.platform :as platform])) + +(defn get-screens [] + (reduce + (fn [acc screen] + (assoc acc (:name screen) screen)) + {} + screens/screens)) + +;;we need this for hot reload (for some reason it doesn't reload, so we have to call get-screens if debug true) +(def screens (get-screens)) -(def splash-screen (-> rn .-NativeModules .-SplashScreen)) +(def components + (reduce + (fn [acc {:keys [name component]}] + (assoc acc name component)) + {} + (concat screens/components))) -(defn on-languages-change [^js event] - (i18n/set-language (.-language event))) +(defn wrapped-screen-style [{:keys [insets style]} insets-obj] + (merge + {:flex 1 + :background-color colors/white} + (when platform/android? + {:border-bottom-width 1 + :border-bottom-color colors/gray-lighter}) + style + (when (get insets :bottom) + {:padding-bottom (+ (oget insets-obj "bottom") + (get style :padding-bottom) + (get style :padding-vertical))}) + (when (get insets :top true) + {:padding-top (+ (oget insets-obj "top") + (get style :padding-top) + (get style :padding-vertical))}))) -(defn on-shake [] - (re-frame/dispatch [:shake-event])) +(defn inactive [] + (when @(re-frame/subscribe [:hide-screen?]) + [react/view {:position :absolute :flex 1 :top 0 :bottom 0 :left 0 :right 0 :background-color colors/white + :z-index 999999999999999999}])) -(defn app-state-change-handler [state] - (re-frame/dispatch [:app-state-change state])) +(defn screen [key] + (reagent.core/reactify-component + (fn [] + ^{:key (str "root" key @reloader/cnt)} + [react/safe-area-provider + [react/safe-area-consumer + (fn [insets] + (reagent/as-element + [react/view {:style (wrapped-screen-style + {:insets (get-in screens [(keyword key) :insets])} + insets)} + [inactive] + [(get-in (if js/goog.DEBUG (get-screens) screens) [(keyword key) :component])]]))] + (when js/goog.DEBUG + [reloader/reload-view]) + (when config/keycard-test-menu-enabled? + [keycard.test-menu/test-menu])]))) -(def debug? ^boolean js/goog.DEBUG) +(defn component [comp] + (reagent/reactify-component + (fn [] + [react/view {:width 500 :height 44} + [comp]]))) -;; Persist navigation state in dev mode -(when debug? - (defonce state (atom nil)) - (defn- persist-state! [state-obj] - (js/Promise. - (fn [resolve _] - (reset! state state-obj) - (resolve true))))) +(def popover-comp + (reagent/reactify-component + (fn [] + ^{:key (str "popover" @reloader/cnt)} + [react/safe-area-provider + [inactive] + [popover/popover] + (when js/goog.DEBUG + [reloader/reload-view]) + (when config/keycard-test-menu-enabled? + [keycard.test-menu/test-menu])]))) -(defn on-state-change [state] - (let [route-name (navigation/get-active-route-name (bean state))] - ;; NOTE(Ferossgp): Keycard did-load events backward compatibility - (re-frame/dispatch [:screens/on-will-focus route-name]) +(def sheet-comp + (reagent/reactify-component + (fn [] + ^{:key (str "seet" @reloader/cnt)} + [react/safe-area-provider + [inactive] + [bottom-sheets/bottom-sheet] + (when js/goog.DEBUG + [reloader/reload-view]) + (when config/keycard-test-menu-enabled? + [keycard.test-menu/test-menu])]))) - ;; NOTE(Ferossgp): Both calls are for backward compatibility, should be reworked in future - (statusbar/set-status-bar route-name) - (re-frame/dispatch [:set :view-id route-name])) - (when debug? - (persist-state! state))) +(def signing-comp + (reagent/reactify-component + (fn [] + ^{:key (str "signing-seet" @reloader/cnt)} + [react/safe-area-provider + [inactive] + [signing/signing] + (when js/goog.DEBUG + [reloader/reload-view]) + (when config/keycard-test-menu-enabled? + [keycard.test-menu/test-menu])]))) -(defn root [_] - (reagent/create-class - {:component-did-mount - (fn [_] - (.addEventListener ^js react/app-state "change" app-state-change-handler) - (.addEventListener react-native-languages "change" on-languages-change) - (.addEventListener react-native-shake "ShakeEvent" on-shake) - (.hide ^js splash-screen) - (utils.universal-links/initialize)) - :component-will-unmount - (fn [] - (.removeEventListener ^js react/app-state "change" app-state-change-handler) - (.removeEventListener react-native-languages "change" on-languages-change) - (utils.universal-links/finalize)) - :display-name "root" - :reagent-render (fn [] - [react/safe-area-provider - ^{:key (str @colors/theme @reloader/cnt)} - [react/view {:flex 1 - :background-color colors/black-persist} - [navigation/navigation-container - (merge {:ref (fn [r] - (navigation/set-navigator-ref r)) - :onStateChange on-state-change - :enableURLHandling false} - (when debug? - {:enableURLHandling true - :initialState @state})) - [routing/main-nav-component]] - [wallet/select-account] - [signing/signing] - [bottom-sheets/bottom-sheet] - [popover/popover] - (when debug? - [reloader/reload-view @reloader/cnt]) - (when config/keycard-test-menu-enabled? - [keycard.test-menu/test-menu])]])})) +(def select-acc-comp + (reagent/reactify-component + (fn [] + ^{:key (str "select-acc-sheet" @reloader/cnt)} + [react/safe-area-provider + [inactive] + [wallet.send.views/select-account] + (when js/goog.DEBUG + [reloader/reload-view]) + (when config/keycard-test-menu-enabled? + [keycard.test-menu/test-menu])]))) diff --git a/src/status_im/ui/screens/wallet/account/views.cljs b/src/status_im/ui/screens/wallet/account/views.cljs index 6a6de85fcf0..725cbcd95b3 100644 --- a/src/status_im/ui/screens/wallet/account/views.cljs +++ b/src/status_im/ui/screens/wallet/account/views.cljs @@ -25,15 +25,6 @@ (def state (reagent/atom {:tab :assets})) -(defn toolbar-view [title] - [topbar/topbar - {:title title - :right-accessories - [{:icon :main-icons/more - :on-press #(re-frame/dispatch [:bottom-sheet/show-sheet - {:content sheets/account-settings - :content-height 60}])}]}]) - (defn button [label icon color handler] [react/touchable-highlight {:on-press handler :style {:flex 1}} [react/view {:flex 1 :align-items :center :justify-content :center} @@ -218,8 +209,14 @@ (let [anim-y (animation/create-value button-group-height) scroll-y (animation/create-value 0)] (anim-listener anim-y scroll-y) - [react/view {:flex 1 :background-color colors/white} - [toolbar-view name] + [:<> + [topbar/topbar + {:title name + :right-accessories + [{:icon :main-icons/more + :on-press #(re-frame/dispatch [:bottom-sheet/show-sheet + {:content sheets/account-settings + :content-height 60}])}]}] [react/animated-scroll-view {:contentContainerStyle {:padding-bottom button-group-height} :on-scroll (animation/event diff --git a/src/status_im/ui/screens/wallet/account_settings/views.cljs b/src/status_im/ui/screens/wallet/account_settings/views.cljs index 2929ea05828..40139447cc4 100644 --- a/src/status_im/ui/screens/wallet/account_settings/views.cljs +++ b/src/status_im/ui/screens/wallet/account_settings/views.cljs @@ -42,7 +42,8 @@ (letsubs [{:keys [address color path type] :as account} [:multiaccount/current-account] new-account (reagent/atom nil) keycard? [:keycard-multiaccount?]] - [react/keyboard-avoiding-view {:flex 1} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [topbar/topbar (cond-> {:title (i18n/label :t/account-settings)} (and @new-account (not= "" (:name @new-account))) diff --git a/src/status_im/ui/screens/wallet/accounts/sheets.cljs b/src/status_im/ui/screens/wallet/accounts/sheets.cljs index 80b809e7eb0..58a3f5a9cec 100644 --- a/src/status_im/ui/screens/wallet/accounts/sheets.cljs +++ b/src/status_im/ui/screens/wallet/accounts/sheets.cljs @@ -45,8 +45,7 @@ :icon :main-icons/security :accessibility-label :wallet-backup-recovery-title :on-press #(hide-sheet-and-dispatch - [:navigate-to :profile-stack {:screen :backup-seed - :initial false}])}])])) + [:navigate-to :backup-seed])}])])) (defn account-card-actions [account type] [react/view diff --git a/src/status_im/ui/screens/wallet/accounts/views.cljs b/src/status_im/ui/screens/wallet/accounts/views.cljs index eeb9a3a3aa3..48f7efa3755 100644 --- a/src/status_im/ui/screens/wallet/accounts/views.cljs +++ b/src/status_im/ui/screens/wallet/accounts/views.cljs @@ -152,8 +152,7 @@ {:on-press #(re-frame/dispatch (if frozen-card? [::keycard.login/reset-pin] - [:navigate-to :profile-stack {:screen :backup-seed - :initial false}]))} + [:navigate-to :backup-seed]))} [react/view {:flex-direction :row :align-items :center} [react/view {:width 14 diff --git a/src/status_im/ui/screens/wallet/add_new/views.cljs b/src/status_im/ui/screens/wallet/add_new/views.cljs index b379ce1a27b..c79d7669c18 100644 --- a/src/status_im/ui/screens/wallet/add_new/views.cljs +++ b/src/status_im/ui/screens/wallet/add_new/views.cljs @@ -120,7 +120,8 @@ status [:keycard/pin-status] error-label [:keycard/pin-error-label] retry-counter [:keycard/retry-counter]] - [react/keyboard-avoiding-view {:style {:flex 1}} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [topbar/topbar {:navigation :none :right-accessories @@ -148,14 +149,16 @@ :padding-bottom 40 :flex 1}} [pin]]) - window-height])) + window-height + #()])) (defview add-account [] (letsubs [{:keys [type account] :as add-account} [:add-account] add-account-disabled? [:add-account-disabled?] entered-password (reagent/atom "") keycard? [:keycard-multiaccount?]] - [react/keyboard-avoiding-view {:style {:flex 1}} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [add-account-topbar type] [react/scroll-view {:keyboard-should-persist-taps :handled :style {:flex 1}} diff --git a/src/status_im/ui/screens/wallet/buy_crypto/views.cljs b/src/status_im/ui/screens/wallet/buy_crypto/views.cljs index f421ecdaf9b..9c7a19370b9 100644 --- a/src/status_im/ui/screens/wallet/buy_crypto/views.cljs +++ b/src/status_im/ui/screens/wallet/buy_crypto/views.cljs @@ -21,7 +21,7 @@ (re-frame/dispatch [:buy-crypto.ui/open-screen])) (defn render-on-ramp [{:keys [name fees logo-url description] :as on-ramp}] - [react/touchable-highlight {:on-press #(re-frame/dispatch [:navigate-to :buy-crypto-website on-ramp]) + [react/touchable-highlight {:on-press #(re-frame/dispatch [:open-modal :buy-crypto-website on-ramp]) :style {:flex 1}} [quo/list-item {:title [react/view {:style {:flex 1}} @@ -53,20 +53,20 @@ (views/defview buy-crypto [] (views/letsubs [on-ramps [:buy-crypto/on-ramps]] - [react/view {:flex 1} - [topbar/topbar {:border-bottom false - :modal? true}] - [list/flat-list {:data on-ramps - :key-fn :site-url - :header [buy-crypto-header] - :render-fn render-on-ramp}]])) + [list/flat-list {:data on-ramps + :key-fn :site-url + :header [buy-crypto-header] + :render-fn render-on-ramp}])) -(defn website [route] +(defn website [] (let [has-loaded? (reagent/atom false) + initialized? (reagent/atom false) {:keys [name hostname logo-url - site-url]} (get-in route [:route :params])] + site-url]} @(re-frame/subscribe [:get-screen-params])] + ;;it crashes on android , probably because of modal animation + (js/setTimeout #(reset! initialized? true) 500) (fn [] ;; overflow hidden needed for the crash on android [react/view {:flex 1 :overflow :hidden} @@ -82,7 +82,7 @@ (when-not @has-loaded? [react/view {:style {:flex 1 :position :absolute - :top 0 + :top 56 :left 0 :right 0 :z-index 1 @@ -98,18 +98,19 @@ [quo/text {:align :center :color :secondary} (i18n/label :t/buy-crypto-leaving)]]]) - [components.webview/webview - {:onLoadEnd #(reset! has-loaded? true) - :ref #(reset! webview-ref %) - :on-permission-request #(browser.views/request-resources-access-for-page - (-> ^js % .-nativeEvent .-resources) site-url @webview-ref) - :java-script-enabled true - ;; This is to avoid crashes on android devices - ;; due to https://github.com/react-native-webview/react-native-webview/issues/1838 - ;; We can't disable hardware acceleration as we need to use camera - :style {:opacity 0.99} - :local-storage-enabled true - :source {:uri site-url}}]]))) + (when @initialized? + [components.webview/webview + {:onLoadEnd #(reset! has-loaded? true) + :ref #(reset! webview-ref %) + :on-permission-request #(browser.views/request-resources-access-for-page + (-> ^js % .-nativeEvent .-resources) site-url @webview-ref) + :java-script-enabled true + ;; This is to avoid crashes on android devices + ;; due to https://github.com/react-native-webview/react-native-webview/issues/1838 + ;; We can't disable hardware acceleration as we need to use camera + :style {:opacity 0.99} + :local-storage-enabled true + :source {:uri site-url}}])]))) (defn container [] (reagent/create-class diff --git a/src/status_im/ui/screens/wallet/custom_tokens/views.cljs b/src/status_im/ui/screens/wallet/custom_tokens/views.cljs index fc240599883..bed9c2581d6 100644 --- a/src/status_im/ui/screens/wallet/custom_tokens/views.cljs +++ b/src/status_im/ui/screens/wallet/custom_tokens/views.cljs @@ -23,7 +23,6 @@ (letsubs [{:keys [contract name symbol decimals in-progress? error error-name error-symbol]} [:wallet/custom-token-screen]] [react/keyboard-avoiding-view {:flex 1 :background-color colors/white} - [topbar/topbar {:title (i18n/label :t/add-custom-token)}] [react/scroll-view {:keyboard-should-persist-taps :handled :style {:flex 1 :padding-horizontal 16}} @@ -108,7 +107,8 @@ (defview custom-token-details [] (letsubs [{:keys [address name symbol decimals custom?] :as token} [:get-screen-params]] - [react/keyboard-avoiding-view {:flex 1 :background-color colors/white} + [react/keyboard-avoiding-view {:style {:flex 1} + :ignore-offset true} [topbar/topbar {:title name}] [react/scroll-view {:keyboard-should-persist-taps :handled :style {:flex 1}} diff --git a/src/status_im/ui/screens/wallet/recipient/views.cljs b/src/status_im/ui/screens/wallet/recipient/views.cljs index 1f9340a53ed..d7a7ad755be 100644 --- a/src/status_im/ui/screens/wallet/recipient/views.cljs +++ b/src/status_im/ui/screens/wallet/recipient/views.cljs @@ -215,9 +215,6 @@ fav-name (atom "")] [kb-presentation/keyboard-avoiding-view {:style {:flex 1}} [react/view {:flex 1} - [topbar/topbar - {:modal? true - :title (i18n/label :t/new-favourite)}] [react/scroll-view {:style {:flex 1}} [react/view {:padding-horizontal 16} [react/view {:flex-direction :row :justify-content :space-between @@ -296,7 +293,7 @@ {:accessibility-label :participant-add-to-favs :type :secondary :disabled disabled? - :on-press #(re-frame/dispatch [:navigate-to :new-favourite])} + :on-press #(re-frame/dispatch [:open-modal :new-favourite])} (i18n/label :t/add-to-favourites)] :right [quo/button diff --git a/src/status_im/ui/screens/wallet/send/views.cljs b/src/status_im/ui/screens/wallet/send/views.cljs index 3a020fc01ce..8cfec7e0e6e 100644 --- a/src/status_im/ui/screens/wallet/send/views.cljs +++ b/src/status_im/ui/screens/wallet/send/views.cljs @@ -20,8 +20,7 @@ [status-im.utils.money :as money] [quo.core :as quo] [status-im.ethereum.core :as ethereum] - [status-im.ui.components.keyboard-avoid-presentation :as kb-presentation] - [status-im.ui.components.topbar :as topbar])) + [status-im.ui.components.keyboard-avoid-presentation :as kb-presentation])) (defn header [{:keys [label small-screen?]}] [react/view (styles/header small-screen?) @@ -140,7 +139,8 @@ (letsubs [data [:commands/select-account]] [bottom-panel/animated-bottom-panel data - select-account-sheet])) + select-account-sheet + #(re-frame/dispatch [:hide-select-acc-sheet])])) (views/defview request-transaction [_] (views/letsubs [{:keys [amount-error amount-text from token sign-enabled?] :as tx} @@ -149,15 +149,7 @@ prices [:prices] wallet-currency [:wallet/currency]] [kb-presentation/keyboard-avoiding-view {:style {:flex 1}} - [react/view {:flex 1} - [topbar/topbar - {:navigation {:on-press - #(do - (re-frame/dispatch [:wallet/cancel-transaction-command]) - (re-frame/dispatch [:navigate-back]))} - :modal? true - :border-bottom true - :title (i18n/label :t/request-transaction)}] + [:<> [react/scroll-view {:style {:flex 1} :keyboard-should-persist-taps :handled} [react/view {:style (styles/sheet)} @@ -210,15 +202,7 @@ window-width [:dimensions/window-width]] (let [to-norm (ethereum/normalized-hex (if (string? to) to (:address to)))] [kb-presentation/keyboard-avoiding-view {:style {:flex 1}} - [react/view {:flex 1} - [topbar/topbar - {:navigation {:on-press - #(do - (re-frame/dispatch [:wallet/cancel-transaction-command]) - (re-frame/dispatch [:navigate-back]))} - :modal? true - :border-bottom true - :title (i18n/label :t/send-transaction)}] + [:<> [react/scroll-view {:style {:flex 1} :keyboard-should-persist-taps :handled} [react/view {:style (styles/sheet)} @@ -265,6 +249,7 @@ :after :main-icon/next :disabled (not sign-enabled?) :on-press #(do + (re-frame/dispatch [:navigate-back]) (re-frame/dispatch [(cond request? @@ -272,8 +257,8 @@ from-chat? :wallet.ui/sign-transaction-button-clicked-from-chat :else - :wallet.ui/sign-transaction-button-clicked) tx]) - (re-frame/dispatch [:navigate-back]))} + :wallet.ui/sign-transaction-button-clicked) tx]))} + (if (and (not request?) from-chat? (not to-norm)) (i18n/label :t/wallet-send) (i18n/label :t/next))]}]]]))) \ No newline at end of file diff --git a/src/status_im/utils/universal_links/core.cljs b/src/status_im/utils/universal_links/core.cljs index c696a67cd45..7e7eeb2ce89 100644 --- a/src/status_im/utils/universal_links/core.cljs +++ b/src/status_im/utils/universal_links/core.cljs @@ -79,7 +79,8 @@ (log/info "universal-links: handling view profile" public-key) (cond (and public-key (new-chat.db/own-public-key? db public-key)) - (navigation/navigate-to-cofx cofx :tabs {:screen :profile-stack}) + {:navigate-change-tab-fx :profile + :pop-to-root-tab-fx :profile-stack} public-key (navigation/navigate-to-cofx (assoc-in cofx [:db :contacts/identity] public-key) @@ -104,10 +105,8 @@ (fx/defn handle-wallet-account [cofx {address :account}] (when-let [account (existing-account? cofx address)] (navigation/navigate-to-cofx cofx - :tabs - {:screen :wallet-stack - :params {:screen :wallet-account - :params account}}))) + :wallet-account + account))) (defn handle-not-found [full-url] (log/info "universal-links: no handler for " full-url)) diff --git a/src/status_im/wallet/choose_recipient/core.cljs b/src/status_im/wallet/choose_recipient/core.cljs index d9e146a9c93..0a77af514ff 100644 --- a/src/status_im/wallet/choose_recipient/core.cljs +++ b/src/status_im/wallet/choose_recipient/core.cljs @@ -87,7 +87,7 @@ :to address :to-name (find-address-name db address))} (let [current-chain-id (get-in networks [current-network :config :NetworkId])] (merge {:db (fill-prepare-transaction-details db details all-tokens) - :dispatch [:navigate-to :prepare-send-transaction]} + :dispatch [:open-modal :prepare-send-transaction]} (when (and chain-id (not= current-chain-id chain-id)) {:ui/show-error (i18n/label :t/wallet-invalid-chain-id {:data uri :chain current-chain-id})}))))) diff --git a/src/status_im/wallet/core.cljs b/src/status_im/wallet/core.cljs index 21cf1fe991c..fce0ed735ea 100644 --- a/src/status_im/wallet/core.cljs +++ b/src/status_im/wallet/core.cljs @@ -84,9 +84,7 @@ (fx/defn open-transaction-details {:events [:wallet.ui/show-transaction-details]} [cofx hash address] - (navigation/navigate-to-cofx cofx :wallet-stack {:screen :wallet-transaction-details - :initial false - :params {:hash hash :address address}})) + (navigation/navigate-to-cofx cofx :wallet-transaction-details {:hash hash :address address})) (defn- validate-token-name! [{:keys [address symbol name]}] @@ -446,7 +444,7 @@ :amount-text amount-text :request? true :from-chat? true}) - :dispatch [:navigate-to :prepare-send-transaction]})) + :dispatch [:open-modal :prepare-send-transaction]})) (fx/defn set-and-validate-amount-request {:events [:wallet.request/set-and-validate-amount]} @@ -490,7 +488,7 @@ :to contact :symbol :ETH :from-chat? true}) - :dispatch [:navigate-to :prepare-send-transaction]} + :dispatch [:open-modal :prepare-send-transaction]} ens-verified (assoc ::resolve-address {:registry (get ens/ens-registries chain) @@ -513,7 +511,7 @@ :symbol :ETH :from-chat? true :request-command? true}) - :dispatch [:navigate-to :request-transaction]})) + :dispatch [:open-modal :request-transaction]})) (fx/defn prepare-transaction-from-wallet {:events [:wallet/prepare-transaction-from-wallet]} @@ -523,7 +521,7 @@ :to nil :symbol :ETH :from-chat? false}) - :dispatch [:navigate-to :prepare-send-transaction] + :dispatch [:open-modal :prepare-send-transaction] :signing/update-gas-price {:success-event :wallet.send/update-gas-price-success}}) (fx/defn cancel-transaction-command @@ -577,7 +575,7 @@ {:db (-> db (assoc :wallet/recipient {}))} (bottom-sheet/hide-bottom-sheet) - (navigation/navigate-to-cofx :recipient nil))) + (navigation/open-modal :recipient nil))) (fx/defn show-delete-account-confirmation {:events [:wallet.settings/show-delete-account-confirmation]} @@ -764,14 +762,14 @@ (fx/defn wallet-will-focus {:events [::wallet-stack]} - [{:keys [db] :as cofx}] + [{:keys [db]}] (let [wallet-set-up-passed? (get-in db [:multiaccount :wallet-set-up-passed?]) sign-phrase-showed? (get db :wallet/sign-phrase-showed?)] - {:dispatch [:wallet.ui/pull-to-refresh] ;TODO temporary simple fix for v1 + {:dispatch-n [[:wallet.ui/pull-to-refresh] ;TODO temporary simple fix for v1 + [:show-popover {:view [signing-phrase/signing-phrase]}]] :db (if (or wallet-set-up-passed? sign-phrase-showed?) db - (assoc db :popover/popover {:view [signing-phrase/signing-phrase]} - :wallet/sign-phrase-showed? true))})) + (assoc db :wallet/sign-phrase-showed? true))})) (fx/defn wallet-wallet-add-custom-token {:events [:wallet/wallet-add-custom-token]} diff --git a/yarn.lock b/yarn.lock index ca6a92d9d63..4fe7b798fd3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -219,6 +219,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.12.13": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + "@babel/helper-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" @@ -679,6 +684,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-transform-object-assign@^7.10.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz#d9b9200a69e03403a813e44a933ad9f4bddfd050" + integrity sha512-4QxDMc0lAOkIBSfCrnSGbAJ+4epDBF2XXwcLXuBcG1xl9u7LrktNVD4+LwhL47XuKVPQ7R25e/WdcV+h97HyZA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.1.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" @@ -1391,49 +1403,6 @@ resolved "https://registry.yarnpkg.com/@react-native-community/slider/-/slider-3.0.0.tgz#ffbf78689fc0572fb5c1e2ccb61b2ef074d3dcd2" integrity sha512-deNc3JHBHz24YN+0DTAocXfrYFIFc1DvsIriMJSsJlR/MvsLzoq2+qwaEN+0/LJ37pstv85wZWY0pNugk4e41g== -"@react-navigation/bottom-tabs@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-5.8.0.tgz#d7386809bceeead0adcaacf61b6563be9cefd5cb" - integrity sha512-geF/FSIg6cArY5jLwJJZrp7PDzLoSrONkCgq9n/4yKxtQapB/Pn5ljSHCNRGNkkb/+g8zqRQmEL5yX4DOja0OA== - dependencies: - color "^3.1.2" - react-native-iphone-x-helper "^1.2.1" - -"@react-navigation/core@^5.12.3": - version "5.12.3" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.12.3.tgz#0484fcca290569a0dc10b70b99f00edd3f1fd93c" - integrity sha512-aEOTAw4FRRNsNu6F9ibLk3SVSs4Res8BI832NEZN6qUto5ZgtuYnQHWeWV2cZ43Nc9KvUyQC/vXvO2RScwgFwA== - dependencies: - "@react-navigation/routers" "^5.4.11" - escape-string-regexp "^4.0.0" - nanoid "^3.1.12" - query-string "^6.13.1" - react-is "^16.13.0" - use-subscription "^1.4.0" - -"@react-navigation/native@^5.7.3": - version "5.7.3" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.7.3.tgz#3cda5ee7b0fe0d980db6d788419f0af50a64deac" - integrity sha512-bXb1g/cLpGF2DW1Vxk90Ch5vbaZTk5b/4Fn5xjQlueQODgc9ca+GPEssKZ84hCrNmS+Xg+iK1m/ArawLF5gMlw== - dependencies: - "@react-navigation/core" "^5.12.3" - nanoid "^3.1.12" - -"@react-navigation/routers@^5.4.11": - version "5.4.11" - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.4.11.tgz#75dbec1809e282c3749068845099c5bee2c792f0" - integrity sha512-J/CsHdIjYBRe81UUiLOoz9NSrQ91uP23Oe21QPCALInRHx+rfwo2oPl6Fn8xAa7n8Dtt2oQUGyF+g5d05cB74w== - dependencies: - nanoid "^3.1.12" - -"@react-navigation/stack@^5.9.0": - version "5.9.0" - resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.9.0.tgz#bf24607175bf502798cc4c832aa8a86e55f3b365" - integrity sha512-kt6M0ZLMyNKXfKi50n01bHg4/d8zp0Yh5QaQG4d1roWOqdV9ou1nFEK4l2yQ6XKH2lLSYswHElPDZUuWd+6XzA== - dependencies: - color "^3.1.2" - react-native-iphone-x-helper "^1.2.1" - "@sinonjs/commons@^1.7.0": version "1.7.2" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" @@ -2528,7 +2497,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2547,32 +2516,16 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - colorette@^1.0.7: version "1.1.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" @@ -2682,11 +2635,16 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.2.2, core-js@^2.4.1, core-js@^2.5.7: +core-js@^2.2.2, core-js@^2.5.7: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js@^2.4.1: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2764,6 +2722,13 @@ create-react-class@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" +cross-fetch@^3.0.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + cross-spawn@^4: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -3150,11 +3115,11 @@ encodeurl@~1.0.2: integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - iconv-lite "~0.4.13" + iconv-lite "^0.6.2" end-of-stream@^1.1.0: version "1.4.4" @@ -3234,11 +3199,6 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escodegen@^1.11.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" @@ -3547,6 +3507,19 @@ fbjs@^1.0.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +fbjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.0.tgz#0907067fb3f57a78f45d95f1eacffcacd623c165" + integrity sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -3913,7 +3886,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@3.x.x, hoist-non-react-statics@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -3977,13 +3950,20 @@ i18n-js@^3.3.0: resolved "https://registry.yarnpkg.com/i18n-js/-/i18n-js-3.5.1.tgz#9787450894059bec1af791123231e59898eb97c1" integrity sha512-nJgbE5Vj9qzOQfjdVd/uoMoO8ppVaB/3LB6KOmMfD8IQ1vNNh307iHyQLK8ZnLYWkAszfPvVpYmUt1Le/RuHMQ== -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.17: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -4094,11 +4074,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -5111,6 +5086,11 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= +lodash@4.17.x: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + lodash@^3.10.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -5708,6 +5688,11 @@ mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "^1.2.5" +mockdate@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb" + integrity sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -5738,11 +5723,6 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== -nanoid@^3.1.12: - version "3.1.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" - integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -5785,6 +5765,11 @@ nocache@^2.1.0: resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -6458,7 +6443,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.4" -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.x.x, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -6539,15 +6524,6 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^6.13.1: - version "6.13.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.1.tgz#d913ccfce3b4b3a713989fe6d39466d92e71ccad" - integrity sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA== - dependencies: - decode-uri-component "^0.2.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -6596,11 +6572,16 @@ react-dom@^16.4.2: prop-types "^15.6.2" scheduler "^0.19.1" -react-is@^16.12.0, react-is@^16.13.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: +react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-lifecycles-compat@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-2.0.0.tgz#71d9c4cde47114c4102454f76da055c2bc48c948" + integrity sha512-txfpPCQYiazVdcbMRhatqWKcAxJweUu2wDXvts5/7Wyp6+Y9cHojqXHsLPEckzutfHlxZhG8Oiundbmp8Fd6eQ== + react-native-background-timer@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/react-native-background-timer/-/react-native-background-timer-2.2.0.tgz#ff82d30899209b924983cc00e6ce174b8de5054a" @@ -6680,11 +6661,6 @@ react-native-image-resizer@^1.2.3: version "0.2.1" resolved "git+https://github.com/Ferossgp/react-native-image-viewing.git#8ef67cdce7b7c66065a939847e45db71347c678e" -react-native-iphone-x-helper@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.1.tgz#645e2ffbbb49e80844bb4cbbe34a126fda1e6772" - integrity sha512-/VbpIEp8tSNNHIvstuA3Swx610whci1Zpc9mqNkqn14DkMbw+ORviln2u0XyHG1kPvvwTNGZY6QpeFwxYaSdbQ== - "react-native-keychain@git+https://github.com/status-im/react-native-keychain.git#v.3.0.0-5-status": version "3.0.0-rc.3" resolved "git+https://github.com/status-im/react-native-keychain.git#9b0d9b283116947cf125e12b6d1d17203604f0d9" @@ -6703,27 +6679,36 @@ react-native-linear-gradient@^2.5.6: version "4.0.0" resolved "git+https://github.com/status-im/react-native-mail.git#a5ff17c3e394b5545549fed33883afe4496f127a" -react-native-navigation-bar-color@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/react-native-navigation-bar-color/-/react-native-navigation-bar-color-2.0.1.tgz#ee2be25cc37105f7da355717b0a9a32c9c059ae6" - integrity sha512-1kE/oxWt+HYjRxdZdvke9tJ365xaee5n3+euOQA1En8zQuSbOxiE4SYEGM7TeaWnmLJ0l37mRnPHaB2H4mGh0A== +react-native-navigation@^7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/react-native-navigation/-/react-native-navigation-7.13.0.tgz#3d3d97be1825034effab2a1deb5402a1fe1ba33e" + integrity sha512-/mdNuTlz9YVplJRB7Rv3g5cDgHCtw4RyG6ATdvrIJvMJOCU57ivCHuZkZDI/YQv7Txm48XD/EUkNahFFUATFZg== + dependencies: + hoist-non-react-statics "3.x.x" + lodash "4.17.x" + prop-types "15.x.x" + react-lifecycles-compat "2.0.0" + tslib "1.9.3" react-native-permissions@^2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-2.1.5.tgz#6cfc4f1ab1590f4952299b7cdc9698525ad540e0" integrity sha512-b9KO/4UEV9qddl+kcSybmdk8nlAifclSDBR2rSvc5KZM06vIaJWJNIzK2ZwPXqDQ5yD3CJLuKTRj7Fz+jM9qyQ== -react-native-reanimated@^1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-1.13.0.tgz#1ee5d27d34bd2cee7dfad4ae9a3673300872c917" - integrity sha512-uadP/0QO+4TCsyPSvzRdl+76NPM7Bp8M25KQLB4Hg3tWBMjhrMrETnzNi33L/OPfmhU+7rceyi0QPe/DxKT5bQ== +react-native-reanimated@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-2.1.0.tgz#b9ad04aee490e1e030d0a6cdaa43a14895d9a54d" + integrity sha512-tlPvvcdf+X7HGQ7g/7npBFhwMznfdk7MHUc9gUB/kp2abSscXNe/kOVKlrNEOO4DS11rNOXc+llFxVFMuNk0zA== dependencies: - fbjs "^1.0.0" + "@babel/plugin-transform-object-assign" "^7.10.4" + fbjs "^3.0.0" + mockdate "^3.0.2" + string-hash-64 "^1.0.3" -react-native-redash@^14.2.2: - version "14.2.2" - resolved "https://registry.yarnpkg.com/react-native-redash/-/react-native-redash-14.2.2.tgz#199746ed51b895e58132aa4d6796686d228ea298" - integrity sha512-LOBfh96sSZxVnW0bK8afwRdOHnrqmVS7XlpcmATNiRVTs2cGYF32F0o89+/nMoNY5Ffo2CAoIV5nnsFteYT+PA== +react-native-redash@^16.0.11: + version "16.0.11" + resolved "https://registry.yarnpkg.com/react-native-redash/-/react-native-redash-16.0.11.tgz#973c3050a0645e3b9873790a8e68694770a32f27" + integrity sha512-9yTpeabkAoWASzmhEkynNh1wDTrLVtbE+x9dOV1DI23vRa7k1HI+Y1jOUNOPyRG2ddgHampNq9iHtsLnkK4mtw== dependencies: abs-svg-path "^0.1.1" normalize-svg-path "^1.0.1" @@ -6734,11 +6719,6 @@ react-native-safe-area-context@^2.0.0: resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-2.0.0.tgz#7ef48e5a83a1e2f7fe9d5321493822b6765fd1ab" integrity sha512-5VtCI3Nluzm7QfTcB/3j4YeWqt25QO1u5KTA1jEg1ckJzV19qCZFyHIpCCkS5+VEX+2JEHfdczhCdwE5sPgyEw== -react-native-screens@^2.10.1: - version "2.10.1" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.10.1.tgz#06d22fae87ef0ce51c616c34a199726db1403b95" - integrity sha512-Z2kKSk4AwWRQNCBmTjViuBQK0/Lx0jc25TZptn/2gKYUCOuVRvCekoA26u0Tsb3BIQ8tWDsZW14OwDlFUXW1aw== - react-native-shake@^3.3.1: version "3.4.0" resolved "https://registry.yarnpkg.com/react-native-shake/-/react-native-shake-3.4.0.tgz#3fa8f682651104b39c0b6c199bfa2ab10b36ce28" @@ -7173,7 +7153,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -7379,13 +7359,6 @@ simple-plist@^1.0.0: bplist-parser "0.2.0" plist "^3.0.1" -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - sisteransi@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -7529,11 +7502,6 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -7620,10 +7588,10 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= +string-hash-64@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string-hash-64/-/string-hash-64-1.0.3.tgz#0deb56df58678640db5c479ccbbb597aaa0de322" + integrity sha512-D5OKWKvDhyVWWn2x5Y9b+37NUllks34q1dCDhk/vYcso9fmhs+Tl3KR/gE4v5UNj2UA35cnX4KdVVGkG1deKqw== string-length@^3.1.0: version "3.1.0" @@ -8002,6 +7970,11 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +tslib@1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -8064,9 +8037,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= ua-parser-js@^0.7.18: - version "0.7.21" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" - integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== uglify-es@^3.1.9: version "3.3.9" @@ -8175,7 +8148,7 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use-subscription@^1.0.0, use-subscription@^1.4.0: +use-subscription@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.4.1.tgz#edcbcc220f1adb2dd4fa0b2f61b6cc308e620069" integrity sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ== @@ -8318,7 +8291,12 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: +whatwg-fetch@>=0.10.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==