Compare commits

..
Author SHA1 Message Date
Icaro Motta 3c3eabf2d3 feat(onboarding): Present Terms to users upgrading from v1 (#21124)
We now show the onboarding intro requesting the user to accept the Terms of Use
& Privacy Policy with the new button "Explore the new Status" if the user had
installed any version of Status older than the one from this PR and had at
least one profile.

Fixes https://github.com/status-im/status-mobile/issues/21113

status-go PR https://github.com/status-im/status-go/pull/5766

In practice, this means:

- Users coming from Status v1 who had at least one profile will see the
  modified onboarding intro screen and will need to accept the terms to proceed.
- Users who already installed v2 and are upgrading to this PR build (devs & QAs
  mostly) and who had at least one profile will also see the modified intro
  screen and will need to accept the terms to proceed.

Areas that may be impacted

- Onboarding

Steps to test:

The criteria used during development:

1. Given that user Alice had installed v1 and had one or more profiles.
2. When she installs v2 and opens it, she sees the new onboarding intro and must
   agree to the terms to enable the button "Explore the new Status".
3. After pressing the button, she can login as usual in any of her profiles.

1. Given that user Alice already upgraded from v1 and accepted the terms.
2. When she reopens the app she does not need to accept terms again and can
   immediately sign-in with any of her profiles.

1. Given that user Alice already upgraded from v1 and accepted the terms.
2. When she deletes all profiles, she sees the onboarding intro for users who
   have not upgraded, i.e. she has to agree to terms and she sees the usual two
   buttons "Create profile" and "Sync or recover profile".

1. Given that user Alice never installed Status.
2. When she installs v2, she sees the normal onboarding intro screen, where she
   has to accept the terms and she sees two buttons "Create profile" and "Sync
   or recover profile".
3. When she reopens the app, she doesn't see anymore the screen to accept terms.
2024-08-28 06:45:00 -03:00
124 changed files with 1428 additions and 2180 deletions
+3 -3
View File
@@ -1,8 +1,8 @@
---
name: Bug Report
about: Bug Report
name: MVPBug Report
about: MVPBug Report
title: ''
labels: ['bug', ':1234: low prio']
labels: ['E:Mobile Bug MVP', ':1234: low prio']
assignees: ''
---
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
import groovy.json.JsonBuilder
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
pipeline {
agent { label 'linux' }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
pipeline {
agent { label 'macos' }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
pipeline {
agent { label params.AGENT_LABEL }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
pipeline {
agent { label 'linux' }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.8'
library 'status-jenkins-lib@v1.9.4'
pipeline {
agent {
+5 -5
View File
@@ -907,7 +907,7 @@ PODS:
- React-Core
- react-native-blob-util (0.13.18):
- React-Core
- react-native-blur (4.4.1):
- react-native-blur (4.4.0):
- glog
- RCT-Folly (= 2022.05.16.00)
- React-Core
@@ -1115,7 +1115,7 @@ PODS:
- React-perflogger (= 0.73.5)
- ReactNativeAudioToolkit (2.0.3):
- React
- ReactNativeCameraKit (14.0.0-beta15):
- ReactNativeCameraKit (14.0.0-beta13):
- React-Core
- ReactNativeNavigation (7.39.0):
- HMSegmentedControl
@@ -1485,7 +1485,7 @@ SPEC CHECKSUMS:
FBLazyVector: 56e0e498dbb513b96c40bac6284729ba4e62672d
FBReactNativeSpec: 146c741a3f40361f6bc13a4ba284678cbedb5881
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
glog: 36c15c01d70ed395c6e4f3619f98a23ee415b07a
glog: 530710e7949eb12c82670bd09e946becf50a3c2a
hermes-engine: 1d1835b2cc54c381909d94d1b3c8e0a2f1a94a0e
HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352
Keycard: ac6df4d91525c3c82635ac24d4ddd9a80aca5fc8
@@ -1515,7 +1515,7 @@ SPEC CHECKSUMS:
react-native-background-timer: 1f7d560647b40e6a60b01c452ba29c54bf581fc4
react-native-biometrics: 352e5a794bfffc46a0c86725ea7dc62deb085bdc
react-native-blob-util: 600972b1782380a5a7d5db61a3817ea32349dae9
react-native-blur: b2b140d3d65077a1d5d26be62d9415f895592344
react-native-blur: 799045500f56146afc46245148080e7b7623cb75
react-native-cameraroll: af8eec1e585d053ff485d98ec837f9a8a11b5745
react-native-compat: 3af9add14d349701306d3d052638435f6795ac2c
react-native-config: 5330c8258265c1e5fdb8c009d2cabd6badd96727
@@ -1551,7 +1551,7 @@ SPEC CHECKSUMS:
React-utils: 987a4526a2fc0acdfaf87888adfe0bf9d0452066
ReactCommon: 2947b0bffd82ea0e58ca7928881152d4c6dae9af
ReactNativeAudioToolkit: de9610f323e855ac6574be8c99621f3d57c5df06
ReactNativeCameraKit: 71343efc1256720184ce980f164c7eedb78d5c16
ReactNativeCameraKit: d95d3e19c514526a234d9f93c6db7e7f10eef9ea
ReactNativeNavigation: 679d8c8bf3b8ae98d285bce810964d10da85dbdb
RNCAsyncStorage: c913ede1fa163a71cea118ed4670bbaaa4b511bb
RNCClipboard: 60fed4b71560d7bfe40e9d35dea9762b024da86d
+124 -124
View File
@@ -10,7 +10,7 @@
00E356F31AD99517003FC87E /* StatusImTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* StatusImTests.m */; };
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
22A6156314445AACCFBFE214 /* libPods-Status-StatusImPR.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B65AA8037F445B3B691C9ED /* libPods-Status-StatusImPR.a */; };
231CD38186B86957CFCF645E /* libPods-Status-StatusIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA19658BCC29789EBB3DE79 /* libPods-Status-StatusIm.a */; };
25DC9C9DC25846BD8D084888 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */; };
3870E1E692E24133A80B07DE /* Inter-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 693A62DB37BC4CD5A30E5C96 /* Inter-SemiBold.otf */; };
393D26E3080B443A998F4A2F /* Inter-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = B07176ACDAA1422E8F0A3D6B /* Inter-Italic.otf */; };
@@ -36,16 +36,17 @@
3AAD2AD324A3A60E0075D594 /* Inter-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 693A62DB37BC4CD5A30E5C96 /* Inter-SemiBold.otf */; };
3AAD2AD424A3A60E0075D594 /* Inter-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = A4F2BBE8D4DD4140A6CCAC39 /* Inter-SemiBoldItalic.otf */; };
3ABC7AF8245FF85900612C45 /* InterStatus-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9C76AF5A418D4D65A4CAD1D9 /* InterStatus-Regular.otf */; };
48BD7F7AF5283037BD52E49A /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A04127DCB75F4E318A4EBEDD /* libPods-Status-StatusIm-StatusImTests.a */; };
57C854A7993C47A3B1AECD32 /* Inter-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = C6B1215047604CD59A4C74D6 /* Inter-MediumItalic.otf */; };
65F6941925780A4F00A45E76 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F6941825780A4F00A45E76 /* Bridge.swift */; };
65F6941A25780A4F00A45E76 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F6941825780A4F00A45E76 /* Bridge.swift */; };
65F6941B25780A4F00A45E76 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F6941825780A4F00A45E76 /* Bridge.swift */; };
67A3DF2242D5B6C35A4C6A33 /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A7B7F8B9749AB74BB0697B49 /* libPods-Status-StatusIm-StatusImTests.a */; };
70ADBB5ECF934DCF8A0E4919 /* Inter-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1426DF592BA248FC81D955CB /* Inter-Regular.otf */; };
715D8132290BE850006F5C88 /* UbuntuMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 715D8131290BE850006F5C88 /* UbuntuMono-Regular.ttf */; };
715D8133290BE850006F5C88 /* UbuntuMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 715D8131290BE850006F5C88 /* UbuntuMono-Regular.ttf */; };
74B758FC20D7C00B003343C3 /* launch-image-universal.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 74B758FB20D7C00B003343C3 /* launch-image-universal.storyboard */; };
8391E8E0E93C41A98AAA6631 /* Inter-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = A4F2BBE8D4DD4140A6CCAC39 /* Inter-SemiBoldItalic.otf */; };
A1B6E23C86E6A40AFE74E925 /* libPods-Status-StatusImPR.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E9723BBA39FC5B087C3D475 /* libPods-Status-StatusImPR.a */; };
B24FC7FD1DE7195700D694FF /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7FC1DE7195700D694FF /* Social.framework */; };
B24FC7FF1DE7195F00D694FF /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7FE1DE7195F00D694FF /* MessageUI.framework */; };
B2F2D1BC1D9D531B00B7B453 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2F2D1BB1D9D531B00B7B453 /* Images.xcassets */; };
@@ -58,7 +59,6 @@
C1715FFC29C0BCE80088FA8B /* launch-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = C14C5F9229C0ADB5005C58A7 /* launch-icon.png */; };
CE4E31B31D8695250033ED64 /* Statusgo.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE4E31B21D8695250033ED64 /* Statusgo.xcframework */; };
D1786306E0184916B11F4C37 /* Inter-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = B2A38FC3D3954DE7B2B171F8 /* Inter-Medium.otf */; };
D34A0845D23EC8E3D30E11B1 /* libPods-Status-StatusIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 84687C28206CB8457AF2BE74 /* libPods-Status-StatusIm.a */; };
D84616FB563A48EBB1678699 /* Inter-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CD4A2C27D6D5473184DC1F7E /* Inter-Bold.otf */; };
D99C50E5E18942A39C8DDF61 /* Inter-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = B321D25F4493470980039457 /* Inter-BoldItalic.otf */; };
/* End PBXBuildFile section */
@@ -108,14 +108,14 @@
00E356EE1AD99517003FC87E /* StatusImTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StatusImTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
00E356F21AD99517003FC87E /* StatusImTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StatusImTests.m; sourceTree = "<group>"; };
064C446A8C45E401B63D0B7C /* Pods-Status-StatusIm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.debug.xcconfig"; sourceTree = "<group>"; };
0E9723BBA39FC5B087C3D475 /* libPods-Status-StatusImPR.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusImPR.a"; sourceTree = BUILT_PRODUCTS_DIR; };
13B07F961A680F5B00A75B9A /* StatusIm.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StatusIm.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = StatusIm/AppDelegate.h; sourceTree = "<group>"; };
13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = StatusIm/AppDelegate.mm; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = StatusIm/Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = StatusIm/main.m; sourceTree = "<group>"; };
1426DF592BA248FC81D955CB /* Inter-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-Regular.otf"; path = "../resources/fonts/Inter-Regular.otf"; sourceTree = "<group>"; };
337641435F36F3900FEAA11C /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.release.xcconfig"; sourceTree = "<group>"; };
2F18074BFB7862090B68D75F /* Pods-Status-StatusImPR.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.debug.xcconfig"; sourceTree = "<group>"; };
3A2626CE245C3F2200D5F94B /* Dummy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dummy.swift; sourceTree = "<group>"; };
3A6406FB24A3ADF90046ED37 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3A8F8EA924A4D31600BF206D /* GameKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System/Library/Frameworks/GameKit.framework; sourceTree = SDKROOT; };
@@ -123,37 +123,37 @@
3AB1C3AD245C043900098F67 /* StatusIm-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StatusIm-Bridging-Header.h"; sourceTree = "<group>"; };
4C16DE0B1F89508700AA10DB /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
4E586E1B0E544F64AA9F5BD1 /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
5D2EA2A248267BA083152C22 /* Pods-Status-StatusIm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.release.xcconfig"; sourceTree = "<group>"; };
5DA19658BCC29789EBB3DE79 /* libPods-Status-StatusIm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
65F693BD2578002500A45E76 /* CoreNFC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreNFC.framework; path = System/Library/Frameworks/CoreNFC.framework; sourceTree = SDKROOT; };
65F693BF2578003600A45E76 /* CoreNFC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreNFC.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk/System/iOSSupport/System/Library/Frameworks/CoreNFC.framework; sourceTree = DEVELOPER_DIR; };
65F6941725780A4E00A45E76 /* StatusImTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StatusImTests-Bridging-Header.h"; sourceTree = "<group>"; };
65F6941825780A4F00A45E76 /* Bridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bridge.swift; sourceTree = "<group>"; };
693A62DB37BC4CD5A30E5C96 /* Inter-SemiBold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-SemiBold.otf"; path = "../resources/fonts/Inter-SemiBold.otf"; sourceTree = "<group>"; };
6B65AA8037F445B3B691C9ED /* libPods-Status-StatusImPR.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusImPR.a"; sourceTree = BUILT_PRODUCTS_DIR; };
715D8131290BE850006F5C88 /* UbuntuMono-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "UbuntuMono-Regular.ttf"; path = "../resources/fonts/UbuntuMono-Regular.ttf"; sourceTree = "<group>"; };
74B758FB20D7C00B003343C3 /* launch-image-universal.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "launch-image-universal.storyboard"; sourceTree = "<group>"; };
84687C28206CB8457AF2BE74 /* libPods-Status-StatusIm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
8C0C93A4288955E6949CAFA7 /* Pods-Status-StatusIm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.release.xcconfig"; sourceTree = "<group>"; };
922C4CA61F4D5F8B0033C753 /* StatusIm.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = StatusIm.entitlements; path = StatusIm/StatusIm.entitlements; sourceTree = "<group>"; };
9C76AF5A418D4D65A4CAD1D9 /* InterStatus-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "InterStatus-Regular.otf"; path = "../resources/fonts/InterStatus-Regular.otf"; sourceTree = "<group>"; };
9C8831EF82FB144215B28760 /* Pods-Status-StatusImPR.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.release.xcconfig"; sourceTree = "<group>"; };
9EC0135C1E06FB1900155B5C /* RCTWKWebView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWKWebView.xcodeproj; path = "../node_modules/react-native-wkwebview-reborn/ios/RCTWKWebView.xcodeproj"; sourceTree = "<group>"; };
A04127DCB75F4E318A4EBEDD /* libPods-Status-StatusIm-StatusImTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm-StatusImTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
A4F2BBE8D4DD4140A6CCAC39 /* Inter-SemiBoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-SemiBoldItalic.otf"; path = "../resources/fonts/Inter-SemiBoldItalic.otf"; sourceTree = "<group>"; };
A7B7F8B9749AB74BB0697B49 /* libPods-Status-StatusIm-StatusImTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm-StatusImTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B064AF9CEF590E7140F5193F /* Pods-Status-StatusIm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.debug.xcconfig"; sourceTree = "<group>"; };
B07176ACDAA1422E8F0A3D6B /* Inter-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-Italic.otf"; path = "../resources/fonts/Inter-Italic.otf"; sourceTree = "<group>"; };
B24FC7FC1DE7195700D694FF /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; };
B24FC7FE1DE7195F00D694FF /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };
B2A38FC3D3954DE7B2B171F8 /* Inter-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-Medium.otf"; path = "../resources/fonts/Inter-Medium.otf"; sourceTree = "<group>"; };
B2F2D1BB1D9D531B00B7B453 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = StatusIm/Images.xcassets; sourceTree = "<group>"; };
B321D25F4493470980039457 /* Inter-BoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-BoldItalic.otf"; path = "../resources/fonts/Inter-BoldItalic.otf"; sourceTree = "<group>"; };
C1244846434197B450E92912 /* Pods-Status-StatusImPR.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.debug.xcconfig"; sourceTree = "<group>"; };
C14C5F8C29C0A149005C58A7 /* launch-icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "launch-icon@3x.png"; path = "StatusIm/launch-icon@3x.png"; sourceTree = "<group>"; };
C14C5F9029C0AD9C005C58A7 /* launch-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "launch-icon@2x.png"; path = "StatusIm/launch-icon@2x.png"; sourceTree = "<group>"; };
C14C5F9229C0ADB5005C58A7 /* launch-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "launch-icon.png"; path = "StatusIm/launch-icon.png"; sourceTree = "<group>"; };
C6B1215047604CD59A4C74D6 /* Inter-MediumItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-MediumItalic.otf"; path = "../resources/fonts/Inter-MediumItalic.otf"; sourceTree = "<group>"; };
CD4A2C27D6D5473184DC1F7E /* Inter-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-Bold.otf"; path = "../resources/fonts/Inter-Bold.otf"; sourceTree = "<group>"; };
CE4E31B21D8695250033ED64 /* Statusgo.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Statusgo.xcframework; path = "../modules/react-native-status/ios/RCTStatus/Statusgo.xcframework"; sourceTree = "<group>"; };
E15A67A7A7B33C177372338A /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; sourceTree = "<group>"; };
D1249D8E109F0F96FFE2CA6C /* Pods-Status-StatusImPR.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.release.xcconfig"; sourceTree = "<group>"; };
E089B0F56B6F6715D444A841 /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; sourceTree = "<group>"; };
EAAD01A6F886D961CE1A9541 /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -161,7 +161,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
48BD7F7AF5283037BD52E49A /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */,
67A3DF2242D5B6C35A4C6A33 /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -174,7 +174,7 @@
CE4E31B31D8695250033ED64 /* Statusgo.xcframework in Frameworks */,
25DC9C9DC25846BD8D084888 /* libc++.tbd in Frameworks */,
BA68A2377A20496EA737000D /* libz.tbd in Frameworks */,
D34A0845D23EC8E3D30E11B1 /* libPods-Status-StatusIm.a in Frameworks */,
231CD38186B86957CFCF645E /* libPods-Status-StatusIm.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -188,7 +188,7 @@
3AAD2AC224A3A60E0075D594 /* Statusgo.xcframework in Frameworks */,
3AAD2AC524A3A60E0075D594 /* libc++.tbd in Frameworks */,
3AAD2AC624A3A60E0075D594 /* libz.tbd in Frameworks */,
22A6156314445AACCFBFE214 /* libPods-Status-StatusImPR.a in Frameworks */,
A1B6E23C86E6A40AFE74E925 /* libPods-Status-StatusImPR.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -314,9 +314,9 @@
CE4E31B21D8695250033ED64 /* Statusgo.xcframework */,
8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */,
4E586E1B0E544F64AA9F5BD1 /* libz.tbd */,
84687C28206CB8457AF2BE74 /* libPods-Status-StatusIm.a */,
A04127DCB75F4E318A4EBEDD /* libPods-Status-StatusIm-StatusImTests.a */,
6B65AA8037F445B3B691C9ED /* libPods-Status-StatusImPR.a */,
5DA19658BCC29789EBB3DE79 /* libPods-Status-StatusIm.a */,
A7B7F8B9749AB74BB0697B49 /* libPods-Status-StatusIm-StatusImTests.a */,
0E9723BBA39FC5B087C3D475 /* libPods-Status-StatusImPR.a */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -324,12 +324,12 @@
D0D5C8D06825D33BA2D2121E /* Pods */ = {
isa = PBXGroup;
children = (
064C446A8C45E401B63D0B7C /* Pods-Status-StatusIm.debug.xcconfig */,
8C0C93A4288955E6949CAFA7 /* Pods-Status-StatusIm.release.xcconfig */,
E15A67A7A7B33C177372338A /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */,
337641435F36F3900FEAA11C /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */,
C1244846434197B450E92912 /* Pods-Status-StatusImPR.debug.xcconfig */,
9C8831EF82FB144215B28760 /* Pods-Status-StatusImPR.release.xcconfig */,
B064AF9CEF590E7140F5193F /* Pods-Status-StatusIm.debug.xcconfig */,
5D2EA2A248267BA083152C22 /* Pods-Status-StatusIm.release.xcconfig */,
E089B0F56B6F6715D444A841 /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */,
EAAD01A6F886D961CE1A9541 /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */,
2F18074BFB7862090B68D75F /* Pods-Status-StatusImPR.debug.xcconfig */,
D1249D8E109F0F96FFE2CA6C /* Pods-Status-StatusImPR.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@@ -341,12 +341,12 @@
isa = PBXNativeTarget;
buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "StatusImTests" */;
buildPhases = (
78DBDF1BD1055E83A260EA98 /* [CP] Check Pods Manifest.lock */,
9B331412309D5F5632348AEE /* [CP] Check Pods Manifest.lock */,
00E356EA1AD99517003FC87E /* Sources */,
00E356EB1AD99517003FC87E /* Frameworks */,
00E356EC1AD99517003FC87E /* Resources */,
0564BBB140EB57AD57BEEAEA /* [CP] Embed Pods Frameworks */,
ED9B7873F01EB9B1500CE371 /* [CP] Copy Pods Resources */,
7545D1B37CABFA574D6D6C31 /* [CP] Embed Pods Frameworks */,
A3AD03105488DA5BC8E8C199 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -362,15 +362,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "StatusIm" */;
buildPhases = (
410DB9615D9ED5009FD09DB3 /* [CP] Check Pods Manifest.lock */,
236F25332B0D1B4DCC0E041E /* [CP] Check Pods Manifest.lock */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
20B6B6891D92C42700CC5C6A /* Embed Frameworks */,
E3914A731DF919ED00EBB515 /* Run Script */,
CACB1A448509663CCC23DAD5 /* [CP] Embed Pods Frameworks */,
3CD62FBC6B5F738846AA62DD /* [CP] Copy Pods Resources */,
37D91248C8178FEAC1661AE0 /* [CP] Embed Pods Frameworks */,
BC5CED24C6D00996607C4942 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -385,15 +385,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 3AAD2AD924A3A60E0075D594 /* Build configuration list for PBXNativeTarget "StatusImPR" */;
buildPhases = (
59C011634B62CD4307167A35 /* [CP] Check Pods Manifest.lock */,
D0B7F25508F9BD7C6B30AF36 /* [CP] Check Pods Manifest.lock */,
3AAD2ABB24A3A60E0075D594 /* Sources */,
3AAD2ABF24A3A60E0075D594 /* Frameworks */,
3AAD2AC924A3A60E0075D594 /* Resources */,
3AAD2AD524A3A60E0075D594 /* Bundle React Native code and images */,
3AAD2AD624A3A60E0075D594 /* Embed Frameworks */,
3AAD2AD724A3A60E0075D594 /* Run Script */,
189EFE1146C70E755688AF3D /* [CP] Embed Pods Frameworks */,
B4118C9690A731BE596936B2 /* [CP] Copy Pods Resources */,
5C9736BD9798020B8F31802B /* [CP] Embed Pods Frameworks */,
B76C3637DC2DDBB6E8472904 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -547,31 +547,35 @@
shellPath = "/usr/bin/env sh";
shellScript = "set -o errexit\nexport NODE_BINARY=\"${NODE_BINARY:-node}\"\nexport NODE_ARGS=\"${NODE_ARGS:- --max-old-space-size=16384 }\"\n\n\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n";
};
0564BBB140EB57AD57BEEAEA /* [CP] Embed Pods Frameworks */ = {
236F25332B0D1B4DCC0E041E /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
"$(DERIVED_FILE_DIR)/Pods-Status-StatusIm-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-frameworks.sh\"\n";
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
189EFE1146C70E755688AF3D /* [CP] Embed Pods Frameworks */ = {
37D91248C8178FEAC1661AE0 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-frameworks.sh",
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
);
name = "[CP] Embed Pods Frameworks";
@@ -580,7 +584,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-frameworks.sh\"\n";
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3AAD2AD524A3A60E0075D594 /* Bundle React Native code and images */ = {
@@ -611,75 +615,43 @@
shellPath = "/usr/bin/env sh";
shellScript = "\"${PROJECT_DIR}/scripts/set_xcode_version.sh\" > ../logs/set_xcode_version.log 2>&1\n";
};
3CD62FBC6B5F738846AA62DD /* [CP] Copy Pods Resources */ = {
5C9736BD9798020B8F31802B /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-resources.sh",
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/RNPermissions/RNPermissionsPrivacyInfo.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
);
name = "[CP] Copy Pods Resources";
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNPermissionsPrivacyInfo.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-resources.sh\"\n";
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
410DB9615D9ED5009FD09DB3 /* [CP] Check Pods Manifest.lock */ = {
7545D1B37CABFA574D6D6C31 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Status-StatusIm-checkManifestLockResult.txt",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
59C011634B62CD4307167A35 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Status-StatusImPR-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
78DBDF1BD1055E83A260EA98 /* [CP] Check Pods Manifest.lock */ = {
9B331412309D5F5632348AEE /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -701,7 +673,31 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
B4118C9690A731BE596936B2 /* [CP] Copy Pods Resources */ = {
A3AD03105488DA5BC8E8C199 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-resources.sh",
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/RNPermissions/RNPermissionsPrivacyInfo.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNPermissionsPrivacyInfo.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
B76C3637DC2DDBB6E8472904 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -725,22 +721,50 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-resources.sh\"\n";
showEnvVarsInLog = 0;
};
CACB1A448509663CCC23DAD5 /* [CP] Embed Pods Frameworks */ = {
BC5CED24C6D00996607C4942 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-resources.sh",
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/RNPermissions/RNPermissionsPrivacyInfo.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
);
name = "[CP] Embed Pods Frameworks";
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNPermissionsPrivacyInfo.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-frameworks.sh\"\n";
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-resources.sh\"\n";
showEnvVarsInLog = 0;
};
D0B7F25508F9BD7C6B30AF36 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Status-StatusImPR-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
E3914A731DF919ED00EBB515 /* Run Script */ = {
@@ -757,30 +781,6 @@
shellPath = "/usr/bin/env sh";
shellScript = "\"${PROJECT_DIR}/scripts/set_xcode_version.sh\" > ../logs/set_xcode_version.log 2>&1\n";
};
ED9B7873F01EB9B1500CE371 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-resources.sh",
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/RNPermissions/RNPermissionsPrivacyInfo.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNPermissionsPrivacyInfo.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -828,7 +828,7 @@
/* Begin XCBuildConfiguration section */
00E356F61AD99517003FC87E /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = E15A67A7A7B33C177372338A /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */;
baseConfigurationReference = E089B0F56B6F6715D444A841 /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_ID_SUFFIX = .debug;
@@ -865,7 +865,7 @@
};
00E356F71AD99517003FC87E /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 337641435F36F3900FEAA11C /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */;
baseConfigurationReference = EAAD01A6F886D961CE1A9541 /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_ID_SUFFIX = "";
@@ -898,7 +898,7 @@
};
13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 064C446A8C45E401B63D0B7C /* Pods-Status-StatusIm.debug.xcconfig */;
baseConfigurationReference = B064AF9CEF590E7140F5193F /* Pods-Status-StatusIm.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)";
BUNDLE_ID_SUFFIX = .debug;
@@ -980,7 +980,7 @@
};
13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 8C0C93A4288955E6949CAFA7 /* Pods-Status-StatusIm.release.xcconfig */;
baseConfigurationReference = 5D2EA2A248267BA083152C22 /* Pods-Status-StatusIm.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)";
BUNDLE_ID_SUFFIX = "";
@@ -1055,7 +1055,7 @@
};
3AAD2ADA24A3A60E0075D594 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C1244846434197B450E92912 /* Pods-Status-StatusImPR.debug.xcconfig */;
baseConfigurationReference = 2F18074BFB7862090B68D75F /* Pods-Status-StatusImPR.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)";
BUNDLE_ID_SUFFIX = .debug;
@@ -1135,7 +1135,7 @@
};
3AAD2ADB24A3A60E0075D594 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9C8831EF82FB144215B28760 /* Pods-Status-StatusImPR.release.xcconfig */;
baseConfigurationReference = D1249D8E109F0F96FFE2CA6C /* Pods-Status-StatusImPR.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIconPR$(BUNDLE_ID_SUFFIX)";
BUNDLE_ID_SUFFIX = "";
@@ -253,6 +253,11 @@ class AccountManager(private val reactContext: ReactApplicationContext) : ReactC
utils.executeRunnableStatusGoMethod({ Statusgo.initializeApplication(request) }, callback)
}
@ReactMethod
private fun acceptTerms(callback: Callback) {
Log.d(TAG, "acceptTerms")
utils.executeRunnableStatusGoMethod({ Statusgo.acceptTerms() }, callback)
}
@ReactMethod
fun logout() {
@@ -204,6 +204,14 @@ RCT_EXPORT_METHOD(initializeApplication:(NSString *)request
callback(@[result]);
}
RCT_EXPORT_METHOD(acceptTerms:(RCTResponseSenderBlock)callback) {
#if DEBUG
NSLog(@"acceptTerms() method called");
#endif
NSString *result = StatusgoAcceptTerms();
callback(@[result]);
}
RCT_EXPORT_METHOD(openAccounts:(RCTResponseSenderBlock)callback) {
#if DEBUG
NSLog(@"OpenAccounts() method called");
@@ -761,6 +761,26 @@ void _Logout(const FunctionCallbackInfo<Value>& args) {
}
void _AcceptTerms(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
if (args.Length() != 0) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8Literal(isolate, "Wrong number of arguments for AcceptTerms")));
return;
}
// Check the argument types
// Call exported Go function, which returns a C string
char *c = AcceptTerms();
Local<String> ret = String::NewFromUtf8(isolate, c).ToLocalChecked();
args.GetReturnValue().Set(ret);
delete c;
}
void _HashMessage(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<Context> context = isolate->GetCurrentContext();
@@ -1998,6 +2018,7 @@ void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "multiAccountStoreAccount", _MultiAccountStoreAccount);
NODE_SET_METHOD(exports, "initKeystore", _InitKeystore);
NODE_SET_METHOD(exports, "initializeApplication", _InitializeApplication);
NODE_SET_METHOD(exports, "acceptTerms", _AcceptTerms);
NODE_SET_METHOD(exports, "fleets", _Fleets);
NODE_SET_METHOD(exports, "stopCPUProfiling", _StopCPUProfiling);
NODE_SET_METHOD(exports, "encodeTransfer", _EncodeTransfer);
+193 -215
View File
@@ -7827,16 +7827,16 @@
},
{
"path": "com/github/Dimezis/BlurView/version-2.0.4",
"path": "com/github/Dimezis/BlurView/version-2.0.3",
"repo": "https://jitpack.io",
"files": {
"BlurView-version-2.0.4.pom": {
"sha1": "48eab3169b9a4ee3167ed1ed5f9c35135e9e4dad",
"sha256": "sha256-DjaiZmuM2CoTmZ4C+6HnNcsjc31ZYaWZSv6A0SCmmjk="
"BlurView-version-2.0.3.pom": {
"sha1": "678c8558151c1f1f37ab3e5e8baf00f1306ab6f5",
"sha256": "sha256-mgYP/aKUkj/GVVA6AxQhH1NTO0Ssv430blX/wYmImtI="
},
"BlurView-version-2.0.4.aar": {
"sha1": "c7d8a6464a50b430b01ce1a25f7949b75ba359b8",
"sha256": "sha256-w+KXiNSn0WoszuUpcxIp/M162Z+4vB30FeFvWKd1mcg="
"BlurView-version-2.0.3.aar": {
"sha1": "1a6b90b3dbd0714e0f9fd3a09196072c7da300a0",
"sha256": "sha256-BuP74/LeQ+ID03WYU0m76TIRNGG0fi4ZM+In6RPQ66E="
}
}
},
@@ -8169,20 +8169,20 @@
},
{
"path": "commons-logging/commons-logging/1.3.4",
"path": "commons-logging/commons-logging/1.3.3",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"commons-logging-1.3.4.pom": {
"sha1": "e919eab34a66d31a9bbe15ddc563d7d2e6770826",
"sha256": "sha256-1L2jSJKqzL9PrTP8MjqKqQfvnXmYRlnaJJRMCoa/CGU="
"commons-logging-1.3.3.pom": {
"sha1": "c5b1495adcb6d090cc4d333bb20e0583e716dd3d",
"sha256": "sha256-El1hQurD93REC6cCwF8o+eCYxS0QcSrhFJast3EGs7o="
},
"commons-logging-1.3.4-api.jar": {
"sha1": "de4050262dfa7522365a9e3c76ed8cf4683fcffa",
"sha256": "sha256-X1zVkiUzQHDbaxctBaaFuEei+tY+WxjtAjqqpeErgh8="
"commons-logging-1.3.3-api.jar": {
"sha1": "37cf34db3776550d413a8a0647937a2f38a017d4",
"sha256": "sha256-rgQB93pp8ZBAvucmTyrKilQEej0ALtAy2SAK9+beyaE="
},
"commons-logging-1.3.4.jar": {
"sha1": "b9fc14968d63a8b8a8a2c1885fe3e90564239708",
"sha256": "sha256-vC3+MvHvBlCeagZRRMGt97Qg6r8RqH8wvRJ/j6ozIBY="
"commons-logging-1.3.3.jar": {
"sha1": "580ad1a4f34876c4f964c083361de31b3d60be68",
"sha256": "sha256-WCj5bAnYhvmxoJk8eASyfPT87IU0UXFk9RN6yLZ+qbk="
}
}
},
@@ -11249,16 +11249,16 @@
},
{
"path": "com/google/errorprone/error_prone_annotations/2.31.0",
"path": "com/google/errorprone/error_prone_annotations/2.29.2",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"error_prone_annotations-2.31.0.pom": {
"sha1": "6dcb31c7f3a4d987eb16c774050af00a3fbe0e25",
"sha256": "sha256-eF8uQKPgiapy2Mi8dYqkht3nYyh5R0PzHMWxzsyboQI="
"error_prone_annotations-2.29.2.pom": {
"sha1": "cfee55ebd44b9c9e37fdcff10480534efb6d2c7f",
"sha256": "sha256-kTQi309RAUHmSkGaqK7Tz223itOMacz9Yk0H14HhHOg="
},
"error_prone_annotations-2.31.0.jar": {
"sha1": "c3ba307b915d6d506e98ffbb49e6d2d12edad65b",
"sha256": "sha256-uo0g+x/BgWclUrMj88dUmzC+HVfEndWDXicp52R9nPo="
"error_prone_annotations-2.29.2.jar": {
"sha1": "23bbed35f2d071c8507984834e3e6438c7fee7d2",
"sha256": "sha256-4KQmskSa8jI8+1Obcp5b5vTWXHIHXJt7GMjofmOsRow="
}
}
},
@@ -11396,12 +11396,12 @@
},
{
"path": "com/google/errorprone/error_prone_parent/2.31.0",
"path": "com/google/errorprone/error_prone_parent/2.29.2",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"error_prone_parent-2.31.0.pom": {
"sha1": "2b0940b07047f8a2cdbd5f66305c89543d220b6d",
"sha256": "sha256-b/rV7o16qMAvSMNw+XGL4NThyZJnRodJZOo5eQb403Y="
"error_prone_parent-2.29.2.pom": {
"sha1": "ca40178525396238286615831558689d408ae77a",
"sha256": "sha256-kplMj0wsSDM2GENtNmOQNGyqLtt26WAAy96sp+ISTNI="
}
}
},
@@ -11595,27 +11595,27 @@
},
{
"path": "com/google/guava/guava-parent/33.3.0-jre",
"path": "com/google/guava/guava-parent/33.2.1-jre",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"guava-parent-33.3.0-jre.pom": {
"sha1": "24b614a34a06ced7c0fba8f4314c0e2d25bc75d6",
"sha256": "sha256-tGueFpaKrkokgTgA9nduyJEYjXvQCXpIqfSgyW1oUQg="
"guava-parent-33.2.1-jre.pom": {
"sha1": "fc55955fab23e86fad230acc81bf570deb5660bd",
"sha256": "sha256-kJX22O43ZZUCB1EHhYMMwigOeBBnkV+pnP4XQNSGXBQ="
}
}
},
{
"path": "com/google/guava/guava-testlib/33.3.0-jre",
"path": "com/google/guava/guava-testlib/33.2.1-jre",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"guava-testlib-33.3.0-jre.pom": {
"sha1": "5f3de794ff17706477e4b0f9a7e66c06d417eded",
"sha256": "sha256-lZrMVGkZCDw1CP/b5UotvUgT0Ly6Ox+PXr4m6CPc9F0="
"guava-testlib-33.2.1-jre.pom": {
"sha1": "3b95376190925f23c89d9f2f990f2eb0bab9d2b2",
"sha256": "sha256-ZAiayFTlu6dVYLw9PB/dPqQ1cpFXJvYMgjcsq/qnTuQ="
},
"guava-testlib-33.3.0-jre.jar": {
"sha1": "e4b14a9d25332bcd3130147741d1033e9c17577b",
"sha256": "sha256-YtAKfjK838Va9k2pU7alaBdNud2l17XP5p6Xi+lWFC8="
"guava-testlib-33.2.1-jre.jar": {
"sha1": "ba7d569795211c283c4576d17528534a618a5d59",
"sha256": "sha256-XsFBByZYQk9AzTC5FGf1zmPA5he5Hskn33JW79/S2Eo="
}
}
},
@@ -11801,20 +11801,20 @@
},
{
"path": "com/google/guava/guava/33.3.0-jre",
"path": "com/google/guava/guava/33.2.1-jre",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"guava-33.3.0-jre.pom": {
"sha1": "7ccfd20558d84416c3c0385e569d116a45202269",
"sha256": "sha256-08vQUY6vq2qXi7bKP/mDM93+c2eEtr/cSZVD8MlyP4Q="
"guava-33.2.1-jre.pom": {
"sha1": "5f72123f1bb7d99af8b4a67745fb8309b73a6294",
"sha256": "sha256-QoF73BwMjHN9a0Ec+vSoR2nn0nHoebAW/QhQJIoG2rU="
},
"guava-33.3.0-jre.jar": {
"sha1": "13b4d0924e6023eda04b4c7aa83b32dfedf735a7",
"sha256": "sha256-363DvOMQHv8UUqrkfXyDP+5EO0e9+e8TMRtsfKtmPd8="
"guava-33.2.1-jre.jar": {
"sha1": "818e780da2c66c63bbb6480fef1f3855eeafa3e4",
"sha256": "sha256-RSstl4e302b6jPXtmhxAQEVC0F7/p6WY2gO7u7dtnzE="
},
"guava-33.3.0-jre.module": {
"sha1": "cbecd20bbaeca674a8147adf68dfa89a6a787ce4",
"sha256": "sha256-1WIerA4Z7qfdIY6zVMRyY+fuaT6d47rSUFS3BGSd6xw="
"guava-33.2.1-jre.module": {
"sha1": "35b3a43a28bf269178f01d7097263d9ef95cac8b",
"sha256": "sha256-0j7aahwsC9JfijNGzd7sQ7Ufdb+Bm5MeqpgybqZEdCI="
}
}
},
@@ -11987,12 +11987,12 @@
},
{
"path": "com/google/protobuf/protobuf-bom/4.28.0",
"path": "com/google/protobuf/protobuf-bom/4.28.0-RC1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"protobuf-bom-4.28.0.pom": {
"sha1": "5bf7899c5c7379d943a8dfe0d3dc3050bd355937",
"sha256": "sha256-/IKQtwylLUdGnrkDiZIxq4AErHriK7Y9liy4pMKN+yI="
"protobuf-bom-4.28.0-RC1.pom": {
"sha1": "4dd88f5b489f6b1bb9a8db169ea31d66464d68a0",
"sha256": "sha256-mDFWhesHjFhmjSZ0NCqMd2emZECyz09XbTE0RgUhsZU="
}
}
},
@@ -12238,16 +12238,16 @@
},
{
"path": "com/google/protobuf/protobuf-java/4.28.0",
"path": "com/google/protobuf/protobuf-java/4.28.0-RC1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"protobuf-java-4.28.0.pom": {
"sha1": "3a5c745b6559c8390f3675c82a7930be4ae56218",
"sha256": "sha256-HcGj/bW9SsaySg0sG5ur3MYAVd3SgY/6KTpbHBXVDZE="
"protobuf-java-4.28.0-RC1.pom": {
"sha1": "abb2a5ec826f29096389ee99365dba30c588c1d0",
"sha256": "sha256-3fQIOV7ElhjT1+SsDhRTXZZZYp7HGdC29kbIB/PKHXk="
},
"protobuf-java-4.28.0.jar": {
"sha1": "8b7f76d4c3179132637581aad5fb8207c992943a",
"sha256": "sha256-rSOIR3s7lplCQeZHMaE2iU3J/tbeufJ21ISosXGxRQw="
"protobuf-java-4.28.0-RC1.jar": {
"sha1": "a7155c9ba741e2fbe3bfcd1ee5f01c2b220ee52b",
"sha256": "sha256-dJDPv1YH7q/TIA4ahs+mlZU8hJ1Mz2EsxlVTUT1oXGI="
}
}
},
@@ -12367,12 +12367,12 @@
},
{
"path": "com/google/protobuf/protobuf-parent/4.28.0",
"path": "com/google/protobuf/protobuf-parent/4.28.0-RC1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"protobuf-parent-4.28.0.pom": {
"sha1": "73d01263876ac4882426dfedb3f800feff999ad2",
"sha256": "sha256-86/a3a2isVeXySHBmyFehgbJ/doc6r+ws1xPwrxjEKE="
"protobuf-parent-4.28.0-RC1.pom": {
"sha1": "f026cdea76c72c34f2a7d2f8fb8874659bc6f18a",
"sha256": "sha256-7/Ndud7DbgafiR9Gw40TdRreYRjwzqR3P/ITBAF7+bw="
}
}
},
@@ -14322,16 +14322,16 @@
},
{
"path": "io/netty/netty-tcnative-classes/2.0.66.Final",
"path": "io/netty/netty-tcnative-classes/2.0.65.Final",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"netty-tcnative-classes-2.0.66.Final.pom": {
"sha1": "75dca372aa373fac57023721582360f84c79e44c",
"sha256": "sha256-SULNAuKRbB+094zKiEHw9yGbuQ+CirdImokCfC76kes="
"netty-tcnative-classes-2.0.65.Final.pom": {
"sha1": "bd8a6acaadbcb7b0beed1459e630fd46ee6c029d",
"sha256": "sha256-Vckic4c3c+lUvHjpJnvPGIr5Mz9Idi2GKMm9mawVy2Q="
},
"netty-tcnative-classes-2.0.66.Final.jar": {
"sha1": "9588bd2f891157538a78d86c945aa34bf9308dda",
"sha256": "sha256-ZpqBGhk9wefJ74bLVHpKuS8PNMzo+bhCuQKb9c+gfMU="
"netty-tcnative-classes-2.0.65.Final.jar": {
"sha1": "3a7aecd4bcaf75c7b0b02c26ea6ceacf3e8f5f4d",
"sha256": "sha256-hO8CQa2htO2SeF4QwW7b6wYzSJWaOw73QHErrdCfoSg="
}
}
},
@@ -14348,12 +14348,12 @@
},
{
"path": "io/netty/netty-tcnative-parent/2.0.66.Final",
"path": "io/netty/netty-tcnative-parent/2.0.65.Final",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"netty-tcnative-parent-2.0.66.Final.pom": {
"sha1": "91784588e56a54734c698f08118b4f3b94a58ec1",
"sha256": "sha256-KwF/s8He6rXR6uvsE0ZZt96ueMFNXr/D1JwLMITqc2U="
"netty-tcnative-parent-2.0.65.Final.pom": {
"sha1": "a02a4d4968be1e5bce30e178be6d3360afcee916",
"sha256": "sha256-KqThVEhalgFdM81wRayS86Znkbt3uQVAMLoupdmufeY="
}
}
},
@@ -14816,16 +14816,16 @@
},
{
"path": "net/bytebuddy/byte-buddy-agent/1.15.0",
"path": "net/bytebuddy/byte-buddy-agent/1.14.15",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-agent-1.15.0.pom": {
"sha1": "d531511349a70f14bd389df3a934b7c8192db809",
"sha256": "sha256-S4Q27/woLIRlbTEbO9aeFGPROSRw8rZ0tBsQ4oIDL40="
"byte-buddy-agent-1.14.15.pom": {
"sha1": "38dc80ceffcc2eb5a333a91178e2b604d79acc4c",
"sha256": "sha256-bSndpffrUMo7o7ChKu9RjMVtgjSjNEKl+pgrS0SAJl4="
},
"byte-buddy-agent-1.15.0.jar": {
"sha1": "e32740c43acebaac9d55b86399ecf6a5df3c17fb",
"sha256": "sha256-M5mg/fe6PxOG6/gxpwYDdCjxsa+B1lPCXPio/eLk0uo="
"byte-buddy-agent-1.14.15.jar": {
"sha1": "0b4cc9d88d5de562bf75b3a54ab436ad01b3f72d",
"sha256": "sha256-PvbscXWAE2EXAGfMaQKWn5ZtN8cr+TU9nNKCJjsYQGQ="
}
}
},
@@ -14853,23 +14853,23 @@
},
{
"path": "net/bytebuddy/byte-buddy-parent/1.14.18",
"path": "net/bytebuddy/byte-buddy-parent/1.14.15",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-parent-1.14.18.pom": {
"sha1": "6b0b1f08e2d2d8166176c80fd22ee3198a26a3cf",
"sha256": "sha256-dpxdCxEV5z9oRSu6qjVrrZtzfV/ge4PUyeSDl1uB/jw="
"byte-buddy-parent-1.14.15.pom": {
"sha1": "41a33be695a3bbf89c995e2d53433f4cbaa3ac81",
"sha256": "sha256-JurvCGUf+li6KQCSzjKBeC4pwGKKG3n6WjeE+Qi0GKw="
}
}
},
{
"path": "net/bytebuddy/byte-buddy-parent/1.15.0",
"path": "net/bytebuddy/byte-buddy-parent/1.14.17",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-parent-1.15.0.pom": {
"sha1": "c626fc5c3eedf76a2bf10d736641de1953ba9638",
"sha256": "sha256-jsJH4HfN925yrSuZGVds8qR3gRk1tWyKJ5WOcpe08Ys="
"byte-buddy-parent-1.14.17.pom": {
"sha1": "c4c18b6ee78934ded11c060ca0dcbfffafa76105",
"sha256": "sha256-BuV7Xpn99O82iv/SNmF5CyO/MtLQE7vAjWjUNFAG9YI="
}
}
},
@@ -14905,31 +14905,31 @@
},
{
"path": "net/bytebuddy/byte-buddy/1.14.18",
"path": "net/bytebuddy/byte-buddy/1.14.15",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-1.14.18.pom": {
"sha1": "5f889814c247762909c7007bdf5ef72f2e7cea7a",
"sha256": "sha256-IvsZB4/nBkirYFSSZscUaZaEciaqbm9+iP7MCBRySTk="
"byte-buddy-1.14.15.pom": {
"sha1": "95fc2fd8a131fad0706f51d6b573ece01763572c",
"sha256": "sha256-1WOfj+J86tM+akx4n62OZfMo9iu3na0r3XrmzJO5RUw="
},
"byte-buddy-1.14.18.jar": {
"sha1": "0081e9b9a20944626e6757b5950676af901c2485",
"sha256": "sha256-UhF68WlqU6p3wTE1MHStolzL3y31EfKvM/rWcE+pUQQ="
"byte-buddy-1.14.15.jar": {
"sha1": "11c9440bc7f9468761e5a82778a05205169d49a9",
"sha256": "sha256-dHLjlhmSwSqf1PbWfCHeQoCr4Y8pJwTdSdczgon4rPU="
}
}
},
{
"path": "net/bytebuddy/byte-buddy/1.15.0",
"path": "net/bytebuddy/byte-buddy/1.14.17",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"byte-buddy-1.15.0.pom": {
"sha1": "6cac0a8c84a08406c584e90f2cfcef0bfce9d444",
"sha256": "sha256-7U0nIWQBxctujxbAn7/UYGebkMQ6Az2NDnsR5Fz7Tlg="
"byte-buddy-1.14.17.pom": {
"sha1": "0ec01a78f3832e5116bdb7b702cc30239df9832c",
"sha256": "sha256-7bLCWR4YBeoRfZojYVWGzGMh0lDokqnTRNwJ1aIr0T4="
},
"byte-buddy-1.15.0.jar": {
"sha1": "a5b1159b91c5334015de0f22ab4b1188cd42bbff",
"sha256": "sha256-x0PPtNsebGevYpf74yo62UcQiEzeTH7ssbrX2CDU8ro="
"byte-buddy-1.14.17.jar": {
"sha1": "a8d08f3c1e75ecc7f38a8cfd7e9fa47919096373",
"sha256": "sha256-zej4+OB7/zaUqs4NmUS6dVZlpYOwXZFT1BBiKF6aimE="
}
}
},
@@ -15256,27 +15256,27 @@
},
{
"path": "org/antlr/antlr4-master/4.13.2",
"path": "org/antlr/antlr4-master/4.13.1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"antlr4-master-4.13.2.pom": {
"sha1": "c16aa4679ed71d485c700238d9b4730dd3d5e82e",
"sha256": "sha256-Ct2gJmhYc/ZRNgF4v/xEbO7kgzCBc5466dbo8H6NkCo="
"antlr4-master-4.13.1.pom": {
"sha1": "bbbe6ef89c12fbfb3fde78ac5c190adebbfed6ea",
"sha256": "sha256-28/JebgFKPwMtFP8to28nSsGA6e+LNzpmrL8aHFGnRg="
}
}
},
{
"path": "org/antlr/antlr4-runtime/4.13.2",
"path": "org/antlr/antlr4-runtime/4.13.1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"antlr4-runtime-4.13.2.pom": {
"sha1": "d07a9559966ddaa848df4dd2099f15ceaab173ca",
"sha256": "sha256-A84HonlsURsMlNwU/YbM3W44KMV5Z60jg94wTg0Runk="
"antlr4-runtime-4.13.1.pom": {
"sha1": "4ca08d3d1a1f5cb989858cde922f40acf129e9ac",
"sha256": "sha256-GSJrF7+jj5nqImsi6XQg4qjt4JqXQg+xrPGG2a2kZXE="
},
"antlr4-runtime-4.13.2.jar": {
"sha1": "fc3db6d844df652a3d5db31c87fa12757f13691d",
"sha256": "sha256-3T6KE6LWab+E+42DTeNc5IdfJxV2mNIGJB7ISIqtyvc="
"antlr4-runtime-4.13.1.jar": {
"sha1": "17125bae1d965624e265ef49552f6465a2bfa307",
"sha256": "sha256-VGZdKDjMZkWDQ0aO/FOeRU/JW0aooEsTxqxD/JvmNQU="
}
}
},
@@ -15529,17 +15529,6 @@
}
},
{
"path": "org/apache/apache/33",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"apache-33.pom": {
"sha1": "f7b7b5a9e84395f17d7e6a136e5bfc4b9973566d",
"sha256": "sha256-14vYUkxfg4ChkKZSVoZimpXf5RLfIRETg6bYwJI6RBU="
}
}
},
{
"path": "org/apache/commons/commons-compress/1.8.1",
"repo": "https://repo.maven.apache.org/maven2",
@@ -15784,17 +15773,6 @@
}
},
{
"path": "org/apache/commons/commons-parent/72",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"commons-parent-72.pom": {
"sha1": "cdfbaff82e756be4cb74d3f09b8fbf8f6b06c79d",
"sha256": "sha256-Q0Xev8dnsa6saKvdcvxn0YtSHUs5A3KhG2P/DFhrIyA="
}
}
},
{
"path": "org/apache/httpcomponents/httpclient/4.1.1",
"repo": "https://repo.maven.apache.org/maven2",
@@ -16530,20 +16508,20 @@
},
{
"path": "org/checkerframework/checker-qual/3.46.0",
"path": "org/checkerframework/checker-qual/3.45.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"checker-qual-3.46.0.pom": {
"sha1": "023fdbd16acb7971828aaa6938b7d2d224e188f0",
"sha256": "sha256-p4dUUeMHmg2EH0WWOeaRpSkx+js+dFHYjzBxbvjNiEs="
"checker-qual-3.45.0.pom": {
"sha1": "90e7617dce895b07c6fe15397cca094f7d35a715",
"sha256": "sha256-6vn2Le5avMuaKZkVyz1YKpOBUAB4+FeZOO3hH3I2FXQ="
},
"checker-qual-3.46.0.jar": {
"sha1": "829954afc56f1737a1df3ab5aa889de574b97cc4",
"sha256": "sha256-S8d6FyJ5MEw/NQRda5yEkngPBH5a2ZGdd0McrynkRAE="
"checker-qual-3.45.0.jar": {
"sha1": "f59fc9e26caad509272d2e2ffbaf275cbc0dd9eb",
"sha256": "sha256-MD7T1T7EEsVJyE+Iun+0Jd5RyIdspi3fVLJu7EPVtEM="
},
"checker-qual-3.46.0.module": {
"sha1": "d3a39af168be2cc83d9023b723e56f0c51c9e066",
"sha256": "sha256-HrKvP0T95kPuHZ9B1Of8hTLqahFKRqgiqX9tji/UWvU="
"checker-qual-3.45.0.module": {
"sha1": "20431fb8b16c7c376df7354b4ae77c3cf36dc7c7",
"sha256": "sha256-vY6PlipqhNL39OPF6EnKbP+wmGggEXc2oiqLo33he+I="
}
}
},
@@ -16879,27 +16857,27 @@
},
{
"path": "org/easymock/easymock-parent/5.4.0",
"path": "org/easymock/easymock-parent/5.3.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"easymock-parent-5.4.0.pom": {
"sha1": "ac49fe5a7d9cfec46d7386f713c5cd5c5afed89f",
"sha256": "sha256-sKGUgoX4OZNIqWxgWTXYJVCnVKTDNfw0SfogL74qAnI="
"easymock-parent-5.3.0.pom": {
"sha1": "cb3dbc3dde07db5aed51fe830d3286337d1617d0",
"sha256": "sha256-rbgEijCk2xLHbuG2xXBxah737kpHxnYzUJuFWv6IzYQ="
}
}
},
{
"path": "org/easymock/easymock/5.4.0",
"path": "org/easymock/easymock/5.3.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"easymock-5.4.0.pom": {
"sha1": "d566a45d12ee304ab0fba3877ebd93ef64469ea8",
"sha256": "sha256-v/kNdi/BrWVB5jCrgeBzJPVflbd5BhE6NKpnqn2HPhk="
"easymock-5.3.0.pom": {
"sha1": "425f58fb29b86ca6412e9a698e9d82ef32d84c57",
"sha256": "sha256-7CsgHpoQXW2uXVjfJE8eDAENPUBMxP/QV7QZ75SQGoU="
},
"easymock-5.4.0.jar": {
"sha1": "eb56bad81c203765f4a5c74aed28142fb0d79354",
"sha256": "sha256-SDUEf+QbVDSRB8EaGEuhIvo8P8cIQHU0ZfdCtJ5+A6M="
"easymock-5.3.0.jar": {
"sha1": "7bac0b4bbd84f49f9bcd8485281b5e52da081fa4",
"sha256": "sha256-31WHJ9p9nYfRGXmyxMZ0gMjvti4uQOEcNScXuYF6fz8="
}
}
},
@@ -17299,20 +17277,20 @@
},
{
"path": "org/hamcrest/hamcrest-core/3.0",
"path": "org/hamcrest/hamcrest-core/3.0-rc1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"hamcrest-core-3.0.pom": {
"sha1": "e419abe63f1e41cb1aa41225f0bb532b2c6e6e1a",
"sha256": "sha256-1kyZW1baUn0+fhhmuRkNmL0QuYanfYET7EVQeZ44WqQ="
"hamcrest-core-3.0-rc1.pom": {
"sha1": "b4531f7e332db9adf6875d6d108788b26ea94c00",
"sha256": "sha256-wvfzg1qjfGTIAkKZ95WkWpoVAXkaLhaxZK1T8tqh6f0="
},
"hamcrest-core-3.0.jar": {
"sha1": "254f69f4b0ca22198acfc19fcdd5f96140431c3e",
"sha256": "sha256-t4o6gWkvQhzAH8F97ZpF6ftvOUnHEvjsTQHaa4wGvG4="
"hamcrest-core-3.0-rc1.jar": {
"sha1": "1eff1caea3852bfa392af907b5ad2d08c7ce818d",
"sha256": "sha256-gpIUbmwtFqZy0ZvJ9WK4T6bZ9P4/mjHYKfU07fg9fbs="
},
"hamcrest-core-3.0.module": {
"sha1": "796d1cd3d6308a0d7338827644448450dd9b12f0",
"sha256": "sha256-gweKVn1bT3j27cznGvQfDnRjmIELze3N/QLiRVe8mmA="
"hamcrest-core-3.0-rc1.module": {
"sha1": "9a3cf013361bcafdd05c2f17cdc2459edebd46a5",
"sha256": "sha256-Hwn9JWdIE/1jePtplnM8gZkuqbpyQNWEVm+Jkw1YTvU="
}
}
},
@@ -17344,20 +17322,20 @@
},
{
"path": "org/hamcrest/hamcrest/3.0",
"path": "org/hamcrest/hamcrest/3.0-rc1",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"hamcrest-3.0.pom": {
"sha1": "3c85240a040ddb51dc33d405ef0e075ec68b6796",
"sha256": "sha256-SgSmgTO/MkYfR7ilPI7p30zi9JoNrZeUvOhxe+5brDE="
"hamcrest-3.0-rc1.pom": {
"sha1": "42a2310ee499db82c55272fa2673ca420bf6bf51",
"sha256": "sha256-EzeZrRqcWysG8kW0swHh2DXnoEftQMt84a8hNLBblF4="
},
"hamcrest-3.0.jar": {
"sha1": "8fd9b78a8e6a6510a078a9e30e9e86a6035cfaf7",
"sha256": "sha256-XWa2pKaAdVy27XyxBPp4Ne9kRmdYb/Bzet65d8Oezbw="
"hamcrest-3.0-rc1.jar": {
"sha1": "14b0b8ef4b05961db5086455c271786a3ec5c815",
"sha256": "sha256-T0y5BrRrhrj071Ej9+oVwjT+w+WgGWUwdhrNptOkK5k="
},
"hamcrest-3.0.module": {
"sha1": "ac51ee99de2e24e2776e9a76e49040b570811dd9",
"sha256": "sha256-mhBVNzjTWME+a69Zeb8sGlSQ7uScLcas8xcPzKCSDd4="
"hamcrest-3.0-rc1.module": {
"sha1": "798ea5bc678a0e450346bc3688d18e998b3cce21",
"sha256": "sha256-hTxz0hjDvK1uEcdyDoCmWg/TCDkL0qlgIw6G3HR/Pkw="
}
}
},
@@ -19100,16 +19078,16 @@
},
{
"path": "org/jetbrains/kotlin/kotlin-reflect/2.0.20",
"path": "org/jetbrains/kotlin/kotlin-reflect/2.0.20-Beta2",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"kotlin-reflect-2.0.20.pom": {
"sha1": "bab129c9fe9e1c24833fa9967b3adeb6f147c1cb",
"sha256": "sha256-Y+Y4sFbdRJ5vUtcenCxdxdsNFkRDI5cOFtf8DWWDk9s="
"kotlin-reflect-2.0.20-Beta2.pom": {
"sha1": "dcba731c793650645246528ced61eaefbfb3d6fb",
"sha256": "sha256-oeGGbrRW4hL/svh53GUKNW7oCpPqAGAdcbO2eSZh/VM="
},
"kotlin-reflect-2.0.20.jar": {
"sha1": "580c610641d75b6448825cbe455a1ded220e148b",
"sha256": "sha256-GPRR5rS3vR0fnWCEnDy/Fg4RUwL5eiAIwZDVBcQ5xnA="
"kotlin-reflect-2.0.20-Beta2.jar": {
"sha1": "c107aab723629eba126d73a256261bc2dd5f6f94",
"sha256": "sha256-+AAY6ksSfwuYtxgNP2tx/Unu/Iq43gP6gNHI1hai73g="
}
}
},
@@ -20687,28 +20665,28 @@
},
{
"path": "org/jetbrains/kotlin/kotlin-stdlib/2.0.20",
"path": "org/jetbrains/kotlin/kotlin-stdlib/2.0.20-Beta2",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"kotlin-stdlib-2.0.20.pom": {
"sha1": "1f331b5e2ac02f11de3e248564ffedf60a8452b3",
"sha256": "sha256-Cu6WIJHn3QKIzDykz0qSjFYgcUYCEb+PQXkAkwbmGf4="
"kotlin-stdlib-2.0.20-Beta2.pom": {
"sha1": "072b10781d710062d541929d810c0f5abece834f",
"sha256": "sha256-7nhCT2tDwl9IGhtJQUrUf4hoSbtgj+cLdu6cwKsNwRs="
},
"kotlin-stdlib-2.0.20-all.jar": {
"sha1": "9bd1e1253e62c42a33a786a0cbe24da0050cb71c",
"sha256": "sha256-UP+t6yC00kVqUmWVpPep6FiJaCcVBz5s26Gx2A461Fg="
"kotlin-stdlib-2.0.20-Beta2-all.jar": {
"sha1": "6b7bb98078d39f9b446e76703a7a3b9ac881ab20",
"sha256": "sha256-c2DTXup0f8352l8CNcDXvjyUgDQ9qo3HMU10Uc2LYhM="
},
"kotlin-stdlib-2.0.20-common.jar": {
"sha1": "7484111a8b4551fbe8a50d66de8b36f0af1de252",
"sha256": "sha256-5U//s64omzwm42t3TCvW+LojfkiwkioTPlvHSKxPP+o="
"kotlin-stdlib-2.0.20-Beta2-common.jar": {
"sha1": "e20b394b07c3e71fcd241f46159d13cb90fe79a4",
"sha256": "sha256-wboFR9YQ07iNrZCwIT8DUrT3w0Qpuu3llUiu0MUiVEY="
},
"kotlin-stdlib-2.0.20.jar": {
"sha1": "7388d355f7cceb002cd387ccb7ab3850e4e0a07f",
"sha256": "sha256-+xaVlmWaUYNXxLLBb0PcdascSYBWXtS0oxegUOXjkAY="
"kotlin-stdlib-2.0.20-Beta2.jar": {
"sha1": "3b5a0c1aa186088d3b4a323f22822c8fff6f73c4",
"sha256": "sha256-rFnFiItEt/OSYo338a26XZh/AiBxz97IgmEVolBpzYg="
},
"kotlin-stdlib-2.0.20.module": {
"sha1": "2d6ffff8c9388d2823dacfe0cbac843e30b077a7",
"sha256": "sha256-3AUdwExqGW8tBtDTya8zufErybT+E5rhKQFAUII2tns="
"kotlin-stdlib-2.0.20-Beta2.module": {
"sha1": "2163c5eba25f097c62eddc8f6d54a37398c4f903",
"sha256": "sha256-BB6Jv2FfcrLP46MsolVAmCcrt2lWmpM4ycHBtkRM9LI="
}
}
},
@@ -21007,16 +20985,16 @@
},
{
"path": "org/junit/junit-bom/5.11.0",
"path": "org/junit/junit-bom/5.11.0-M2",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"junit-bom-5.11.0.pom": {
"sha1": "a4a8a67d5348d748a6345d6f1d08846fb2780ed9",
"sha256": "sha256-5nRZ1IgkJKxjdPQNscj0ouiJRrNAugcsgL6TKivkZE0="
"junit-bom-5.11.0-M2.pom": {
"sha1": "6c517cddae7893aba5bf9f051c44860a4fc18211",
"sha256": "sha256-Sj/8Sk7c/sLLXWGZInBqlAcWF5hXGTn4VN/ac+ThfMg="
},
"junit-bom-5.11.0.module": {
"sha1": "d0302ab22149450fd7698262515751337f70a3a6",
"sha256": "sha256-9+2+Z/IgQnCMQQq8VHQI5cR29An1ViNqEXkiEnSi7S0="
"junit-bom-5.11.0-M2.module": {
"sha1": "4546561225def9f7f99c7c1abc3828dec51aad2a",
"sha256": "sha256-hkd6vPSQ1soFmqmXPLEI0ipQb0nRpVabsyzGy/Q8LM4="
}
}
},
@@ -21112,16 +21090,16 @@
},
{
"path": "org/mockito/mockito-core/5.13.0",
"path": "org/mockito/mockito-core/5.12.0",
"repo": "https://repo.maven.apache.org/maven2",
"files": {
"mockito-core-5.13.0.pom": {
"sha1": "1dea8951406bcc4570567888b064c30f821f50ef",
"sha256": "sha256-dFb4MOc+cmMcCbb3LQyyeCvlHI8fnGAzAtTLsrYqLVI="
"mockito-core-5.12.0.pom": {
"sha1": "63bde3dc82d8ee626ecf765f61a1ce7b8c68cb96",
"sha256": "sha256-bccvwKe1NHdVVfgzB0hiqcUwE6ZzOD4hMStYHKI7dhI="
},
"mockito-core-5.13.0.jar": {
"sha1": "bb2ba38657ce6fa72a13d96009d0b3bb9d7ddc1e",
"sha256": "sha256-+Kba2VEfvICcSTsYQEFOQhcjNeQUvbq+ZD3S1T2umn4="
"mockito-core-5.12.0.jar": {
"sha1": "22f8bbaf478e6789164787fa411a3b5ed986e110",
"sha256": "sha256-Si6ykjcFDadJ6QpG+Ui85+JuwitnHkH1mxrG9LZAgik="
}
}
},
+1 -1
View File
@@ -496,7 +496,7 @@ com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.11.1
com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.11.1
com.fasterxml.jackson.module:jackson-module-kotlin:2.11.1
com.fasterxml.woodstox:woodstox-core:6.2.1
com.github.Dimezis:BlurView:version-2.0.4
com.github.Dimezis:BlurView:version-2.0.3
com.github.bumptech.glide:annotations:4.12.0
com.github.bumptech.glide:compiler:4.12.0
com.github.bumptech.glide:disklrucache:4.12.0
+28 -30
View File
@@ -487,7 +487,7 @@ https://dl.google.com/dl/android/maven2/com/google/testing/platform/core-proto/0
https://dl.google.com/dl/android/maven2/com/google/testing/platform/core-proto/0.0.8-alpha07/core-proto-0.0.8-alpha07.pom
https://dl.google.com/dl/android/maven2/com/google/testing/platform/core-proto/0.0.8-alpha08/core-proto-0.0.8-alpha08.pom
https://dl.google.com/dl/android/maven2/com/google/test/platform/core-proto/0.0.2-dev/core-proto-0.0.2-dev.pom
https://jitpack.io/com/github/Dimezis/BlurView/version-2.0.4/BlurView-version-2.0.4.pom
https://jitpack.io/com/github/Dimezis/BlurView/version-2.0.3/BlurView-version-2.0.3.pom
https://jitpack.io/com/github/status-im/function/0.0.1/function-0.0.1.pom
https://jitpack.io/com/github/status-im/status-keycard-java/android/3.1.1/android-3.1.1.pom
https://jitpack.io/com/github/status-im/status-keycard-java/lib/3.1.1/lib-3.1.1.pom
@@ -509,7 +509,7 @@ https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.po
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.16.1/commons-io-2.16.1.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.3.4/commons-logging-1.3.4.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.3.3/commons-logging-1.3.3.pom
https://repo.maven.apache.org/maven2/com/adobe/xmp/xmpcore/6.1.11/xmpcore-6.1.11.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
@@ -693,7 +693,7 @@ https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotatio
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.10.0/error_prone_annotations-2.10.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.27.0/error_prone_annotations-2.27.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.31.0/error_prone_annotations-2.31.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.29.2/error_prone_annotations-2.29.2.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.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
@@ -706,7 +706,7 @@ https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.10.0/error_prone_parent-2.10.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.11.0/error_prone_parent-2.11.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.27.0/error_prone_parent-2.27.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.31.0/error_prone_parent-2.31.0.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.29.2/error_prone_parent-2.29.2.pom
https://repo.maven.apache.org/maven2/com/google/flatbuffers/flatbuffers-java/1.12.0/flatbuffers-java-1.12.0.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
@@ -723,8 +723,8 @@ https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/30.1-jre/guav
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/31.0.1-android/guava-parent-31.0.1-android.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/31.0.1-jre/guava-parent-31.0.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/31.1-jre/guava-parent-31.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/33.3.0-jre/guava-parent-33.3.0-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-testlib/33.3.0-jre/guava-testlib-33.3.0-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/33.2.1-jre/guava-parent-33.2.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-testlib/33.2.1-jre/guava-testlib-33.2.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
@@ -737,7 +737,7 @@ https://repo.maven.apache.org/maven2/com/google/guava/guava/30.1-jre/guava-30.1-
https://repo.maven.apache.org/maven2/com/google/guava/guava/31.0.1-android/guava-31.0.1-android.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/31.0.1-jre/guava-31.0.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/33.3.0-jre/guava-33.3.0-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/33.2.1-jre/guava-33.2.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/listenablefuture/1.0/listenablefuture-1.0.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
@@ -751,7 +751,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.13.0/pro
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.17.2/protobuf-bom-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.19.2/protobuf-bom-3.19.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.19.3/protobuf-bom-3.19.3.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.28.0/protobuf-bom-4.28.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.28.0-RC1/protobuf-bom-4.28.0-RC1.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-javalite/3.17.2/protobuf-javalite-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-javalite/3.19.2/protobuf-javalite-3.19.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util/3.4.0/protobuf-java-util-3.4.0.pom
@@ -768,7 +768,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.13.0/pr
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.17.2/protobuf-java-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.19.2/protobuf-java-3.19.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.19.3/protobuf-java-3.19.3.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.28.0/protobuf-java-4.28.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.28.0-RC1/protobuf-java-4.28.0-RC1.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-lite/3.0.1/protobuf-lite-3.0.1.pom
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
@@ -779,7 +779,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.13.0/
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.17.2/protobuf-parent-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.19.2/protobuf-parent-3.19.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.19.3/protobuf-parent-3.19.3.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.28.0/protobuf-parent-4.28.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.28.0-RC1/protobuf-parent-4.28.0-RC1.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth-parent/1.4.4/truth-parent-1.4.4.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth/1.4.4/truth-1.4.4.pom
https://repo.maven.apache.org/maven2/com/google/zxing/core/3.4.1/core-3.4.1.pom
@@ -916,9 +916,9 @@ https://repo.maven.apache.org/maven2/io/netty/netty-resolver/4.1.52.Final/netty-
https://repo.maven.apache.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-resolver/5.0.0.Alpha2/netty-resolver-5.0.0.Alpha2.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.66.Final/netty-tcnative-classes-2.0.66.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-classes/2.0.65.Final/netty-tcnative-classes-2.0.65.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.46.Final/netty-tcnative-parent-2.0.46.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.66.Final/netty-tcnative-parent-2.0.66.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-tcnative-parent/2.0.65.Final/netty-tcnative-parent-2.0.65.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.34.Final/netty-transport-4.1.34.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.52.Final/netty-transport-4.1.52.Final.pom
https://repo.maven.apache.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.pom
@@ -950,15 +950,15 @@ 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.11.13/byte-buddy-agent-1.11.13.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.11.19/byte-buddy-agent-1.11.19.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.15.0/byte-buddy-agent-1.15.0.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.14.15/byte-buddy-agent-1.14.15.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.11.13/byte-buddy-parent-1.11.13.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.11.19/byte-buddy-parent-1.11.19.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.14.18/byte-buddy-parent-1.14.18.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.15.0/byte-buddy-parent-1.15.0.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.14.15/byte-buddy-parent-1.14.15.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.14.17/byte-buddy-parent-1.14.17.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.11.13/byte-buddy-1.11.13.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.11.19/byte-buddy-1.11.19.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.14.18/byte-buddy-1.14.18.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.15.0/byte-buddy-1.15.0.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.14.15/byte-buddy-1.14.15.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.14.17/byte-buddy-1.14.17.pom
https://repo.maven.apache.org/maven2/net/java/dev/jna/jna-platform/5.6.0/jna-platform-5.6.0.pom
https://repo.maven.apache.org/maven2/net/java/dev/jna/jna/5.6.0/jna-5.6.0.pom
https://repo.maven.apache.org/maven2/net/java/jvnet-parent/1/jvnet-parent-1.pom
@@ -982,8 +982,8 @@ https://repo.maven.apache.org/maven2/org/abego/treelayout/org.abego.treelayout.c
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.4/ST4-4.3.4.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.13.2/antlr4-master-4.13.2.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4-runtime/4.13.2/antlr4-runtime-4.13.2.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.13.1/antlr4-master-4.13.1.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr4-runtime/4.13.1/antlr4-runtime-4.13.1.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.3/antlr-master-3.3.pom
https://repo.maven.apache.org/maven2/org/antlr/antlr-master/3.5.2/antlr-master-3.5.2.pom
@@ -1004,7 +1004,6 @@ https://repo.maven.apache.org/maven2/org/apache/apache/21/apache-21.pom
https://repo.maven.apache.org/maven2/org/apache/apache/23/apache-23.pom
https://repo.maven.apache.org/maven2/org/apache/apache/31/apache-31.pom
https://repo.maven.apache.org/maven2/org/apache/apache/32/apache-32.pom
https://repo.maven.apache.org/maven2/org/apache/apache/33/apache-33.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.12/commons-compress-1.12.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.20/commons-compress-1.20.pom
@@ -1025,7 +1024,6 @@ https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/48/common
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/52/commons-parent-52.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/69/commons-parent-69.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/71/commons-parent-71.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/72/commons-parent-72.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/httpclient-4.2.6.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.5.2/httpclient-4.5.2.pom
@@ -1080,7 +1078,7 @@ https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/2.8.1/che
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/2.11.1/checker-qual-2.11.1.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.5.0/checker-qual-3.5.0.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.46.0/checker-qual-3.46.0.pom
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.45.0/checker-qual-3.45.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-xml/3.0.9/groovy-xml-3.0.9.pom
https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-xml/3.0.10/groovy-xml-3.0.10.pom
@@ -1103,8 +1101,8 @@ https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/84/mojo-paren
https://repo.maven.apache.org/maven2/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.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/5.4.0/easymock-parent-5.4.0.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock/5.4.0/easymock-5.4.0.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock-parent/5.3.0/easymock-parent-5.3.0.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock/5.3.0/easymock-5.3.0.pom
https://repo.maven.apache.org/maven2/org/eclipse/angus/angus-activation-project/2.0.2/angus-activation-project-2.0.2.pom
https://repo.maven.apache.org/maven2/org/eclipse/angus/angus-activation/2.0.2/angus-activation-2.0.2.pom
https://repo.maven.apache.org/maven2/org/eclipse/ee4j/project/1.0.2/project-1.0.2.pom
@@ -1135,10 +1133,10 @@ https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/2.3.1/txw2-2.3.1.po
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/4.0.5/txw2-4.0.5.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/3.0/hamcrest-core-3.0.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/3.0-rc1/hamcrest-core-3.0-rc1.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/hamcrest/hamcrest/3.0/hamcrest-3.0.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest/3.0-rc1/hamcrest-3.0-rc1.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.12/org.jacoco.build-0.8.12.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.pom
@@ -1238,7 +1236,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.6.10/
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.6.20/kotlin-reflect-1.6.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.7.22/kotlin-reflect-1.7.22.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.8.20-RC2/kotlin-reflect-1.8.20-RC2.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/2.0.20/kotlin-reflect-2.0.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/2.0.20-Beta2/kotlin-reflect-2.0.20-Beta2.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.6.20/kotlin-scripting-common-1.6.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.7.22/kotlin-scripting-common-1.7.22.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.8.0/kotlin-scripting-common-1.8.0.pom
@@ -1343,7 +1341,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.8.20-R
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.8.21/kotlin-stdlib-1.8.21.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.0/kotlin-stdlib-1.9.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.21/kotlin-stdlib-1.9.21.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.0.20/kotlin-stdlib-2.0.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.0.20-Beta2/kotlin-stdlib-2.0.20-Beta2.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.7.22/kotlin-tooling-core-1.7.22.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.8.0/kotlin-tooling-core-1.8.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.9.0/kotlin-tooling-core-1.9.0.pom
@@ -1363,14 +1361,14 @@ https://repo.maven.apache.org/maven2/org/json/json/20180813/json-20180813.pom
https://repo.maven.apache.org/maven2/org/json/json/20240303/json-20240303.pom
https://repo.maven.apache.org/maven2/org/jsoup/jsoup/1.13.1/jsoup-1.13.1.pom
https://repo.maven.apache.org/maven2/org/jspecify/jspecify/1.0.0/jspecify-1.0.0.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.11.0/junit-bom-5.11.0.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.11.0-M2/junit-bom-5.11.0-M2.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/1.8.1/stax-ex-1.8.1.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.8/stax-ex-1.8.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/2.1.0/stax-ex-2.1.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/3.12.4/mockito-core-3.12.4.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/4.0.0/mockito-core-4.0.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/5.13.0/mockito-core-5.13.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/5.12.0/mockito-core-5.12.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-inline/4.0.0/mockito-inline-4.0.0.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-parent/3.3/objenesis-parent-3.3.pom
+1 -1
View File
@@ -14,7 +14,7 @@
"@react-native-camera-roll/camera-roll": "7.5.2",
"@react-native-clipboard/clipboard": "1.13.2",
"@react-native-community/audio-toolkit": "git+https://github.com/tbenr/react-native-audio-toolkit.git#refs/tags/v2.0.3-status-v6",
"@react-native-community/blur": "4.4.1",
"@react-native-community/blur": "4.4.0",
"@react-native-community/hooks": "^3.0.0",
"@react-native-community/masked-view": "^0.1.6",
"@react-native-community/netinfo": "^4.4.0",
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

+2 -12
View File
@@ -1,9 +1,7 @@
(ns legacy.status-im.data-store.settings
(:require
[clojure.set :as set]
[clojure.string :as string]
[legacy.status-im.data-store.visibility-status-updates :as visibility-status-updates]
[status-im.contexts.wallet.common.validation :as validation]
[utils.ethereum.eip.eip55 :as eip55]))
(defn rpc->visible-tokens
@@ -20,13 +18,6 @@
{}
pinned-mailservers))
(defn rpc->currency
[currency]
(-> currency
(name)
(string/lower-case)
(keyword)))
(defn rpc->settings
[settings]
(-> settings
@@ -35,8 +26,7 @@
(update :wallet-legacy/visible-tokens rpc->visible-tokens)
(update :pinned-mailservers rpc->pinned-mailservers)
(update :link-previews-enabled-sites set)
(update :currency rpc->currency)
(assoc :ens-name? (validation/ens-name? (:preferred-name settings)))
(update :currency keyword)
(visibility-status-updates/<-rpc-settings)
(set/rename-keys {:compressedKey :compressed-key
:emojiHash :emoji-hash})))
@@ -44,5 +34,5 @@
(defn rpc->setting-value
[{:keys [name] :as setting}]
(condp = name
:currency (update setting :value rpc->currency)
:currency (update setting :value keyword)
setting))
+5 -6
View File
@@ -85,12 +85,11 @@
(rf/defn add-members
"Add members to a group chat"
{:events [:group-chats.ui/add-members-pressed]}
[{{:group-chat/keys [selected-participants]} :db} chat-id]
(when (seq selected-participants)
{:json-rpc/call [{:method "wakuext_addMembersToGroupChat"
:params [nil chat-id selected-participants]
:js-response true
:on-success #(re-frame/dispatch [:chat-updated % true])}]}))
[{{:group-chat/keys [selected-participants]} :db :as cofx} chat-id]
{:json-rpc/call [{:method "wakuext_addMembersToGroupChat"
:params [nil chat-id selected-participants]
:js-response true
:on-success #(re-frame/dispatch [:chat-updated % true])}]})
(rf/defn add-members-from-invitation
"Add members to a group chat"
@@ -1,6 +1,5 @@
(ns legacy.status-im.multiaccounts.update.core
(:require
[legacy.status-im.data-store.settings :as settings]
[legacy.status-im.utils.deprecated-types :as types]
[status-im.constants :as constants]
[taoensso.timbre :as log]
@@ -82,7 +81,7 @@
[{:keys [db] :as cofx} setting setting-value]
(let [current-multiaccount (:profile/profile db)
setting-value (if (= :currency setting)
(settings/rpc->currency setting-value)
(keyword setting-value)
setting-value)
db (case setting
:stickers/packs-pending
@@ -105,9 +104,7 @@
db)]
{:db (if setting-value
(assoc-in db [:profile/profile setting] setting-value)
(update db :profile/profile dissoc setting))
:fx [(when (= setting :currency)
[:dispatch [:wallet/get-wallet-token-for-all-accounts]])]}))
(update db :profile/profile dissoc setting))}))
(rf/defn set-many-js
[cofx settings-js]
+84
View File
@@ -0,0 +1,84 @@
(ns legacy.status-im.utils.currency
(:require
[utils.i18n :as i18n]))
(def currencies
{:aed {:id :aed :code "AED" :display-name (i18n/label :t/currency-display-name-aed) :symbol "د.إ"}
:afn {:id :afn :code "AFN" :display-name (i18n/label :t/currency-display-name-afn) :symbol "؋"}
:ars {:id :ars :code "ARS" :display-name (i18n/label :t/currency-display-name-ars) :symbol "$"}
:aud {:id :aud :code "AUD" :display-name (i18n/label :t/currency-display-name-aud) :symbol "$"}
:bbd {:id :bbd :code "BBD" :display-name (i18n/label :t/currency-display-name-bbd) :symbol "$"}
:bdt {:id :bdt :code "BDT" :display-name (i18n/label :t/currency-display-name-bdt) :symbol " Tk"}
:bgn {:id :bgn :code "BGN" :display-name (i18n/label :t/currency-display-name-bgn) :symbol "лв"}
:bhd {:id :bhd :code "BHD" :display-name (i18n/label :t/currency-display-name-bhd) :symbol "BD"}
:bnd {:id :bnd :code "BND" :display-name (i18n/label :t/currency-display-name-bnd) :symbol "$"}
:bob {:id :bob :code "BOB" :display-name (i18n/label :t/currency-display-name-bob) :symbol "$b"}
:brl {:id :brl :code "BRL" :display-name (i18n/label :t/currency-display-name-brl) :symbol "R$"}
:btn {:id :btn :code "BTN" :display-name (i18n/label :t/currency-display-name-btn) :symbol "Nu."}
:cad {:id :cad :code "CAD" :display-name (i18n/label :t/currency-display-name-cad) :symbol "$"}
:chf {:id :chf :code "CHF" :display-name (i18n/label :t/currency-display-name-chf) :symbol "CHF"}
:clp {:id :clp :code "CLP" :display-name (i18n/label :t/currency-display-name-clp) :symbol "$"}
:cny {:id :cny :code "CNY" :display-name (i18n/label :t/currency-display-name-cny) :symbol "¥"}
:cop {:id :cop :code "COP" :display-name (i18n/label :t/currency-display-name-cop) :symbol "$"}
:crc {:id :crc :code "CRC" :display-name (i18n/label :t/currency-display-name-crc) :symbol "₡"}
:czk {:id :czk :code "CZK" :display-name (i18n/label :t/currency-display-name-czk) :symbol "Kč"}
:dkk {:id :dkk :code "DKK" :display-name (i18n/label :t/currency-display-name-dkk) :symbol "kr"}
:dop {:id :dop :code "DOP" :display-name (i18n/label :t/currency-display-name-dop) :symbol "RD$"}
:egp {:id :egp :code "EGP" :display-name (i18n/label :t/currency-display-name-egp) :symbol "£"}
:etb {:id :etb :code "ETB" :display-name (i18n/label :t/currency-display-name-etb) :symbol "Br"}
:eur {:id :eur :code "EUR" :display-name (i18n/label :t/currency-display-name-eur) :symbol "€"}
:gbp {:id :gbp :code "GBP" :display-name (i18n/label :t/currency-display-name-gbp) :symbol "£"}
:gel {:id :gel :code "GEL" :display-name (i18n/label :t/currency-display-name-gel) :symbol "₾"}
:ghs {:id :ghs :code "GHS" :display-name (i18n/label :t/currency-display-name-ghs) :symbol "¢"}
:hkd {:id :hkd :code "HKD" :display-name (i18n/label :t/currency-display-name-hkd) :symbol "$"}
:hrk {:id :hrk :code "HRK" :display-name (i18n/label :t/currency-display-name-hrk) :symbol "kn"}
:huf {:id :huf :code "HUF" :display-name (i18n/label :t/currency-display-name-huf) :symbol "Ft"}
:idr {:id :idr :code "IDR" :display-name (i18n/label :t/currency-display-name-idr) :symbol "Rp"}
:ils {:id :ils :code "ILS" :display-name (i18n/label :t/currency-display-name-ils) :symbol "₪"}
:inr {:id :inr :code "INR" :display-name (i18n/label :t/currency-display-name-inr) :symbol "₹"}
:isk {:id :isk :code "ISK" :display-name (i18n/label :t/currency-display-name-isk) :symbol "kr"}
:jmd {:id :jmd :code "JMD" :display-name (i18n/label :t/currency-display-name-jmd) :symbol "J$"}
:jpy {:id :jpy :code "JPY" :display-name (i18n/label :t/currency-display-name-jpy) :symbol "¥"}
:kes {:id :kes :code "KES" :display-name (i18n/label :t/currency-display-name-kes) :symbol "KSh"}
:krw {:id :krw :code "KRW" :display-name (i18n/label :t/currency-display-name-krw) :symbol "₩"}
:kwd {:id :kwd :code "KWD" :display-name (i18n/label :t/currency-display-name-kwd) :symbol "د.ك"}
:kzt {:id :kzt :code "KZT" :display-name (i18n/label :t/currency-display-name-kzt) :symbol "лв"}
:lkr {:id :lkr :code "LKR" :display-name (i18n/label :t/currency-display-name-lkr) :symbol "₨"}
:mad {:id :mad :code "MAD" :display-name (i18n/label :t/currency-display-name-mad) :symbol "MAD"}
:mdl {:id :mdl :code "MDL" :display-name (i18n/label :t/currency-display-name-mdl) :symbol "MDL"}
:mur {:id :mur :code "MUR" :display-name (i18n/label :t/currency-display-name-mur) :symbol "₨"}
:mwk {:id :mwk :code "MWK" :display-name (i18n/label :t/currency-display-name-mwk) :symbol "MK"}
:mxn {:id :mxn :code "MXN" :display-name (i18n/label :t/currency-display-name-mxn) :symbol "$"}
:myr {:id :myr :code "MYR" :display-name (i18n/label :t/currency-display-name-myr) :symbol "RM"}
:mzn {:id :mzn :code "MZN" :display-name (i18n/label :t/currency-display-name-mzn) :symbol "MT"}
:nad {:id :nad :code "NAD" :display-name (i18n/label :t/currency-display-name-nad) :symbol "$"}
:ngn {:id :ngn :code "NGN" :display-name (i18n/label :t/currency-display-name-ngn) :symbol "₦"}
:nok {:id :nok :code "NOK" :display-name (i18n/label :t/currency-display-name-nok) :symbol "kr"}
:npr {:id :npr :code "NPR" :display-name (i18n/label :t/currency-display-name-npr) :symbol "₨"}
:nzd {:id :nzd :code "NZD" :display-name (i18n/label :t/currency-display-name-nzd) :symbol "$"}
:omr {:id :omr :code "OMR" :display-name (i18n/label :t/currency-display-name-omr) :symbol "﷼"}
:pen {:id :pen :code "PEN" :display-name (i18n/label :t/currency-display-name-pen) :symbol "S/."}
:pgk {:id :pgk :code "PGK" :display-name (i18n/label :t/currency-display-name-pgk) :symbol "K"}
:php {:id :php :code "PHP" :display-name (i18n/label :t/currency-display-name-php) :symbol "₱"}
:pkr {:id :pkr :code "PKR" :display-name (i18n/label :t/currency-display-name-pkr) :symbol "₨"}
:pln {:id :pln :code "PLN" :display-name (i18n/label :t/currency-display-name-pln) :symbol "zł"}
:pyg {:id :pyg :code "PYG" :display-name (i18n/label :t/currency-display-name-pyg) :symbol "Gs"}
:qar {:id :qar :code "QAR" :display-name (i18n/label :t/currency-display-name-qar) :symbol "﷼"}
:ron {:id :ron :code "RON" :display-name (i18n/label :t/currency-display-name-ron) :symbol "lei"}
:rsd {:id :rsd :code "RSD" :display-name (i18n/label :t/currency-display-name-rsd) :symbol "Дин."}
:rub {:id :rub :code "RUB" :display-name (i18n/label :t/currency-display-name-rub) :symbol "₽"}
:sar {:id :sar :code "SAR" :display-name (i18n/label :t/currency-display-name-sar) :symbol "﷼"}
:sek {:id :sek :code "SEK" :display-name (i18n/label :t/currency-display-name-sek) :symbol "kr"}
:sgd {:id :sgd :code "SGD" :display-name (i18n/label :t/currency-display-name-sgd) :symbol "$"}
:thb {:id :thb :code "THB" :display-name (i18n/label :t/currency-display-name-thb) :symbol "฿"}
:ttd {:id :ttd :code "TTD" :display-name (i18n/label :t/currency-display-name-ttd) :symbol "TT$"}
:twd {:id :twd :code "TWD" :display-name (i18n/label :t/currency-display-name-twd) :symbol "NT$"}
:tzs {:id :tzs :code "TZS" :display-name (i18n/label :t/currency-display-name-tzs) :symbol "TSh"}
:try {:id :try :code "TRY" :display-name (i18n/label :t/currency-display-name-try) :symbol "₺"}
:uah {:id :uah :code "UAH" :display-name (i18n/label :t/currency-display-name-uah) :symbol "₴"}
:ugx {:id :ugx :code "UGX" :display-name (i18n/label :t/currency-display-name-ugx) :symbol "USh"}
:uyu {:id :uyu :code "UYU" :display-name (i18n/label :t/currency-display-name-uyu) :symbol "$U"}
:usd {:id :usd :code "USD" :display-name (i18n/label :t/currency-display-name-usd) :symbol "$"}
:vef {:id :vef :code "VEF" :display-name (i18n/label :t/currency-display-name-vef) :symbol "Bs"}
:vnd {:id :vnd :code "VND" :display-name (i18n/label :t/currency-display-name-vnd) :symbol "₫"}
:zar {:id :zar :code "ZAR" :display-name (i18n/label :t/currency-display-name-zar) :symbol "R"}})
+6
View File
@@ -79,6 +79,12 @@
(types/clj->json request)
#(callback (types/json->clj %))))
(defn accept-terms
([]
(native-utils/promisify-native-module-call accept-terms))
([callback]
(.acceptTerms ^js (account-manager) callback)))
(defn prepare-dir-and-update-config
[key-uid config callback]
(log/debug "[native-module] prepare-dir-and-update-config")
@@ -4,7 +4,7 @@
[quo.components.calendar.calendar.view :as calendar]
[test-helpers.component :as h]))
(def start-date (time/date-time (time/year (time/now)) (time/month (time/now)) 8))
(def start-date (time/date-time (time/year (time/now)) (time/month (time/now)) 5))
(def end-date (time/date-time (time/plus start-date (time/days 2))))
(h/describe "calendar component"
@@ -23,7 +23,7 @@
{:start-date nil
:end-date nil
:on-change on-change}])
(h/fire-event :press (h/query-first-by-text (str (time/day start-date))))
(h/fire-event :press (h/query-by-text (str (time/day start-date))))
(h/was-called-with on-change {:start-date start-date :end-date nil})))
(h/test "should call on-change with start and end date on second click"
@@ -31,7 +31,7 @@
(h/render
[calendar/view
{:start-date start-date :end-date nil :on-change on-change}])
(h/fire-event :press (h/query-first-by-text (str (time/day end-date))))
(h/fire-event :press (h/query-by-text (str (time/day end-date))))
(h/was-called-with on-change {:start-date start-date :end-date end-date})))
(h/test "should reset the dates on third click"
@@ -41,7 +41,7 @@
{:start-date start-date
:end-date end-date
:on-change on-change}])
(h/fire-event :press (h/query-first-by-text (str (time/day start-date))))
(h/fire-event :press (h/query-by-text (str (time/day start-date))))
(h/was-called-with on-change {:start-date start-date :end-date nil})))
(h/test "should reset dates when start date is clicked again"
@@ -51,7 +51,7 @@
{:start-date start-date
:end-date nil
:on-change on-change}])
(h/fire-event :press (h/query-first-by-text (str (time/day start-date))))
(h/fire-event :press (h/query-by-text (str (time/day start-date))))
(h/was-called-with on-change {:start-date nil :end-date nil})))
(h/test "should assign start and end date correctly when upper range selected first"
@@ -61,5 +61,5 @@
{:start-date end-date
:end-date nil
:on-change on-change}])
(h/fire-event :press (h/query-first-by-text (str (time/day start-date))))
(h/fire-event :press (h/query-by-text (str (time/day start-date))))
(h/was-called-with on-change {:start-date start-date :end-date end-date}))))
@@ -91,7 +91,7 @@
:color-index gradient-color-index}]])
(defn- card-details
[{:keys [community? avatar-image-src collectible-name theme state set-state loading?]}]
[{:keys [community? avatar-image-src collectible-name theme state set-state]}]
(let [loader-opacity (reanimated/use-shared-value 1)
avatar-opacity (reanimated/use-shared-value 0)
[load-time set-load-time] (rn/use-state (datetime/now))
@@ -102,7 +102,7 @@
:avatar-opacity avatar-opacity}))
empty-name? (string/blank? collectible-name)]
(rn/use-mount (fn []
(when (and (string/blank? avatar-image-src) (not loading?))
(when (string/blank? avatar-image-src)
(set-avatar-loaded))))
[rn/view {:style style/card-details-container}
[reanimated/view {:style (style/avatar-container avatar-opacity)}
@@ -137,7 +137,7 @@
(defn- card-view
[{:keys [avatar-image-src collectible-name community? counter state set-state
gradient-color-index image-src supported-file? loading?]}]
gradient-color-index image-src supported-file?]}]
(let [theme (quo.theme/use-theme)
loader-opacity (reanimated/use-shared-value (if supported-file? 1 0))
image-opacity (reanimated/use-shared-value (if supported-file? 0 1))
@@ -189,7 +189,6 @@
:community? community?
:avatar-image-src avatar-image-src
:collectible-name collectible-name
:loading? loading?
:theme theme}]]))
(defn- image-view
@@ -277,7 +276,6 @@
[:supported-file? {:optional true} [:maybe boolean?]]
[:native-ID {:optional true} [:maybe [:or string? keyword?]]]
[:community? {:optional true} [:maybe boolean?]]
[:loading? {:optional true} [:maybe boolean?]]
[:counter {:optional true} [:maybe [:or :string :int]]]
[:gradient-color-index {:optional true}
[:maybe [:enum :gradient-1 :gradient-2 :gradient-3 :gradient-4 :gradient-5]]]
@@ -10,7 +10,6 @@
[quo.components.settings.settings-item.style :as style]
[quo.components.tags.context-tag.view :as context-tag]
[quo.components.tags.status-tags :as status-tags]
[quo.components.utilities.token.view :as token]
[quo.foundations.colors :as colors]
[quo.theme :as quo.theme]
[react-native.core :as rn]
@@ -60,7 +59,6 @@
:icon [icon/icon image-props (style/color blur? theme)]
:avatar [user-avatar/user-avatar image-props]
:icon-avatar [icon-avatar/icon-avatar image-props]
:token [token/view image-props]
nil)]))
(defn tag-component
@@ -6,20 +6,16 @@
(h/describe "Wallet: Token Input"
(h/test "Token label renders"
(h/render-with-theme-provider [token-input/view
{:token-symbol :snt
:currency-symbol :snt
:on-swap nil
:error? false
:value "1"
:converted-value "10"}])
{:token :snt
:currency :eur
:currency-symbol "€"
:conversion 1}])
(h/is-truthy (h/get-by-text "SNT")))
(h/test "Amount renders"
(h/render-with-theme-provider [token-input/view
{:token-symbol :snt
:currency-symbol :snt
:on-swap nil
:error? false
:value "1"
:converted-value "€0.00"}])
{:token :snt
:currency :eur
:currency-symbol "€"
:conversion 1}])
(h/is-truthy (h/get-by-text "€0.00"))))
@@ -4,14 +4,15 @@
[:=>
[:catn
[:props
[:map {:closed true}
[:token-symbol [:maybe [:or :string :keyword]]]
[:currency-symbol [:maybe [:or :string :keyword]]]
[:hint-component {:optional true} [:maybe :schema.common/hiccup]]
[:on-token-press {:optional true} [:maybe fn?]]
[:on-swap [:maybe fn?]]
[:container-style {:optional true} [:maybe :map]]
[:error? [:maybe :boolean]]
[:value [:maybe :string]]
[:converted-value [:maybe :string]]]]]
[:map
[:token {:optional true} [:maybe [:or :string :keyword]]]
[:currency {:optional true} [:maybe [:or :string :keyword]]]
[:error? {:optional true} [:maybe :boolean]]
[:title {:optional true} [:maybe :string]]
[:conversion {:optional true} [:maybe :double]]
[:show-keyboard? {:optional true} [:maybe :boolean]]
[:networks {:optional true}
[:maybe [:sequential [:map [:source [:maybe :schema.common/image-source]]]]]]
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
[:value {:optional true} [:maybe :string]]]]]
:any])
@@ -25,11 +25,9 @@
(defn input-container
[window-width]
{:width (- window-width 120)
:margin-left 8
:margin-right 8
:flex-direction :row
:align-items :flex-end})
{:width (- window-width 120)
:margin-left 8
:margin-right 8})
(def text-input-dimensions
(-> typography/heading-1
@@ -67,6 +65,6 @@
:justify-content :space-between
:align-items :center})
(defn converted-amount
(defn fiat-amount
[theme]
{:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)})
+123 -53
View File
@@ -1,15 +1,57 @@
(ns quo.components.wallet.token-input.view
(:require
[clojure.string :as string]
[oops.core :as oops]
[quo.components.buttons.button.view :as button]
[quo.components.dividers.divider-line.view :as divider-line]
[quo.components.markdown.text :as text]
[quo.components.tags.network-tags.view :as network-tag]
[quo.components.utilities.token.view :as token]
[quo.components.wallet.token-input.schema :as component-schema]
[quo.components.wallet.token-input.style :as style]
[quo.theme :as quo.theme]
[react-native.core :as rn]
[schema.core :as schema]))
[schema.core :as schema]
[utils.number :as number]))
(defn fiat-format
[currency-symbol num-value conversion]
(str currency-symbol (.toFixed (* num-value conversion) 2)))
(defn crypto-format
[num-value conversion crypto-decimals token]
(str (number/remove-trailing-zeroes
(.toFixed (/ num-value conversion) (or crypto-decimals 2)))
" "
(string/upper-case (or (clj->js token) ""))))
(defn calc-value
[{:keys [crypto? currency-symbol token value conversion crypto-decimals]}]
(let [num-value (if (string? value)
(or (parse-double value) 0)
value)]
(if crypto?
(fiat-format currency-symbol num-value conversion)
(crypto-format num-value conversion crypto-decimals token))))
(defn- data-info
[{:keys [theme token crypto-decimals conversion networks title crypto? currency-symbol amount
error?]}]
[rn/view {:style style/data-container}
[network-tag/view
{:networks networks
:title title
:status (when error? :error)}]
[text/text
{:size :paragraph-2
:weight :medium
:style (style/fiat-amount theme)}
(calc-value {:crypto? crypto?
:currency-symbol currency-symbol
:token token
:value amount
:conversion conversion
:crypto-decimals crypto-decimals})]])
(defn- token-name-text
[theme text]
@@ -20,63 +62,91 @@
(string/upper-case (or (clj->js text) ""))])
(defn input-section
[{:keys [token-symbol on-token-press value error? on-swap currency-symbol]}]
(let [theme (quo.theme/use-theme)
window-width (:width (rn/get-window))]
[rn/pressable
{:style {:width "100%"
:flex-direction :row}
:on-press on-token-press}
[token/view
{:token token-symbol
:size :size-32}]
[rn/view {:style (style/input-container window-width)}
[rn/text-input
{:style (style/text-input theme error?)
:placeholder-text-color (style/placeholder-text theme)
:placeholder "0"
:keyboard-type :numeric
:editable false
:value value}]
[token-name-text theme currency-symbol]]
[button/button
{:icon true
:icon-only? true
:size 32
:on-press #(when on-swap (on-swap))
:type :outline
:accessibility-label :reorder}
:i/reorder]]))
[{:keys [on-change-text value value-internal set-value-internal on-selection-change
on-token-press]}]
(let [input-ref (atom nil)
set-ref #(reset! input-ref %)
focus-input #(when-let [ref ^js @input-ref]
(.focus ref))
controlled-input? (some? value)
handle-on-change-text (fn [v]
(when-not controlled-input?
(set-value-internal v))
(when on-change-text
(on-change-text v)))
handle-selection-change (fn [^js e]
(when on-selection-change
(-> e
(oops/oget "nativeEvent.selection")
(js->clj :keywordize-keys true)
(on-selection-change))))]
(fn [{:keys [token customization-color show-keyboard? crypto? currency value error? selection
handle-on-swap allow-selection?]
:or {show-keyboard? true
allow-selection? true}}]
(let [theme (quo.theme/use-theme)
window-width (:width (rn/get-window))]
[rn/pressable
{:style {:width "100%"
:flex-direction :row}
:on-press on-token-press}
[token/view
{:token token
:size :size-32}]
[rn/view {:style (style/input-container window-width)}
[rn/pressable
{:style style/text-input-container
:on-press focus-input}
[rn/text-input
(cond-> {:style (style/text-input theme error?)
:placeholder-text-color (style/placeholder-text theme)
:auto-focus true
:ref set-ref
:placeholder "0"
:keyboard-type :numeric
:on-change-text handle-on-change-text
:selection-color customization-color
:show-soft-input-on-focus show-keyboard?
:on-selection-change handle-selection-change
:selection (clj->js selection)
:editable allow-selection?}
controlled-input? (assoc :value value)
(not controlled-input?) (assoc :default-value value-internal))]
[token-name-text theme (if crypto? token currency)]]]
[button/button
{:icon true
:icon-only? true
:size 32
:on-press handle-on-swap
:type :outline
:accessibility-label :reorder}
:i/reorder]]))))
(defn- view-internal
[{:keys [token-symbol
value
on-token-press
error?
container-style
on-swap
converted-value
hint-component
currency-symbol]}]
(let [theme (quo.theme/use-theme)
width (:width (rn/get-window))]
[{:keys [container-style value on-swap] :as props}]
(let [theme (quo.theme/use-theme)
width (:width (rn/get-window))
[value-internal set-value-internal] (rn/use-state nil)
[crypto? set-crypto] (rn/use-state true)
handle-on-swap (rn/use-callback
(fn []
(set-crypto (not crypto?))
(when on-swap (on-swap (not crypto?))))
[crypto? on-swap])]
[rn/view {:style (merge (style/main-container width) container-style)}
[rn/view {:style style/amount-container}
[input-section
{:theme theme
:token-symbol token-symbol
:on-token-press on-token-press
:value value
:error? error?
:on-swap on-swap
:currency-symbol currency-symbol}]]
(assoc props
:value-internal value-internal
:theme theme
:set-value-internal set-value-internal
:handle-on-swap handle-on-swap
:crypto? crypto?)]]
[divider-line/view {:container-style (style/divider theme)}]
[rn/view {:style style/data-container}
hint-component
[text/text
{:size :paragraph-2
:weight :medium
:style (style/converted-amount theme)}
converted-value]]]))
[data-info
(assoc props
:theme theme
:crypto? crypto?
:amount (or value value-internal))]]))
(def view (schema/instrument #'view-internal component-schema/?schema))
@@ -1,8 +1,6 @@
(ns status-im.common.controlled-input.utils
(:require
[clojure.string :as string]
[status-im.contexts.wallet.common.utils :as wallet-utils]
[utils.money :as money]))
[clojure.string :as string]))
(def init-state
{:value ""
@@ -16,7 +14,7 @@
(defn numeric-value
[state]
(money/bignumber (input-value state)))
(or (parse-double (input-value state)) 0))
(defn input-error
[state]
@@ -28,27 +26,23 @@
(defn upper-limit
[state]
(money/bignumber (:upper-limit state)))
(:upper-limit state))
(defn lower-limit
[state]
(money/bignumber (:lower-limit state)))
(:lower-limit state))
(defn upper-limit-exceeded?
[state]
(let [num-value (numeric-value state)]
(and
(upper-limit state)
(when (money/bignumber? num-value)
(money/greater-than (numeric-value state) (upper-limit state))))))
(and
(upper-limit state)
(> (numeric-value state) (upper-limit state))))
(defn- lower-limit-exceeded?
(defn lower-limit-exceeded?
[state]
(let [num-value (numeric-value state)]
(and
(lower-limit state)
(when (money/bignumber? num-value)
(money/less-than (numeric-value state) (lower-limit state))))))
(and
(lower-limit state)
(< (numeric-value state) (lower-limit state))))
(defn- recheck-errorness
[state]
@@ -81,11 +75,13 @@
(defn increase
[state]
(set-input-value state (str (money/add (numeric-value state) 1))))
(let [new-val (inc (numeric-value state))]
(set-input-value state (str new-val))))
(defn decrease
[state]
(set-input-value state (str (money/add (numeric-value state) -1))))
(let [new-val (dec (numeric-value state))]
(set-input-value state (str new-val))))
(def ^:private not-digits-or-dot-pattern
#"[^0-9+\.]")
@@ -134,29 +130,3 @@
(defn empty-value?
[state]
(string/blank? (:value state)))
(defn- fiat->crypto
[value conversion-rate]
(-> value
(money/fiat->crypto conversion-rate)
(wallet-utils/cut-crypto-decimals-to-fit-usd-cents conversion-rate)))
(defn- crypto->fiat
[value conversion-rate]
(-> value
(money/crypto->fiat conversion-rate)
(wallet-utils/cut-fiat-balance-to-two-decimals)))
(defn ->crypto
[state conversion-rate]
(-> state
(set-input-value (fiat->crypto (input-value state) conversion-rate))
(set-upper-limit (fiat->crypto (upper-limit state) conversion-rate))
(set-lower-limit (fiat->crypto (lower-limit state) conversion-rate))))
(defn ->fiat
[state conversion-rate]
(-> state
(set-input-value (crypto->fiat (input-value state) conversion-rate))
(set-upper-limit (crypto->fiat (upper-limit state) conversion-rate))
(set-lower-limit (crypto->fiat (lower-limit state) conversion-rate))))
@@ -61,7 +61,7 @@
(defn view
[{:keys [header footer customization-color footer-container-padding header-container-style
content-container-style gradient-cover? keyboard-should-persist-taps shell-overlay?
blur-options content-avoid-keyboard? automatically-adjust-keyboard-insets]
blur-options content-avoid-keyboard?]
:or {footer-container-padding (safe-area/get-top)}}
& children]
(reagent/with-let [scroll-view-ref (atom nil)
@@ -123,7 +123,7 @@
:scroll-event-throttle 64
:content-container-style {:flex-grow 1}
:always-bounce-vertical @keyboard-did-show?
:automatically-adjust-keyboard-insets automatically-adjust-keyboard-insets
:automatically-adjust-keyboard-insets true
:shows-vertical-scroll-indicator false
:keyboard-should-persist-taps keyboard-should-persist-taps}
(into [rn/view
@@ -94,11 +94,3 @@
(fn [params]
(doseq [param params]
(call param))))
(defn log-rpc-error
[_ [{:keys [event params]} error]]
(log/error (str "Failed to " event)
{:params params
:error error}))
(rf/reg-event-fx :log-rpc-error log-rpc-error)
+1 -1
View File
@@ -17,7 +17,7 @@
(let [parsed-time (t.format/parse (t.format/formatters :date-time-no-ms) muted-till-string)
hours-and-minutes (str (add-leading-zero (t/hour (t/plus parsed-time time-zone-offset)))
":"
(add-leading-zero (t/minute (t/plus parsed-time time-zone-offset))))
(add-leading-zero (t/minute parsed-time)))
when-to-unmute (cond (= go-default-time
muted-till-string) (i18n/label :t/until-you-turn-it-back-on)
(today? parsed-time) (str hours-and-minutes " today")
+1 -4
View File
@@ -90,10 +90,7 @@
:dark (js/require "../resources/images/ui2/sweating-man-dark.png")}
:no-pinned-messages
{:light (js/require "../resources/images/ui2/no-pinned-messages-light.png")
:dark (js/require "../resources/images/ui2/no-pinned-messages-dark.png")}
:no-assets
{:light (js/require "../resources/images/ui2/no-assets-light.png")
:dark (js/require "../resources/images/ui2/no-assets-dark.png")}})
:dark (js/require "../resources/images/ui2/no-pinned-messages-dark.png")}})
(def mock-images
{:bored-ape (js/require "../resources/images/mock2/bored-ape.png")
+9 -34
View File
@@ -24,7 +24,7 @@
(def web-prefixes ["https://" "http://" "https://www." "http://www."])
(def status-web2-domain "status.app")
(def web2-domain "status.app")
(def user-path "u#")
(def user-with-data-path "u/")
@@ -32,17 +32,13 @@
(def community-with-data-path "c/")
(def channel-path "cc/")
(def status-web-urls (map #(str % status-web2-domain "/") web-prefixes))
(def web-urls (map #(str % web2-domain "/") web-prefixes))
(defn prepend-status-urls
(defn path-urls
[path]
(map #(str % path) status-web-urls))
(map #(str % path) web-urls))
(def handled-schemes (set (into uri-schemes status-web-urls)))
(defn wc-normalize-uri
[uri]
(if (string/includes? uri "//wc:") (string/replace-first uri "/?" "?") uri))
(def handled-schemes (set (into uri-schemes web-urls)))
(def group-chat-extractor
{[#"(.*)" :params] {"" :group-chat
@@ -63,9 +59,7 @@
["wallet/" :account] :wallet-account
[user-with-data-path :user-data] :user
"c" :community
"u" :user
#"wc:([^\?]+)" :wallet-connect
"wc" :wallet-connect}
"u" :user}
ethereum-scheme eip-extractor}])
(defn parse-query-params
@@ -80,11 +74,6 @@
(when-not (string/blank? fragment)
fragment)))
(defn remove-scheme
[uri]
(let [[_ url] (string/split uri #"://")]
url))
(defn match-uri
[uri]
(let [;; bidi has trouble parse path with `=` in it extract `=` here and add back to parsed
@@ -98,17 +87,13 @@
uri-without-equal-in-path
(if equal-end-of-base64url (string/replace-first uri equal-end-of-base64url "") uri)
;;bidi has issue to detect wc regex with /?, couldn't fine any other workaround
normalize-uri
(wc-normalize-uri uri-without-equal-in-path)
;; fragment is the one after `#`, usually user-id, ens-name, community-id
fragment (parse-fragment uri)
ens? (utils.ens/is-valid-eth-name? fragment)
compressed-key? (validators/valid-compressed-key? fragment)
{:keys [handler route-params query-params] :as parsed}
(assoc (bidi/match-route routes normalize-uri)
{:keys [handler route-params] :as parsed}
(assoc (bidi/match-route routes uri-without-equal-in-path)
:uri uri
:query-params (parse-query-params uri))]
(cond-> parsed
@@ -145,13 +130,7 @@
(update-in [:route-params :user-data] #(str % equal-end-of-base64url))
(and (= handler :user) compressed-key?)
(assoc-in [:route-params :user-id] fragment)
(= handler :wallet-connect)
(assoc-in [:route-params :uri]
(if (get query-params "uri")
(get query-params "uri")
(remove-scheme normalize-uri))))))
(assoc-in [:route-params :user-id] fragment))))
(defn match-contact-async
[chain {:keys [user-id ens-name]} callback]
@@ -348,10 +327,6 @@
(= handler :wallet-account)
(cb (match-wallet-account route-params))
(= handler :wallet-connect)
(cb {:type :wallet-connect
:uri (:uri route-params)})
(address/address? uri)
(cb (address->eip681 uri))
+5 -9
View File
@@ -105,12 +105,6 @@
[full-url]
(log/info "universal-links: no handler for " full-url))
(rf/defn handle-wallet-connect
[_ uri]
(log/info "universal-links: handle-wallet-connect" uri)
{:dispatch-later {:ms 1500
:dispatch [:wallet-connect/on-scan-connection uri]}})
(defn dispatch-url
"Dispatch url so we can get access to re-frame/db"
[url]
@@ -123,7 +117,7 @@
(rf/defn on-handle
{:events [:universal-links/match-value]}
[cofx url {:keys [type chat-id community-id uri] :as data}]
[cofx url {:keys [type chat-id community-id] :as data}]
(case type
:group-chat (handle-group-chat cofx data)
:private-chat (handle-private-chat cofx data)
@@ -136,7 +130,6 @@
:browser (handle-browse cofx data)
:eip681 (handle-eip681 cofx data)
:wallet-account (handle-wallet-account cofx data)
:wallet-connect (handle-wallet-connect cofx uri)
(handle-not-found url)))
(rf/defn route-url
@@ -185,10 +178,13 @@
[{:keys [db]} [{:keys [public-key on-success]}]]
(let [profile-public-key (get-in db [:profile/profile :public-key])
profile? (or (not public-key) (= public-key profile-public-key))
ens-name? (if profile?
(get-in db [:profile/profile :ens-name?])
(get-in db [:contacts/contacts public-key :ens-name]))
public-key (if profile? profile-public-key public-key)]
(when public-key
{:json-rpc/call
[{:method "wakuext_shareUserURLWithData"
[{:method (if ens-name? "wakuext_shareUserURLWithENS" "wakuext_shareUserURLWithData")
:params [public-key]
:on-success (fn [url]
(rf/dispatch [:universal-links/save-profile-url public-key url])
@@ -45,8 +45,8 @@
(let [db {:profile/profile {:ens-name? true :public-key pubkey}}
rst (links/generate-profile-url {:db db} [])]
(are [result expected] (match? result expected)
"wakuext_shareUserURLWithData" (-> rst :json-rpc/call first :method)
pubkey (-> rst :json-rpc/call first :params first)))))
"wakuext_shareUserURLWithENS" (-> rst :json-rpc/call first :method)
pubkey (-> rst :json-rpc/call first :params first)))))
(testing "user has no ens name"
(testing "it calls the ens rpc method with public keyas param"
(let [db {:profile/profile {:public-key pubkey}}
@@ -60,8 +60,8 @@
db {:contacts/contacts {pubkey {:ens-name ens}}}
rst (links/generate-profile-url {:db db} [{:public-key pubkey}])]
(are [result expected] (match? result expected)
"wakuext_shareUserURLWithData" (-> rst :json-rpc/call first :method)
pubkey (-> rst :json-rpc/call first :params first)))))
"wakuext_shareUserURLWithENS" (-> rst :json-rpc/call first :method)
pubkey (-> rst :json-rpc/call first :params first)))))
(testing "contact has no ens name"
(testing "it calls the ens rpc method with public keyas param"
(let [db {:contacts/contacts {pubkey {:public-key pubkey}}}
+2 -2
View File
@@ -260,7 +260,9 @@
(def regx-community-universal-link #"((^https?://status.app/)|(^status-app://))c/([\x00-\x7F]+)$")
(def regx-deep-link #"((^ethereum:.*)|(^status-app://[\x00-\x7F]+$))")
(def regx-ens #"^(?=.{5,255}$)([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$")
(def regx-multichain-address #"^(?:(?:eth:|arb1:|oeth:)(?=:|))*0x[0-9a-fA-F]{40}$")
(def regx-address-contains #"(?i)0x[a-fA-F0-9]{40}")
(def regx-starts-with-uuid #"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}")
(def regx-full-or-partial-address #"^0x[a-fA-F0-9]{1,40}$")
@@ -584,8 +586,6 @@
(def ^:const contact-item-height 56)
(def ^:const currency-item-height 64)
(def ^:const slippages [0.1 0.5 1])
(def ^:const default-slippage 0.5)
(def ^:const max-recommended-slippage 5)
@@ -58,9 +58,6 @@
{:keys [admins] :as group} (rf/sub [:chats/chat-by-id chat-id])
current-pk (rf/sub [:multiaccount/public-key])
admin? (get admins current-pk)]
(rn/use-mount (fn []
(rf/dispatch [:group/clear-added-participants])
(rf/dispatch [:group/clear-removed-members])))
[rn/view {:flex 1 :margin-top 20}
[rn/touchable-opacity
{:on-press #(rf/dispatch [:navigate-back])
@@ -177,8 +174,11 @@
:icon :i/add-user
:label (i18n/label (if admin? :t/manage-members :t/add-members))
:counter-value (count contacts)
:on-press #(rf/dispatch [:open-modal :group-add-manage-members
chat-id])}]}]
:on-press (fn []
(rf/dispatch [:group/clear-added-participants])
(rf/dispatch [:group/clear-removed-members])
(rf/dispatch [:open-modal :group-add-manage-members
chat-id]))}]}]
[rn/section-list
{:key-fn :title
:sticky-section-headers-enabled false
@@ -26,7 +26,7 @@
(h/render [audio-message/audio-message message context])
(h/is-truthy (h/get-by-label-text :audio-message-container)))
(h/test-skip "press play calls audio/toggle-playpause-player"
(h/test "press play calls audio/toggle-playpause-player"
(with-redefs [audio/toggle-playpause-player (js/jest.fn)
audio/new-player (fn [_ _ _] {})
audio/prepare-player (fn [_ on-success _] (on-success))
@@ -25,7 +25,7 @@
token-permissions-check id last-opened-at]
:as community} (data-store.communities/<-rpc community-js)
previous-last-opened-at (get-in db [:communities id :last-opened-at])]
(when (>= clock (get-in db [:communities id :clock]))
(when (> clock (get-in db [:communities id :clock]))
{:db (assoc-in db
[:communities id]
(assoc community :last-opened-at (max last-opened-at previous-last-opened-at)))
@@ -181,4 +181,9 @@
(testing "given a community with lower clock"
(let [effects (events/handle-community {:db {:communities {community-id {:clock 3}}}} [community])]
(is (nil? effects))))
(testing "given a community without clock"
(let [community #js {:id community-id}
effects (events/handle-community {} [community])]
(is (nil? effects))))))
@@ -74,7 +74,7 @@
(fn [{:keys [db]} [contact-id]]
{:db (update-in db
[:contacts/contacts contact-id]
#(assoc % :blocked? false))}))
#(assoc % :blocked? false :added true :active? true))}))
(rf/reg-event-fx :contact/unblock-contact
(fn [_ [contact-id]]
@@ -193,7 +193,6 @@
{:header [page-nav]
:keyboard-should-persist-taps :handled
:content-avoid-keyboard? true
:automatically-adjust-keyboard-insets true
:blur-options
{:blur-amount 34
:blur-radius 20
@@ -11,66 +11,92 @@
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(defn- show-terms-of-use
[]
(rf/dispatch [:show-bottom-sheet {:content terms/terms-of-use :shell? true}]))
(defn- show-privacy-policy
[]
(rf/dispatch [:show-bottom-sheet {:content privacy/privacy-statement :shell? true}]))
(defn- terms
[terms-accepted? set-terms-accepted?]
[rn/view {:style style/terms-privacy-container}
[rn/view
{:accessibility-label :terms-privacy-checkbox-container}
[quo/selectors
{:type :checkbox
:blur? true
:checked? terms-accepted?
:on-change #(set-terms-accepted? not)}]]
[rn/view {:style style/text-container}
[quo/text
{:style style/plain-text
:size :paragraph-2}
(str (i18n/label :t/accept-status-tos-prefix) " ")]
[quo/text
{:on-press show-terms-of-use
:style style/highlighted-text
:size :paragraph-2
:weight :medium}
(i18n/label :t/terms-of-service)]
[quo/text
{:style style/plain-text
:size :paragraph-2}
" " (i18n/label :t/and) " "]
[quo/text
{:on-press show-privacy-policy
:style style/highlighted-text
:size :paragraph-2
:weight :medium}
(i18n/label :t/intro-privacy-policy)]]])
(defn- explore-new-status
[]
(rf/dispatch [:profile/explore-new-status]))
(defn- sync-or-recover-profile
[]
(when-let [blur-show-fn @overlay/blur-show-fn-atom]
(blur-show-fn))
(rf/dispatch [:open-modal :screen/onboarding.sync-or-recover-profile]))
(defn- create-profile
[]
(when-let [blur-show-fn @overlay/blur-show-fn-atom]
(blur-show-fn))
(rf/dispatch [:open-modal :screen/onboarding.new-to-status]))
(defn view
[]
(let [[terms-accepted? set-terms-accepted?] (rn/use-state false)]
(let [[terms-accepted? set-terms-accepted?] (rn/use-state false)
from-v1-without-terms-accepted? (rf/sub [:profile/from-status-v1-without-terms-accepted?])]
[rn/view {:style style/page-container}
[background/view false]
[quo/bottom-actions
{:container-style (style/bottom-actions-container (safe-area/get-bottom))
:actions :two-vertical-actions
:description :top
:description-top-text [rn/view
{:style style/terms-privacy-container}
[rn/view
{:accessibility-label :terms-privacy-checkbox-container}
[quo/selectors
{:type :checkbox
:blur? true
:checked? terms-accepted?
:on-change #(set-terms-accepted? not)}]]
[rn/view {:style style/text-container}
[quo/text
{:style style/plain-text
:size :paragraph-2}
(str (i18n/label :t/accept-status-tos-prefix) " ")]
[quo/text
{:on-press #(rf/dispatch [:show-bottom-sheet
{:content terms/terms-of-use
:shell? true}])
:style style/highlighted-text
:size :paragraph-2
:weight :medium}
(i18n/label :t/terms-of-service)]
[quo/text
{:style style/plain-text
:size :paragraph-2}
" " (i18n/label :t/and) " "]
[quo/text
{:on-press #(rf/dispatch [:show-bottom-sheet
{:content privacy/privacy-statement
:shell? true}])
:style style/highlighted-text
:size :paragraph-2
:weight :medium}
(i18n/label :t/intro-privacy-policy)]]]
:button-one-label (i18n/label :t/sync-or-recover-profile)
:button-one-props {:type :dark-grey
:disabled? (not terms-accepted?)
:accessibility-label :already-use-status-button
:on-press (fn []
(when-let [blur-show-fn @overlay/blur-show-fn-atom]
(blur-show-fn))
(rf/dispatch
[:open-modal
:screen/onboarding.sync-or-recover-profile]))}
:button-two-label (i18n/label :t/create-profile)
:button-two-props {:accessibility-label :new-to-status-button
:disabled? (not terms-accepted?)
:on-press
(fn []
(when-let [blur-show-fn @overlay/blur-show-fn-atom]
(blur-show-fn))
(rf/dispatch
[:open-modal :screen/onboarding.new-to-status]))}}]
(cond->
{:container-style (style/bottom-actions-container (safe-area/get-bottom))
:actions :two-vertical-actions
:description :top
:description-top-text [terms terms-accepted? set-terms-accepted?]}
from-v1-without-terms-accepted?
(assoc
:actions :one-action
:button-one-label (i18n/label :t/explore-the-new-status)
:button-one-props {:disabled? (not terms-accepted?)
:accessibility-label :explore-new-status
:on-press explore-new-status})
(not from-v1-without-terms-accepted?)
(assoc
:actions :two-vertical-actions
:button-one-label (i18n/label :t/sync-or-recover-profile)
:button-one-props {:type :dark-grey
:disabled? (not terms-accepted?)
:accessibility-label :already-use-status-button
:on-press sync-or-recover-profile}
:button-two-label (i18n/label :t/create-profile)
:button-two-props {:accessibility-label :new-to-status-button
:disabled? (not terms-accepted?)
:on-press create-profile}))]
[overlay/view]]))
@@ -2,13 +2,9 @@
(:require
[quo.core :as quo]
[quo.foundations.resources :as resources]
[react-native.core :as rn]
[react-native.safe-area :as safe-area]
[reagent.core :as reagent]
[status-im.common.controlled-input.utils :as controlled-input]
[status-im.contexts.preview.quo.preview :as preview]
[status-im.contexts.wallet.common.utils :as utils]
[utils.money :as money]))
[status-im.contexts.preview.quo.preview :as preview]))
(def networks
[{:source (resources/get-network :arbitrum)}
@@ -16,75 +12,47 @@
{:source (resources/get-network :ethereum)}])
(def title "Max: 200 SNT")
(def conversion-rate 3450.28)
(def descriptor
[{:key :token-symbol
[{:key :token
:type :select
:options [{:key :eth}
{:key :snt}]}
{:key :currency
:type :select
:options [{:key "$"}
{:key "€"}]}
:options [{:key :usd}
{:key :eur}]}
{:key :error?
:type :boolean}
{:key :allow-selection?
:type :boolean}])
(defn view
[]
(let [state (reagent/atom {:token-symbol :eth
:currency "$"
:crypto? true
:error? false})]
(let [state (reagent/atom {:token :eth
:currency :usd
:conversion 0.02
:networks networks
:title title
:customization-color :blue
:show-keyboard? false
:allow-selection? true})
value (reagent/atom "")
set-value (fn [v]
(swap! value str v))
delete (fn [_]
(swap! value #(subs % 0 (dec (count %)))))]
(fn []
(let [{:keys [currency token-symbol crypto? error?]} @state
[input-state set-input-state] (rn/use-state controlled-input/init-state)
input-amount (controlled-input/input-value input-state)
swap-between-fiat-and-crypto (fn []
(if crypto?
(set-input-state #(controlled-input/->fiat
%
conversion-rate))
(set-input-state
#(controlled-input/->crypto
%
conversion-rate))))
converted-value (if crypto?
(utils/prettify-balance currency
(money/crypto->fiat
input-amount
conversion-rate))
(utils/prettify-crypto-balance
(or (clj->js token-symbol) "")
(money/fiat->crypto input-amount
conversion-rate)
conversion-rate))]
[preview/preview-container
{:state state
:descriptor descriptor
:full-screen? true
:component-container-style {:flex 1
:justify-content :space-between}}
[quo/token-input
{:token-symbol token-symbol
:currency-symbol (if crypto? token-symbol currency)
:error? error?
:value input-amount
:converted-value converted-value
:on-swap (fn []
(swap! state assoc :crypto? (not crypto?))
(swap-between-fiat-and-crypto))
:hint-component [quo/network-tags
{:networks networks
:title title
:status (when (:error? @state) :error)}]}]
[quo/numbered-keyboard
{:container-style {:padding-bottom (safe-area/get-top)}
:left-action :dot
:delete-key? true
:on-press (fn [c]
(set-input-state #(controlled-input/add-character % c)))
:on-delete (fn []
(set-input-state controlled-input/delete-last))}]]))))
[preview/preview-container
{:state state
:descriptor descriptor
:full-screen? true
:component-container-style {:flex 1
:justify-content :space-between}}
[quo/token-input (assoc @state :value @value)]
[quo/numbered-keyboard
{:container-style {:padding-bottom (safe-area/get-top)}
:left-action :dot
:delete-key? true
:on-press set-value
:on-delete delete}]])))
@@ -1,6 +1,7 @@
(ns status-im.contexts.profile.create.events
(:require
[native-module.core :as native-module]
[status-im.common.emoji-picker.utils :as emoji-picker.utils]
[status-im.contexts.profile.config :as profile.config]
status-im.contexts.profile.create.effects
[utils.re-frame :as rf]
@@ -16,4 +17,5 @@
:displayName display-name
:password login-sha3-password
:imagePath (profile.config/strip-file-prefix image-path)
:customizationColor color)}))
:customizationColor color
:emoji (emoji-picker.utils/random-emoji))}))
@@ -0,0 +1,5 @@
(ns status-im.contexts.profile.data-store)
(defn accepted-terms?
[accounts]
(some #(:hasAcceptedTerms %) accounts))
@@ -11,18 +11,18 @@
(defn items
[theme]
(let [{:keys [bio ens-name?] :as profile} (rf/sub [:profile/profile-with-image])
customization-color (rf/sub [:profile/customization-color])
full-name (profile.utils/displayed-name profile)]
(let [profile (rf/sub [:profile/profile-with-image])
customization-color (rf/sub [:profile/customization-color])
bio (:bio profile)
full-name (profile.utils/displayed-name profile)]
[{:label (i18n/label :t/profile)
:items [(cond-> {:title (i18n/label :t/name)
:blur? true
:label :text
:label-props (utils/truncate-str full-name constants/profile-name-max-length)
:container-style style/item-container}
(not ens-name?)
(assoc :on-press #(rf/dispatch [:open-modal :edit-name])
:action :arrow))
:items [{:title (i18n/label :t/name)
:on-press #(rf/dispatch [:open-modal :edit-name])
:blur? true
:label :text
:label-props (utils/truncate-str full-name constants/profile-name-max-length)
:action :arrow
:container-style style/item-container}
{:title (i18n/label :t/bio)
:on-press #(rf/dispatch [:open-modal :edit-bio])
:blur? true
@@ -0,0 +1,14 @@
(ns status-im.contexts.profile.effects
(:require
[native-module.core :as native-module]
[promesa.core :as promesa]
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
(rf/reg-fx :effects.profile/accept-terms
(fn [{:keys [on-success]}]
(-> (native-module/accept-terms)
(promesa/then (fn []
(rf/call-continuation on-success)))
(promesa/catch (fn [error]
(log/error "Failed to accept terms" {:error error}))))))
+28 -20
View File
@@ -4,10 +4,12 @@
[legacy.status-im.multiaccounts.update.core :as multiaccounts.update]
[native-module.core :as native-module]
[status-im.config :as config]
[status-im.contexts.profile.data-store :as profile.data-store]
[status-im.contexts.profile.edit.accent-colour.events]
[status-im.contexts.profile.edit.bio.events]
[status-im.contexts.profile.edit.header.events]
[status-im.contexts.profile.edit.name.events]
status-im.contexts.profile.effects
status-im.contexts.profile.login.events
[status-im.contexts.profile.rpc :as profile.rpc]
[utils.re-frame :as rf]))
@@ -42,26 +44,27 @@
(rf/reg-event-fx
:profile/get-profiles-overview-success
(fn [{:keys [db]} [{:keys [accounts] {:keys [userConfirmed enabled]} :centralizedMetricsInfo}]]
(let [db-with-settings (assoc db
:centralized-metrics/user-confirmed? userConfirmed
:centralized-metrics/enabled? enabled)]
(if (seq accounts)
(let [profiles (reduce-profiles accounts)
{:keys [key-uid]} (first (sort-by :timestamp > (vals profiles)))]
{:db (if key-uid
(-> db-with-settings
(assoc :profile/profiles-overview profiles)
(update :profile/login #(select-profile % key-uid)))
db-with-settings)
:fx [[:dispatch [:update-theme-and-init-root :screen/profile.profiles]]
(when (and key-uid userConfirmed)
[:effects.biometric/check-if-available
{:key-uid key-uid
:on-success (fn [auth-method]
(rf/dispatch [:profile.login/check-biometric-success key-uid
auth-method]))}])]})
{:db db-with-settings
:fx [[:dispatch [:update-theme-and-init-root :screen/onboarding.intro]]]}))))
(let [db-with-settings (assoc db
:centralized-metrics/user-confirmed? userConfirmed
:centralized-metrics/enabled? enabled)
profiles (reduce-profiles accounts)
{:keys [key-uid]} (first (sort-by :timestamp > (vals profiles)))
new-db (cond-> db-with-settings
(seq profiles)
(assoc :profile/profiles-overview profiles)
key-uid
(update :profile/login #(select-profile % key-uid)))]
{:db new-db
:fx (if (profile.data-store/accepted-terms? accounts)
[[:dispatch [:update-theme-and-init-root :screen/profile.profiles]]
(when (and key-uid userConfirmed)
[:effects.biometric/check-if-available
{:key-uid key-uid
:on-success (fn [auth-method]
(rf/dispatch [:profile.login/check-biometric-success key-uid
auth-method]))}])]
[[:dispatch [:update-theme-and-init-root :screen/onboarding.intro]]])})))
(rf/reg-event-fx
:profile/update-setting-from-backup
@@ -82,3 +85,8 @@
:messages-from-contacts-only
(not (get-in db [:profile/profile :messages-from-contacts-only]))
{})))
(rf/reg-event-fx :profile/explore-new-status
(fn []
{:fx [[:effects.profile/accept-terms
{:on-success [:navigate-to :screen/profile.profiles]}]]}))
@@ -95,7 +95,6 @@
[:dispatch-later [{:ms 1500 :dispatch [:profile.login/non-critical-initialization]}]]
[:dispatch [:network/check-expensive-connection]]
[:profile.settings/get-profile-picture key-uid]
[:settings/get-currencies]
(when (ff/enabled? ::ff/wallet.wallet-connect)
[:dispatch [:wallet-connect/init]])
(when notifications-enabled?
@@ -1,6 +1,7 @@
(ns status-im.contexts.profile.recover.events
(:require
[native-module.core :as native-module]
[status-im.common.emoji-picker.utils :as emoji-picker.utils]
[status-im.contexts.profile.config :as profile.config]
status-im.contexts.profile.recover.effects
[utils.re-frame :as rf]
@@ -22,4 +23,5 @@
:password login-sha3-password
:imagePath (profile.config/strip-file-prefix image-path)
:customizationColor color
:emoji (emoji-picker.utils/random-emoji)
:fetchBackup true})}))
@@ -151,8 +151,3 @@
[{:method "settings_mnemonicWasShown"
:on-success #(log/debug "mnemonic was marked as shown")
:on-error #(log/error "mnemonic was not marked as shown" %)}]]]}))
(rf/reg-event-fx :profile.settings/update-currency
(fn [_ [currency]]
{:fx [[:dispatch [:profile.settings/profile-update :currency currency]]
[:dispatch [:wallet/get-wallet-token-for-all-accounts]]]}))
@@ -85,12 +85,13 @@
:image :icon
:blur? true
:action :arrow}
{:title (i18n/label :t/language-and-currency)
:on-press #(rf/dispatch [:open-modal :screen/settings.language-and-currency])
:image-props :i/globe
:image :icon
:blur? true
:action :arrow}]
(when config/show-not-implemented-features?
{:title (i18n/label :t/language-and-currency)
:on-press not-implemented/alert
:image-props :i/globe
:image :icon
:blur? true
:action :arrow})]
[(when config/show-not-implemented-features?
{:title (i18n/label :t/data-usage)
:on-press not-implemented/alert
@@ -1,8 +0,0 @@
(ns status-im.contexts.settings.language-and-currency.currency.style)
(def input-container
{:padding-horizontal 20
:padding-vertical 8})
(def empty-results
{:margin-top 100})
@@ -1,20 +0,0 @@
(ns status-im.contexts.settings.language-and-currency.currency.utils
(:require [status-im.constants :as constants]))
(defn make-currency-item
"This function generates props for quo/category component item"
[{:keys [currency selected-currency on-change]}]
{:title (if (:token? currency)
(:short-name currency)
(str (:short-name currency) " · " (:symbol currency)))
:description :text
:description-props {:text (:name currency)}
:container-style {:height constants/currency-item-height}
:image (when (:token? currency) :token)
:image-props {:token (:id currency)
:size :size-20}
:action :selector
:action-props {:type :radio
:blur? true
:checked? (= selected-currency (:id currency))
:on-change #(on-change (:id currency))}})
@@ -1,84 +0,0 @@
(ns status-im.contexts.settings.language-and-currency.currency.view
(:require [quo.core :as quo]
[react-native.core :as rn]
[status-im.common.resources :as resources]
[status-im.constants :as constants]
[status-im.contexts.settings.language-and-currency.currency.style :as style]
[status-im.contexts.settings.language-and-currency.currency.utils :as utils]
[status-im.contexts.settings.language-and-currency.data-store :as data-store]
[utils.debounce :as debounce]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(defn- navigate-back
[]
(rf/dispatch [:navigate-back]))
(defn- get-item-layout
[_ index]
#js {:length constants/currency-item-height
:offset (* constants/currency-item-height index)
:index index})
(defn- settings-category-view
[{:keys [title data]} _ _ {:keys [selected-currency on-currency-press]}]
[rn/delay-render
[quo/category
{:label title
:data (map (fn [currency]
(utils/make-currency-item
{:currency currency
:selected-currency selected-currency
:on-change on-currency-press}))
data)
:blur? true
:list-type :settings}]])
(defn view
[]
(let [[search-text set-search-text] (rn/use-state "")
on-currency-press (rn/use-callback #(rf/dispatch [:profile.settings/update-currency
%]))
selected-currency (rf/sub [:profile/currency])
currencies (rf/sub [:currencies/categorized search-text])
on-change-text (rn/use-callback
(debounce/debounce
#(set-search-text %)
300))
formatted-data (rn/use-memo
#(data-store/get-formatted-currency-data currencies)
[search-text currencies])]
[quo/overlay
{:type :shell
:top-inset? true}
[quo/page-nav
{:background :blur
:icon-name :i/arrow-left
:on-press navigate-back}]
[quo/page-top
{:title (i18n/label :t/currency)}]
[quo/input
{:small? true
:blur? true
:container-style style/input-container
:placeholder (i18n/label :t/search-currencies)
:icon-name :i/search
:on-change-text on-change-text}]
(when (zero? (:total currencies))
[quo/empty-state
{:title (i18n/label :t/no-result)
:image (resources/get-themed-image :no-assets :dark)
:container-style style/empty-results
:description (i18n/label :t/try-with-different-currency)}])
[rn/flat-list
{:data formatted-data
:render-data {:selected-currency selected-currency
:on-currency-press on-currency-press}
:render-fn settings-category-view
:get-item-layout get-item-layout
:initial-num-to-render 14
:max-to-render-per-batch 20
:scroll-event-throttle 16
:shows-vertical-scroll-indicator false
:bounces false
:over-scroll-mode :never}]]))
@@ -1,30 +0,0 @@
(ns status-im.contexts.settings.language-and-currency.data-store
(:require [clojure.set :as set]
[utils.i18n :as i18n]))
(defn rpc->currency
[currency]
(some-> currency
(dissoc :unicode)
(set/rename-keys
{:shortName :short-name
:isPopular :popular?
:isToken :token?})
(update :id keyword)))
(defn rpc->currencies
[currencies]
(map rpc->currency currencies))
(defn get-formatted-currency-data
[{:keys [popular crypto other]}]
(concat
(when (seq popular)
[{:title (i18n/label :t/popular-currencies)
:data popular}])
(when (seq crypto)
[{:title (i18n/label :t/crypto)
:data crypto}])
(when (seq other)
[{:title (i18n/label :t/all-currencies)
:data other}])))
@@ -1,56 +0,0 @@
(ns status-im.contexts.settings.language-and-currency.data-store-test
(:require
[cljs.test :refer-macros [deftest is testing]]
matcher-combinators.test
[status-im.contexts.settings.language-and-currency.data-store :as sut]))
(def raw-currency-popular
{:id "usd"
:shortName "USD"
:name "US Dollar"
:symbol "$"
:emoji "🇺🇸"
:isPopular true
:isToken false
:imageSource "https://example.com/image.png"})
(def raw-currency-token
{:id "btc"
:shortName "BTC"
:name "Bitcoin"
:symbol ""
:emoji ""
:isPopular false
:isToken true
:imageSource "https://example.com/image.png"})
(deftest rpc->currency-test
(testing "transforms a currency"
(is
(match? {:id :usd
:short-name "USD"
:symbol "$"
:emoji "🇺🇸"
:name "US Dollar"
:popular? true
:token? false}
(sut/rpc->currency raw-currency-popular)))))
(deftest rpc->currencies-test
(testing "transforms and sorts raw keypairs"
(is
(match? [(sut/rpc->currency raw-currency-popular)
(sut/rpc->currency raw-currency-token)]
(sut/rpc->currencies [raw-currency-popular
raw-currency-token])))))
(deftest get-formatted-currency-data-test
(testing "returns formatted currency data"
(is
(match? [{:title "Popular currencies"
:data [(sut/rpc->currency raw-currency-popular)]}
{:title "Crypto"
:data [(sut/rpc->currency raw-currency-token)]}]
(sut/get-formatted-currency-data {:popular [(sut/rpc->currency raw-currency-popular)]
:crypto [(sut/rpc->currency raw-currency-token)]
:other []})))))
@@ -1,18 +0,0 @@
(ns status-im.contexts.settings.language-and-currency.events
(:require [status-im.common.json-rpc.events :as json-rpc]
[status-im.contexts.settings.language-and-currency.data-store :as data-store]
[utils.collection]
[utils.re-frame :as rf]))
(rf/reg-event-fx :settings/get-currencies-success
(fn [{:keys [db]} [currencies]]
(let [all-currencies (data-store/rpc->currencies currencies)]
{:db (assoc db
:currencies
(utils.collection/index-by :id all-currencies))})))
(rf/reg-fx :settings/get-currencies
(fn []
(json-rpc/call {:method "appgeneral_getCurrencies"
:on-success [:settings/get-currencies-success]
:on-error [:log-rpc-error {:event :settings/get-currencies}]})))
@@ -1,27 +0,0 @@
(ns status-im.contexts.settings.language-and-currency.events-test
(:require
[cljs.test :refer-macros [is]]
matcher-combinators.test
status-im.contexts.settings.language-and-currency.events
[test-helpers.unit :as h]))
(def raw-currency-popular
{:id "usd"
:shortName "USD"
:name "US Dollar"
:symbol "$"
:emoji "🇺🇸"
:isPopular true
:isToken false
:imageSource "https://example.com/image.png"})
(h/deftest-event :settings/get-currencies-success
[event-id dispatch]
(let [expected-effects {:db {:currencies {:usd {:id :usd
:short-name "USD"
:symbol "$"
:emoji "🇺🇸"
:name "US Dollar"
:popular? true
:token? false}}}}]
(is (match? expected-effects (dispatch [event-id [raw-currency-popular]])))))
@@ -1,36 +0,0 @@
(ns status-im.contexts.settings.language-and-currency.view
(:require [quo.core :as quo]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(defn- navigate-back
[]
(rf/dispatch [:navigate-back]))
(defn- on-currency-press
[]
(rf/dispatch [:open-modal :screen/settings.currency-selection]))
(defn view
[]
(let [{:keys [name short-name token?]
:as currency} (rf/sub [:profile/currency-info])
currency-title (if token? name (str short-name " · " (:symbol currency)))]
[quo/overlay
{:type :shell
:top-inset? true}
[quo/page-nav
{:background :blur
:icon-name :i/arrow-left
:on-press navigate-back}]
[quo/page-top
{:title (i18n/label :t/language-and-currency)}]
[quo/category
{:label (i18n/label :t/currency)
:data [{:title currency-title
:on-press on-currency-press
:description :text
:action :arrow
:description-props {:text name}}]
:blur? true
:list-type :settings}]]))
@@ -95,7 +95,7 @@
show-profile-pictures-to
open-show-profile-pictures-to-options))
(setting-preview-privacy preview-privacy? customization-color toggle-preview-privacy)
{:title (i18n/label :t/share-usage-data-with-status)
{:title (i18n/label :t/share-usage-data)
:description :text
:description-props {:text (i18n/label :t/from-all-profiles-on-device)}
:blur? true
@@ -9,7 +9,6 @@
[status-im.contexts.settings.wallet.saved-addresses.add-address-to-save.style :as style]
[status-im.contexts.wallet.common.utils :as utils]
[status-im.contexts.wallet.common.validation :as validation]
[utils.address :as utils-address]
[utils.debounce :as debounce]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
@@ -32,7 +31,7 @@
:own-account
(not
(or (utils-address/eip-3770-address? user-input)
(or (validation/eth-address? user-input)
(validation/ens-name? user-input)))
:invalid-address-or-ens)))
@@ -6,9 +6,9 @@
[status-im.common.scan-qr-code.view :as scan-qr-code]
[status-im.common.validation.general :as validators]
[status-im.contexts.communities.events]
[status-im.contexts.wallet.common.validation :as wallet-validation]
[status-im.contexts.wallet.wallet-connect.utils :as wc-utils]
[status-im.feature-flags :as ff]
[utils.address :as utils-address]
[utils.debounce :as debounce]
[utils.ethereum.eip.eip681 :as eip681]
[utils.i18n :as i18n]
@@ -19,15 +19,19 @@
:theme :dark
:text (i18n/label :t/invalid-qr)})
(defn- text-a-status-url-for-path?
(defn- text-for-url-path?
[text path]
(some #(string/starts-with? text %) (router/prepend-status-urls path)))
(some #(string/starts-with? text %) (router/path-urls path)))
(defn- extract-id
[scanned-text]
(let [index (string/index-of scanned-text "#")]
(subs scanned-text (inc index))))
(defn eth-address?
[scanned-text]
(wallet-validation/eth-address? scanned-text))
(defn eip681-address?
[scanned-text]
(-> scanned-text
@@ -67,15 +71,15 @@
[:wallet-connect/on-scan-connection scanned-text]
300))
(defn- on-qr-code-scanned
(defn on-qr-code-scanned
[scanned-text]
(cond
(or
(text-a-status-url-for-path? scanned-text router/community-with-data-path)
(text-a-status-url-for-path? scanned-text router/channel-path))
(text-for-url-path? scanned-text router/community-with-data-path)
(text-for-url-path? scanned-text router/channel-path))
(debounce/debounce-and-dispatch [:universal-links/handle-url scanned-text] 300)
(text-a-status-url-for-path? scanned-text router/user-with-data-path)
(text-for-url-path? scanned-text router/user-with-data-path)
(let [address (extract-id scanned-text)]
(load-and-show-profile address))
@@ -83,9 +87,9 @@
(validators/valid-compressed-key? scanned-text))
(load-and-show-profile scanned-text)
(utils-address/supported-address? scanned-text)
(when-let [address (utils-address/supported-address->status-address scanned-text)]
(debounce/debounce-and-dispatch [:generic-scanner/scan-success address] 300)
(eth-address? scanned-text)
(do
(debounce/debounce-and-dispatch [:generic-scanner/scan-success scanned-text] 300)
(debounce/debounce-and-dispatch [:navigate-change-tab :wallet-stack] 300))
(eip681-address? scanned-text)
@@ -25,29 +25,23 @@
[]
(rf/dispatch [:wallet/request-collectibles-for-current-viewing-account]))
(defn- collectibles-tab
[]
(let [updating? (rf/sub [:wallet/current-viewing-account-collectibles-updating?])
collectible-list (rf/sub
[:wallet/current-viewing-account-collectibles-in-selected-networks])
current-account-address (rf/sub [:wallet/current-viewing-account-address])]
[collectibles/view
{:loading? updating?
:collectibles collectible-list
:current-account-address current-account-address
:on-end-reached on-end-reached
:on-collectible-press on-collectible-press
:on-collectible-long-press on-collectible-long-press}]))
(defn view
[{:keys [selected-tab]}]
[rn/view {:style {:flex 1}}
(case selected-tab
:assets [assets/view]
:collectibles [collectibles-tab]
:activity [activity/view]
:permissions [empty-tab/view
{:title (i18n/label :t/no-permissions)
:description (i18n/label :t/no-collectibles-description)
:placeholder? true}]
[about/view])])
(let [collectible-list (rf/sub
[:wallet/current-viewing-account-collectibles-in-selected-networks])
current-account-address (rf/sub [:wallet/current-viewing-account-address])]
[rn/view {:style {:flex 1}}
(case selected-tab
:assets [assets/view]
:collectibles [collectibles/view
{:collectibles collectible-list
:current-account-address current-account-address
:on-end-reached on-end-reached
:on-collectible-press on-collectible-press
:on-collectible-long-press on-collectible-long-press}]
:activity [activity/view]
:permissions [empty-tab/view
{:title (i18n/label :t/no-permissions)
:description (i18n/label :t/no-collectibles-description)
:placeholder? true}]
[about/view])]))
@@ -6,10 +6,10 @@
[react-native.core :as rn]
[reagent.core :as reagent]
[status-im.common.floating-button-page.view :as floating-button-page]
[status-im.constants :as constants]
[status-im.contexts.wallet.add-account.add-address-to-watch.style :as style]
[status-im.contexts.wallet.common.validation :as validation]
[status-im.subs.wallet.add-account.address-to-watch]
[utils.address :as utils-address]
[utils.debounce :as debounce]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
@@ -20,9 +20,13 @@
(or (nil? user-input) (= user-input "")) nil
(contains? known-addresses user-input) (i18n/label :t/address-already-in-use)
(not
(or (utils-address/supported-address? user-input)
(or (validation/eth-address? user-input)
(validation/ens-name? user-input))) (i18n/label :t/invalid-address)))
(defn- extract-address
[scanned-text]
(re-find constants/regx-address-contains scanned-text))
(defn- address-input
[{:keys [input-value validation-msg validate clear-input]}]
(let [scanned-address (rf/sub [:wallet/scanned-address])
@@ -137,12 +141,10 @@
(= activity-state :scanning)
(not validated-address))
:on-press (fn []
(rf/dispatch
[:navigate-to
:screen/wallet.confirm-address-to-watch
{:address
(utils-address/extract-address-without-chains-info
validated-address)}])
(rf/dispatch [:navigate-to
:screen/wallet.confirm-address-to-watch
{:address (extract-address
validated-address)}])
(clear-input))
:container-style {:z-index 2}}
(i18n/label :t/continue)]}
@@ -1,15 +1,11 @@
(ns status-im.contexts.wallet.collectible.events
(:require [camel-snake-kebab.extras :as cske]
[clojure.set]
[clojure.string :as string]
[react-native.platform :as platform]
[status-im.contexts.network.data-store :as network.data-store]
[status-im.contexts.wallet.collectible.utils :as collectible-utils]
[status-im.contexts.wallet.data-store :as data-store]
[taoensso.timbre :as log]
[utils.collection]
[utils.ethereum.chain :as chain]
[utils.number :as utils.number]
[utils.re-frame :as rf]
[utils.transforms :as transforms]))
@@ -28,12 +24,6 @@
(def max-cache-age-seconds 3600)
(def collectibles-request-batch-size 25)
(def ownership-state
{:idle 1
:delayed 2
:updating 3
:error 4})
(defn- move-collectibles-to-accounts
[accounts new-collectibles-per-account]
(reduce-kv (fn [acc account new-collectibles]
@@ -94,18 +84,12 @@
(rf/reg-event-fx
:wallet/request-collectibles-for-all-accounts
(fn [{:keys [db]} [{:keys [new-request?]}]]
(let [updating-addresses (-> (get-in db [:wallet :ui :collectibles :updating])
keys
set)
accounts (->> (get-in db [:wallet :accounts])
(let [accounts (->> (get-in db [:wallet :accounts])
(filter (fn [[_ {:keys [has-more-collectibles?]}]]
(or (nil? has-more-collectibles?)
(true? has-more-collectibles?))))
(keys))
;; filter the addresses which are requested before and the collectibles are updating
requestable-addresses (clojure.set/difference (set accounts)
updating-addresses)
num-accounts (count requestable-addresses)
num-accounts (count accounts)
collectibles-per-account (quot collectibles-request-batch-size num-accounts)
;; We need to pass unique IDs for simultaneous requests, otherwise they'll fail
request-ids (get-unique-collectible-request-id num-accounts)
@@ -116,13 +100,13 @@
:account account
:amount collectibles-per-account}]])
request-ids
requestable-addresses)]
accounts)]
{:db (cond-> db
:always (assoc-in [:wallet :ui :collectibles :pending-requests] num-accounts)
new-request? (update-in [:wallet :accounts] update-vals #(dissoc % :collectibles)))
:fx collectible-requests})))
(defn request-collectibles-for-account
(defn request-new-collectibles-for-account-from-signal
[{:keys [db]} [address]]
(let [pending-requests (get-in db [:wallet :ui :collectibles :pending-requests] 0)
[request-id] (get-unique-collectible-request-id 1)]
@@ -133,138 +117,49 @@
:account address
:amount collectibles-request-batch-size}]]]}))
(rf/reg-event-fx :wallet/request-collectibles-for-account request-collectibles-for-account)
(rf/reg-event-fx :wallet/request-new-collectibles-for-account-from-signal
request-new-collectibles-for-account-from-signal)
(rf/reg-event-fx
:wallet/request-collectibles-for-current-viewing-account
(fn [{:keys [db]} _]
(when (network.data-store/online? db)
(let [current-viewing-account (-> db :wallet :current-viewing-account-address)]
{:fx [[:dispatch [:wallet/request-collectibles-for-account current-viewing-account]]]}))))
(rf/reg-event-fx
:wallet/collectible-ownership-update-finished-with-error
(fn [{:keys [db]} [{:keys [accounts message chainId]}]]
(let [address (first accounts)
pending-chain-ids (get-in db [:wallet :ui :collectibles :updating address])
updated-chain-ids (disj pending-chain-ids chainId)
all-chain-updated? (and (some? pending-chain-ids) (empty? updated-chain-ids))]
{:db (cond-> db
(some? pending-chain-ids)
(assoc-in [:wallet :ui :collectibles :updating address] updated-chain-ids))
:fx [[:dispatch
[:wallet/log-rpc-error
{:event :wallet/collectible-ownership-update-finished-with-error
:params {:address address
:chain-id chainId}}
message]]
(when all-chain-updated?
[:dispatch [:wallet/request-collectibles-for-account address]])]})))
(rf/reg-event-fx
:wallet/collectible-ownership-update-finished
(fn [{:keys [db]} [{:keys [accounts chainId]}]]
(let [address (first accounts)
pending-chain-ids (get-in db [:wallet :ui :collectibles :updating address])
updated-chain-ids (disj pending-chain-ids chainId)
all-chain-updated? (and (some? pending-chain-ids) (empty? updated-chain-ids))]
{:db (cond-> db
(some? pending-chain-ids)
(assoc-in [:wallet :ui :collectibles :updating address] updated-chain-ids))
:fx [(when all-chain-updated?
[:dispatch [:wallet/request-collectibles-for-account address]])]})))
(defn- update-collectibles-in-account
[existing-collectibles updated-collectibles]
(let [indexed-existing (utils.collection/index-by
:unique-id
existing-collectibles)
existing-ids (-> indexed-existing keys vec)
;; pick collectibles only in the app-db
indexed-updated (-> (utils.collection/index-by
:unique-id
updated-collectibles)
(select-keys existing-ids))]
(-> (merge-with
merge
indexed-existing
indexed-updated)
vals
vec)))
(rf/reg-event-fx
:wallet/collectibles-data-updated
(fn [{:keys [db]} [{:keys [message]}]]
(let [collectibles-by-address (->> message
transforms/json->clj
data-store/rpc->collectibles
(group-by #(-> % :ownership first :address)))]
{:db (update-in db
[:wallet :accounts]
#(reduce-kv
(fn [accounts address updated-collectibles]
(if (contains? accounts address)
(update-in accounts
[address :collectibles]
update-collectibles-in-account
updated-collectibles)
accounts))
%
collectibles-by-address))})))
(rf/reg-event-fx
:wallet/set-collectibles-updating-status
(fn [{:keys [db]} [address chain-ids]]
{:db (assoc-in db [:wallet :ui :collectibles :updating address] chain-ids)}))
(let [current-viewing-account (-> db :wallet :current-viewing-account-address)
[request-id] (get-unique-collectible-request-id 1)]
{:db (assoc-in db [:wallet :ui :collectibles :pending-requests] 1)
:fx [[:dispatch
[:wallet/request-new-collectibles-for-account
{:request-id request-id
:account current-viewing-account
:amount collectibles-request-batch-size}]]]}))))
(defn- update-fetched-collectibles-progress
[db owner-address collectibles offset has-more?]
(-> db
(update-in [:wallet :ui :collectibles :updating] dissoc owner-address)
(assoc-in [:wallet :ui :collectibles :fetched owner-address] collectibles)
(assoc-in [:wallet :accounts owner-address :current-collectible-idx]
(+ offset (count collectibles)))
(assoc-in [:wallet :accounts owner-address :has-more-collectibles?] has-more?)))
(defn- updating-collectibles?
[status]
(and (= (:state status) (ownership-state :updating))
(= (:timestamp status) -1)))
(rf/reg-event-fx
:wallet/owned-collectibles-filtering-done
(fn [{:keys [db]} [{:keys [message]}]]
(let [{:keys [offset ownershipStatus collectibles
hasMore]} (transforms/json->clj message)
ownership-status-by-address (-> ownershipStatus
(update-keys name)
(update-vals #(update-keys %
(comp utils.number/parse-int name))))
owner-address (some-> ownership-status-by-address
first
key)
ownership-status (get ownership-status-by-address owner-address)
collectibles (data-store/rpc->collectibles collectibles)
pending-requests (dec (get-in db [:wallet :ui :collectibles :pending-requests]))
;; check if collectibles are updating (never fetched and cached before) for this address
updating-chains (-> (select-keys
ownership-status
(for [[k v] ownership-status
:when (updating-collectibles? v)]
k))
keys
set)
updating? (-> updating-chains count pos?)]
hasMore]} (transforms/json->clj message)
collectibles (cske/transform-keys transforms/->kebab-case-keyword collectibles)
pending-requests (dec (get-in db [:wallet :ui :collectibles :pending-requests]))
owner-address (some->> ownershipStatus
first
key
name)]
{:db (cond-> db
:always (assoc-in [:wallet :ui :collectibles :pending-requests] pending-requests)
owner-address (update-fetched-collectibles-progress owner-address
collectibles
offset
(when-not updating? hasMore)))
hasMore))
:fx [(when (zero? pending-requests)
[:dispatch [:wallet/flush-collectibles-fetched]])
(when updating?
[:dispatch [:wallet/set-collectibles-updating-status owner-address updating-chains]])]})))
[:dispatch [:wallet/flush-collectibles-fetched]])]})))
(rf/reg-event-fx
:wallet/navigate-to-collectible-details
@@ -43,8 +43,8 @@
(is (match? result-db expected-db))))))
(deftest request-collectibles-for-account-test
(testing "request collectibles for account"
(deftest request-new-collectibles-for-account-from-signal-test
(testing "request new collectibles for account from signal"
(let [db {:wallet {}}
address "0x1"
expected {:db {:wallet {:ui {:collectibles {:pending-requests 1}}}}
@@ -53,6 +53,6 @@
{:request-id 0
:account address
:amount events/collectibles-request-batch-size}]]]}
effects (events/request-collectibles-for-account {:db db}
[address])]
effects (events/request-new-collectibles-for-account-from-signal {:db db}
[address])]
(is (match? expected effects)))))
@@ -70,10 +70,3 @@
test-networks-enabled?
is-goerli-enabled?)]
(str base-link "/assets/" opensea-network-name "/" contract-address "/" token-id)))
(defn get-collectible-unique-id
[{:keys [id]}]
(let [chain-id (-> id :contract-id :chain-id)
contract-address (-> id :contract-id :address)
token-id (-> id :token-id)]
(str chain-id contract-address token-id)))
@@ -10,16 +10,6 @@
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(defn- loading-collectible-item
[_ index]
(let [gradient-color (keyword (str "gradient-" (inc (mod index 5))))]
[quo/collectible-list-item
{:type :card
:gradient-color-index gradient-color
:supported-file? true
:loading? true
:container-style style/collectible-container}]))
(defn- collectible-item
[{:keys [preview-url collection-data collectible-data total-owned on-press on-long-press]
:as collectible}
@@ -51,18 +41,10 @@
(defn view
[{:keys [collectibles filtered? on-end-reached on-collectible-press
current-account-address on-collectible-long-press loading?]}]
current-account-address on-collectible-long-press]}]
(let [theme (quo.theme/use-theme)
no-results-match-query? (and filtered? (empty? collectibles))]
(cond
loading?
[rn/flat-list
{:data (repeat 8 {})
:style {:flex 1}
:content-container-style style/list-container-style
:num-columns 2
:render-fn loading-collectible-item}]
no-results-match-query?
[rn/view {:style {:flex 1 :justify-content :center}}
[quo/empty-state
@@ -80,14 +62,15 @@
;; TODO: https://github.com/status-im/status-mobile/issues/20137
;; 1. If possible, move `collectibles-data` calculation to a subscription
;; 2. Optimization: do not recalculate all the collectibles, process only the new ones
(let [collectibles-data (map
(fn [{:keys [ownership] :as collectible}]
(let [collectibles-data (map-indexed
(fn [index {:keys [ownership] :as collectible}]
(let [total-owned (rf/sub [:wallet/total-owned-collectible ownership
current-account-address])]
(assoc collectible
:total-owned total-owned
:on-long-press on-collectible-long-press
:on-press on-collectible-press)))
:total-owned total-owned
:on-long-press on-collectible-long-press
:on-press on-collectible-press
:collectible-index index)))
collectibles)]
[rn/flat-list
{:data collectibles-data
@@ -97,5 +80,5 @@
:num-columns 2
:render-fn collectible-item
:on-end-reached on-end-reached
:key-fn :unique-id
:key-fn :collectible-index
:on-end-reached-threshold 4}]))))
@@ -1,11 +1,28 @@
(ns status-im.contexts.wallet.common.scan-account.view
(:require
[clojure.string :as string]
[status-im.common.scan-qr-code.view :as scan-qr-code]
[utils.address :as utils-address]
[status-im.constants :as constants]
[utils.debounce :as debounce]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(def ^:private supported-networks #{:eth :arb1 :oeth})
(defn- contains-supported-address?
[s]
(let [address? (boolean (re-find constants/regx-address-contains s))
networks (when address?
(as-> s $
(string/split $ ":")
(butlast $)))
supported? (every? supported-networks (map keyword networks))]
(and address? supported?)))
(defn- extract-address
[scanned-text]
(first (re-seq constants/regx-multichain-address scanned-text)))
(defn view
[]
(let [{:keys [on-result]} (rf/sub [:get-screen-params])]
@@ -13,9 +30,9 @@
{:title (i18n/label :t/scan-qr)
:subtitle (i18n/label :t/scan-an-address-qr-code)
:error-message (i18n/label :t/oops-this-qr-does-not-contain-an-address)
:validate-fn #(utils-address/supported-address? %)
:validate-fn #(contains-supported-address? %)
:on-success-scan (fn [result]
(let [address (utils-address/supported-address->status-address result)]
(let [address (extract-address result)]
(when on-result (on-result address))
(debounce/debounce-and-dispatch
[:wallet/scan-address-success address]
+36 -61
View File
@@ -12,20 +12,14 @@
[full-name]
(first (string/split full-name #" ")))
(defn cut-fiat-balance-to-two-decimals
[balance]
(defn prettify-balance
[currency-symbol balance]
(let [valid-balance? (and balance
(or (number? balance) (.-toFixed balance)))]
(as-> balance $
(if valid-balance? $ 0)
(.toFixed $ 2))))
(defn prettify-balance
[currency-symbol balance]
(let [formatted-symbol (if (> (count currency-symbol) 1)
(str currency-symbol " ")
currency-symbol)]
(str formatted-symbol (cut-fiat-balance-to-two-decimals balance))))
(.toFixed $ 2)
(str currency-symbol $))))
(defn get-derivation-path
[number-of-accounts]
@@ -53,8 +47,8 @@
nil))
(defn calc-max-crypto-decimals
[one-cent-value]
(let [str-representation (str one-cent-value)
[value]
(let [str-representation (str value)
decimal-part (second (clojure.string/split str-representation #"\."))
exponent (extract-exponent str-representation)
zeroes-count (count (take-while #(= \0 %) decimal-part))
@@ -64,60 +58,29 @@
(inc max-decimals)
max-decimals)))
(defn token-usd-price
[token]
(get-in token [:market-values-per-currency :usd :price]))
(defn one-cent-value
[token-price-in-usd]
(if (pos? token-price-in-usd)
(/ 0.01 token-price-in-usd)
0))
(defn analyze-token-amount-for-price
"For full details: https://github.com/status-im/status-mobile/issues/18225"
[token-price-in-usd token-units]
(if (or (nil? token-units)
(not (money/bignumber? token-units))
(money/equal-to token-units 0))
{:zero-value? true}
(let [cent-value (one-cent-value token-price-in-usd)]
{:usd-cent-value cent-value
:standardized-decimals-count (if (nil? token-price-in-usd)
missing-price-decimals
(calc-max-crypto-decimals cent-value))})))
(defn cut-crypto-decimals-to-fit-usd-cents
[token-units token-price-in-usd]
(let [{:keys [zero-value? usd-cent-value standardized-decimals-count]}
(analyze-token-amount-for-price token-price-in-usd token-units)]
(cond
zero-value? "0"
(< token-units usd-cent-value) "0"
:else (number/remove-trailing-zeroes
(.toFixed token-units standardized-decimals-count)))))
(defn prettify-crypto-balance
[token-symbol crypto-balance conversion-rate]
(str (cut-crypto-decimals-to-fit-usd-cents crypto-balance conversion-rate)
" "
(string/upper-case token-symbol)))
(defn get-crypto-decimals-count
[{:keys [market-values-per-currency]}]
(let [price (get-in market-values-per-currency [:usd :price])
one-cent-value (if (pos? price) (/ 0.01 price) 0)]
(calc-max-crypto-decimals one-cent-value)))
(defn get-standard-crypto-format
"For full details: https://github.com/status-im/status-mobile/issues/18225"
[token token-units]
(let [token-price-in-usd (token-usd-price token)
{:keys [zero-value? usd-cent-value standardized-decimals-count]}
(analyze-token-amount-for-price token-price-in-usd token-units)]
(cond
zero-value?
"0"
[{:keys [market-values-per-currency]} token-units]
(cond (or (nil? token-units)
(money/equal-to token-units 0))
"0"
(< token-units usd-cent-value)
(str "<" (number/remove-trailing-zeroes (.toFixed usd-cent-value standardized-decimals-count)))
(nil? (-> market-values-per-currency :usd :price))
(number/remove-trailing-zeroes (.toFixed token-units missing-price-decimals))
:else
(number/remove-trailing-zeroes (.toFixed token-units standardized-decimals-count)))))
:else
(let [price (-> market-values-per-currency :usd :price)
one-cent-value (if (pos? price) (/ 0.01 price) 0)
decimals-count (calc-max-crypto-decimals one-cent-value)]
(if (< token-units one-cent-value)
(str "<" (number/remove-trailing-zeroes (.toFixed one-cent-value decimals-count)))
(number/remove-trailing-zeroes (.toFixed token-units decimals-count))))))
(defn get-market-value
[currency {:keys [market-values-per-currency]}]
@@ -323,6 +286,18 @@
(let [counter (count address)]
(str (subs address 0 6) "\u2026" (subs address (- counter 3) counter)))))
(defn make-limit-label-crypto
[amount currency]
(str amount
" "
(some-> currency
name
string/upper-case)))
(defn make-limit-label-fiat
[amount currency-symbol]
(str currency-symbol amount))
(defn get-account-name-error
[s existing-account-names]
(cond
@@ -73,12 +73,7 @@
token-units (money/bignumber 0.01)]
(is (= (utils/get-standard-crypto-format {:market-values-per-currency market-values-per-currency}
token-units)
"<2")))
(let [market-values-per-currency {:usd {:price 0.005}}
token-units "0.01"]
(is (= (utils/get-standard-crypto-format {:market-values-per-currency market-values-per-currency}
token-units)
"0")))))
"<2")))))
(deftest calculate-total-token-balance-test
(testing "calculate-total-token-balance function"
@@ -168,3 +163,5 @@
expected-order ["DAI" "ETH" "SNT"]]
(is (= expected-order sorted-tokens)))))
@@ -1,11 +1,8 @@
(ns status-im.contexts.wallet.common.validation
(:require [clojure.string :as string]
[status-im.constants :as constants]))
(:require [status-im.constants :as constants]))
(defn ens-name?
[s]
(and (not (string/blank? s))
(boolean (re-find constants/regx-ens s))))
(defn ens-name? [s] (boolean (re-find constants/regx-ens s)))
(defn eth-address? [s] (re-find constants/regx-multichain-address s))
(defn private-key?
[s]
(or (re-find constants/regx-private-key-hex s)
@@ -4,7 +4,6 @@
[clojure.set :as set]
[clojure.string :as string]
[status-im.constants :as constants]
[status-im.contexts.wallet.collectible.utils :as collectible-utils]
[status-im.contexts.wallet.common.utils.networks :as network-utils]
[status-im.contexts.wallet.send.utils :as send-utils]
[utils.collection :as utils.collection]
@@ -267,10 +266,3 @@
(defn tokens-never-loaded?
[db]
(nil? (get-in db [:wallet :ui :tokens-loading])))
(defn rpc->collectibles
[collectibles]
(->> collectibles
(cske/transform-keys transforms/->kebab-case-keyword)
(map #(assoc % :unique-id (collectible-utils/get-collectible-unique-id %)))
vec))
+21 -4
View File
@@ -105,7 +105,7 @@
:wallet/fetch-assets-for-address
(fn [_ [address]]
{:fx [[:dispatch [:wallet/get-wallet-token-for-account address]]
[:dispatch [:wallet/request-collectibles-for-account address]]
[:dispatch [:wallet/request-new-collectibles-for-account-from-signal address]]
[:dispatch [:wallet/check-recent-history-for-account address]]]}))
(defn- reconcile-accounts
@@ -151,6 +151,11 @@
:on-success [:wallet/get-accounts-success]
:on-error [:wallet/log-rpc-error {:event :wallet/get-accounts}]}]]]}))
(rf/reg-event-fx :wallet/process-account-from-signal
(fn [{:keys [db]} [{:keys [address] :as account}]]
{:db (assoc-in db [:wallet :accounts address] (data-store/rpc->account account))
:fx [[:dispatch [:wallet/fetch-assets-for-address address]]]}))
(rf/reg-event-fx
:wallet/save-account
(fn [_ [{:keys [account on-success]}]]
@@ -579,13 +584,25 @@
(rf/reg-event-fx
:wallet/process-keypair-from-backup
(fn [_ [{:keys [backedUpKeypair]}]]
{:fx [[:dispatch [:wallet/reconcile-keypairs [backedUpKeypair]]]]}))
(fn [{:keys [db]} [{:keys [backedUpKeypair]}]]
(let [{:keys [key-uid accounts]} backedUpKeypair
accounts-fx
(mapv (fn [{:keys [chat] :as account}]
;; We exclude the chat account from the profile keypair for fetching the assets
(when-not chat
[:dispatch
[:wallet/process-account-from-signal
account]]))
accounts)]
{:db (assoc-in db
[:wallet :keypairs key-uid]
(data-store/rpc->keypair backedUpKeypair))
:fx accounts-fx})))
(rf/reg-event-fx
:wallet/process-watch-only-account-from-backup
(fn [_ [{:keys [backedUpWatchOnlyAccount]}]]
{:fx [[:dispatch [:wallet/reconcile-watch-only-accounts [backedUpWatchOnlyAccount]]]]}))
{:fx [[:dispatch [:wallet/process-account-from-signal backedUpWatchOnlyAccount]]]}))
(defn reconcile-watch-only-accounts
[{:keys [db]} [watch-only-accounts]]
@@ -143,6 +143,13 @@
address-2 {:address address-2}}}})
(is (match? expected-fx (:fx (dispatch [event-id])))))))
(h/deftest-event :wallet/process-account-from-signal
[event-id dispatch]
(let [expected-effects {:db {:wallet {:accounts {address account}}}
:fx [[:dispatch [:wallet/fetch-assets-for-address address]]]}]
(reset! rf-db/app-db {:wallet {:accounts {}}})
(is (match? expected-effects (dispatch [event-id raw-account])))))
(h/deftest-event :wallet/reconcile-keypairs
[event-id dispatch]
(let [keypair-key-uid (:key-uid raw-account)]
@@ -19,23 +19,17 @@
(def on-collectible-press #(rf/dispatch [:wallet/navigate-to-collectible-details %]))
(def request-collectibles #(rf/dispatch [:wallet/request-collectibles-for-all-accounts {}]))
(defn- collectibles-tab
[]
(let [updating? (rf/sub [:wallet/home-tab-collectibles-updating?])
collectible-list (rf/sub [:wallet/owned-collectibles-list-in-selected-networks])]
[collectibles/view
{:loading? updating?
:collectibles collectible-list
:on-collectible-long-press on-collectible-long-press
:on-end-reached request-collectibles
:on-collectible-press on-collectible-press}]))
(defn view
[{:keys [selected-tab]}]
[rn/view {:style style/container}
(case selected-tab
:assets [assets/view]
:collectibles [collectibles-tab]
[activity/view {:activities []}])])
(let [collectible-list (rf/sub [:wallet/owned-collectibles-list-in-selected-networks])
request-collectibles #(rf/dispatch
[:wallet/request-collectibles-for-all-accounts {}])]
[rn/view {:style style/container}
(case selected-tab
:assets [assets/view]
:collectibles [collectibles/view
{:collectibles collectible-list
:on-collectible-long-press on-collectible-long-press
:on-end-reached request-collectibles
:on-collectible-press on-collectible-press}]
[activity/view {:activities []}])]))
@@ -110,23 +110,22 @@
(h/setup-subs sub-mocks)
(h/render-with-theme-provider [input-amount/view
{:crypto-decimals 2
:limit-crypto (money/bignumber 250)
:limit-crypto 250
:initial-crypto-currency? false}])
(h/is-truthy (h/get-by-text "0"))
(h/is-truthy (h/get-by-text "USD"))
(h/is-truthy (h/get-by-text "0 ETH"))
(h/is-truthy (h/get-by-text "ETH"))
(h/is-truthy (h/get-by-text "$0.00"))
(h/is-truthy (h/get-by-label-text :container))
(h/is-disabled (h/get-by-label-text :button-one)))
(h/test "Fill token input and confirm"
(h/setup-subs sub-mocks)
(let [on-confirm (h/mock-fn)]
(h/render-with-theme-provider [input-amount/view
{:crypto-decimals 10
:limit-crypto (money/bignumber 1000)
:on-confirm on-confirm
:initial-crypto-currency? true}])
{:on-confirm on-confirm
:crypto-decimals 10
:limit-crypto 1000
:initial-crypto-currency? false}])
(h/fire-event :press (h/query-by-label-text :keyboard-key-1))
(h/fire-event :press (h/query-by-label-text :keyboard-key-2))
@@ -135,19 +134,42 @@
(h/fire-event :press (h/query-by-label-text :keyboard-key-4))
(h/fire-event :press (h/query-by-label-text :keyboard-key-5))
(-> (h/wait-for #(h/get-by-text "$1234.50"))
(.then (fn []
(h/is-truthy (h/get-by-label-text :button-one))
(h/is-truthy (h/get-by-label-text :container))
(h/fire-event :press (h/get-by-label-text :button-one))
(h/was-called on-confirm))))))
(h/test "Fill token input and confirm"
(h/setup-subs sub-mocks)
(let [on-confirm (h/mock-fn)]
(h/render-with-theme-provider [input-amount/view
{:crypto-decimals 10
:limit-crypto 1000
:on-confirm on-confirm
:initial-crypto-currency? false}])
(h/fire-event :press (h/query-by-label-text :keyboard-key-1))
(h/fire-event :press (h/query-by-label-text :keyboard-key-2))
(h/fire-event :press (h/query-by-label-text :keyboard-key-3))
(h/fire-event :press (h/query-by-label-text :keyboard-key-.))
(h/fire-event :press (h/query-by-label-text :keyboard-key-4))
(h/fire-event :press (h/query-by-label-text :keyboard-key-5))
(-> (h/wait-for #(h/get-by-text "$1234.50"))
(.then (fn []
(let [btn (h/get-by-label-text :button-one)]
(h/is-truthy btn)
(h/fire-event :press btn)
(h/was-called on-confirm)))))))
(h/is-truthy (h/get-by-label-text :button-one))
(h/is-truthy (h/get-by-label-text :container))
(h/fire-event :press (h/get-by-label-text :button-one))
(h/was-called on-confirm))))))
(h/test "Try to fill more than limit"
(h/setup-subs sub-mocks)
(h/render-with-theme-provider [input-amount/view
{:crypto-decimals 1
:limit-crypto (money/bignumber 1)}])
:limit-crypto 1}])
(h/fire-event :press (h/query-by-label-text :keyboard-key-2))
(h/fire-event :press (h/query-by-label-text :keyboard-key-9))
@@ -159,12 +181,13 @@
(h/setup-subs sub-mocks)
(h/render-with-theme-provider [input-amount/view
{:crypto-decimals 1
:limit-crypto (money/bignumber 10)
:limit-crypto 1
:on-confirm #()}])
(h/fire-event :press (h/query-by-label-text :keyboard-key-9))
(h/fire-event :press (h/query-by-label-text :keyboard-key-9))
(h/is-truthy (h/get-by-label-text :container-error))
(h/fire-event :press (h/query-by-label-text :reorder))
(h/is-truthy #(h/get-by-text "Max: $100.00"))))
(-> (h/wait-for #(h/get-by-text "Max: $1000.00"))
(.then (fn []
(h/wait-for #(h/is-truthy (h/get-by-label-text :container))))))))
@@ -153,8 +153,9 @@
bottom (safe-area/get-bottom)
[crypto-currency? set-crypto-currency] (rn/use-state initial-crypto-currency?)
on-navigate-back on-navigate-back
[input-state set-input-state] (rn/use-state controlled-input/init-state)
[just-toggled-mode? set-just-toggled-mode?] (rn/use-state false)
clear-input! #(set-input-state controlled-input/delete-all)
handle-on-confirm (fn [amount]
(rf/dispatch [:wallet/set-token-amount-to-send
{:amount amount
@@ -162,45 +163,63 @@
{fiat-currency :currency} (rf/sub [:profile/profile])
{token-symbol :symbol
token-networks :networks
token-decimals :decimals
:as
token} (rf/sub [:wallet/wallet-send-token])
send-from-locked-amounts (rf/sub [:wallet/wallet-send-from-locked-amounts])
{token-balance :total-balance
:as token-by-symbol} (rf/sub [:wallet/token-by-symbol
{token-balance :total-balance
available-balance :available-balance
:as token-by-symbol} (rf/sub [:wallet/token-by-symbol
(str token-symbol)
enabled-from-chain-ids])
currency-symbol (rf/sub [:profile/currency-symbol])
currency (rf/sub [:profile/currency])
conversion-rate (-> token
:market-values-per-currency
currency
:price)
token-decimals (-> token
utils/token-usd-price
utils/one-cent-value
utils/calc-max-crypto-decimals)
[input-state set-input-state] (rn/use-state
(-> controlled-input/init-state
(controlled-input/set-upper-limit
(utils/cut-crypto-decimals-to-fit-usd-cents
(or default-limit-crypto token-balance)
conversion-rate))))
clear-input! #(set-input-state controlled-input/delete-all)
currency-symbol (rf/sub [:profile/currency-symbol])
loading-routes? (rf/sub
[:wallet/wallet-send-loading-suggested-routes?])
route (rf/sub [:wallet/wallet-send-route])
on-confirm (or default-on-confirm handle-on-confirm)
crypto-decimals (or token-decimals default-crypto-decimals)
input-value (controlled-input/input-value input-state)
valid-input? (not (or (controlled-input/empty-value? input-state)
(controlled-input/input-error input-state)))
current-crypto-limit (or default-limit-crypto
(utils/get-standard-crypto-format
token
token-balance))
available-crypto-limit (or default-limit-crypto
(utils/get-standard-crypto-format
token
available-balance))
current-fiat-limit (.toFixed (* token-balance conversion-rate) 2)
available-fiat-limit (.toFixed (* available-balance conversion-rate) 2)
current-limit (if crypto-currency?
current-crypto-limit
current-fiat-limit)
available-limit (if crypto-currency?
available-crypto-limit
available-fiat-limit)
valid-input? (not (or (string/blank?
(controlled-input/input-value
input-state))
(<= (controlled-input/numeric-value
input-state)
0)
(> (controlled-input/numeric-value
input-state)
available-limit)))
input-num-value (controlled-input/numeric-value input-state)
input-amount (controlled-input/input-value input-state)
confirm-disabled? (or (nil? route)
(empty? route)
(not valid-input?))
(string/blank? (controlled-input/input-value
input-state))
(<= input-num-value 0)
(> input-num-value current-limit))
amount-in-crypto (if crypto-currency?
input-value
input-amount
(number/remove-trailing-zeroes
(.toFixed (/ input-value conversion-rate)
(.toFixed (/ input-amount conversion-rate)
crypto-decimals)))
total-amount-receiver (rf/sub [:wallet/total-amount true])
amount-text (str (number/remove-trailing-zeroes
@@ -248,7 +267,8 @@
receiver-selected-network))
receiver-networks))
input-error (controlled-input/input-error input-state)
limit-insufficient? (controlled-input/upper-limit-exceeded? input-state)
limit-insufficient? (> (controlled-input/numeric-value input-state)
current-limit)
should-try-again? (and (not limit-insufficient?) no-routes-found?)
current-address (rf/sub [:wallet/current-viewing-account-address])
owned-eth-token (rf/sub [:wallet/token-by-symbol
@@ -261,9 +281,7 @@
(if (= token-symbol
(string/upper-case
constants/mainnet-short-name))
(money/equal-to
(controlled-input/numeric-value input-state)
(controlled-input/upper-limit input-state))
(= current-limit input-amount)
(money/equal-to (:total-balance
owned-eth-token)
0)))
@@ -277,20 +295,34 @@
:valid-input? valid-input?
:bounce-duration-ms bounce-duration-ms
:token token}))
swap-between-fiat-and-crypto (fn []
swap-between-fiat-and-crypto (fn [swap-to-crypto-currency?]
(set-just-toggled-mode? true)
(if crypto-currency?
(set-input-state
#(controlled-input/->fiat % conversion-rate))
(set-input-state
#(controlled-input/->crypto % conversion-rate)))
(set-crypto-currency (not crypto-currency?)))]
(set-crypto-currency swap-to-crypto-currency?)
(set-input-state
(fn [input-state]
(controlled-input/set-input-value
input-state
(let [value (controlled-input/input-value
input-state)
new-value (if swap-to-crypto-currency?
(.toFixed (/ value
conversion-rate)
crypto-decimals)
(.toFixed (* value
conversion-rate)
12))]
(number/remove-trailing-zeroes
new-value))))))]
(rn/use-mount
(fn []
(let [dismiss-keyboard-fn #(when (= % "active") (rn/dismiss-keyboard!))
app-keyboard-listener (.addEventListener rn/app-state "change" dismiss-keyboard-fn)]
#(.remove app-keyboard-listener))))
(hot-reload/use-safe-unmount on-navigate-back)
(rn/use-effect
(fn []
(set-input-state #(controlled-input/set-upper-limit % current-limit)))
[current-limit])
(rn/use-effect
(fn []
(when input-error (debounce/clear-all))
@@ -314,36 +346,24 @@
:on-press #(rf/dispatch [:navigate-back])
:switcher-type :select-account}]
[quo/token-input
{:container-style style/input-container
:token-symbol token-symbol
:value input-value
:on-swap swap-between-fiat-and-crypto
:on-token-press show-select-asset-sheet
:error? (controlled-input/input-error input-state)
:currency-symbol (if crypto-currency? token-symbol fiat-currency)
:converted-value (if crypto-currency?
(utils/prettify-balance
currency-symbol
(money/crypto->fiat input-value
conversion-rate))
(utils/prettify-crypto-balance
(or (clj->js token-symbol) "")
(money/fiat->crypto input-value
conversion-rate)
conversion-rate))
:hint-component [quo/network-tags
{:networks (seq from-enabled-networks)
:title (i18n/label
:t/send-limit
{:limit (if crypto-currency?
(utils/prettify-crypto-balance
(or (clj->js token-symbol) "")
(controlled-input/upper-limit input-state)
conversion-rate)
(utils/prettify-balance currency-symbol
(controlled-input/upper-limit
input-state)))})
:status (when (controlled-input/input-error input-state) :error)}]}]
{:container-style style/input-container
:token token-symbol
:currency fiat-currency
:currency-symbol currency-symbol
:crypto-decimals (min token-decimals 6)
:error? (controlled-input/input-error input-state)
:networks (seq from-enabled-networks)
:title (i18n/label
:t/send-limit
{:limit (if crypto-currency?
(utils/make-limit-label-crypto current-limit token-symbol)
(utils/make-limit-label-fiat current-limit currency-symbol))})
:conversion conversion-rate
:show-keyboard? false
:value input-amount
:on-swap swap-between-fiat-and-crypto
:on-token-press show-select-asset-sheet
:allow-selection? false}]
[routes/view
{:token token-by-symbol
:send-amount-in-crypto amount-in-crypto
@@ -388,7 +408,7 @@
:left-action :dot
:delete-key? true
:on-press (fn [c]
(let [new-text (str input-value c)
(let [new-text (str input-amount c)
max-decimals (if crypto-currency? crypto-decimals 2)
regex-pattern (str "^\\d*\\.?\\d{0," max-decimals "}$")
regex (re-pattern regex-pattern)]
@@ -1,12 +1,19 @@
(ns status-im.contexts.wallet.send.routes.view
(:require
[clojure.string :as string]
[quo.core :as quo]
[react-native.core :as rn]
[react-native.safe-area :as safe-area]
[status-im.common.controlled-input.utils :as controlled-input]
[status-im.contexts.wallet.common.utils :as utils]
[status-im.contexts.wallet.common.utils.networks :as network-utils]
[status-im.contexts.wallet.send.routes.style :as style]
[status-im.contexts.wallet.send.utils :as send-utils]
[status-im.contexts.wallet.sheets.network-preferences.view :as network-preferences]
[status-im.feature-flags :as ff]
[utils.i18n :as i18n]
[utils.money :as money]
[utils.number :as number]
[utils.re-frame :as rf]))
@@ -80,164 +87,160 @@
(rf/dispatch [:wallet/update-receiver-networks
chain-ids]))}]))}]))
#_(defn- edit-amount
[{:keys [chain-id token-symbol send-amount-in-crypto init-amount]}]
(rf/dispatch
[:show-bottom-sheet
{:content
(fn []
(let [{:keys [network-name] :as network-details} (rf/sub [:wallet/network-details-by-chain-id
chain-id])
{fiat-currency :currency} (rf/sub [:profile/profile])
{token-decimals :decimals
:as
token} (rf/sub [:wallet/wallet-send-token])
currency (rf/sub [:profile/currency])
currency-symbol (rf/sub [:profile/currency-symbol])
send-from-locked-amounts (rf/sub
[:wallet/wallet-send-from-locked-amounts])
{account-color :color} (rf/sub [:wallet/current-viewing-account])
locked-amount (get send-from-locked-amounts chain-id)
network-name-str (string/capitalize (name network-name))
[input-state set-input-state] (rn/use-state
(cond-> controlled-input/init-state
init-amount
(defn- edit-amount
[{:keys [chain-id token-symbol send-amount-in-crypto init-amount]}]
(rf/dispatch
[:show-bottom-sheet
{:content
(fn []
(let [{:keys [network-name] :as network-details} (rf/sub [:wallet/network-details-by-chain-id
chain-id])
{fiat-currency :currency} (rf/sub [:profile/profile])
{token-decimals :decimals
:as
token} (rf/sub [:wallet/wallet-send-token])
currency (rf/sub [:profile/currency])
currency-symbol (rf/sub [:profile/currency-symbol])
send-from-locked-amounts (rf/sub
[:wallet/wallet-send-from-locked-amounts])
{account-color :color} (rf/sub [:wallet/current-viewing-account])
locked-amount (get send-from-locked-amounts chain-id)
network-name-str (string/capitalize (name network-name))
[input-state set-input-state] (rn/use-state (cond-> controlled-input/init-state
init-amount
(controlled-input/set-input-value
(money/to-string init-amount))
locked-amount
(controlled-input/set-input-value
locked-amount)))
[crypto-currency? set-crypto-currency] (rn/use-state true)
conversion-rate (-> token
:market-values-per-currency
currency
:price)
{token-balance :total-balance} (rf/sub [:wallet/token-by-symbol
(str token-symbol)
[chain-id]])
current-crypto-limit (utils/get-standard-crypto-format
token
token-balance)
current-fiat-limit (.toFixed (* token-balance conversion-rate) 2)
current-limit (if crypto-currency?
current-crypto-limit
current-fiat-limit)
crypto-decimals token-decimals
input-amount (controlled-input/input-value input-state)
[is-amount-locked? set-is-amount-locked] (rn/use-state (some? locked-amount))
bottom (safe-area/get-bottom)
amount-in-crypto (if crypto-currency?
input-amount
(number/remove-trailing-zeroes
(.toFixed (/ input-amount
conversion-rate)
crypto-decimals)))
locked-greater-then-send-amount? (let [amount (money/bignumber
amount-in-crypto)
send-amount (money/bignumber
send-amount-in-crypto)]
(and (money/bignumber? amount)
(money/bignumber? send-amount)
(money/greater-than amount send-amount)))
swap-between-fiat-and-crypto (fn [swap-to-crypto-currency?]
(set-crypto-currency swap-to-crypto-currency?)
(set-input-state
(fn [input-state]
(controlled-input/set-input-value
(money/to-string init-amount))
locked-amount
(controlled-input/set-input-value
locked-amount)))
[crypto-currency? set-crypto-currency] (rn/use-state true)
conversion-rate (-> token
:market-values-per-currency
currency
:price)
{token-balance :total-balance} (rf/sub [:wallet/token-by-symbol
(str token-symbol)
[chain-id]])
current-crypto-limit (utils/get-standard-crypto-format
token
token-balance)
current-fiat-limit (.toFixed (* token-balance conversion-rate) 2)
current-limit (if crypto-currency?
current-crypto-limit
current-fiat-limit)
crypto-decimals token-decimals
input-amount (controlled-input/input-value input-state)
[is-amount-locked? set-is-amount-locked] (rn/use-state (some? locked-amount))
bottom (safe-area/get-bottom)
amount-in-crypto (if crypto-currency?
input-amount
(number/remove-trailing-zeroes
(.toFixed (/ input-amount
conversion-rate)
crypto-decimals)))
locked-greater-then-send-amount? (let [amount (money/bignumber
amount-in-crypto)
send-amount (money/bignumber
send-amount-in-crypto)]
(and (money/bignumber? amount)
(money/bignumber? send-amount)
(money/greater-than amount
send-amount)))
swap-between-fiat-and-crypto (fn [swap-to-crypto-currency?]
(set-crypto-currency
swap-to-crypto-currency?)
(set-input-state
(fn [input-state]
(controlled-input/set-input-value
input-state
(let [value (controlled-input/input-value
input-state)
new-value
(if
swap-to-crypto-currency?
(.toFixed
(/ value
conversion-rate)
crypto-decimals)
(.toFixed
(* value
conversion-rate)
12))]
(number/remove-trailing-zeroes
new-value))))))
lock-or-unlock-amount (fn []
(if is-amount-locked?
(rf/dispatch [:wallet/lock-from-amount
chain-id
amount-in-crypto])
(rf/dispatch [:wallet/unlock-from-amount
chain-id]))
(rf/dispatch [:hide-bottom-sheet]))]
(rn/use-effect
(fn []
(set-input-state #(controlled-input/set-upper-limit % current-limit)))
[current-limit])
[:<>
[quo/drawer-top
{:title (i18n/label :t/send-from-network {:network network-name-str})
:description (i18n/label :t/define-amount-sent-from-network {:network network-name-str})}]
[quo/token-input
{:container-style style/input-container
:token token-symbol
:currency fiat-currency
:currency-symbol currency-symbol
:crypto-decimals (min token-decimals 6)
:error? (controlled-input/input-error input-state)
:networks [network-details]
:title (i18n/label
:t/send-limit
{:limit (if crypto-currency?
(utils/make-limit-label-crypto current-limit token-symbol)
(utils/make-limit-label-fiat current-limit currency-symbol))})
:conversion conversion-rate
:show-keyboard? false
:value (controlled-input/input-value input-state)
:on-swap swap-between-fiat-and-crypto
:allow-selection? false}]
(when locked-greater-then-send-amount?
[quo/information-box
{:type :error
:icon :i/info
:style style/error-box}
(i18n/label :t/value-higher-than-send-amount)])
[quo/disclaimer
{:on-change (fn [checked?]
(set-is-amount-locked checked?))
:checked? is-amount-locked?
:container-style style/disclaimer
:icon (if is-amount-locked?
:i/locked
:i/unlocked)
:customization-color account-color}
(i18n/label :t/dont-auto-recalculate-network {:network network-name-str})]
[quo/bottom-actions
{:actions :one-action
:button-one-label (i18n/label :t/update)
:button-one-props {:on-press lock-or-unlock-amount
:customization-color account-color
:disabled? (or (controlled-input/empty-value? input-state)
(controlled-input/input-error input-state)
locked-greater-then-send-amount?)}}]
[quo/numbered-keyboard
{:container-style (style/keyboard-container bottom)
:left-action :dot
:delete-key? true
:on-press (fn [c]
(let [new-text (str input-amount c)
max-decimals (if crypto-currency? crypto-decimals 2)
regex-pattern (str "^\\d*\\.?\\d{0," max-decimals "}$")
regex (re-pattern regex-pattern)]
(when (re-matches regex new-text)
(set-is-amount-locked true)
(set-input-state #(controlled-input/add-character % c)))))
:on-delete (fn []
(set-is-amount-locked true)
(set-input-state controlled-input/delete-last))
:on-long-press-delete (fn []
(set-is-amount-locked true)
(set-input-state controlled-input/delete-all))}]]))}]))
input-state
(let [value (controlled-input/input-value
input-state)
new-value (if
swap-to-crypto-currency?
(.toFixed
(/ value
conversion-rate)
crypto-decimals)
(.toFixed
(* value
conversion-rate)
12))]
(number/remove-trailing-zeroes
new-value))))))
lock-or-unlock-amount (fn []
(if is-amount-locked?
(rf/dispatch [:wallet/lock-from-amount
chain-id
amount-in-crypto])
(rf/dispatch [:wallet/unlock-from-amount
chain-id]))
(rf/dispatch [:hide-bottom-sheet]))]
(rn/use-effect
(fn []
(set-input-state #(controlled-input/set-upper-limit % current-limit)))
[current-limit])
[:<>
[quo/drawer-top
{:title (i18n/label :t/send-from-network {:network network-name-str})
:description (i18n/label :t/define-amount-sent-from-network {:network network-name-str})}]
[quo/token-input
{:container-style style/input-container
:token token-symbol
:currency fiat-currency
:currency-symbol currency-symbol
:crypto-decimals (min token-decimals 6)
:error? (controlled-input/input-error input-state)
:networks [network-details]
:title (i18n/label
:t/send-limit
{:limit (if crypto-currency?
(utils/make-limit-label-crypto current-limit token-symbol)
(utils/make-limit-label-fiat current-limit currency-symbol))})
:conversion conversion-rate
:show-keyboard? false
:value (controlled-input/input-value input-state)
:on-swap swap-between-fiat-and-crypto
:allow-selection? false}]
(when locked-greater-then-send-amount?
[quo/information-box
{:type :error
:icon :i/info
:style style/error-box}
(i18n/label :t/value-higher-than-send-amount)])
[quo/disclaimer
{:on-change (fn [checked?]
(set-is-amount-locked checked?))
:checked? is-amount-locked?
:container-style style/disclaimer
:icon (if is-amount-locked?
:i/locked
:i/unlocked)
:customization-color account-color}
(i18n/label :t/dont-auto-recalculate-network {:network network-name-str})]
[quo/bottom-actions
{:actions :one-action
:button-one-label (i18n/label :t/update)
:button-one-props {:on-press lock-or-unlock-amount
:customization-color account-color
:disabled? (or (controlled-input/empty-value? input-state)
(controlled-input/input-error input-state)
locked-greater-then-send-amount?)}}]
[quo/numbered-keyboard
{:container-style (style/keyboard-container bottom)
:left-action :dot
:delete-key? true
:on-press (fn [c]
(let [new-text (str input-amount c)
max-decimals (if crypto-currency? crypto-decimals 2)
regex-pattern (str "^\\d*\\.?\\d{0," max-decimals "}$")
regex (re-pattern regex-pattern)]
(when (re-matches regex new-text)
(set-is-amount-locked true)
(set-input-state #(controlled-input/add-character % c)))))
:on-delete (fn []
(set-is-amount-locked true)
(set-input-state controlled-input/delete-last))
:on-long-press-delete (fn []
(set-is-amount-locked true)
(set-input-state controlled-input/delete-all))}]]))}]))
(defn render-network-values
[{:keys [network-values token-symbol on-press on-long-press receiver? loading-routes?
@@ -385,6 +388,13 @@
chain-id-to-disable
disabled-from-chain-ids
token-available-networks-for-suggested-routes))
(when (ff/enabled? ::ff/wallet.custom-network-amounts)
:on-long-press) (fn [chain-id amount-calculated-for-chain]
(edit-amount
{:chain-id chain-id
:token-symbol token-symbol
:send-amount-in-crypto send-amount-in-crypto
:init-amount amount-calculated-for-chain}))
:receiver? false
:theme theme
:loading-routes? loading-routes?
@@ -12,12 +12,12 @@
[status-im.contexts.wallet.common.account-switcher.view :as account-switcher]
[status-im.contexts.wallet.common.utils :as utils]
[status-im.contexts.wallet.common.utils.networks :as network-utils]
[status-im.contexts.wallet.common.validation :as validation]
[status-im.contexts.wallet.item-types :as types]
[status-im.contexts.wallet.send.select-address.style :as style]
[status-im.contexts.wallet.send.select-address.tabs.view :as tabs]
[status-im.feature-flags :as ff]
[status-im.setup.hot-reload :as hot-reload]
[utils.address :as utils-address]
[utils.debounce :as debounce]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
@@ -33,9 +33,9 @@
[address]
(debounce/debounce-and-dispatch
(cond
(<= (count address) 0) [:wallet/address-validation-failed address]
(utils-address/eip-3770-address? address) [:wallet/address-validation-success address]
:else [:wallet/address-validation-failed address])
(<= (count address) 0) [:wallet/address-validation-failed address]
(validation/eth-address? address) [:wallet/address-validation-success address]
:else [:wallet/address-validation-failed address])
300))
(defn- address-input
@@ -58,7 +58,7 @@
{:on-result on-result}]))
:ens-regex constants/regx-ens
:scanned-value (or (when recipient-plain-address? send-address) scanned-address)
:address-regex utils-address/regx-eip-3770-address
:address-regex constants/regx-multichain-address
:on-detect-address (fn [address]
(when (or (= current-screen-id :screen/wallet.select-address)
(= current-screen-id :screen/wallet.scan-address))
@@ -29,21 +29,6 @@
[:wallet/pending-transaction-status-changed-received
(transforms/js->clj event-js)]]]}
"wallet-collectibles-ownership-update-finished"
{:fx [[:dispatch
[:wallet/collectible-ownership-update-finished
(transforms/js->clj event-js)]]]}
"wallet-collectibles-ownership-update-finished-with-error"
{:fx [[:dispatch
[:wallet/collectible-ownership-update-finished-with-error
(transforms/js->clj event-js)]]]}
"wallet-collectibles-data-updated"
{:fx [[:dispatch
[:wallet/collectibles-data-updated
(transforms/js->clj event-js)]]]}
"wallet-owned-collectibles-filtering-done"
{:fx [[:dispatch
[:wallet/owned-collectibles-filtering-done
@@ -52,19 +52,6 @@
[proposal]
(get-in proposal [:params :proposer :metadata]))
(defn get-current-request-dapp
[request sessions]
(let [dapp-url (get-in request [:event :verifyContext :verified :origin])]
(->> sessions
(filter (fn [session]
(= (utils.string/remove-trailing-slash dapp-url)
(utils.string/remove-trailing-slash (get session :url)))))
first)))
(defn get-dapp-redirect-url
[session]
(get-in session [:peer :metadata :redirect :native]))
(defn get-db-current-request-params
[db]
(-> db
@@ -1,27 +0,0 @@
(ns status-im.contexts.wallet.wallet-connect.core-test
(:require
[cljs.test :refer-macros [deftest is testing]]
[status-im.contexts.wallet.wallet-connect.core :as sut]))
(deftest get-current-request-dapp-test
(testing "returns the correct dapp based on the request's origin"
(let [request {:event {:verifyContext {:verified {:origin "https://dapp.com"}}}}
sessions [{:url "https://dapp.com"}
{:url "https://anotherdapp.com"}]]
(is (= {:url "https://dapp.com"}
(sut/get-current-request-dapp request sessions)))))
(testing "returns nil if no matching dapp is found"
(let [request {:event {:verifyContext {:verified {:origin "https://dapp.com"}}}}
sessions [{:url "https://anotherdapp.com"}]]
(is (nil? (sut/get-current-request-dapp request sessions))))))
(deftest get-dapp-redirect-url-test
(testing "returns the native redirect URL if it exists"
(let [session {:peer {:metadata {:redirect {:native "native://redirect-url"}}}}]
(is (= "native://redirect-url"
(sut/get-dapp-redirect-url session)))))
(testing "returns nil if no redirect URL is found"
(let [session {:peer {:metadata {}}}]
(is (nil? (sut/get-dapp-redirect-url session))))))
@@ -317,17 +317,13 @@
(rf/reg-event-fx
:wallet-connect/persist-session
(fn [_ [session-info]]
(let [redirect-url (-> session-info
(js->clj :keywordize-keys true)
(wallet-connect-core/get-dapp-redirect-url))]
{:fx [[:json-rpc/call
[{:method "wallet_addWalletConnectSession"
:params [(js/JSON.stringify session-info)]
:on-success (fn []
(log/info "Wallet Connect session persisted")
(rf/dispatch [:wallet-connect/fetch-persisted-sessions])
(rf/dispatch [:wallet-connect/redirect-to-dapp redirect-url]))
:on-error #(log/info "Wallet Connect session persistence failed" %)}]]]})))
{:fx [[:json-rpc/call
[{:method "wallet_addWalletConnectSession"
:params [(js/JSON.stringify session-info)]
:on-success (fn []
(log/info "Wallet Connect session persisted")
(rf/dispatch [:wallet-connect/fetch-persisted-sessions]))
:on-error #(log/info "Wallet Connect session persistence failed" %)}]]]}))
(rf/reg-event-fx
:wallet-connect/disconnect-session

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