Compare commits

..
Author SHA1 Message Date
Richard Ramos 47cc8a5757 test: use debug level by default 2024-01-31 15:59:51 -04:00
269 changed files with 2286 additions and 5091 deletions
+12 -13
View File
@@ -16,19 +16,18 @@
:clj-kondo-config {:level :error} :clj-kondo-config {:level :error}
:cond-else {:level :error} :cond-else {:level :error}
:consistent-alias {:level :error :consistent-alias {:level :error
:aliases {clojure.set set :aliases {clojure.set set
clojure.string string clojure.string string
clojure.walk walk clojure.walk walk
malli.core malli malli.core malli
malli.dev.pretty malli.pretty malli.dev.pretty malli.pretty
malli.dev.virhe malli.virhe malli.dev.virhe malli.virhe
malli.error malli.error malli.error malli.error
malli.generator malli.generator malli.generator malli.generator
malli.transform malli.transform malli.transform malli.transform
malli.util malli.util malli.util malli.util
schema.core schema schema.core schema
status-im.feature-flags ff taoensso.timbre log}}
taoensso.timbre log}}
:deprecated-namespace {:level :warning} :deprecated-namespace {:level :warning}
:docstring-blank {:level :error} :docstring-blank {:level :error}
:equals-true {:level :error} :equals-true {:level :error}
+3 -28
View File
@@ -160,12 +160,10 @@ pod-install: export TARGET := ios
pod-install: ##@prepare Run 'pod install' to install podfiles and update Podfile.lock pod-install: ##@prepare Run 'pod install' to install podfiles and update Podfile.lock
cd ios && pod install; cd -- cd ios && pod install; cd --
FLEETS_FILE := ./resources/config/fleets.json
update-fleets: ##@prepare Download up-to-date JSON file with current fleets state update-fleets: ##@prepare Download up-to-date JSON file with current fleets state
curl -s https://fleets.status.im/ \ curl -s https://fleets.status.im/ \
| sed 's/"warning": "/"warning": "DO NOT EDIT! /' \ | sed 's/"warning": "/"warning": "DO NOT EDIT! /' \
> $(FLEETS_FILE) > resources/config/fleets.json
echo >> $(FLEETS_FILE)
$(KEYSTORE_PATH): export TARGET := keytool $(KEYSTORE_PATH): export TARGET := keytool
$(KEYSTORE_PATH): $(KEYSTORE_PATH):
@@ -275,9 +273,6 @@ run-re-frisk: ##@run Start re-frisk server
# TODO: Migrate this to a Nix recipe, much the same way as nix/mobile/android/targets/release-android.nix # TODO: Migrate this to a Nix recipe, much the same way as nix/mobile/android/targets/release-android.nix
run-android: export TARGET := android run-android: export TARGET := android
# Disabled for debug builds to avoid 'maximum call stack exceeded' errors.
# https://github.com/status-im/status-mobile/issues/18493
run-android: export ORG_GRADLE_PROJECT_hermesEnabled := false
# INFO: If it's empty (no devices attached, parsing issues, script error) - for Nix it's the same as not set. # INFO: If it's empty (no devices attached, parsing issues, script error) - for Nix it's the same as not set.
run-android: export ANDROID_ABI_INCLUDE ?= $(shell ./scripts/adb_devices_abis.sh) run-android: export ANDROID_ABI_INCLUDE ?= $(shell ./scripts/adb_devices_abis.sh)
run-android: ##@run Build Android APK and start it on the device run-android: ##@run Build Android APK and start it on the device
@@ -373,20 +368,15 @@ test-watch-for-repl: ##@test Watch all Clojure tests and support REPL connection
"until [ -f $$SHADOW_OUTPUT_TO ] ; do sleep 1 ; done ; node --require ./test-resources/override.js $$SHADOW_OUTPUT_TO --repl" "until [ -f $$SHADOW_OUTPUT_TO ] ; do sleep 1 ; done ; node --require ./test-resources/override.js $$SHADOW_OUTPUT_TO --repl"
test-unit: export SHADOW_OUTPUT_TO := target/unit_test/test.js test-unit: export SHADOW_OUTPUT_TO := target/unit_test/test.js
test-unit: export SHADOW_NS_REGEXP := ^(?!tests\.integration-test)(?!tests-im\.contract-test).*-test$$ test-unit: export SHADOW_NS_REGEXP := ^(?!status-im\.integration-test).*-test$$
test-unit: ##@test Run unit tests test-unit: ##@test Run unit tests
test-unit: _test-clojure test-unit: _test-clojure
test-integration: export SHADOW_OUTPUT_TO := target/integration_test/test.js test-integration: export SHADOW_OUTPUT_TO := target/integration_test/test.js
test-integration: export SHADOW_NS_REGEXP := ^tests\.integration-test.*$$ test-integration: export SHADOW_NS_REGEXP := ^status-im\.integration-test.*$$
test-integration: ##@test Run integration tests test-integration: ##@test Run integration tests
test-integration: _test-clojure test-integration: _test-clojure
test-contract: export SHADOW_OUTPUT_TO := target/contract_test/test.js
test-contract: export SHADOW_NS_REGEXP := ^tests\.contract-test.*$$
test-contract: ##@test Run contract tests
test-contract: _test-clojure
android-test: jsbundle android-test: jsbundle
android-test: export TARGET := android android-test: export TARGET := android
android-test: android-test:
@@ -462,18 +452,3 @@ repl-clojure: ##@repl Start Clojure repl for mobile App
yarn shadow-cljs cljs-repl mobile yarn shadow-cljs cljs-repl mobile
repl-nix: nix-repl ##@repl Start an interactive Nix REPL repl-nix: nix-repl ##@repl Start an interactive Nix REPL
#--------------
# Dev Automation Flows
#--------------
auto-login: export TARGET := default
auto-login: ##@auto runs flow for login or onboarding app on simulator/emulator
maestro test "maestro/create-account-or-login.yaml"
auto-custom: export TARGET := default
auto-custom: ##@auto runs any custom maestro automation flow on simulator/emulator
ifndef FLOW
$(error Usage: make automate FLOW=your-maestro-flow-file.yaml)
endif
maestro test "$(FLOW)"
+14 -13
View File
@@ -267,24 +267,25 @@ android {
dependencies { dependencies {
// The version of react-native is set by the React Native Gradle Plugin // The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android") implementation("com.facebook.react:react-android")
implementation("androidx.core:core-splashscreen:1.0.0") implementation "androidx.core:core-splashscreen:1.0.0"
// we don't use hermes for debug but we need its pom file for release builds
// https://github.com/status-im/status-mobile/pull/18675 if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android") implementation("com.facebook.react:hermes-android")
// FIXME: implementing both hermes & JSC increases bundle size by ~ 2MB } else {
implementation(jscFlavor) implementation jscFlavor
}
// react-native-screens // react-native-screens
implementation("androidx.appcompat:appcompat:1.1.0-rc01") implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02") implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
implementation("androidx.multidex:multidex:2.0.1") // required by status-mobile/android/app/src/main/java/im/status/ethereum/MainApplication.java implementation 'androidx.multidex:multidex:2.0.1' // required by status-mobile/android/app/src/main/java/im/status/ethereum/MainApplication.java
implementation project(':react-native-blur') implementation project(':react-native-blur')
implementation project(':react-native-status') implementation project(':react-native-status')
implementation project(':react-native-status-keycard') implementation project(':react-native-status-keycard')
implementation("com.github.status-im:function:0.0.1") implementation 'com.github.status-im:function:0.0.1'
implementation("com.facebook.fresco:fresco:2.5.0") implementation 'com.facebook.fresco:fresco:2.5.0'
implementation("com.facebook.fresco:animated-gif:2.5.0") implementation 'com.facebook.fresco:animated-gif:2.5.0'
implementation("com.squareup.okhttp3:okhttp-tls:4.9.2") implementation "com.squareup.okhttp3:okhttp-tls:4.9.2"
implementation("com.google.prefab:cli:2.0.0") implementation("com.google.prefab:cli:2.0.0")
} }
+1 -3
View File
@@ -57,6 +57,4 @@ newArchEnabled=false
# Use this property to enable or disable the Hermes JS engine. # Use this property to enable or disable the Hermes JS engine.
# If set to false, you will be using JSC instead. # If set to false, you will be using JSC instead.
# Disabled for debug builds to avoid 'maximum call stack exceeded' errors. hermesEnabled=true
# https://github.com/status-im/status-mobile/issues/18493
hermesEnabled=false
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.8.4'
/* Options section can't access functions in objects. */ /* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild() def isPRBuild = utils.isPRBuild()
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.8.4'
pipeline { pipeline {
agent { label 'linux' } agent { label 'linux' }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.8.4'
pipeline { pipeline {
agent { label 'linux' } agent { label 'linux' }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.8.4'
/* Options section can't access functions in objects. */ /* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild() def isPRBuild = utils.isPRBuild()
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.8.4'
/* Options section can't access functions in objects. */ /* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild() def isPRBuild = utils.isPRBuild()
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.7.15'
pipeline { pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.7.15'
pipeline { pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.7.15'
pipeline { pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.7.15'
pipeline { pipeline {
agent { label 'macos' } agent { label 'macos' }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.7.15'
pipeline { pipeline {
agent { label params.AGENT_LABEL } agent { label params.AGENT_LABEL }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.7.15'
pipeline { pipeline {
agent { label 'linux' } agent { label 'linux' }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.5' library 'status-jenkins-lib@v1.7.15'
pipeline { pipeline {
agent { agent {
-11
View File
@@ -1,11 +0,0 @@
appId: im.status.ethereum.debug
---
- runFlow: # to run onboarding flow only when device is in onboarding state
when:
visible: "Im new to Status"
file: onboarding.yaml
- runFlow: # to run login flow only when device is on login screen
when:
visible: "Profile password"
file: login.yaml
-5
View File
@@ -1,5 +0,0 @@
appId: im.status.ethereum.debug
---
- tapOn: "password-input"
- inputText: "password123" # update your account password here
- tapOn: login-button
-15
View File
@@ -1,15 +0,0 @@
appId: im.status.ethereum.debug
---
- tapOn: "Im new to Status"
- tapOn: "small-option-card"
- tapOn: "Your name"
- inputText: "DeviceA"
- tapOn: "submit-create-profile-button"
- inputText: "password123"
- tapOn: "Repeat password"
- inputText: "password123"
- tapOn: "disclaimer-touchable-opacity"
- tapOn: "Confirm password"
- tapOn: "skip-identifiers"
- tapOn: "enable-notifications-later-button"
- tapOn: "welcome-button"
+61 -61
View File
@@ -11344,12 +11344,12 @@
}, },
{ {
"path": "com/google/protobuf/protobuf-bom/4.26.0-RC1", "path": "com/google/protobuf/protobuf-bom/4.0.0-rc-2",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"protobuf-bom-4.26.0-RC1.pom": { "protobuf-bom-4.0.0-rc-2.pom": {
"sha1": "95b890ee6f318b67514a9d3573c78aebfd8cf4c1", "sha1": "1cf14b7774313bc34805dd58fffa3cbc35601184",
"sha256": "sha256-rGscgQUEAvrvFw6SnyMSbIw7N0J6SEgo4bo8nmAbO04=" "sha256": "sha256-45/pSYKw70HwkoTPbtPkj0Bsu/ZtioKD0MYmk04KYTI="
} }
} }
}, },
@@ -11520,16 +11520,16 @@
}, },
{ {
"path": "com/google/protobuf/protobuf-java/4.26.0-RC1", "path": "com/google/protobuf/protobuf-java/4.0.0-rc-2",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"protobuf-java-4.26.0-RC1.pom": { "protobuf-java-4.0.0-rc-2.pom": {
"sha1": "9b053265705abd2eb8dd06831b4728ed19e8f79a", "sha1": "8fab0fe0746b1d370663a3db7dd483c2c4d34a6f",
"sha256": "sha256-cexXywR1/FPS885SUYezfvvww1TAjy6gAtAmxJVxn0Y=" "sha256": "sha256-q//aKX5NdsCktWMRsnjG/L3jNI9g/ucIGLN119ZzT50="
}, },
"protobuf-java-4.26.0-RC1.jar": { "protobuf-java-4.0.0-rc-2.jar": {
"sha1": "a4718e6e4943736bb27aa3c7f8ef3c0a851c35b1", "sha1": "ae590f34383d2d6fde2b3b8e2ffb668e64579099",
"sha256": "sha256-cgTa51zMiegEQa2I9pyGy9psCQ5tPJU9MfMoC8DyDDg=" "sha256": "sha256-PMJSvvZfetM8UwzuxxZkzR2gsmUhrWZzpl2fpJMegio="
} }
} }
}, },
@@ -11627,38 +11627,38 @@
}, },
{ {
"path": "com/google/protobuf/protobuf-parent/4.26.0-RC1", "path": "com/google/protobuf/protobuf-parent/4.0.0-rc-2",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"protobuf-parent-4.26.0-RC1.pom": { "protobuf-parent-4.0.0-rc-2.pom": {
"sha1": "80963cafb79bc1b0f5dd2c1c82c67016c2362ad4", "sha1": "c5391c7917ca1197cbbda4efc6454a87e7e7107e",
"sha256": "sha256-n+4hEMufYvUwFQts4WiDUYKyGGnivQQhyc2bS7fODMs=" "sha256": "sha256-4NJwgSugXAqrlx4wtRyl0VcmYBkGxiGsIM3LLkq2fi8="
} }
} }
}, },
{ {
"path": "com/google/truth/truth-parent/1.4.0", "path": "com/google/truth/truth-parent/1.2.0",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"truth-parent-1.4.0.pom": { "truth-parent-1.2.0.pom": {
"sha1": "08b3f870d82e4e34caa1aa94ca03c29d9b40d3d2", "sha1": "d24447b2a11846a354e503575ed95e393ba5158d",
"sha256": "sha256-K+3ssiZ3EYKh/sxgh3NFLyTPuMEjreDzymb4pmmU3Gs=" "sha256": "sha256-Q8/2l2yxZ5ETlTWluYDpwTW8Fgxk7hGc/6qNHv9aquI="
} }
} }
}, },
{ {
"path": "com/google/truth/truth/1.4.0", "path": "com/google/truth/truth/1.2.0",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"truth-1.4.0.pom": { "truth-1.2.0.pom": {
"sha1": "6ff4bdfe8a3758a755b52ad894b7d983c88e4850", "sha1": "44853be2a0532449235377b3eea680b679cefa7e",
"sha256": "sha256-v4+lYqfRXWNEU9f/LidC/eACm2VNhwtK0uejf89mTnY=" "sha256": "sha256-4snQPEXLKYR49KPOM37mXXsk+nVA/PSEy/OkvuQCuVo="
}, },
"truth-1.4.0.jar": { "truth-1.2.0.jar": {
"sha1": "2a9475ed8cf2081b859fda8f9c860d5c449cd9ed", "sha1": "0135db6c1dfab1b3ca326c8ce51c09381d332d43",
"sha256": "sha256-I1wo6W7mcBqwHMhS+ylMsPNHVvY2qBVLmu8I+xIVu8Q=" "sha256": "sha256-tGEIQNXjffFOZqqwuEDA7j+l6Vl9o6KQIGQYcXHCM5o="
} }
} }
}, },
@@ -17512,16 +17512,16 @@
}, },
{ {
"path": "org/jetbrains/kotlin/kotlin-reflect/2.0.0-Beta3", "path": "org/jetbrains/kotlin/kotlin-reflect/2.0.0-Beta2",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"kotlin-reflect-2.0.0-Beta3.pom": { "kotlin-reflect-2.0.0-Beta2.pom": {
"sha1": "dc97aad46542eaa0cb64120911ac1013483969ac", "sha1": "71908b10dd3fefa0509880918948931ad0b8d7c8",
"sha256": "sha256-NnPskjZQvqH3zdWL94mDT/EMvy51senYGEbKjz+ya64=" "sha256": "sha256-TmkaczZz+Eqbux6yz2SyE9WhflLrknrULgk8j/2sfUs="
}, },
"kotlin-reflect-2.0.0-Beta3.jar": { "kotlin-reflect-2.0.0-Beta2.jar": {
"sha1": "6915153788502bdccc98753f41dcbd5bf7c7e128", "sha1": "0cf9ed5d13e31c4e4ab74be627b7cedc0ecc7715",
"sha256": "sha256-k4zOXYaKP8MBwjWAOLuEt0ahsLlSHtdnldJma/o0e2Y=" "sha256": "sha256-PAz62O51jigTUVGhAJHGrWdbLoVdCFwwhhI883u50bw="
} }
} }
}, },
@@ -18769,28 +18769,28 @@
}, },
{ {
"path": "org/jetbrains/kotlin/kotlin-stdlib/2.0.0-Beta3", "path": "org/jetbrains/kotlin/kotlin-stdlib/2.0.0-Beta2",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"kotlin-stdlib-2.0.0-Beta3.pom": { "kotlin-stdlib-2.0.0-Beta2.pom": {
"sha1": "1005b3f259dffb93f972e5227eb18fc579b71811", "sha1": "a1310fbc42c0cbc786766d2e35dcbfdaf3f8a8b1",
"sha256": "sha256-2qxjaqrwUBME9CbB4lpEKGV4qi2VGn8USteyCSZ8lq4=" "sha256": "sha256-8upeJFveFokz2f2rBOXj2KZ9+OzyWxWtqZ9/2qcJGnI="
}, },
"kotlin-stdlib-2.0.0-Beta3-all.jar": { "kotlin-stdlib-2.0.0-Beta2-all.jar": {
"sha1": "845c7a75152307a41522e800bb9706a58e02b228", "sha1": "c844df2813fa56f8baa346530a5172ccf03277d0",
"sha256": "sha256-YwNHMM8zT64dAULHPNt+zLXQ5xTeAvtP/HKybthMDWI=" "sha256": "sha256-o8TV9hZ9IGumB5g+8nq6R6YU+VxlRV0PJ3IsSsMRsSM="
}, },
"kotlin-stdlib-2.0.0-Beta3-common.jar": { "kotlin-stdlib-2.0.0-Beta2-common.jar": {
"sha1": "e0224f6b9468655e1feffe789ab7ebd4965a9431", "sha1": "e0224f6b9468655e1feffe789ab7ebd4965a9431",
"sha256": "sha256-ikItp8AZFxM/bokvCF68e2Q+oNGbbJxTILtPDnj7uMI=" "sha256": "sha256-ikItp8AZFxM/bokvCF68e2Q+oNGbbJxTILtPDnj7uMI="
}, },
"kotlin-stdlib-2.0.0-Beta3.jar": { "kotlin-stdlib-2.0.0-Beta2.jar": {
"sha1": "9982637ebb69602015ed823cceca7054d2ab8bbe", "sha1": "61be8a13ad24f43c915ba6962440cd30af4700ec",
"sha256": "sha256-1+6KuGuMgmiuPLpxx+cJSZ3/pnVOMmLdtzmk3mwB0ro=" "sha256": "sha256-yDOkRXCSzieZ5nejro0ku4suO6qDwWlDBdnb5ZHgquA="
}, },
"kotlin-stdlib-2.0.0-Beta3.module": { "kotlin-stdlib-2.0.0-Beta2.module": {
"sha1": "5026675037ebf81e108eb3cc581a24570ec7ceb2", "sha1": "22702775430e8d3a9f8d824167e00484e07d5932",
"sha256": "sha256-rlVFQM89Ga0h57LsViIgT8iSdE18G0rd/TN7/u9UKrU=" "sha256": "sha256-J6vVZxhfZbGpw8tTtV4RQTPJrkFqMwetPevDDG/iO/U="
} }
} }
}, },
@@ -19055,16 +19055,16 @@
}, },
{ {
"path": "org/junit/junit-bom/5.10.2", "path": "org/junit/junit-bom/5.10.1",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"junit-bom-5.10.2.pom": { "junit-bom-5.10.1.pom": {
"sha1": "b25ed98a5bd08cdda60e569cf22822a760e76019", "sha1": "41a86ea51227739a5b7ca3430ae88ce44a64a42a",
"sha256": "sha256-Fp3ZBKSw9lIM/+ZYzGIpK/6fPBSpifqSEgckzeQ6mWg=" "sha256": "sha256-IcSwKG9LIAaVd/9LIJeKhcEArIpGtvHIZy+6qzN7w/I="
}, },
"junit-bom-5.10.2.module": { "junit-bom-5.10.1.module": {
"sha1": "ce536748a853ae6ac09e7815fce0678a96cff778", "sha1": "1b577334c47deb59a29dc31e5211499d0eb3c17b",
"sha256": "sha256-3iOxFLPkEZqP5usXvtWjhSgWaYus5nBxV51tkn67CAo=" "sha256": "sha256-IbCvz//i7LN3D16wCuehn+rulOdx+jkYFzhQ2ueAZ7c="
} }
} }
}, },
@@ -19160,16 +19160,16 @@
}, },
{ {
"path": "org/mockito/mockito-core/5.10.0", "path": "org/mockito/mockito-core/5.9.0",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"mockito-core-5.10.0.pom": { "mockito-core-5.9.0.pom": {
"sha1": "25e309d012d326eef980de463edeb2a592cf9cdb", "sha1": "2054dcc15b9ede899cb9ec6e8e960e36c68b4574",
"sha256": "sha256-D4gyKTuHHyO2/0QkET7mXBdfq9G2uswY7Dg8s5akOq8=" "sha256": "sha256-BJDEL+Yu7WRzQdpAojcHGW2BO0TbKj3KMB2IFz56yPc="
}, },
"mockito-core-5.10.0.jar": { "mockito-core-5.9.0.jar": {
"sha1": "b3812fa2ee069f1d0b41c1c0155da79d0e1dcde0", "sha1": "faa88b96db3aeb96a93e83dec7491345bfbfc414",
"sha256": "sha256-AyP1kbBNOg18qevuu56fNKB8DskWm3RE7jlRtx1MrVY=" "sha256": "sha256-u62Rhe1zSWX6x+Nn8OUVlvaVMeUdiyy87BBI3W+0Hyw="
} }
} }
}, },
+9 -9
View File
@@ -718,7 +718,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.7.1/prot
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.10.0/protobuf-bom-3.10.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.10.0/protobuf-bom-3.10.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.13.0/protobuf-bom-3.13.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/3.13.0/protobuf-bom-3.13.0.pom
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.17.2/protobuf-bom-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.26.0-RC1/protobuf-bom-4.26.0-RC1.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.0.0-rc-2/protobuf-bom-4.0.0-rc-2.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.17.2/protobuf-javalite-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util/3.4.0/protobuf-java-util-3.4.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util/3.4.0/protobuf-java-util-3.4.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util/3.10.0/protobuf-java-util-3.10.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util/3.10.0/protobuf-java-util-3.10.0.pom
@@ -730,7 +730,7 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.7.1/pro
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.10.0/protobuf-java-3.10.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.10.0/protobuf-java-3.10.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.pom
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.17.2/protobuf-java-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.26.0-RC1/protobuf-java-4.26.0-RC1.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.0.0-rc-2/protobuf-java-4.0.0-rc-2.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-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.0.0/protobuf-parent-3.0.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.4.0/protobuf-parent-3.4.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.4.0/protobuf-parent-3.4.0.pom
@@ -739,9 +739,9 @@ https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.7.1/p
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.10.0/protobuf-parent-3.10.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.10.0/protobuf-parent-3.10.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.13.0/protobuf-parent-3.13.0.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.13.0/protobuf-parent-3.13.0.pom
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.17.2/protobuf-parent-3.17.2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.26.0-RC1/protobuf-parent-4.26.0-RC1.pom https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/4.0.0-rc-2/protobuf-parent-4.0.0-rc-2.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth-parent/1.4.0/truth-parent-1.4.0.pom https://repo.maven.apache.org/maven2/com/google/truth/truth-parent/1.2.0/truth-parent-1.2.0.pom
https://repo.maven.apache.org/maven2/com/google/truth/truth/1.4.0/truth-1.4.0.pom https://repo.maven.apache.org/maven2/com/google/truth/truth/1.2.0/truth-1.2.0.pom
https://repo.maven.apache.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.pom https://repo.maven.apache.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.pom
https://repo.maven.apache.org/maven2/com/intellij/annotations/12.0/annotations-12.0.pom https://repo.maven.apache.org/maven2/com/intellij/annotations/12.0/annotations-12.0.pom
https://repo.maven.apache.org/maven2/com/parse/bolts/bolts-tasks/1.4.0/bolts-tasks-1.4.0.pom https://repo.maven.apache.org/maven2/com/parse/bolts/bolts-tasks/1.4.0/bolts-tasks-1.4.0.pom
@@ -1146,7 +1146,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.6.20/kotlin-reflect-1.6.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.7.10/kotlin-reflect-1.7.10.pom https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.7.10/kotlin-reflect-1.7.10.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.7.22/kotlin-reflect-1.7.22.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/2.0.0-Beta3/kotlin-reflect-2.0.0-Beta3.pom https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/2.0.0-Beta2/kotlin-reflect-2.0.0-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.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.7.22/kotlin-scripting-common-1.7.22.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.9.0/kotlin-scripting-common-1.9.0.pom https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-scripting-common/1.9.0/kotlin-scripting-common-1.9.0.pom
@@ -1229,7 +1229,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.7.10/k
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.7.22/kotlin-stdlib-1.7.22.pom https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.7.22/kotlin-stdlib-1.7.22.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.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/1.9.21/kotlin-stdlib-1.9.21.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.0.0-Beta3/kotlin-stdlib-2.0.0-Beta3.pom https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/2.0.0-Beta2/kotlin-stdlib-2.0.0-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.7.22/kotlin-tooling-core-1.7.22.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.9.0/kotlin-tooling-core-1.9.0.pom https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-core/1.9.0/kotlin-tooling-core-1.9.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-metadata/1.6.20/kotlin-tooling-metadata-1.6.20.pom https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-tooling-metadata/1.6.20/kotlin-tooling-metadata-1.6.20.pom
@@ -1247,14 +1247,14 @@ https://repo.maven.apache.org/maven2/org/json/json/20231013/json-20231013.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/jsoup/jsoup/1.13.1/jsoup-1.13.1.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.9.2/junit-bom-5.9.2.pom https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.9.2/junit-bom-5.9.2.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.9.3/junit-bom-5.9.3.pom https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.9.3/junit-bom-5.9.3.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.10.2/junit-bom-5.10.2.pom https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.10.1/junit-bom-5.10.1.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.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.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/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/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/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/4.0.0/mockito-core-4.0.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/5.10.0/mockito-core-5.10.0.pom https://repo.maven.apache.org/maven2/org/mockito/mockito-core/5.9.0/mockito-core-5.9.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/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.2/objenesis-parent-3.2.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/3.3/objenesis-parent-3.3.pom https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/3.3/objenesis-parent-3.3.pom
-3
View File
@@ -79,9 +79,6 @@ in stdenv.mkDerivation rec {
STATUS_GO_SRC_OVERRIDE = statusGoSrcOverride; STATUS_GO_SRC_OVERRIDE = statusGoSrcOverride;
ANDROID_ABI_SPLIT = androidAbiSplit; ANDROID_ABI_SPLIT = androidAbiSplit;
ANDROID_ABI_INCLUDE = androidAbiInclude; ANDROID_ABI_INCLUDE = androidAbiInclude;
# Disabled for debug builds to avoid 'maximum call stack exceeded' errors.
# https://github.com/status-im/status-mobile/issues/18493
ORG_GRADLE_PROJECT_hermesEnabled = true;
# Fix for ERR_OSSL_EVP_UNSUPPORTED error. # Fix for ERR_OSSL_EVP_UNSUPPORTED error.
NODE_OPTIONS = "--openssl-legacy-provider"; NODE_OPTIONS = "--openssl-legacy-provider";
-1
View File
@@ -97,5 +97,4 @@ in {
patchMavenSources = callPackage ./pkgs/patch-maven-srcs { }; patchMavenSources = callPackage ./pkgs/patch-maven-srcs { };
goMavenResolver = callPackage ./pkgs/go-maven-resolver { }; goMavenResolver = callPackage ./pkgs/go-maven-resolver { };
xcbeautify = callPackage ./pkgs/xcbeautify { }; xcbeautify = callPackage ./pkgs/xcbeautify { };
idb-companion = callPackage ./pkgs/idb-companion { };
} }
-29
View File
@@ -1,29 +0,0 @@
{ stdenv, fetchurl, lib }:
stdenv.mkDerivation rec {
pname = "idb-companion";
version = "1.1.8";
src = fetchurl {
url = "https://github.com/facebook/idb/releases/download/v${version}/idb-companion.universal.tar.gz";
sha256 = "sha256-O3LMappbGiKhiCBahAkNOilDR6hGGA79dVzxo8hI4+c=";
};
buildInputs = [ ];
unpackPhase = ''
tar -xzf $src
'';
installPhase = ''
mkdir -p $out/bin
cp -r ./* $out/bin/
'';
meta = with lib; {
description = "A powerful command line tool for automating iOS simulators and devices";
homepage = "https://github.com/facebook/idb";
license = licenses.mit;
platforms = platforms.darwin;
};
}
+2 -2
View File
@@ -23,9 +23,9 @@ in mkShell {
# build specific utilities # build specific utilities
clojure maven watchman clojure maven watchman
# other nice to have stuff # other nice to have stuff
yarn nodejs python310 maestro yarn nodejs python310
] # and some special cases ] # and some special cases
++ lib.optionals stdenv.isDarwin ([ cocoapods clang tcl idb-companion ] ++ appleSDKFrameworks) ++ lib.optionals stdenv.isDarwin ([ cocoapods clang tcl ] ++ appleSDKFrameworks)
++ lib.optionals (!stdenv.isDarwin) [ gcc8 ] ++ lib.optionals (!stdenv.isDarwin) [ gcc8 ]
); );
+43 -74
View File
@@ -1,7 +1,7 @@
{ {
"meta": { "meta": {
"hostname": "node-01.do-ams3.sites.misc", "hostname": "node-01.do-ams3.sites.misc",
"timestamp": "2024-02-02T14:48:22.521541", "timestamp": "2023-01-05T10:03:38.657813",
"warning": "DO NOT EDIT! Auto generated from Consul. Should only be used at build time." "warning": "DO NOT EDIT! Auto generated from Consul. Should only be used at build time."
}, },
"fleets": { "fleets": {
@@ -89,9 +89,9 @@
"node-01.ac-cn-hongkong-c.wakuv2.prod": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.prod.statusim.net/tcp/30303/p2p/16Uiu2HAm4v86W3bmT1BiH6oSPzcsSr24iDQpSN5Qa992BCjjwgrD" "node-01.ac-cn-hongkong-c.wakuv2.prod": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.prod.statusim.net/tcp/30303/p2p/16Uiu2HAm4v86W3bmT1BiH6oSPzcsSr24iDQpSN5Qa992BCjjwgrD"
}, },
"enr/p2p/waku": { "enr/p2p/waku": {
"node-01.do-ams3.wakuv2.prod": "enr:-P-4QJI8tS1WTdIQxq_yIrD05oIIW1Xg-tm_qfP0CHfJGnp9dfr6ttQJmHwTNxGEl4Le8Q7YHcmi-kXTtphxFysS11oBgmlkgnY0gmlwhLymh5GKbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi5wcm9kLnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDbl1X_zJIw3EAJGtmHMVn4Z2xhpSoUaP5ElsHKCv7hlWDdGNwgnZfg3VkcIIjKIV3YWt1Mg8", "node-01.do-ams3.wakuv2.prod": "enr:-M-4QLdAB-KyzT3QEsDoNa4LXT6RGH9BIylvTlDFLQhigWmxKEesulgc8AoKmVEUKj_4St6ThBKwyBc69tBfCe2hVTABgmlkgnY0gmlwhLymh5GKbXVsdGlhZGRyc7EALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi5wcm9kLnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDbl1X_zJIw3EAJGtmHMVn4Z2xhpSoUaP5ElsHKCv7hlWDdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
"node-01.gc-us-central1-a.wakuv2.prod": "enr:-QERuEC0EGWTjg_gYdnuPypJ9LAbB3lml6M8GiRajGegL2iWEj1MJzUMV9X6jXw7mMAQQLozLCTLFT-zv-ELQLPwWdACAYJpZIJ2NIJpcIQieWRsim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdXYyLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA_30kHgQqfXZRioa4J_u5asgXTJ5iw_8w3lEICH4TFu_g3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "node-01.gc-us-central1-a.wakuv2.prod": "enr:-Nm4QNgc2L6L-4nk6jgllNDE1QDcn6kv2922rTRYs1wM3My_OmSsTimkMCIMh8fat6enFdYfuJ23KjWdF5whBz3zXgUBgmlkgnY0gmlwhCJ5ZGyKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA_30kHgQqfXZRioa4J_u5asgXTJ5iw_8w3lEICH4TFu_g3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-01.ac-cn-hongkong-c.wakuv2.prod": "enr:-QERuEDABor1lVmSa5ek8of5eBc8jZoxxdleJVLLdMl8UeZHNwhsVp64SFiCT4BRIIfcs7uxTPUCjmWxK_OA1s-FfIW7AYJpZIJ2NIJpcIQI0t7nim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdXYyLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAo0C-VvfgHiXrxZi3umDiooXMGY9FvYj5_d1Q4EeS7eyg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP" "node-01.ac-cn-hongkong-c.wakuv2.prod": "enr:-Nm4QOdTOKZJKTUUZ4O_W932CXIET-M9NamewDnL78P5u9DOGnZlK0JFZ4k0inkfe6iY-0JAaJVovZXc575VV3njeiABgmlkgnY0gmlwhAjS3ueKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAo0C-VvfgHiXrxZi3umDiooXMGY9FvYj5_d1Q4EeS7eyg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP"
}, },
"wss/p2p/waku": { "wss/p2p/waku": {
"node-01.do-ams3.wakuv2.prod": "/dns4/node-01.do-ams3.wakuv2.prod.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmL5okWopX7NqZWBUKVqW8iUxCEmd5GMHLVPwCgzYzQv3e", "node-01.do-ams3.wakuv2.prod": "/dns4/node-01.do-ams3.wakuv2.prod.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmL5okWopX7NqZWBUKVqW8iUxCEmd5GMHLVPwCgzYzQv3e",
@@ -106,9 +106,9 @@
"node-01.ac-cn-hongkong-c.wakuv2.test": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.test.statusim.net/tcp/30303/p2p/16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm" "node-01.ac-cn-hongkong-c.wakuv2.test": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.test.statusim.net/tcp/30303/p2p/16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm"
}, },
"enr/p2p/waku": { "enr/p2p/waku": {
"node-01.do-ams3.wakuv2.test": "enr:-P-4QPLMQ1zIYRAs4-F0mYmMxMihSySRtEIuGHJ_Qd_GL8XqUE78hpVUE97rgwlXnxPkzMJHkWyiNq7DT1fdZSy3QcgBgmlkgnY0gmlwhIbRi9KKbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi50ZXN0LnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDnr03Tuo77930a7sYLikftxnuG3BbC3gCFhA4632ooDaDdGNwgnZfg3VkcIIjKIV3YWt1Mg8", "node-01.do-ams3.wakuv2.test": "enr:-M-4QCtJKX2WDloRYDT4yjeMGKUCRRcMlsNiZP3cnPO0HZn6IdJ035RPCqsQ5NvTyjqHzKnTM6pc2LoKliV4CeV0WrgBgmlkgnY0gmlwhIbRi9KKbXVsdGlhZGRyc7EALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi50ZXN0LnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDnr03Tuo77930a7sYLikftxnuG3BbC3gCFhA4632ooDaDdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
"node-01.gc-us-central1-a.wakuv2.test": "enr:-QERuEDZcXS5tjppj4TIlOm-TLanjmqx3-uk2kGFvvAQR1NVrklUhiN1JCb5dWucEQ_oDADOb6nG_1mJ5goF5CHneZ-VAYJpZIJ2NIJpcIRomu-Aim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdXYyLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA1giYsmWV9r2yJZYAiMGHJfjLlLeqAuTAokUGPN__pkxg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "node-01.gc-us-central1-a.wakuv2.test": "enr:-Nm4QLHYoJ5WYQoVzyqPR-pwIeQvi3ONWs-EPwk3uUiBiDseN9Dd7fYbCvkMdeXcuZ-8U9IYdGm38VxSDf_Oq3zZ0cEBgmlkgnY0gmlwhGia74CKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA1giYsmWV9r2yJZYAiMGHJfjLlLeqAuTAokUGPN__pkxg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-01.ac-cn-hongkong-c.wakuv2.test": "enr:-QERuEC2LyiXKURIKxNHa7Mj7frsM-lZiAGJ-2mopR3w8LMn2UhKmahZ9RHKV5ehBN1fXbRYqAeiXuOxD9t2igF4PIizAYJpZIJ2NIJpcIQv8tJJim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdXYyLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAhAm-P4q6mWONKcGnbLPU8WXZJ4Qs3AxIbrycvc7PVKsg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP" "node-01.ac-cn-hongkong-c.wakuv2.test": "enr:-Nm4QC0_ClHzbsutYzgT3jJm7ZY1D4shylAdd6Ac-L4uwAUha1oHM0zwoEkTORVt94W5Cpa0IiyrTcXAYLgpRXpVNUsBgmlkgnY0gmlwhC_y0kmKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAhAm-P4q6mWONKcGnbLPU8WXZJ4Qs3AxIbrycvc7PVKsg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP"
}, },
"wss/p2p/waku": { "wss/p2p/waku": {
"node-01.do-ams3.wakuv2.test": "/dns4/node-01.do-ams3.wakuv2.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ", "node-01.do-ams3.wakuv2.test": "/dns4/node-01.do-ams3.wakuv2.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ",
@@ -116,23 +116,6 @@
"node-01.ac-cn-hongkong-c.wakuv2.test": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm" "node-01.ac-cn-hongkong-c.wakuv2.test": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm"
} }
}, },
"waku.test": {
"tcp/p2p/waku": {
"node-01.do-ams3.waku.test": "/dns4/node-01.do-ams3.waku.test.statusim.net/tcp/30303/p2p/16Uiu2HAkykgaECHswi3YKJ5dMLbq2kPVCo89fcyTd38UcQD6ej5W",
"node-01.gc-us-central1-a.waku.test": "/dns4/node-01.gc-us-central1-a.waku.test.statusim.net/tcp/30303/p2p/16Uiu2HAmDCp8XJ9z1ev18zuv8NHekAsjNyezAvmMfFEJkiharitG",
"node-01.ac-cn-hongkong-c.waku.test": "/dns4/node-01.ac-cn-hongkong-c.waku.test.statusim.net/tcp/30303/p2p/16Uiu2HAkzHaTP5JsUwfR9NR8Rj9HC24puS6ocaU8wze4QrXr9iXp"
},
"enr/p2p/waku": {
"node-01.do-ams3.waku.test": "enr:-QESuEC1p_s3xJzAC_XlOuuNrhVUETmfhbm1wxRGis0f7DlqGSw2FM-p2Ugl_r25UHQJ3f1rIRrpzxJXSMaJe4yk1XFSAYJpZIJ2NIJpcISygI2rim11bHRpYWRkcnO4XAArNiZub2RlLTAxLmRvLWFtczMud2FrdS50ZXN0LnN0YXR1c2ltLm5ldAZ2XwAtNiZub2RlLTAxLmRvLWFtczMud2FrdS50ZXN0LnN0YXR1c2ltLm5ldAYfQN4DgnJzkwABCAAAAAEAAgADAAQABQAGAAeJc2VjcDI1NmsxoQJATXRSRSUyTw_QLB6H_U3oziVQgNRgrXpK7wp2AMyNxYN0Y3CCdl-DdWRwgiMohXdha3UyDw",
"node-01.gc-us-central1-a.waku.test": "enr:-QEkuECnZ3IbVAgkOzv-QLnKC4dRKAPRY80m1-R7G8jZ7yfT3ipEfBrhKN7ARcQgQ-vg-h40AQzyvAkPYlHPaFKk6u9uAYJpZIJ2NIJpcIQiEAFDim11bHRpYWRkcnO4bgA0Ni9ub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdS50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA2Ni9ub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdS50ZXN0LnN0YXR1c2ltLm5ldAYfQN4DgnJzkwABCAAAAAEAAgADAAQABQAGAAeJc2VjcDI1NmsxoQMIJwesBVgUiBCi8yiXGx7RWylBQkYm1U9dvEy-neLG2YN0Y3CCdl-DdWRwgiMohXdha3UyDw",
"node-01.ac-cn-hongkong-c.waku.test": "enr:-QEkuEDzQyIAhs-CgBHIrJqtBv3EY1uP1Psrc-y8yJKsmxW7dh3DNcq2ergMUWSFVcJNlfcgBeVsFPkgd_QopRIiCV2pAYJpZIJ2NIJpcIQI2ttrim11bHRpYWRkcnO4bgA0Ni9ub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdS50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA2Ni9ub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdS50ZXN0LnN0YXR1c2ltLm5ldAYfQN4DgnJzkwABCAAAAAEAAgADAAQABQAGAAeJc2VjcDI1NmsxoQJIN4qwz3v4r2Q8Bv8zZD0eqBcKw6bdLvdkV7-JLjqIj4N0Y3CCdl-DdWRwgiMohXdha3UyDw"
},
"wss/p2p/waku": {
"node-01.do-ams3.waku.test": "/dns4/node-01.do-ams3.waku.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAkykgaECHswi3YKJ5dMLbq2kPVCo89fcyTd38UcQD6ej5W",
"node-01.gc-us-central1-a.waku.test": "/dns4/node-01.gc-us-central1-a.waku.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmDCp8XJ9z1ev18zuv8NHekAsjNyezAvmMfFEJkiharitG",
"node-01.ac-cn-hongkong-c.waku.test": "/dns4/node-01.ac-cn-hongkong-c.waku.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAkzHaTP5JsUwfR9NR8Rj9HC24puS6ocaU8wze4QrXr9iXp"
}
},
"status.prod": { "status.prod": {
"tcp/p2p/waku": { "tcp/p2p/waku": {
"node-01.do-ams3.status.prod": "/dns4/node-01.do-ams3.status.prod.statusim.net/tcp/30303/p2p/16Uiu2HAm6HZZr7aToTvEBPpiys4UxajCTU97zj5v7RNR2gbniy1D", "node-01.do-ams3.status.prod": "/dns4/node-01.do-ams3.status.prod.statusim.net/tcp/30303/p2p/16Uiu2HAm6HZZr7aToTvEBPpiys4UxajCTU97zj5v7RNR2gbniy1D",
@@ -143,12 +126,12 @@
"node-02.ac-cn-hongkong-c.status.prod": "/dns4/node-02.ac-cn-hongkong-c.status.prod.statusim.net/tcp/30303/p2p/16Uiu2HAmFy8BrJhCEmCYrUfBdSNkrPw6VHExtv4rRp1DSBnCPgx8" "node-02.ac-cn-hongkong-c.status.prod": "/dns4/node-02.ac-cn-hongkong-c.status.prod.statusim.net/tcp/30303/p2p/16Uiu2HAmFy8BrJhCEmCYrUfBdSNkrPw6VHExtv4rRp1DSBnCPgx8"
}, },
"enr/p2p/waku": { "enr/p2p/waku": {
"node-01.do-ams3.status.prod": "enr:-P-4QGVNANzbhCI49du6Moyw98AjuMhKoOpE_Jges9JlCq-ICAVadktjfcNpuhQgT0g1cu86_S3nbM7eYkCsqDAQG7UBgmlkgnY0gmlwhI_G-a6KbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaECoVyonsTGEQvVioM562Q1fjzTb_vKD152PPIdsV7sM6SDdGNwgnZfg3VkcIIjKIV3YWt1Mg8", "node-01.do-ams3.status.prod": "enr:-M-4QLOTEs_ZFxCb09FgIezZd5KeTru5CWWyEtMWMN-yUABrerWxckU-pMIh3yO8VjxHpgZ4jU2WSXuK3goW4uYb6c4BgmlkgnY0gmlwhI_G-a6KbXVsdGlhZGRyc7EALzYobm9kZS0wMS5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaECoVyonsTGEQvVioM562Q1fjzTb_vKD152PPIdsV7sM6SDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
"node-02.do-ams3.status.prod": "enr:-P-4QMXNung2KVE9xLMzctM754vz4kbavb4Stai3RBPfN-5XMfuf2i0x8J5l8fkxkiZ3Vpd0IkN9Gg0PbbDh2BUyIF8BgmlkgnY0gmlwhKEj9HmKbXVsdGlhZGRyc7hgAC02KG5vZGUtMDIuZG8tYW1zMy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMi5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaED1AYI2Ox27DnSqf2qoih5M2fNpHFq-OzJ3thREEApdiiDdGNwgnZfg3VkcIIjKIV3YWt1Mg8", "node-02.do-ams3.status.prod": "enr:-M-4QIhQjPgSnoKXLsJAxbRzF8cZYYjOfdt1ysBkibcriCvXb9lWHDiRghIv11JQltK5KYFs2zrCKoQ-_ZoRXEs5FasBgmlkgnY0gmlwhKEj9HmKbXVsdGlhZGRyc7EALzYobm9kZS0wMi5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaED1AYI2Ox27DnSqf2qoih5M2fNpHFq-OzJ3thREEApdiiDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
"node-01.gc-us-central1-a.status.prod": "enr:-QERuEAFZ-rlajEo617uz0NDycgW4cPqqBumBvTOWywyFzIg4UOmbctTjYi6sfMArMgJEIDpphaXpLkCt5r12_gmtDQlAYJpZIJ2NIJpcIQjyjeZim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEuc3RhdHVzLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAhoqdPkAZNvNRuzEecDGwnt5UbF98qwM16PZG3JmW6kUg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "node-01.gc-us-central1-a.status.prod": "enr:-Nm4QPRAGqCjHCuu3DjbDVoLPqpE35Lfc3mjdCsmGTqdWmxjOF2NAbdYezEnukrz38TkTNXzEdslw_n_H5uUQ3hi-2EBgmlkgnY0gmlwhCPKN5mKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAhoqdPkAZNvNRuzEecDGwnt5UbF98qwM16PZG3JmW6kUg3RjcIJ2X4N1ZHCCIyiFd2FrdTID",
"node-02.gc-us-central1-a.status.prod": "enr:-QERuEA_42Fh7Kq3drLxfIuRkqMfoJpfKpjwRcUXLv1PUQdUt1AAhIOUpun_kHKAMBmrREU9y2VoTKykl0dPBw02Fbh-AYJpZIJ2NIJpcIQihNXpim11bHRpYWRkcnO4cgA2NjFub2RlLTAyLmdjLXVzLWNlbnRyYWwxLWEuc3RhdHVzLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDIuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAwtASPpiz5Gq3zuFuWF4MTviQVipi3HaQGytF-4wfbdvg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "node-02.gc-us-central1-a.status.prod": "enr:-Nm4QEdveBFdGPTVPCmYBikMKtGFlvLnzvXfYLOWDLPtTejBLcV_9e5Ry7dqx5K027rn5zedG-HnNiHP_GBcdCpGnq0BgmlkgnY0gmlwhCKE1emKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDIuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAwtASPpiz5Gq3zuFuWF4MTviQVipi3HaQGytF-4wfbdvg3RjcIJ2X4N1ZHCCIyiFd2FrdTID",
"node-01.ac-cn-hongkong-c.status.prod": "enr:-QERuEAVmLHSKOsMq2Atya-0mhdvu718BAcynh40JAPBprvhpgcsTqkXV5kRrxaZbtzKa5-b0I4aO9U_O7-zHe24UDMAAYJpZIJ2NIJpcIQv8so7im11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMuc3RhdHVzLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAgwDLi50TMXqxWTCnR_rjQP3Eeznjs645ZNBoRh5B3jhg3RjcIJ2X4N1ZHCCIyiFd2FrdTIL", "node-01.ac-cn-hongkong-c.status.prod": "enr:-Nm4QOxEmmi5LQo3EwmHCagXOzVXzsLDGDwPDTL6ECmUCoXPYV0ldWvzMVqPOEPzXMCtECdk7xpleiNN85oKQxFiGnYBgmlkgnY0gmlwhC_yyjuKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAgwDLi50TMXqxWTCnR_rjQP3Eeznjs645ZNBoRh5B3jhg3RjcIJ2X4N1ZHCCIyiFd2FrdTID",
"node-02.ac-cn-hongkong-c.status.prod": "enr:-QERuECscpffU15jE9GD77vwwKCeAWn8jBl7IXS9fMj8FcY6YzBPNNr17pXuOHPqhLbieZxM3zc0AMWDa5tWqpfbtzMKAYJpZIJ2NIJpcIQv84CGim11bHRpYWRkcnO4cgA2NjFub2RlLTAyLmFjLWNuLWhvbmdrb25nLWMuc3RhdHVzLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDIuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAzE4YIBrPK5oT_9MvYEeggmaDd205iU4Nn1MAhU5xqY5g3RjcIJ2X4N1ZHCCIyiFd2FrdTIP" "node-02.ac-cn-hongkong-c.status.prod": "enr:-Nm4QOqKQ4bi7sYE1ZXAqnryEGeJOnQxIzo9UK5xHY_GeP4healoFVspoG2FaUCSyIg8pa4X2P99BbC15iSh98NIgPYBgmlkgnY0gmlwhC_zgIaKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDIuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAzE4YIBrPK5oT_9MvYEeggmaDd205iU4Nn1MAhU5xqY5g3RjcIJ2X4N1ZHCCIyiFd2FrdTID"
}, },
"wss/p2p/waku": { "wss/p2p/waku": {
"node-01.do-ams3.status.prod": "/dns4/node-01.do-ams3.status.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAm6HZZr7aToTvEBPpiys4UxajCTU97zj5v7RNR2gbniy1D", "node-01.do-ams3.status.prod": "/dns4/node-01.do-ams3.status.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAm6HZZr7aToTvEBPpiys4UxajCTU97zj5v7RNR2gbniy1D",
@@ -166,9 +149,9 @@
"node-01.ac-cn-hongkong-c.status.test": "/dns4/node-01.ac-cn-hongkong-c.status.test.statusim.net/tcp/30303/p2p/16Uiu2HAm2BjXxCp1sYFJQKpLLbPbwd5juxbsYofu3TsS3auvT9Yi" "node-01.ac-cn-hongkong-c.status.test": "/dns4/node-01.ac-cn-hongkong-c.status.test.statusim.net/tcp/30303/p2p/16Uiu2HAm2BjXxCp1sYFJQKpLLbPbwd5juxbsYofu3TsS3auvT9Yi"
}, },
"enr/p2p/waku": { "enr/p2p/waku": {
"node-01.do-ams3.status.test": "enr:-P-4QOg_CbInUakb3TEQBeCICyC-QDPeWK-CGtV9-nWp1W5DOKE2va63re3nPw-_hgvJfJkvshTaV0VmditigxKxT_kBgmlkgnY0gmlwhEDhUe2KbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLnN0YXR1cy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaECBNx5Erw5Jdsw-uI9pBjB_V2R6brvuVWE-MJwYCQKVv6DdGNwgnZfg3VkcIIjKIV3YWt1Mg8", "node-01.do-ams3.status.test": "enr:-M-4QI1qCnM3DMuZR2Y86FygFXPtm9fIRc4rFdUaDj0NbEA3Jl4In8mXAjUWgoei7W9Grc7oqtgibmIo-HIHHg7wrhMBgmlkgnY0gmlwhEDhUe2KbXVsdGlhZGRyc7EALzYobm9kZS0wMS5kby1hbXMzLnN0YXR1cy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaECBNx5Erw5Jdsw-uI9pBjB_V2R6brvuVWE-MJwYCQKVv6DdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
"node-01.gc-us-central1-a.status.test": "enr:-QERuED3i2Oj7jWVR6QyPE_R0WO4Kec4CuUf8Pf6YrEXB6mvFwW_Y2wyHExqajqKR-ke-129TwAwovz2QjErTUga6rM8AYJpZIJ2NIJpcIQievx2im11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEuc3RhdHVzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAzToWxPoQnnubNH_CIu7YHPV0RHadQVIKlpfMJxxC2eFg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "node-01.gc-us-central1-a.status.test": "enr:-Nm4QFxGf89g3MGnCLYBxBgpXejyB44mvXvJSpNzjlRwNXO6BIn7hl66OJpESPWdH7ipHNemmz0e04wtJHe_wVV5woABgmlkgnY0gmlwhCJ6_HaKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAzToWxPoQnnubNH_CIu7YHPV0RHadQVIKlpfMJxxC2eFg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-01.ac-cn-hongkong-c.status.test": "enr:-QERuEDoxPEax-hctqp6vg2cmvd2UNPjgdf6iWmgvShX2-hL_Wj2JHpjVua9buZTYLsLD-Or5e71hwlgZlFaceEfopnzAYJpZIJ2NIJpcIQv8ukkim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMuc3RhdHVzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAmRvsjqPlfX7OOJ4x4F3GAOpBa4y4NQSoNHjX2XIo1lvg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP" "node-01.ac-cn-hongkong-c.status.test": "enr:-Nm4QCF2zwCuAZzxTtjjjbo5hn6vx0ICcEJBGRBMdDCfpoX5BGiApbfhEljEjpI4ePhYra_k0o5uI8eTTGYHkr6208gBgmlkgnY0gmlwhC_y6SSKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAmRvsjqPlfX7OOJ4x4F3GAOpBa4y4NQSoNHjX2XIo1lvg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP"
}, },
"wss/p2p/waku": { "wss/p2p/waku": {
"node-01.do-ams3.status.test": "/dns4/node-01.do-ams3.status.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAkukebeXjTQ9QDBeNDWuGfbaSg79wkkhK4vPocLgR6QFDf", "node-01.do-ams3.status.test": "/dns4/node-01.do-ams3.status.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAkukebeXjTQ9QDBeNDWuGfbaSg79wkkhK4vPocLgR6QFDf",
@@ -176,52 +159,38 @@
"node-01.ac-cn-hongkong-c.status.test": "/dns4/node-01.ac-cn-hongkong-c.status.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAm2BjXxCp1sYFJQKpLLbPbwd5juxbsYofu3TsS3auvT9Yi" "node-01.ac-cn-hongkong-c.status.test": "/dns4/node-01.ac-cn-hongkong-c.status.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAm2BjXxCp1sYFJQKpLLbPbwd5juxbsYofu3TsS3auvT9Yi"
} }
}, },
"shards.test": { "go-waku.prod": {
"tcp/p2p/waku/boot": { "tcp/p2p/waku": {
"boot-01.do-ams3.shards.test": "/dns4/boot-01.do-ams3.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAmAR24Mbb6VuzoyUiGx42UenDkshENVDj4qnmmbabLvo31", "node-01.do-ams3.go-waku.prod": "/dns4/node-01.do-ams3.go-waku.prod.statusim.net/tcp/30303/p2p/16Uiu2HAkyScd7DiwgMwzfw8CFFhznH3wRzciqEUfjDzn7vyimR8c",
"boot-01.gc-us-central1-a.shards.test": "/dns4/boot-01.gc-us-central1-a.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAm8mUZ18tBWPXDQsaF7PbCKYA35z7WB2xNZH2EVq1qS8LJ", "node-01.gc-us-central1-a.go-waku.prod": "/dns4/node-01.gc-us-central1-a.go-waku.prod.statusim.net/tcp/30303/p2p/16Uiu2HAmKTYnoPKebjWy63e1zPKiYRCQvm25W5mNSnCFE8EmzLga",
"boot-01.ac-cn-hongkong-c.shards.test": "/dns4/boot-01.ac-cn-hongkong-c.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAmGwcE8v7gmJNEWFtZtojYpPMTHy2jBLL6xRk33qgDxFWX" "node-01.ac-cn-hongkong-c.go-waku.prod": "/dns4/node-01.ac-cn-hongkong-c.go-waku.prod.statusim.net/tcp/30303/p2p/16Uiu2HAkwUKwy66nhcSFeW7y5qijNqXC4ZD3TaMMqnoEbh3wK2xU"
}, },
"enr/p2p/waku/boot": { "enr/p2p/waku": {
"boot-01.do-ams3.shards.test": "enr:-QEOuEAuAK49evunDoidpHqcmeVqZz73wt4jwHnHJlmCVBFj6EdIbZ9uH5BnCYKOEPJTns2QJKUR2XLtWyzIspPAfJF9AYJpZIJ2NIJpcISnYxMvim11bHRpYWRkcnO4YAAtNihib290LTAxLmRvLWFtczMuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfAC82KGJvb3QtMDEuZG8tYW1zMy5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAt60bRUEoHNuLlnsM12sU2PIQwBwfLIJ8a_ZPEY2-Rnkg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN", "node-01.do-ams3.go-waku.prod": "enr:-NC4QGRYrus1rbuI183CZmxjb1wL4_wdNMcJDKaxaTaRs-RUTXP6KQ0VxL8zGaPNNxLT45ItXS8dmQvcyBWUlTwqXfYBgmlkgnY0gmlwhIbRh8OKbXVsdGlhZGRyc7IAMDYpbm9kZS0wMS5kby1hbXMzLmdvLXdha3UucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAjusiHwKZa-rftTSq-KnDnirfCBW-q5ClJf4YEw9N8_Jg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"boot-01.gc-us-central1-a.shards.test": "enr:-QEguEC3wjzOk7U5rIqiX32CCD-0_J1cYYGK_YwKSah5di2NTxJUaKQ9B7NMiEQ_-YGm-Eus4SzHtxN_fXEuVaNHql9aAYJpZIJ2NIJpcIQihw1Xim11bHRpYWRkcnO4cgA2NjFib290LTAxLmdjLXVzLWNlbnRyYWwxLWEuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MWJvb3QtMDEuZ2MtdXMtY2VudHJhbDEtYS5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAsY6oA0NFskUjopWFN9gwOZP1zZQ4rN5tVXV5CvcTOpDg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN", "node-01.gc-us-central1-a.go-waku.prod": "enr:-Nq4QJuKC3qwV704_zzThJiIaV2Jb1YLLjRzSalpgrgAUV7vU0_fMYTQUshz6hcqds0lR3lHFzhCDEdrT6TmP1rBF1IBgmlkgnY0gmlwhCJ6XvOKbXVsdGlhZGRyc7g7ADk2Mm5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5nby13YWt1LnByb2Quc3RhdHVzaW0ubmV0BgG73gOJc2VjcDI1NmsxoQNlE4TEM5FmqnyDaMQ4viBkHpx2FZb9SPVl_XsVCrn5q4N0Y3CCdl-DdWRwgiMohXdha3UyDw",
"boot-01.ac-cn-hongkong-c.shards.test": "enr:-QEguEBb4rlxsdYCIZ8NcAlcjnb2zp4C9JbDsz-01Ix2sKNdWzI79KRFnhlakX-4F8gRYcviDvQL5eEZDOxHTupUW7VXAYJpZIJ2NIJpcIQI2hdMim11bHRpYWRkcnO4cgA2NjFib290LTAxLmFjLWNuLWhvbmdrb25nLWMuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MWJvb3QtMDEuYWMtY24taG9uZ2tvbmctYy5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAz-wm0ZPmCicDhRTOGfZ3stBj3O1jyWgsBpKTUcpWu5gg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN" "node-01.ac-cn-hongkong-c.go-waku.prod": "enr:-Nq4QFd-E6Ej3RuGF_-zZWYLfIb4vpfhKNi6RiLWrt30O90oNuJnbhUo8rMvuX_sO95X6QoyHa9RaUYx9N7cywA4WWkBgmlkgnY0gmlwhAjSBH6KbXVsdGlhZGRyc7g7ADk2Mm5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5nby13YWt1LnByb2Quc3RhdHVzaW0ubmV0BgG73gOJc2VjcDI1NmsxoQIeZXd0MFV5YU9q0pWt05cUEc0RnptCtJarNlnxV7OpJYN0Y3CCdl-DdWRwgiMohXdha3UyDw"
}, },
"wss/p2p/waku/boot": { "wss/p2p/waku": {
"boot-01.do-ams3.shards.test": "/dns4/boot-01.do-ams3.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmAR24Mbb6VuzoyUiGx42UenDkshENVDj4qnmmbabLvo31", "node-01.do-ams3.go-waku.prod": "/dns4/node-01.do-ams3.go-waku.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAkyScd7DiwgMwzfw8CFFhznH3wRzciqEUfjDzn7vyimR8c",
"boot-01.gc-us-central1-a.shards.test": "/dns4/boot-01.gc-us-central1-a.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAm8mUZ18tBWPXDQsaF7PbCKYA35z7WB2xNZH2EVq1qS8LJ", "node-01.gc-us-central1-a.go-waku.prod": "/dns4/node-01.gc-us-central1-a.go-waku.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAmKTYnoPKebjWy63e1zPKiYRCQvm25W5mNSnCFE8EmzLga",
"boot-01.ac-cn-hongkong-c.shards.test": "/dns4/boot-01.ac-cn-hongkong-c.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmGwcE8v7gmJNEWFtZtojYpPMTHy2jBLL6xRk33qgDxFWX" "node-01.ac-cn-hongkong-c.go-waku.prod": "/dns4/node-01.ac-cn-hongkong-c.go-waku.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAkwUKwy66nhcSFeW7y5qijNqXC4ZD3TaMMqnoEbh3wK2xU"
},
"tcp/p2p/waku/store": {
"store-01.do-ams3.shards.test": "/dns4/store-01.do-ams3.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAmAUdrQ3uwzuE4Gy4D56hX6uLKEeerJAnhKEHZ3DxF1EfT",
"store-02.do-ams3.shards.test": "/dns4/store-02.do-ams3.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAm9aDJPkhGxc2SFcEACTFdZ91Q5TJjp76qZEhq9iF59x7R",
"store-01.gc-us-central1-a.shards.test": "/dns4/store-01.gc-us-central1-a.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAmMELCo218hncCtTvC2Dwbej3rbyHQcR8erXNnKGei7WPZ",
"store-02.gc-us-central1-a.shards.test": "/dns4/store-02.gc-us-central1-a.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAmJnVR7ZzFaYvciPVafUXuYGLHPzSUigqAmeNw9nJUVGeM",
"store-01.ac-cn-hongkong-c.shards.test": "/dns4/store-01.ac-cn-hongkong-c.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAm2M7xs7cLPc3jamawkEqbr7cUJX11uvY7LxQ6WFUdUKUT",
"store-02.ac-cn-hongkong-c.shards.test": "/dns4/store-02.ac-cn-hongkong-c.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAm9CQhsuwPR54q27kNj9iaQVfyRzTGKrhFmr94oD8ujU6P"
},
"enr/p2p/waku/store": {
"store-01.do-ams3.shards.test": "enr:-QEQuEDom7vBcLEP3ZCvRGPyBVTUJUO5YIyXvxcibag_iq6s5Ux6Zd1_nnqEXqynppYMNOTaTzSetRhmV9IH83j72umYAYJpZIJ2NIJpcISf3_Jeim11bHRpYWRkcnO4YgAuNilzdG9yZS0wMS5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwAwNilzdG9yZS0wMS5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaEC36GkB96EmFufcsRAX3gGW5bZlJwuAc2JB6nq9lUDE8qDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
"store-02.do-ams3.shards.test": "enr:-QEQuEAmPituRLmZuwA6z0AT_Vl-KWbb7kpyX7qcWwbjygv_Oxrdu_0kmpShNtauWxhRmaOMOYddv9IwiIS8HujxHvpbAYJpZIJ2NIJpcISf3_Kaim11bHRpYWRkcnO4YgAuNilzdG9yZS0wMi5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwAwNilzdG9yZS0wMi5kby1hbXMzLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaEC0jOth5qhqWd_NmDOAsiPjAiJZMTD-2WzsKsET75PcLCDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
"store-01.gc-us-central1-a.shards.test": "enr:-QEiuEBW0x-NQAwfFIgwrwtMRbPpWYRbWzsQ6nMDQK5K8vT8uAph5mlAw-TaeIxw9K2Vc0QuEYzf8-MnOESVyQ-C6ywcAYJpZIJ2NIJpcIQiqsAnim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMS5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMS5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaEDf2gcTbDga3Hgy8gu-bwRUbs7_7Vn2hxudCXPQ0M7cJCDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
"store-02.gc-us-central1-a.shards.test": "enr:-QEiuEDjbS1EbRmNA7Gl1F3z_NsTHloyfZp4h0tm5cQmTvo5SlFGIBPPpmB6oycGnVGCHFPmqV_XbJJRO5pObWa5dOHgAYJpZIJ2NIJpcIQiqpoCim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMi5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMi5nYy11cy1jZW50cmFsMS1hLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaEDWxINW5DCQgYg-U43t2f9dUfpHfZrp2RdL-IomGWtY4KDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
"store-01.ac-cn-hongkong-c.shards.test": "enr:-QEiuEDkMIJT5pVMmtzHD5RATLyU0kAG0tKcC3AE3BQe0O6S9R6OsA7PEVaaUg52fA4_I2pwjoW2GroE6uR9a-7Vdfy-AYJpZIJ2NIJpcIQI2kpJim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMS5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMS5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaECZtdI3Wq88fYXHYUShn7AMktB3OaVo98ock70-RSMChiDdGNwgnZfg3VkcIIjKIV3YWt1MgM",
"store-02.ac-cn-hongkong-c.shards.test": "enr:-QEiuEBzOdkswwOBobEe-nUvdtALMP8sjV9b_v9rQS4E0QOv2TVdrXRKKrBzOgk8TIXFtdry3RrowN5pTH7vBWl8TPKUAYJpZIJ2NIJpcIQI2nnoim11bHRpYWRkcnO4dAA3NjJzdG9yZS0wMi5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAZ2XwA5NjJzdG9yZS0wMi5hYy1jbi1ob25na29uZy1jLnNoYXJkcy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DgnJziwAQBAAgAEAAgAEAiXNlY3AyNTZrMaECzJ3LruqSdw0Ec2FKpAdT22kcWVyBiYvMGim2wRWzkjSDdGNwgnZfg3VkcIIjKIV3YWt1MgM"
},
"wss/p2p/waku/store": {
"store-01.do-ams3.shards.test": "/dns4/store-01.do-ams3.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmAUdrQ3uwzuE4Gy4D56hX6uLKEeerJAnhKEHZ3DxF1EfT",
"store-02.do-ams3.shards.test": "/dns4/store-02.do-ams3.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAm9aDJPkhGxc2SFcEACTFdZ91Q5TJjp76qZEhq9iF59x7R",
"store-01.gc-us-central1-a.shards.test": "/dns4/store-01.gc-us-central1-a.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmMELCo218hncCtTvC2Dwbej3rbyHQcR8erXNnKGei7WPZ",
"store-02.gc-us-central1-a.shards.test": "/dns4/store-02.gc-us-central1-a.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmJnVR7ZzFaYvciPVafUXuYGLHPzSUigqAmeNw9nJUVGeM",
"store-01.ac-cn-hongkong-c.shards.test": "/dns4/store-01.ac-cn-hongkong-c.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAm2M7xs7cLPc3jamawkEqbr7cUJX11uvY7LxQ6WFUdUKUT",
"store-02.ac-cn-hongkong-c.shards.test": "/dns4/store-02.ac-cn-hongkong-c.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAm9CQhsuwPR54q27kNj9iaQVfyRzTGKrhFmr94oD8ujU6P"
} }
}, },
"notify.prod": { "go-waku.test": {
"tcp/p2p/waku": { "tcp/p2p/waku": {
"node-01.do-ams3.notify.prod": "enode://401ba5eda402678dc78a0a40fd0795f4ea8b1e34972c4d15cf33ac01292341c89f0cbc637fa9f7a3ffe0b9dfe90e9cdae7a14925500ab01b6a91c67bae42a97a@178.128.139.80:1443", "node-01.do-ams3.go-waku.test": "/dns4/node-01.do-ams3.go-waku.test.statusim.net/tcp/30303/p2p/16Uiu2HAm9vnvCQgCDrynDK1h7GJoEZVGvnuzq84RyDQ3DEdXmcX7",
"node-01.gc-us-central1-a.notify.prod": "enode://181141b1d111908aaf05f4788e6778ec07073a1d4e1ce43c73815c40ee4e7345a1cbf5a90a45f601bf3763f12be63b01624ba1f36eeb9572455e7034b8f9f2c4@34.71.141.140:1443", "node-01.gc-us-central1-a.go-waku.test": "/dns4/node-01.gc-us-central1-a.go-waku.test.statusim.net/tcp/30303/p2p/16Uiu2HAmPz63Xc6AuVkDeujz7YeZta18rcdau3Y1BzaxKAfDrBqz",
"node-01.ac-cn-hongkong-c.notify.prod": "enode://5ffc34d5ffda180d94cd3974d9ed2bb082ede68f342babdbe801ceffb7da902087d43f9aa961c7b85029358874c08ef04ecad9f1d95a1f0e448cbdd5d04350c7@47.242.88.117:1443" "node-01.ac-cn-hongkong-c.go-waku.test": "/dns4/node-01.ac-cn-hongkong-c.go-waku.test.statusim.net/tcp/30303/p2p/16Uiu2HAmBDbMWFiG9ki8sDw6fYtraSxo4oHU9HbuN43S2HVyq1FD"
},
"enr/p2p/waku": {
"node-01.do-ams3.go-waku.test": "enr:-NC4QKYOHGKa69sKLLKbRlcR890mmPRIboV0MUSMQtvjiwd7SISpBYqVibOpmTuS0kRlU6KmBQs_MXA9LPOBgMbRB7UBgmlkgnY0gmlwhIbRhj-KbXVsdGlhZGRyc7IAMDYpbm9kZS0wMS5kby1hbXMzLmdvLXdha3UudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAtd5TiUZInW1nFF7nZtkXrw0iuqOLyV31_f7EhuM_Fs-g3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-01.gc-us-central1-a.go-waku.test": "enr:-Nq4QEb3btlua6_4EdC1SAF0wTl0JqI8Du34Bm7raZoYOAbHPmRzVt4rq-0ItCM3L4MkOpCFn_X26aTq-Q2YEK8DuGEBgmlkgnY0gmlwhCPft1uKbXVsdGlhZGRyc7g7ADk2Mm5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5nby13YWt1LnRlc3Quc3RhdHVzaW0ubmV0BgG73gOJc2VjcDI1NmsxoQOoVQePH5eRqlcCf-0XwZsoJPeZp1Mq59un_jYM9hUc6YN0Y3CCdl-DdWRwgiMohXdha3UyDw",
"node-01.ac-cn-hongkong-c.go-waku.test": "enr:-Nq4QCWN6qBpeK_1GiqE_F45k3MmBDxaOJ7X9fAOKO0qu_6xCPAkjOVz6Th_vn8n-CLdEizO5oJ6YOivuAiRHDdJ3q4BgmlkgnY0gmlwhAjaAm6KbXVsdGlhZGRyc7g7ADk2Mm5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5nby13YWt1LnRlc3Quc3RhdHVzaW0ubmV0BgG73gOJc2VjcDI1NmsxoQLqosp15CMf5c4k-z9MGM7_aiR0DGdmSrpjQ_xWnmsTOIN0Y3CCdl-DdWRwgiMohXdha3UyDw"
},
"wss/p2p/waku": {
"node-01.do-ams3.go-waku.test": "/dns4/node-01.do-ams3.go-waku.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAm9vnvCQgCDrynDK1h7GJoEZVGvnuzq84RyDQ3DEdXmcX7",
"node-01.gc-us-central1-a.go-waku.test": "/dns4/node-01.gc-us-central1-a.go-waku.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmPz63Xc6AuVkDeujz7YeZta18rcdau3Y1BzaxKAfDrBqz",
"node-01.ac-cn-hongkong-c.go-waku.test": "/dns4/node-01.ac-cn-hongkong-c.go-waku.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmBDbMWFiG9ki8sDw6fYtraSxo4oHU9HbuN43S2HVyq1FD"
} }
} }
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 695 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

-7
View File
@@ -33,17 +33,10 @@ trap "rm -vf ${SECRETS_FILE_PATH}" EXIT ERR INT QUIT
# Names of variables containing secrets to save in env file. # Names of variables containing secrets to save in env file.
SECRETS_ENV_VARS=( SECRETS_ENV_VARS=(
'ALCHEMY_ETHEREUM_MAINNET_TOKEN'
'ALCHEMY_ETHEREUM_GOERLI_TOKEN'
'ALCHEMY_ETHEREUM_SEPOLIA_TOKEN'
'ALCHEMY_ARBITRUM_GOERLI_TOKEN' 'ALCHEMY_ARBITRUM_GOERLI_TOKEN'
'ALCHEMY_ARBITRUM_MAINNET_TOKEN' 'ALCHEMY_ARBITRUM_MAINNET_TOKEN'
'ALCHEMY_ARBITRUM_SEPOLIA_TOKEN'
'ALCHEMY_OPTIMISM_GOERLI_TOKEN' 'ALCHEMY_OPTIMISM_GOERLI_TOKEN'
'ALCHEMY_OPTIMISM_MAINNET_TOKEN' 'ALCHEMY_OPTIMISM_MAINNET_TOKEN'
'ALCHEMY_OPTIMISM_SEPOLIA_TOKEN'
'RARIBLE_MAINNET_API_KEY'
'RARIBLE_TESTNET_API_KEY'
'INFURA_TOKEN' 'INFURA_TOKEN'
'INFURA_TOKEN_SECRET' 'INFURA_TOKEN_SECRET'
'OPENSEA_API_KEY' 'OPENSEA_API_KEY'
+7 -30
View File
@@ -45,9 +45,6 @@
;; To match the folder created by Nix build of JSBundle. ;; To match the folder created by Nix build of JSBundle.
:output-dir "result" :output-dir "result"
:init-fn status-im.core/init :init-fn status-im.core/init
:build-hooks [(status-im.setup.build-hooks.worklets/transform-output)
(status-im.setup.build-hooks.worklets/optimize-start)
(status-im.setup.build-hooks.worklets/optimize-output)]
;; When false, the Shadow-CLJS watcher won't automatically refresh ;; When false, the Shadow-CLJS watcher won't automatically refresh
;; the target files (a.k.a hot reload). When false, you can manually ;; the target files (a.k.a hot reload). When false, you can manually
;; reload by calling `shadow.cljs.devtools.api/watch-compile-all!`. ;; reload by calling `shadow.cljs.devtools.api/watch-compile-all!`.
@@ -66,17 +63,10 @@
{status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN" {status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN"
status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN" status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN"
status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY" status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY"
status-im.config/RARIBLE_MAINNET_API_KEY #shadow/env "RARIBLE_MAINNET_API_KEY"
status-im.config/RARIBLE_TESTNET_API_KEY #shadow/env "RARIBLE_TESTNET_API_KEY"
status-im.config/ALCHEMY_ETHEREUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ETHEREUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ETHEREUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ETHEREUM_GOERLI_TOKEN"
status-im.config/ALCHEMY_ETHEREUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ETHEREUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ARBITRUM_GOERLI_TOKEN" status-im.config/ALCHEMY_ARBITRUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ARBITRUM_GOERLI_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ARBITRUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_GOERLI_TOKEN" status-im.config/ALCHEMY_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_GOERLI_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"} status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"}
:compiler-options {:output-feature-set :es5 :compiler-options {:output-feature-set :es5
;; We disable `:fn-deprecated` warnings because we ;; We disable `:fn-deprecated` warnings because we
;; are managing deprecation via clj-kondo and we ;; are managing deprecation via clj-kondo and we
@@ -100,17 +90,10 @@
{status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN" {status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN"
status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN" status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN"
status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY" status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY"
status-im.config/RARIBLE_MAINNET_API_KEY #shadow/env "RARIBLE_MAINNET_API_KEY"
status-im.config/RARIBLE_TESTNET_API_KEY #shadow/env "RARIBLE_TESTNET_API_KEY"
status-im.config/ALCHEMY_ETHEREUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ETHEREUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ETHEREUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ETHEREUM_GOERLI_TOKEN"
status-im.config/ALCHEMY_ETHEREUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ETHEREUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ARBITRUM_GOERLI_TOKEN" status-im.config/ALCHEMY_ARBITRUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ARBITRUM_GOERLI_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ARBITRUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_GOERLI_TOKEN" status-im.config/ALCHEMY_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_GOERLI_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"} status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"}
:compiler-options {:output-feature-set :es6 :compiler-options {:output-feature-set :es6
;;disable for android build as there ;;disable for android build as there
;;is an intermittent warning with deftype ;;is an intermittent warning with deftype
@@ -140,17 +123,10 @@
status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN" status-im.config/POKT_TOKEN #shadow/env "POKT_TOKEN"
status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN" status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN"
status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY" status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY"
status-im.config/RARIBLE_MAINNET_API_KEY #shadow/env "RARIBLE_MAINNET_API_KEY"
status-im.config/RARIBLE_TESTNET_API_KEY #shadow/env "RARIBLE_TESTNET_API_KEY"
status-im.config/ALCHEMY_ETHEREUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ETHEREUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ETHEREUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ETHEREUM_GOERLI_TOKEN"
status-im.config/ALCHEMY_ETHEREUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ETHEREUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ARBITRUM_GOERLI_TOKEN" status-im.config/ALCHEMY_ARBITRUM_GOERLI_TOKEN #shadow/env "ALCHEMY_ARBITRUM_GOERLI_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_ARBITRUM_SEPOLIA_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_GOERLI_TOKEN" status-im.config/ALCHEMY_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_GOERLI_TOKEN"
status-im.config/ALCHEMY_OPTIMISM_SEPOLIA_TOKEN #shadow/env "ALCHEMY_OPTIMISM_SEPOLIA_TOKEN"} status-im.config/ALCHEMY_OPTIMISM_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_TOKEN"}
:compiler-options :compiler-options
{;; needed because we override require and it {;; needed because we override require and it
;; messes with source-map which reports callstack ;; messes with source-map which reports callstack
@@ -179,6 +155,7 @@
;; option setupFilesAfterEnv. ;; option setupFilesAfterEnv.
test-helpers.component-tests-preload test-helpers.component-tests-preload
status-im.setup.schema-preload status-im.setup.schema-preload
quo.core-spec quo.core-spec
status-im.core-spec] status-im.core-spec]
:ns-regexp "component-spec$" :ns-regexp "component-spec$"
@@ -44,37 +44,22 @@
[categ] [categ]
(reduce-kv #(assoc %1 (name %2) %3) {} categ)) (reduce-kv #(assoc %1 (name %2) %3) {} categ))
(defn role-permission?
[token-permission]
(contains? constants/community-role-permissions (:type token-permission)))
(defn membership-permission?
[token-permission]
(= (:type token-permission) constants/community-token-permission-become-member))
(defn <-rpc (defn <-rpc
[c] [c]
(-> c (-> c
(set/rename-keys (set/rename-keys {:canRequestAccess :can-request-access?
{:canRequestAccess :can-request-access? :canManageUsers :can-manage-users?
:canManageUsers :can-manage-users? :canDeleteMessageForEveryone :can-delete-message-for-everyone?
:canDeleteMessageForEveryone :can-delete-message-for-everyone? :canJoin :can-join?
;; This flag is misleading based on its name alone :requestedToJoinAt :requested-to-join-at
;; because it should not be used to decide if the user :isMember :is-member?
;; is *allowed* to join. Allowance is based on token :adminSettings :admin-settings
;; permissions. Still, the flag can be used to know :tokenPermissions :token-permissions
;; whether or not the user will have to wait until an :communityTokensMetadata :tokens-metadata
;; admin approves a join request. :introMessage :intro-message
:canJoin :can-join? :muteTill :muted-till
:requestedToJoinAt :requested-to-join-at :lastOpenedAt :last-opened-at
:isMember :is-member? :joinedAt :joined-at})
:adminSettings :admin-settings
:tokenPermissions :token-permissions
:communityTokensMetadata :tokens-metadata
:introMessage :intro-message
:muteTill :muted-till
:lastOpenedAt :last-opened-at
:joinedAt :joined-at})
(update :admin-settings (update :admin-settings
set/rename-keys set/rename-keys
{:pinMessageAllMembersEnabled :pin-message-all-members-enabled?}) {:pinMessageAllMembersEnabled :pin-message-all-members-enabled?})
@@ -82,16 +67,9 @@
(update :chats <-chats-rpc) (update :chats <-chats-rpc)
(update :token-permissions seq) (update :token-permissions seq)
(update :categories <-categories-rpc) (update :categories <-categories-rpc)
(assoc :role-permissions?
(->> c
:tokenPermissions
vals
(some role-permission?)))
(assoc :membership-permissions? (assoc :membership-permissions?
(->> c (some #(= (:type %) constants/community-token-permission-become-member)
:tokenPermissions (vals (:tokenPermissions c))))
vals
(some membership-permission?)))
(assoc :token-images (assoc :token-images
(reduce (fn [acc {sym :symbol image :image}] (reduce (fn [acc {sym :symbol image :image}]
(assoc acc sym image)) (assoc acc sym image))
@@ -0,0 +1,93 @@
(ns legacy.status-im.ethereum.subscriptions
(:require
[legacy.status-im.ethereum.transactions.core :as transactions]
[legacy.status-im.wallet.core :as wallet.core]
[legacy.status-im.wallet.db :as wallet]
[taoensso.timbre :as log]
[utils.ethereum.eip.eip55 :as eip55]
[utils.re-frame :as rf]))
(rf/defn new-transfers
[cofx block-number accounts]
(log/debug "[wallet-subs] new-transfers"
"accounts" accounts
"block" block-number)
(transactions/check-watched-transactions cofx))
(rf/defn recent-history-fetching-started
[{:keys [db]} accounts]
(log/debug "[wallet-subs] recent-history-fetching-started"
"accounts"
accounts)
(let [event (get db :wallet-legacy/on-recent-history-fetching)]
(cond-> {:db (-> db
(transactions/update-fetching-status accounts :recent? true)
(assoc :wallet-legacy/recent-history-fetching-started? true)
(dissoc :wallet-legacy/on-recent-history-fetching))}
event
(assoc :dispatch event))))
(rf/defn recent-history-fetching-ended
[{:keys [db]} {:keys [accounts blockNumber]}]
(log/debug "[wallet-subs] recent-history-fetching-ended"
"accounts" accounts
"block" blockNumber)
{:db (-> db
(assoc :ethereum/current-block blockNumber)
(update-in [:wallet-legacy :accounts]
wallet/remove-transactions-since-block
blockNumber)
(transactions/update-fetching-status accounts :recent? false)
(dissoc :wallet-legacy/waiting-for-recent-history?
:wallet-legacy/refreshing-history?
:wallet-legacy/fetching-error
:wallet-legacy/recent-history-fetching-started?))
:transactions/get-transfers
{:chain-tokens (:wallet-legacy/all-tokens db)
:addresses (reduce
(fn [v address]
(let [normalized-address
(eip55/address->checksum address)]
(if (contains? v normalized-address)
v
(conj v address))))
[]
accounts)
:before-block blockNumber
:limit 20}})
(rf/defn fetching-error
[{:keys [db] :as cofx} {:keys [message]}]
(rf/merge
cofx
{:db (assoc db :wallet-legacy/fetching-error message)}
(wallet.core/after-checking-history)))
(rf/defn non-archival-node-detected
[{:keys [db]} _]
{:db (assoc db :wallet-legacy/non-archival-node true)})
(rf/defn new-wallet-event
[cofx {:keys [type blockNumber accounts] :as event}]
(log/debug "[wallet-subs] new-wallet-event"
"event-type" type
"blockNumber" blockNumber
"accounts" accounts)
(case type
"new-transfers" (new-transfers cofx blockNumber accounts)
"recent-history-fetching" (recent-history-fetching-started cofx accounts)
"recent-history-ready" (recent-history-fetching-ended cofx event)
"fetching-history-error" (fetching-error cofx event)
"non-archival-node-detected" (non-archival-node-detected cofx event)
"pending-transaction-status-changed" {:fx
[[:dispatch
[:wallet/pending-transaction-status-changed-received
event]]]}
"wallet-owned-collectibles-filtering-done" {:fx [[:dispatch
[:wallet/owned-collectibles-filtering-done
event]]]}
"wallet-get-collectibles-details-done" {:fx [[:dispatch
[:wallet/get-collectible-details-done
event]]]}
"wallet-tick-reload" {:fx [[:dispatch [:wallet/reload]]]}
(log/debug ::unknown-wallet-event :type type :event event)))
+1
View File
@@ -8,6 +8,7 @@
legacy.status-im.chat.models.loading legacy.status-im.chat.models.loading
legacy.status-im.contact.block legacy.status-im.contact.block
legacy.status-im.currency.core legacy.status-im.currency.core
legacy.status-im.ethereum.subscriptions
legacy.status-im.fleet.core legacy.status-im.fleet.core
[legacy.status-im.keycard.core :as keycard] [legacy.status-im.keycard.core :as keycard]
legacy.status-im.log-level.core legacy.status-im.log-level.core
@@ -19,8 +19,7 @@
transactions-management-enabled? transactions-management-enabled?
current-fleet current-fleet
webview-debug webview-debug
test-networks-enabled? test-networks-enabled?]}]
is-sepolia-enabled?]}]
(keep (keep
identity identity
[{:size :small [{:size :small
@@ -111,14 +110,6 @@
#(re-frame/dispatch [:profile.settings/toggle-test-networks]) #(re-frame/dispatch [:profile.settings/toggle-test-networks])
:accessory :switch :accessory :switch
:active test-networks-enabled?} :active test-networks-enabled?}
{:size :small
:title "Enable Sepolia as test network"
:accessibility-label :enable-sepolia-as-test-network
:container-margin-bottom 8
:on-press
#(re-frame/dispatch [:profile.settings/toggle-sepolia-test-network])
:accessory :switch
:active is-sepolia-enabled?}
{:size :small {:size :small
:title (i18n/label :t/set-currency) :title (i18n/label :t/set-currency)
:accessibility-label :wallet-change-currency :accessibility-label :wallet-change-currency
@@ -139,7 +130,6 @@
(views/defview advanced-settings (views/defview advanced-settings
[] []
(views/letsubs [test-networks-enabled? [:profile/test-networks-enabled?] (views/letsubs [test-networks-enabled? [:profile/test-networks-enabled?]
is-sepolia-enabled? [:profile/is-sepolia-enabled?]
light-client-enabled? [:profile/light-client-enabled?] light-client-enabled? [:profile/light-client-enabled?]
webview-debug [:profile/webview-debug] webview-debug [:profile/webview-debug]
network-name [:network-name] network-name [:network-name]
@@ -155,7 +145,6 @@
:current-fleet current-fleet :current-fleet current-fleet
:dev-mode? false :dev-mode? false
:webview-debug webview-debug :webview-debug webview-debug
:test-networks-enabled? test-networks-enabled? :test-networks-enabled? test-networks-enabled?})
:is-sepolia-enabled? is-sepolia-enabled?})
:key-fn (fn [_ i] (str i)) :key-fn (fn [_ i] (str i))
:render-fn render-item}])) :render-fn render-item}]))
@@ -63,6 +63,6 @@
[quo/button [quo/button
{:theme :positive {:theme :positive
:style {:margin-horizontal 8} :style {:margin-horizontal 8}
:on-press #(debounce/throttle-and-dispatch [::network/connect-network-pressed target-network-id] :on-press #(debounce/dispatch-and-chill [::network/connect-network-pressed target-network-id]
1000)} 1000)}
(i18n/label :t/allow)]]]])) (i18n/label :t/allow)]]]]))
@@ -84,7 +84,7 @@
(zero? (count selected))) (zero? (count selected)))
:accessibility-label :share-community-link :accessibility-label :share-community-link
:type :secondary :type :secondary
:on-press #(debounce/throttle-and-dispatch :on-press #(debounce/dispatch-and-chill
[(if can-invite? [(if can-invite?
::communities/invite-people-confirmation-pressed ::communities/invite-people-confirmation-pressed
::communities/share-community-confirmation-pressed) @user-pk ::communities/share-community-confirmation-pressed) @user-pk
@@ -111,7 +111,7 @@
(:available :connected :connected-with-different-key :owned) (:available :connected :connected-with-different-key :owned)
[react/touchable-highlight [react/touchable-highlight
{:on-press #(debounce/throttle-and-dispatch [::ens/input-submitted] 3000)} {:on-press #(debounce/dispatch-and-chill [::ens/input-submitted] 3000)}
[icon-wrapper colors/blue [icon-wrapper colors/blue
[icons/icon :main-icons/arrow-right {:color colors/white-persist}]]] [icons/icon :main-icons/arrow-right {:color colors/white-persist}]]]
@@ -365,9 +365,8 @@
:right [react/view {:padding-horizontal 8} :right [react/view {:padding-horizontal 8}
[quo/button [quo/button
{:disabled (or (not @checked?) (not sufficient-funds?)) {:disabled (or (not @checked?) (not sufficient-funds?))
:on-press #(debounce/throttle-and-dispatch [::ens/register-name-pressed :on-press #(debounce/dispatch-and-chill [::ens/register-name-pressed address]
address] 2000)}
2000)}
(if sufficient-funds? (if sufficient-funds?
(i18n/label :t/ens-register) (i18n/label :t/ens-register)
(i18n/label :t/not-enough-snt))]]}]])))) (i18n/label :t/not-enough-snt))]]}]]))))
@@ -139,9 +139,9 @@
{:type :secondary {:type :secondary
:accessibility-label :create-group-chat-button :accessibility-label :create-group-chat-button
:disabled group-name-empty? :disabled group-name-empty?
:on-press #(debounce/throttle-and-dispatch [:group-chats.ui/create-pressed :on-press #(debounce/dispatch-and-chill [:group-chats.ui/create-pressed
group-name] group-name]
300)} 300)}
(i18n/label :t/create-group-chat)]}]]]))) (i18n/label :t/create-group-chat)]}]]])))
(defn searchable-contact-list (defn searchable-contact-list
@@ -6,7 +6,7 @@
[legacy.status-im.ui.screens.network.styles :as st] [legacy.status-im.ui.screens.network.styles :as st]
[legacy.status-im.ui.screens.network.views :as network-settings] [legacy.status-im.ui.screens.network.views :as network-settings]
[re-frame.core :as re-frame] [re-frame.core :as re-frame]
[utils.debounce :refer [throttle-and-dispatch]] [utils.debounce :refer [dispatch-and-chill]]
[utils.i18n :as i18n]) [utils.i18n :as i18n])
(:require-macros [legacy.status-im.utils.views :as views])) (:require-macros [legacy.status-im.utils.views :as views]))
@@ -25,7 +25,7 @@
:connected? connected?}] :connected? connected?}]
(when-not connected? (when-not connected?
[react/touchable-highlight [react/touchable-highlight
{:on-press #(throttle-and-dispatch [::network/connect-network-pressed id] 1000)} {:on-press #(dispatch-and-chill [::network/connect-network-pressed id] 1000)}
[react/view st/connect-button-container [react/view st/connect-button-container
[react/view [react/view
{:style st/connect-button {:style st/connect-button
@@ -109,7 +109,7 @@
(defn hide-sheet-and-dispatch-old (defn hide-sheet-and-dispatch-old
[event] [event]
(re-frame/dispatch [:bottom-sheet/hide-old]) (re-frame/dispatch [:bottom-sheet/hide-old])
(debounce/throttle-and-dispatch event 2000)) (debounce/dispatch-and-chill event 2000))
(defn invitation-sheet (defn invitation-sheet
[{:keys [id]} contact] [{:keys [id]} contact]
@@ -4,19 +4,14 @@
(def backgrounds #{:photo :blur}) (def backgrounds #{:photo :blur})
;; Note: We hardcode the :light theme for the background-color and apply an overlay when necessary, such (defn custom-color-type
;; as for dark themes and pressed states. This approach is taken because, for communities, we only have
;; one color available, which is the light theme version.
;; For more information, see the related issue: https://github.com/status-im/status-mobile/issues/16396
(defn- custom-color-type
[customization-color icon-only?] [customization-color icon-only?]
{:icon-color colors/white-opa-70 {:icon-color colors/white-opa-70
:label-color colors/white :label-color colors/white
:background-color (colors/resolve-color customization-color :light) :background-color (colors/custom-color customization-color 50)
:border-radius (when icon-only? 24) :border-radius (when icon-only? 24)})
:overlay-customization-color customization-color})
(defn- grey-photo (defn grey-photo
[theme pressed?] [theme pressed?]
{:icon-color (colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-70 theme) {:icon-color (colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-70 theme)
:label-color (colors/theme-colors colors/neutral-100 colors/white theme) :label-color (colors/theme-colors colors/neutral-100 colors/white theme)
@@ -29,7 +24,7 @@
theme)) theme))
:blur-type (if (= theme :light) :light :dark)}) :blur-type (if (= theme :light) :light :dark)})
(defn- grey-blur (defn grey-blur
[theme pressed?] [theme pressed?]
{:icon-color (colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-70 theme) {:icon-color (colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-70 theme)
:label-color (colors/theme-colors colors/neutral-100 colors/white theme) :label-color (colors/theme-colors colors/neutral-100 colors/white theme)
@@ -37,7 +32,7 @@
(colors/theme-colors colors/neutral-80-opa-10 colors/white-opa-10 theme) (colors/theme-colors colors/neutral-80-opa-10 colors/white-opa-10 theme)
(colors/theme-colors colors/neutral-80-opa-5 colors/white-opa-5 theme))}) (colors/theme-colors colors/neutral-80-opa-5 colors/white-opa-5 theme))})
(defn- outline-blur (defn outline-blur
[theme pressed?] [theme pressed?]
{:icon-color (colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-40 theme) {:icon-color (colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-40 theme)
:label-color (colors/theme-colors colors/neutral-100 colors/white theme) :label-color (colors/theme-colors colors/neutral-100 colors/white theme)
@@ -45,7 +40,7 @@
(colors/theme-colors colors/neutral-80-opa-20 colors/white-opa-20 theme) (colors/theme-colors colors/neutral-80-opa-20 colors/white-opa-20 theme)
(colors/theme-colors colors/neutral-80-opa-10 colors/white-opa-10 theme))}) (colors/theme-colors colors/neutral-80-opa-10 colors/white-opa-10 theme))})
(defn- grey (defn grey
[theme pressed?] [theme pressed?]
{:icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme) {:icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
:label-color (colors/theme-colors colors/neutral-100 colors/white theme) :label-color (colors/theme-colors colors/neutral-100 colors/white theme)
@@ -55,7 +50,7 @@
colors/neutral-90 colors/neutral-90
theme))}) theme))})
(defn- dark-grey (defn dark-grey
[theme pressed?] [theme pressed?]
{:icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme) {:icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
:label-color (colors/theme-colors colors/neutral-100 colors/white theme) :label-color (colors/theme-colors colors/neutral-100 colors/white theme)
@@ -63,7 +58,7 @@
(colors/theme-colors colors/neutral-30 colors/neutral-60 theme) (colors/theme-colors colors/neutral-30 colors/neutral-60 theme)
(colors/theme-colors colors/neutral-20 colors/neutral-90 theme))}) (colors/theme-colors colors/neutral-20 colors/neutral-90 theme))})
(defn- outline (defn outline
[theme pressed?] [theme pressed?]
{:icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme) {:icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
:label-color (colors/theme-colors colors/neutral-100 colors/white theme) :label-color (colors/theme-colors colors/neutral-100 colors/white theme)
@@ -71,32 +66,29 @@
(colors/theme-colors colors/neutral-40 colors/neutral-60 theme) (colors/theme-colors colors/neutral-40 colors/neutral-60 theme)
(colors/theme-colors colors/neutral-30 colors/neutral-70 theme))}) (colors/theme-colors colors/neutral-30 colors/neutral-70 theme))})
(defn- ghost (defn ghost
[theme pressed?] [theme pressed?]
{:icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme) {:icon-color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
:label-color (colors/theme-colors colors/neutral-100 colors/white theme) :label-color (colors/theme-colors colors/neutral-100 colors/white theme)
:background-color (when pressed? :background-color (when pressed?
(colors/theme-colors colors/neutral-10 colors/neutral-80 theme))}) (colors/theme-colors colors/neutral-10 colors/neutral-80 theme))})
(defn- black (defn black
[pressed?] [pressed?]
{:label-color colors/white {:label-color colors/white
:background-color (if pressed? colors/neutral-80 colors/neutral-95)}) :background-color (if pressed? colors/neutral-80 colors/neutral-95)})
(defn get-values (defn get-values
[{:keys [customization-color theme type background pressed? icon-only?]}] [{:keys [customization-color theme type background pressed? icon-only?]}]
(let [customization-color (get {:primary customization-color (cond
:positive :success (= type :primary) (custom-color-type customization-color icon-only?)
:danger :danger} (= type :positive) (custom-color-type customization-color icon-only?)
type)] (= type :danger) (custom-color-type customization-color icon-only?)
(cond (and (= :photo background) (= type :grey)) (grey-photo theme pressed?)
(contains? #{:primary :positive :danger} type) (custom-color-type customization-color (and (= :blur background) (= type :grey)) (grey-blur theme pressed?)
icon-only?) (and (= :blur background) (= type :outline)) (outline-blur theme pressed?)
(and (= :photo background) (= type :grey)) (grey-photo theme pressed?) (= type :grey) (grey theme pressed?)
(and (= :blur background) (= type :grey)) (grey-blur theme pressed?) (= type :dark-grey) (dark-grey theme pressed?)
(and (= :blur background) (= type :outline)) (outline-blur theme pressed?) (= type :outline) (outline theme pressed?)
(= type :grey) (grey theme pressed?) (= type :ghost) (ghost theme pressed?)
(= type :dark-grey) (dark-grey theme pressed?) (= type :black) (black pressed?)))
(= type :outline) (outline theme pressed?)
(= type :ghost) (ghost theme pressed?)
(= type :black) (black pressed?))))
+18 -16
View File
@@ -34,13 +34,16 @@
(fn (fn
[{:keys [on-press on-long-press disabled? type background size icon-left icon-right icon-top [{:keys [on-press on-long-press disabled? type background size icon-left icon-right icon-top
customization-color theme accessibility-label icon-only? container-style inner-style customization-color theme accessibility-label icon-only? container-style inner-style
pressed? on-press-in on-press-out allow-multiple-presses?] pressed? on-press-in on-press-out]
:or {type :primary :or {type :primary
size 40 size 40
customization-color (if (= type :primary) :blue nil)}} customization-color (cond (= type :primary) :blue
(= type :positive) :success
(= type :danger) :danger
:else nil)}}
children] children]
(let [{:keys [icon-color background-color label-color border-color blur-type (let [{:keys [icon-color background-color label-color border-color blur-type
blur-overlay-color border-radius overlay-customization-color]} blur-overlay-color border-radius]}
(button-properties/get-values {:customization-color customization-color (button-properties/get-values {:customization-color customization-color
:background background :background background
:type type :type type
@@ -49,17 +52,16 @@
:icon-only? icon-only?}) :icon-only? icon-only?})
icon-size (when (= 24 size) 12)] icon-size (when (= 24 size) 12)]
[rn/touchable-without-feedback [rn/touchable-without-feedback
{:disabled disabled? {:disabled disabled?
:accessibility-label accessibility-label :accessibility-label accessibility-label
:on-press-in (fn [] :on-press-in (fn []
(reset! pressed-state? true) (reset! pressed-state? true)
(when on-press-in (on-press-in))) (when on-press-in (on-press-in)))
:on-press-out (fn [] :on-press-out (fn []
(reset! pressed-state? nil) (reset! pressed-state? nil)
(when on-press-out (on-press-out))) (when on-press-out (on-press-out)))
:on-press on-press :on-press on-press
:allow-multiple-presses? allow-multiple-presses? :on-long-press on-long-press}
:on-long-press on-long-press}
[rn/view [rn/view
{:style (merge {:style (merge
(style/shape-style-container size border-radius) (style/shape-style-container size border-radius)
@@ -76,9 +78,9 @@
:icon-left icon-left :icon-left icon-left
:icon-right icon-right}) :icon-right icon-right})
inner-style)} inner-style)}
(when overlay-customization-color (when customization-color
[customization-colors/overlay [customization-colors/overlay
{:customization-color overlay-customization-color {:customization-color customization-color
:theme theme :theme theme
:pressed? (if pressed? pressed? @pressed-state?)}]) :pressed? (if pressed? pressed? @pressed-state?)}])
(when (= background :photo) (when (= background :photo)
@@ -15,12 +15,11 @@
[rn/view [rn/view
{:style style/container} {:style style/container}
[button/button [button/button
{:icon true {:icon true
:type :outline :type :outline
:accessibility-label :previous-month-button :accessibility-label :previous-month-button
:allow-multiple-presses? true :size 24
:size 24 :on-press #(on-change (utils/previous-month year month))}
:on-press #(on-change (utils/previous-month year month))}
:i/chevron-left] :i/chevron-left]
[text/text [text/text
{:weight :semi-bold {:weight :semi-bold
@@ -28,12 +27,11 @@
:style (style/text theme)} :style (style/text theme)}
(utils/format-month-year year month)] (utils/format-month-year year month)]
[button/button [button/button
{:icon true {:icon true
:accessibility-label :next-month-button :accessibility-label :next-month-button
:allow-multiple-presses? true :size 24
:size 24 :type :outline
:type :outline :on-press #(on-change (utils/next-month year month))}
:on-press #(on-change (utils/next-month year month))}
:i/chevron-right]])) :i/chevron-right]]))
(def view (theme/with-theme view-internal)) (def view (theme/with-theme view-internal))
+3 -4
View File
@@ -31,10 +31,9 @@
theme))] theme))]
[rn/pressable [rn/pressable
{:style (style/color-button hex-color selected? idx window-width) {:style (style/color-button hex-color selected? idx window-width)
:accessibility-label :color-picker-item :accessibility-label :color-picker-item
:allow-multiple-presses? true :on-press #(on-press color)}
:on-press #(on-press color)}
(if (and (= :feng-shui color) (not selected?)) (if (and (= :feng-shui color) (not selected?))
[feng-shui [feng-shui
(assoc props (assoc props
@@ -35,7 +35,7 @@
(when (and @ref (>= index 0)) (when (and @ref (>= index 0))
(some-> ^js @ref (some-> ^js @ref
(.scrollToIndex #js (.scrollToIndex #js
{:animated false {:animated true
:index index :index index
:viewPosition 0.5}))))) :viewPosition 0.5})))))
50))) 50)))
@@ -1,34 +0,0 @@
(ns quo.components.counter.collectible-counter.component-spec
(:require
[quo.components.counter.collectible-counter.view :as collectible-counter]
[test-helpers.component :as h]))
(defn render
[component]
(h/render-with-theme-provider component :dark))
(h/describe "collectible counter component"
(h/test "default render of component"
(render [collectible-counter/view {}])
(-> (h/expect (h/get-by-label-text :collectible-counter))
(h/is-truthy)))
(h/test "render with a string value"
(render [collectible-counter/view {:value "x500"}])
(-> (h/expect (h/get-by-text "x500"))
(h/is-truthy)))
(h/test "render with an integer value and default status"
(render [collectible-counter/view
{:value 100
:status :default}])
(-> (h/expect (h/get-by-text "100"))
(h/is-truthy)))
(h/test "render with all availiable props"
(render [collectible-counter/view
{:value "x100"
:status :error
:size :size-24}])
(-> (h/expect (h/get-by-text "x100"))
(h/is-truthy))))
@@ -1,57 +0,0 @@
(ns quo.components.counter.collectible-counter.style
(:require
[quo.foundations.colors :as colors]))
(defn- get-background-color
[{:keys [status theme]}]
(case status
:default (colors/theme-colors colors/white-opa-70 colors/neutral-95-opa-70 theme)
:error (colors/resolve-color :danger theme 10)
(colors/theme-colors colors/white-opa-70 colors/neutral-95-opa-70 theme)))
(defn- get-container-border-styles
[{:keys [status theme]}]
(when (= status :error)
{:border-color (colors/resolve-color :danger theme 20)
:border-width 1}))
(defn- get-container-styles-by-size
[{:keys [size]}]
(let [style-size-24 {:height 24
:padding-vertical 3
:padding-horizontal 8}
style-size-32 {:height 32
:padding-vertical 5
:padding-horizontal 12}]
(case size
:size-32 style-size-32
:size-24 style-size-24
style-size-32)))
(defn container
[props]
(merge {:align-self :flex-start
:flex-direcrion :row
:justify-content :center
:border-radius 999
:background-color (get-background-color props)}
(get-container-border-styles props)
(get-container-styles-by-size props)))
(defn- get-text-color
[{:keys [status theme]}]
(case status
:default (colors/theme-colors colors/neutral-100 colors/white theme)
:error (colors/resolve-color :danger theme)
(colors/theme-colors colors/neutral-100 colors/white theme)))
(defn get-text-size
[{:keys [size]}]
(case size
:size-32 :paragraph-1
:size-24 :paragraph-2
:paragraph-1))
(defn text
[props]
{:color (get-text-color props)})
@@ -1,39 +0,0 @@
(ns quo.components.counter.collectible-counter.view
(:require
[quo.components.counter.collectible-counter.style :as style]
[quo.components.markdown.text :as text]
[quo.theme]
[react-native.core :as rn]
[schema.core :as schema]))
(def ?schema
[:=>
[:catn
[:props
[:map {:closed true}
[:value {:optional true} [:maybe [:or :string :int]]]
[:status {:optional true} [:maybe :keyword]]
[:size {:optional true} [:maybe [:enum :size-32 :size-24]]]
[:accessibility-label {:optional true} [:maybe :keyword]]
[:theme :schema.common/theme]]]]
:any])
(defn- view-internal
[{:keys [value accessibility-label]
:as props}]
(let [default-props {:status :default
:size :size-32}
props (merge default-props props)]
[rn/view
{:accessible true
:accessibility-label (or accessibility-label :collectible-counter)
:style (style/container props)}
[text/text
{:weight :medium
:size (style/get-text-size props)
:style (style/text props)}
value]]))
(def view
(quo.theme/with-theme
(schema/instrument #'view-internal ?schema)))
@@ -3,11 +3,9 @@
[quo.foundations.colors :as colors])) [quo.foundations.colors :as colors]))
(defn divider (defn divider
[theme blur?] [theme]
{:border-top-width 1 {:border-top-width 1
:border-top-color (if blur? :border-top-color (colors/theme-colors colors/neutral-10 colors/neutral-90 theme)
colors/white-opa-5
(colors/theme-colors colors/neutral-10 colors/neutral-90 theme))
:margin-top 8 :margin-top 8
:margin-bottom 7 :margin-bottom 7
:align-items :center :align-items :center
@@ -14,9 +14,9 @@
(colors/theme-colors colors/neutral-50 colors/neutral-40 theme))) (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)))
(defn- divider (defn- divider
[theme blur?] [theme]
[rn/view [rn/view
{:style (style/divider theme blur?) {:style (style/divider theme)
:accessible true :accessible true
:accessibility-label :divider}]) :accessibility-label :divider}])
@@ -45,7 +45,7 @@
blur?]}] blur?]}]
[:<> [:<>
(when add-divider? (when add-divider?
[divider theme blur?]) [divider theme])
[maybe-pressable disabled? [maybe-pressable disabled?
{:accessibility-label accessibility-label {:accessibility-label accessibility-label
:style (style/container {:sub-label sub-label :style (style/container {:sub-label sub-label
@@ -3,60 +3,34 @@
[quo.components.drawers.bottom-actions.view :as bottom-actions] [quo.components.drawers.bottom-actions.view :as bottom-actions]
[test-helpers.component :as h])) [test-helpers.component :as h]))
(defn- render
[component]
(h/render-with-theme-provider component :light))
(h/describe "bottom actions tests" (h/describe "bottom actions tests"
(h/test "default render with no description and single action button" (h/test "default render with no description and single action button"
(render [bottom-actions/view {:actions :one-action :button-one-label "Request to join"}]) (h/render [bottom-actions/view {:button-one-label "Request to join"}])
(h/is-truthy (h/get-by-text "Request to join"))) (h/is-truthy (h/get-by-text "Request to join")))
(h/test "render with description & 1 action" (h/test "render with description"
(render [bottom-actions/view (h/render [bottom-actions/view {:description "Sample description"}])
{:description :bottom (h/is-truthy (h/get-by-text "Sample description")))
:description-text "Sample description"
:actions :one-action
:button-one-label "Request to join"}])
(h/is-truthy (h/get-by-text "Sample description"))
(h/is-truthy (h/get-by-text "Request to join")))
(h/test "render with 2 actions" (h/test "render with 2 actions"
(let [button-one "Button One" (let [button-one "Button One"
button-two "Button Two"] button-two "Button Two"]
(render [bottom-actions/view (h/render [bottom-actions/view
{:actions :two-actions {:actions :2-actions
:button-one-label button-one :button-one-label button-one
:button-one-props {:icon-left :i/arrow-left} :button-one-props {:icon-left :i/arrow-left}
:button-two-label button-two}]) :button-two-label button-two}])
(h/is-truthy (h/get-by-text button-one)) (h/is-truthy (h/get-by-text button-one))
(h/is-truthy (h/get-by-label-text :icon)) (h/is-truthy (h/get-by-label-text :icon))
(h/is-truthy (h/get-by-text button-two)))) (h/is-truthy (h/get-by-text button-two))))
(h/test "render disabled button" (h/test "render disabled button"
(render [bottom-actions/view (h/render [bottom-actions/view
{:description :bottom {:description "Sample description"
:actions :one-action :button-one-props {:disabled? true}
:description-text "Sample description" :button-one-label "button"}])
:button-one-props {:disabled? true}
:button-one-label "button"}])
(h/is-disabled (h/get-by-label-text :button-one))) (h/is-disabled (h/get-by-label-text :button-one)))
(h/test "render with error & 1 action" (h/test "sane defaults"
(render [bottom-actions/view (h/render [bottom-actions/view {}])
{:description :top-error (h/is-truthy (h/get-by-label-text :button-one))))
:error-message "Sample error"
:actions :one-action
:button-one-label "Request to join"}])
(h/is-truthy (h/get-by-text "Sample error"))
(h/is-truthy (h/get-by-text "Request to join")))
(h/test "render with top description & 1 action"
(render [bottom-actions/view
{:description :top
:role :admin
:actions :one-action
:button-one-label "Request to join"}])
(h/is-truthy (h/get-by-text "Eligible to join as"))
(h/is-truthy (h/get-by-text "Admin"))
(h/is-truthy (h/get-by-text "Request to join"))))
@@ -2,58 +2,34 @@
(:require (:require
[quo.foundations.colors :as colors])) [quo.foundations.colors :as colors]))
(defn- text-color
[scroll? blur? theme]
(cond
scroll? (if blur?
colors/white-70-blur
(colors/theme-colors colors/neutral-80-opa-70
colors/white-opa-70
theme))
blur? colors/white-opa-40
:else (colors/theme-colors colors/neutral-50
colors/neutral-40
theme)))
(defn container
[scroll? blur? theme]
{:background-color (when-not (or scroll? blur?)
(colors/theme-colors colors/white colors/neutral-95 theme))})
(def buttons-container (def buttons-container
{:flex-direction :row {:flex-direction :row
:justify-content :space-around :justify-content :space-around
:padding-vertical 12 :padding-vertical 12
:gap 12
:padding-horizontal 20}) :padding-horizontal 20})
(def button-container (def button-container
{:flex 1}) {:flex 1})
(def description-top (def button-container-2-actions
{:flex-direction :row (assoc button-container :margin-right 12))
:align-items :center
:gap 5
:padding-top 12
:padding-bottom 4
:justify-content :center})
(defn description-top-text (defn description
[scroll? blur? theme] [theme scroll?]
{:color (text-color scroll? blur? theme)}) {:color (colors/theme-colors
(if scroll?
(defn description-bottom (colors/custom-color colors/neutral-80 70)
[scroll? blur? theme] colors/neutral-50)
{:color (text-color scroll? blur? theme) (if scroll?
colors/white-opa-70
colors/neutral-40)
theme)
:text-align :center :text-align :center
:padding-bottom 12
:padding-horizontal 40}) :padding-horizontal 40})
(def error-message (def scroll
{:flex-direction :row {:margin-top 21
:gap 4 :margin-horizontal 120
:justify-content :center :margin-bottom 8
:align-items :center :width 134
:padding-top 15 :height 5})
:padding-horizontal 20
:padding-bottom 7})
@@ -2,96 +2,55 @@
(:require (:require
[quo.components.buttons.button.view :as button] [quo.components.buttons.button.view :as button]
[quo.components.drawers.bottom-actions.style :as style] [quo.components.drawers.bottom-actions.style :as style]
[quo.components.icon :as icon]
[quo.components.markdown.text :as text] [quo.components.markdown.text :as text]
[quo.components.tags.context-tag.view :as context-tag]
[quo.foundations.colors :as colors]
[quo.theme :as quo.theme] [quo.theme :as quo.theme]
[react-native.core :as rn] [react-native.core :as rn]))
[schema.core :as schema]
[utils.i18n :as i18n]))
(def ?schema (def default-props
[:=> {:button-one-type :primary
[:catn :button-two-type :grey
[:props :customization-color :blue})
[:map {:closed true}
[:actions [:maybe [:enum :one-action :two-actions]]]
[:description {:optional true} [:maybe [:enum :top :bottom :top-error]]]
[:description-text {:optional true} [:maybe :string]]
[:error-message {:optional true} [:maybe :string]]
[:role {:optional true} [:maybe [:enum :admin :member :token-master :owner]]]
[:button-one-label {:optional true} [:maybe :string]]
[:button-two-label {:optional true} [:maybe :string]]
[:button-one-props {:optional true} [:maybe :map]]
[:button-two-props {:optional true} [:maybe :map]]
[:theme :schema.common/theme]
[:scroll? {:optional true} [:maybe :boolean]]
[:blur? {:optional true} [:maybe :boolean]]
[:container-style {:optional true} [:maybe :map]]]]]
:any])
(def ^:private role-icon
{:admin :i/gavel
:member :i/members
:token-master :i/token-master
:owner :i/crown})
(defn- view-internal (defn- view-internal
[{:keys [actions description description-text error-message role button-one-label button-two-label "Options:
blur? button-one-props button-two-props theme scroll? container-style]}]
[rn/view
{:style (merge (style/container scroll? blur? theme) container-style)}
(when (= description :top-error)
[rn/view {:style style/error-message}
[icon/icon
:i/alert
{:color (colors/theme-colors colors/danger-50 colors/danger-60 theme)
:size 16}]
[text/text
{:size :paragraph-2
:style {:color (colors/theme-colors colors/danger-50 colors/danger-60 theme)}}
error-message]])
(when (= description :top) :actions - keyword (default nil) - :1-action/:2-actions
[rn/view :description - string (default nil) - Description to display below the title
{:style style/description-top} :button-one-label - string (default nil) - Label for the first button
[text/text :button-two-label - string (default nil) - Label for the second button
{:size :paragraph-2 :button-one-props - map with props for button one
:style (style/description-top-text scroll? blur? theme)} :button-two-props - map with props for button two
(i18n/label :t/eligible-to-join-as)] :theme - :light/:dark
[context-tag/view :scroll? - bool (default false) - Whether the iOS Home Indicator should be rendered"
{:type :icon [props]
:size 24 (let [{:keys [actions description button-one-label button-two-label
:icon (role role-icon) button-one-props button-two-props theme scroll? customization-color container-style]}
:blur? blur? (merge default-props props)]
:context (i18n/label (keyword "t" role))}]]) [rn/view {:style container-style}
[rn/view {:style style/buttons-container}
[rn/view {:style style/buttons-container} (when (= actions :2-actions)
(when (= actions :two-actions) [button/button
(merge
{:size 40
:background (when scroll? :blur)
:container-style style/button-container-2-actions
:theme theme
:accessibility-label :button-two}
button-two-props)
button-two-label])
[button/button [button/button
(merge (merge
{:size 40 {:size 40
:background (when (or blur? scroll?) :blur)
:container-style style/button-container :container-style style/button-container
:background (when scroll? :blur)
:theme theme :theme theme
:accessibility-label :button-two} :accessibility-label :button-one
button-two-props) :customization-color customization-color}
button-two-label]) button-one-props)
[button/button button-one-label]]
(merge (when description
{:size 40 [text/text
:container-style style/button-container {:size :paragraph-2
:background (when (or blur? scroll?) :blur) :style (style/description theme scroll?)} description])]))
:theme theme
:accessibility-label :button-one}
button-one-props)
button-one-label]]
(when (= description :bottom)
[text/text
{:size :paragraph-2
:style (style/description-bottom scroll? blur? theme)} description-text])])
(def view (def view (quo.theme/with-theme view-internal))
(quo.theme/with-theme
(schema/instrument #'view-internal ?schema)))
@@ -3,110 +3,97 @@
[quo.core :as quo] [quo.core :as quo]
[test-helpers.component :as h])) [test-helpers.component :as h]))
(def ^:private theme :light)
(h/describe "drawer top tests" (h/describe "drawer top tests"
(h/test "component renders in default type" (h/test "component renders in default type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:type :default}] :type :default}])
theme)
(h/is-truthy (h/get-by-text "Title"))) (h/is-truthy (h/get-by-text "Title")))
(h/test "component renders in default + description type" (h/test "component renders in default + description type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:type :default :type :default
:description "Description"}] :description "Description"}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(h/is-truthy (h/get-by-text "Description"))) (h/is-truthy (h/get-by-text "Description")))
(h/test "component renders in info type" (h/test "component renders in info type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:type :info}] :type :info}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(h/is-truthy (h/get-by-label-text :info-icon))) (h/is-truthy (h/get-by-label-text :info-icon)))
(h/test "component renders in info + description type" (h/test "component renders in info + description type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:description "Description" :description "Description"
:type :info}] :type :info}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(h/is-truthy (h/get-by-text "Description")) (h/is-truthy (h/get-by-text "Description"))
(h/is-truthy (h/get-by-label-text :info-icon))) (h/is-truthy (h/get-by-label-text :info-icon)))
(h/test "component renders in context-tag type" (h/test "component renders in context-tag type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:type :context-tag :type :context-tag
:community-name "Coinbase"}] :community-name "Coinbase"}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(h/is-truthy (h/get-by-label-text :context-tag-wrapper))) (h/is-truthy (h/get-by-label-text :context-tag-wrapper)))
(h/test "component renders in context-tag + button type" (h/test "component renders in context-tag + button type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:type :context-tag :type :context-tag
:button-icon :i/placeholder :button-icon :i/placeholder
:community-name "Coinbase"}] :community-name "Coinbase"}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(h/is-truthy (h/get-by-label-text :button-icon)) (h/is-truthy (h/get-by-label-text :button-icon))
(h/is-truthy (h/get-by-label-text :context-tag-wrapper))) (h/is-truthy (h/get-by-label-text :context-tag-wrapper)))
(h/test "component renders in account type" (h/test "component renders in account type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:type :account :type :account
:account-avatar-emoji "🍿" :account-avatar-emoji "🍿"
:networks [{:name :ethereum :short-name "eth"}] :networks [{:name :ethereum :short-name "eth"}]
:description "0x62b...0a5" :description "0x62b...0a5"
:customization-color :purple}] :customization-color :purple}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(h/is-truthy (h/get-by-text "0x62b...0a5")) (h/is-truthy (h/get-by-text "0x62b...0a5"))
(h/is-truthy (h/get-by-label-text :account-avatar))) (h/is-truthy (h/get-by-label-text :account-avatar)))
(h/test "component renders in keypair type when keycard? is false" (h/test "component renders in keypair type when keycard? is false"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:keycard? false :keycard? false
:icon-avatar :i/placeholder :icon-avatar :i/placeholder
:type :keypair}] :type :keypair}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(-> (h/expect (h/get-by-translation-text :t/on-device)) (-> (h/expect (h/get-by-translation-text :t/on-device))
(.toBeTruthy))) (.toBeTruthy)))
(h/test "component renders in keypair type when keycard? is true" (h/test "component renders in keypair type when keycard? is true"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:keycard? true :keycard? true
:icon-avatar :i/placeholder :icon-avatar :i/placeholder
:type :keypair}] :type :keypair}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(-> (h/expect (h/get-by-translation-text :t/on-keycard)) (-> (h/expect (h/get-by-translation-text :t/on-keycard))
(.toBeTruthy))) (.toBeTruthy)))
(h/test "component renders in default-keypair type" (h/test "component renders in default-keypair type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:title "Title" {:title "Title"
:description "0x62b...0a5" :description "0x62b...0a5"
:type :default-keypair}] :type :default-keypair}])
theme)
(h/is-truthy (h/get-by-text "Title")) (h/is-truthy (h/get-by-text "Title"))
(h/is-truthy (h/get-by-label-text :default-keypair-text))) (h/is-truthy (h/get-by-label-text :default-keypair-text)))
(h/test "component renders in label type" (h/test "component renders in label type"
(h/render-with-theme-provider [quo/drawer-top (h/render [quo/drawer-top
{:label "label" {:label "label"
:type :label}] :type :label}])
theme)
(h/is-truthy (h/get-by-text "label")))) (h/is-truthy (h/get-by-text "label"))))
@@ -182,7 +182,7 @@
(defn- view-internal (defn- view-internal
[{:keys [title title-icon type theme description blur? community-name community-logo button-icon [{:keys [title title-icon type theme description blur? community-name community-logo button-icon
account-name emoji context-tag-type account-name emoji
on-button-press on-button-press
on-button-long-press on-button-long-press
button-disabled? account-avatar-emoji account-avatar-type customization-color icon-avatar button-disabled? account-avatar-emoji account-avatar-type customization-color icon-avatar
@@ -214,7 +214,6 @@
:description description :description description
:community-name community-name :community-name community-name
:community-logo community-logo :community-logo community-logo
:context-tag-type context-tag-type
:customization-color customization-color :customization-color customization-color
:account-name account-name :account-name account-name
:emoji emoji}]] :emoji emoji}]]
@@ -6,21 +6,14 @@
[react-native.linear-gradient :as linear-gradient])) [react-native.linear-gradient :as linear-gradient]))
(defn- view-internal (defn- view-internal
[{:keys [customization-color opacity container-style height] [{:keys [customization-color opacity container-style height] :or {customization-color :blue}}]
:or {customization-color :blue}}] (let [color-top (colors/custom-color customization-color 50 20)
;; `when` added for safety, `linear-gradient` will break if `nil` is passed, color-bottom (colors/custom-color customization-color 50 0)]
;; the `:or` destructuring won't work because it's only applied when the [linear-gradient/linear-gradient
;; `:customization-color` key is non-existent. While deleting an account the key exists {:accessibility-label :gradient-cover
;; and has a `nil` value. :colors [color-top color-bottom]
(when customization-color :start {:x 0 :y 0}
(let [color-top (colors/resolve-color customization-color 50 20) :end {:x 0 :y 1}
color-bottom (colors/resolve-color customization-color 50 0)] :style (merge (style/root-container opacity height) container-style)}]))
[linear-gradient/linear-gradient
{:accessibility-label :gradient-cover
:colors [color-top color-bottom]
:start {:x 0 :y 0}
:end {:x 0 :y 1}
:style (merge (style/root-container opacity height)
container-style)}])))
(def view (quo.theme/with-theme view-internal)) (def view (quo.theme/with-theme view-internal))
@@ -61,30 +61,24 @@
value (reagent/atom "") value (reagent/atom "")
focused? (atom false)] focused? (atom false)]
(fn [{:keys [scanned-value theme blur? on-change-text on-blur on-focus on-clear on-scan (fn [{:keys [scanned-value theme blur? on-change-text on-blur on-focus on-clear on-scan
on-detect-ens on-detect-address on-detect-unclassified address-regex ens-regex on-detect-ens on-detect-address address-regex valid-ens-or-address?
valid-ens-or-address? container-style]}] container-style]}]
(let [on-change (fn [text] (let [on-change (fn [text]
(when (not= @value text) (when (not= @value text)
(let [address? (when address-regex (let [address? (when address-regex
(boolean (re-matches address-regex text))) (boolean (re-matches address-regex text)))]
ens? (when ens-regex
(boolean (re-matches ens-regex text)))]
(if (> (count text) 0) (if (> (count text) 0)
(reset! status :typing) (reset! status :typing)
(reset! status :active)) (reset! status :active))
(reset! value text) (reset! value text)
(when on-change-text (when on-change-text
(on-change-text text)) (on-change-text text))
(when (and on-detect-ens ens?) (when (and on-detect-ens (> (count text) 0))
(reset! status :loading) (reset! status :loading)
(on-detect-ens text #(reset! status :typing))) (on-detect-ens text #(reset! status :typing)))
(when (and address? on-detect-address) (when (and address? on-detect-address)
(reset! status :loading) (reset! status :loading)
(on-detect-address text)) (on-detect-address text)))))
(when (and (not address?)
(not ens?)
on-detect-unclassified)
(on-detect-unclassified text)))))
on-paste (fn [] on-paste (fn []
(clipboard/get-string (clipboard/get-string
(fn [clipboard] (fn [clipboard]
@@ -4,83 +4,79 @@
[quo.foundations.colors :as colors] [quo.foundations.colors :as colors]
[test-helpers.component :as h])) [test-helpers.component :as h]))
(def ^:private theme :light)
(h/describe "List items: account" (h/describe "List items: account"
(h/test "default render'" (h/test "default render'"
(h/render-with-theme-provider [account/view] theme) (h/render [account/view])
(h/is-truthy (h/query-by-label-text :container))) (h/is-truthy (h/query-by-label-text :container)))
(h/test "on-press-in changes state to :pressed" (h/test "on-press-in changes state to :pressed"
(h/render-with-theme-provider [account/view] theme) (h/render [account/view])
(h/fire-event :on-press-in (h/get-by-label-text :container)) (h/fire-event :on-press-in (h/get-by-label-text :container))
(h/wait-for #(h/has-style (h/query-by-label-text :container) (h/wait-for #(h/has-style (h/query-by-label-text :container)
{:backgroundColor (colors/resolve-color :blue :light 5)}))) {:backgroundColor (colors/resolve-color :blue :light 5)})))
(h/test "on-press-in changes state to :pressed with blur? enabled" (h/test "on-press-in changes state to :pressed with blur? enabled"
(h/render-with-theme-provider [account/view {:blur? true}] theme) (h/render [account/view {:blur? true}])
(h/fire-event :on-press-in (h/get-by-label-text :container)) (h/fire-event :on-press-in (h/get-by-label-text :container))
(h/wait-for #(h/has-style (h/query-by-label-text :container) (h/wait-for #(h/has-style (h/query-by-label-text :container)
{:backgroundColor colors/white-opa-5}))) {:backgroundColor colors/white-opa-5})))
(h/test "render with state :active" (h/test "render with state :active"
(h/render-with-theme-provider [account/view {:state :active}] theme) (h/render [account/view {:state :active}])
(h/has-style (h/query-by-label-text :container) (h/has-style (h/query-by-label-text :container)
{:backgroundColor (colors/resolve-color :blue :light 10)})) {:backgroundColor (colors/resolve-color :blue :light 10)}))
(h/test "render with state :active and blur? enabled" (h/test "render with state :active and blur? enabled"
(h/render-with-theme-provider [account/view (h/render [account/view
{:blur? true {:blur? true
:state :active}] :state :active}])
theme)
(h/has-style (h/query-by-label-text :container) (h/has-style (h/query-by-label-text :container)
{:backgroundColor colors/white-opa-10})) {:backgroundColor colors/white-opa-10}))
(h/test "render with state :selected" (h/test "render with state :selected"
(h/render-with-theme-provider [account/view {:state :selected}] theme) (h/render [account/view {:state :selected}])
(h/is-truthy (h/query-by-label-text :check-icon))) (h/is-truthy (h/query-by-label-text :check-icon)))
(h/test "calls on-press" (h/test "calls on-press"
(let [on-press (h/mock-fn)] (let [on-press (h/mock-fn)]
(h/render-with-theme-provider [account/view {:on-press on-press}] theme) (h/render [account/view {:on-press on-press}])
(h/fire-event :on-press (h/get-by-label-text :container)) (h/fire-event :on-press (h/get-by-label-text :container))
(h/was-called on-press))) (h/was-called on-press)))
(h/test "renders token props if type :tag" (h/test "renders token props if type :tag"
(h/render-with-theme-provider [account/view {:type :tag}] theme) (h/render [account/view {:type :tag}])
(h/is-truthy (h/query-by-label-text :tag-container))) (h/is-truthy (h/query-by-label-text :tag-container)))
(h/test "renders keycard icon if title-icon is present" (h/test "renders keycard icon if title-icon is present"
(h/render-with-theme-provider [account/view {:title-icon :i/placeholder}] theme) (h/render [account/view {:title-icon :i/placeholder}])
(h/is-truthy (h/query-by-label-text :title-icon))) (h/is-truthy (h/query-by-label-text :title-icon)))
(h/test "doesn't render keycard icon if title-icon is missing" (h/test "doesn't render keycard icon if title-icon is missing"
(h/render-with-theme-provider [account/view] theme) (h/render [account/view])
(h/is-falsy (h/query-by-label-text :title-icon))) (h/is-falsy (h/query-by-label-text :title-icon)))
(h/test "renders balance container but not arrow icon if type :balance-neutral" (h/test "renders balance container but not arrow icon if type :balance-neutral"
(h/render-with-theme-provider [account/view {:type :balance-neutral}] theme) (h/render [account/view {:type :balance-neutral}])
(h/is-truthy (h/query-by-label-text :balance-container)) (h/is-truthy (h/query-by-label-text :balance-container))
(h/is-falsy (h/query-by-label-text :arrow-icon))) (h/is-falsy (h/query-by-label-text :arrow-icon)))
(h/test "renders balance container and negative arrow icon if type :balance-negative" (h/test "renders balance container and negative arrow icon if type :balance-negative"
(h/render-with-theme-provider [account/view {:type :balance-negative}] theme) (h/render [account/view {:type :balance-negative}])
(h/is-truthy (h/query-by-label-text :balance-container)) (h/is-truthy (h/query-by-label-text :balance-container))
(h/is-truthy (h/query-by-label-text :icon-negative)) (h/is-truthy (h/query-by-label-text :icon-negative))
(h/is-falsy (h/query-by-label-text :icon-positive))) (h/is-falsy (h/query-by-label-text :icon-positive)))
(h/test "renders balance container and positive arrow icon if type :balance-positive" (h/test "renders balance container and positive arrow icon if type :balance-positive"
(h/render-with-theme-provider [account/view {:type :balance-positive}] theme) (h/render [account/view {:type :balance-positive}])
(h/is-truthy (h/query-by-label-text :balance-container)) (h/is-truthy (h/query-by-label-text :balance-container))
(h/is-falsy (h/query-by-label-text :icon-negative)) (h/is-falsy (h/query-by-label-text :icon-negative))
(h/is-truthy (h/query-by-label-text :icon-positive))) (h/is-truthy (h/query-by-label-text :icon-positive)))
(h/test "renders options button if type :action" (h/test "renders options button if type :action"
(let [on-options-press (h/mock-fn)] (let [on-options-press (h/mock-fn)]
(h/render-with-theme-provider [account/view (h/render [account/view
{:type :action {:type :action
:on-options-press on-options-press}] :on-options-press on-options-press}])
theme)
(h/is-truthy (h/query-by-label-text :options-button)) (h/is-truthy (h/query-by-label-text :options-button))
(h/fire-event :on-press (h/get-by-label-text :options-button)) (h/fire-event :on-press (h/get-by-label-text :options-button))
(h/was-called on-options-press)))) (h/was-called on-options-press))))
@@ -9,10 +9,8 @@
[utils.i18n :as i18n])) [utils.i18n :as i18n]))
(defn- view-internal (defn- view-internal
[{:keys [state theme number word on-press] :as props}] [{:keys [state theme number word] :as props}]
[rn/pressable [rn/view {:style (style/container props)}
{:style (style/container props)
:on-press on-press}
(if (or (= state :empty) (= state :disabled)) (if (or (= state :empty) (= state :disabled))
[rn/view [rn/view
{:style (style/num-container props) {:style (style/num-container props)
+6 -8
View File
@@ -39,15 +39,13 @@
(defn user (defn user
[{:keys [short-chat-key primary-name secondary-name photo-path online? contact? verified? [{:keys [short-chat-key primary-name secondary-name photo-path online? contact? verified?
untrustworthy? on-press on-long-press accessory customization-color theme untrustworthy? on-press on-long-press accessory customization-color theme]}]
allow-multiple-presses?]}]
[rn/touchable-highlight [rn/touchable-highlight
{:style container-style {:style container-style
:underlay-color (colors/resolve-color customization-color theme 5) :underlay-color (colors/resolve-color customization-color theme 5)
:allow-multiple-presses? allow-multiple-presses? :accessibility-label :user-list
:accessibility-label :user-list :on-press (when on-press on-press)
:on-press (when on-press on-press) :on-long-press (when on-long-press on-long-press)}
:on-long-press (when on-long-press on-long-press)}
[:<> [:<>
[user-avatar/user-avatar [user-avatar/user-avatar
{:full-name primary-name {:full-name primary-name
@@ -47,13 +47,12 @@
:height 40 :height 40
:border-radius 10})] :border-radius 10})]
[rn/touchable-without-feedback [rn/touchable-without-feedback
{:test-ID test-ID {:test-ID test-ID
:on-long-press on-long-press ;;NOTE - this is temporary while supporting old wallet :on-long-press on-long-press ;;NOTE - this is temporary while supporting old wallet
:allow-multiple-presses? true :on-press on-press
:on-press on-press :on-press-in #(toggle-background-color background-color false pass-through?)
:on-press-in #(toggle-background-color background-color false pass-through?) :on-press-out #(toggle-background-color background-color true pass-through?)
:on-press-out #(toggle-background-color background-color true pass-through?) :accessibility-label accessibility-label}
:accessibility-label accessibility-label}
[reanimated/view {:style background-animated-style} [reanimated/view {:style background-animated-style}
;; In android animations are not working for the animated components which are nested by ;; In android animations are not working for the animated components which are nested by
;; hole-view, ;; hole-view,
@@ -24,7 +24,9 @@
{:background-color (colors/theme-colors colors/neutral-80-opa-70 colors/white-opa-70 theme) {:background-color (colors/theme-colors colors/neutral-80-opa-70 colors/white-opa-70 theme)
:flex-direction :row :flex-direction :row
:justify-content :space-between :justify-content :space-between
:padding 8 :padding-vertical 8
:padding-left 10
:padding-right 8
:border-radius 12}) :border-radius 12})
(defn title (defn title
@@ -45,13 +47,8 @@
theme)) theme))
:container-style {:width 20 :height 20}}) :container-style {:width 20 :height 20}})
(def left-side-container (def left-side-container {:padding 2})
{:padding 2 (def right-side-container {:padding 4 :flex 1})
:padding-top 3})
(def right-side-container
{:padding 4
:flex 1})
(defn action-container (defn action-container
[theme] [theme]
@@ -45,6 +45,7 @@
:blur-radius 10 :blur-radius 10
:blur-type :transparent :blur-type :transparent
:overlay-color :transparent}] :overlay-color :transparent}]
[rn/view {:style (style/content-container theme)} [rn/view {:style (style/content-container theme)}
[rn/view {:style style/left-side-container} [rn/view {:style style/left-side-container}
left] left]
@@ -76,19 +77,16 @@
:or {type :neutral icon :i/placeholder}}] :or {type :neutral icon :i/placeholder}}]
(let [context-theme (or theme (quo.theme/get-theme)) (let [context-theme (or theme (quo.theme/get-theme))
icon-name (case type icon-name (case type
:positive (if (= theme :light) :positive :i/correct
:i/correct :negative :i/incorrect
:i/correct-dark)
:negative (if (= theme :light)
:i/incorrect
:i/incorrect-dark)
:neutral icon)] :neutral icon)]
[quo.theme/provider {:theme context-theme} [quo.theme/provider {:theme context-theme}
[toast-container [toast-container
{:left (cond user {:left (cond user
[user-avatar/user-avatar user] [user-avatar/user-avatar user]
icon-name icon-name
[icon/icon icon-name (style/icon type context-theme)]) [icon/icon icon-name (style/icon type context-theme)]
)
:title title :title title
:text text :text text
:right (if undo-duration :right (if undo-duration
@@ -15,23 +15,19 @@
(defn- view-internal (defn- view-internal
[] []
(let [pressed? (reagent/atom false)] (let [pressed? (reagent/atom false)]
(fn [{:keys [disabled? theme blur? on-press on-long-press type]} label] (fn [{:keys [disabled? theme blur? on-press type]} label]
(let [label-color (style/get-label-color disabled? theme blur?) (let [label-color (style/get-label-color disabled? theme blur?)
background-color (style/toggle-background-color @pressed? blur? theme)] background-color (style/toggle-background-color @pressed? blur? theme)]
[rn/pressable [rn/pressable
{:accessibility-label (label->accessibility-label label) {:accessibility-label (label->accessibility-label label)
:disabled (or disabled? (not label)) :disabled (or disabled? (not label))
:on-press (fn [] :on-press (fn []
(when on-press (when on-press
(on-press label))) (on-press label)))
:on-long-press (fn [] :on-press-in #(reset! pressed? true)
(when (fn? on-long-press) :on-press-out #(reset! pressed? false)
(on-long-press label))) :hit-slop {:top 8 :bottom 8 :left 25 :right 25}
:allow-multiple-presses? true :style (style/container background-color)}
:on-press-in #(reset! pressed? true)
:on-press-out #(reset! pressed? false)
:hit-slop {:top 8 :bottom 8 :left 25 :right 25}
:style (style/container background-color)}
(case type (case type
:key [icons/icon :key [icons/icon
label label
@@ -6,19 +6,18 @@
[react-native.core :as rn])) [react-native.core :as rn]))
(defn keyboard-item (defn keyboard-item
[{:keys [item type disabled? on-press on-long-press blur? theme]}] [{:keys [item type disabled? on-press blur? theme]}]
[keyboard-key/view [keyboard-key/view
{:disabled? disabled? {:disabled? disabled?
:on-press on-press :on-press on-press
:on-long-press on-long-press :blur? blur?
:blur? blur? :theme theme
:theme theme :type type}
:type type}
item]) item])
(defn- view-internal (defn- view-internal
[] []
(fn [{:keys [disabled? theme blur? left-action delete-key? on-press on-delete on-long-press-delete (fn [{:keys [disabled? theme blur? left-action delete-key? on-press on-delete
container-style] container-style]
:or {left-action :none}}] :or {left-action :none}}]
[rn/view [rn/view
@@ -63,13 +62,12 @@
:theme theme}] :theme theme}]
(if delete-key? (if delete-key?
[keyboard-item [keyboard-item
{:item :i/backspace {:item :i/backspace
:type :key :type :key
:disabled? disabled? :disabled? disabled?
:on-press on-delete :on-press on-delete
:on-long-press on-long-press-delete :blur? blur?
:blur? blur? :theme theme}]
:theme theme}]
[keyboard-item])]])) [keyboard-item])]]))
(def view (quo.theme/with-theme view-internal)) (def view (quo.theme/with-theme view-internal))
@@ -3,6 +3,7 @@
[quo.components.markdown.text :as text] [quo.components.markdown.text :as text]
[quo.components.profile.collectible.style :as style] [quo.components.profile.collectible.style :as style]
[react-native.core :as rn] [react-native.core :as rn]
[react-native.fast-image :as fast-image]
[react-native.svg :as svg])) [react-native.svg :as svg]))
(defn remaining-tiles (defn remaining-tiles
@@ -24,12 +25,7 @@
{:style {:border-radius (:border-radius image-style) {:style {:border-radius (:border-radius image-style)
:overflow :hidden}} :overflow :hidden}}
[svg/svg-uri (assoc image-style :uri (:uri resource))]] [svg/svg-uri (assoc image-style :uri (:uri resource))]]
;; NOTE: using react-native-fast-image here causes a crash on devices when used inside a [fast-image/fast-image
;; large flatlist. The library seems to have issues with memory consumption when used with
;; large images/GIFs.
;;
;; https://github.com/DylanVann/react-native-fast-image/issues/195
[rn/image
{:style image-style {:style image-style
:source (if (string? resource) :source (if (string? resource)
{:uri resource {:uri resource
@@ -12,13 +12,12 @@
accessibility-label] accessibility-label]
:or {accessibility-label :reaction}}] :or {accessibility-label :reaction}}]
[rn/pressable [rn/pressable
{:accessibility-label accessibility-label {:accessibility-label accessibility-label
:allow-multiple-presses? true :style (merge (style/container @pressed?)
:style (merge (style/container @pressed?) container-style)
container-style) :on-press (fn [e]
:on-press (fn [e] (swap! pressed? not)
(swap! pressed? not) (when on-press
(when on-press (on-press e)))}
(on-press e)))}
[rn/text [rn/text
(reactions.resource/system-emojis emoji)]]))) (reactions.resource/system-emojis emoji)]])))
@@ -30,8 +30,7 @@
:theme theme})] :theme theme})]
[rn/pressable [rn/pressable
(when-not disabled? (when-not disabled?
{:on-press #(handle-press on-change internal-checked? actual-checked?) {:on-press #(handle-press on-change internal-checked? actual-checked?)})
:allow-multiple-presses? true})
[rn/view [rn/view
{:style outer-styles {:style outer-styles
:needs-offscreen-alpha-compositing true :needs-offscreen-alpha-compositing true
@@ -121,7 +121,7 @@
{:accessibility-label :data-item {:accessibility-label :data-item
:disabled (not icon-right?) :disabled (not icon-right?)
:on-press on-press :on-press on-press
:style (merge (style/container size card? blur? theme) container-style)} :style (merge container-style (style/container size card? blur? theme))}
[left-side props] [left-side props]
(when (and (= :default status) (not= :small size)) (when (and (= :default status) (not= :small size))
[right-side [right-side
@@ -2,64 +2,9 @@
(:require [quo.components.share.share-qr-code.view :as share-qr-code] (:require [quo.components.share.share-qr-code.view :as share-qr-code]
[test-helpers.component :as h])) [test-helpers.component :as h]))
(def qr-label "Text shown below QR")
(def default-props
{:qr-data qr-label
:qr-image-uri "test-uri"
:full-name "Default name"})
(def profile-props
{:type :profile
:profile-picture 123})
(def wallet-props {:networks '(:ethereum)})
(def text-press-event
{:test-name "Text pressed"
:accessibility-label :share-qr-code-info-text
:event-name :press
:callback-prop-key :on-text-press})
(def text-long-press-event
{:test-name "Text long pressed"
:accessibility-label :share-qr-code-info-text
:event-name :long-press
:callback-prop-key :on-text-long-press})
(def share-press-event
{:test-name "Share button"
:accessibility-label :link-to-profile
:event-name :press
:callback-prop-key :on-share-press})
(def multichain-press-event
{:test-name "Multichain tab pressed"
:accessibility-label :share-qr-code-multichain-tab
:event-name :press
:callback-prop-key :on-multichain-press})
(def legacy-press-event
{:test-name "Legacy tab pressed"
:accessibility-label :share-qr-code-legacy-tab
:event-name :press
:callback-prop-key :on-legacy-press})
(def settings-press-event
{:test-name "Settings pressed"
:accessibility-label :share-qr-code-settings
:event-name :press
:callback-prop-key :on-settings-press})
(defn render-share-qr-code (defn render-share-qr-code
[props] [{share-qr-type :type :as props}]
;; NOTE: rendering the profile type first, so that the re-render is triggered. (let [component-rendered (h/render [share-qr-code/view {:type share-qr-type}])
;; Passing a :key breaks it for some reason.
(let [component-rendered (h/render [share-qr-code/view
(merge
default-props
profile-props
{:qr-data "initial-render"})])
rerender-fn (h/get-rerender-fn component-rendered) rerender-fn (h/get-rerender-fn component-rendered)
share-qr-code (h/get-by-label-text :share-qr-code)] share-qr-code (h/get-by-label-text :share-qr-code)]
;; Fires on-layout since it's needed to render the content ;; Fires on-layout since it's needed to render the content
@@ -68,52 +13,23 @@
(h/describe "Share QR Code component" (h/describe "Share QR Code component"
(h/describe "Renders share-qr-code component in all types" (h/describe "Renders share-qr-code component in all types"
(h/test "Profile" (let [qr-label "Text shown below QR"]
(render-share-qr-code (merge default-props (h/test "Profile"
profile-props)) (render-share-qr-code {:type :profile
(h/is-truthy (h/get-by-text qr-label))) :qr-data qr-label})
(h/is-truthy (h/get-by-text qr-label)))
(h/test "Wallet Legacy" (h/test "Wallet Legacy"
(render-share-qr-code (merge default-props (render-share-qr-code {:type :wallet-legacy
wallet-props :qr-data qr-label
{:type :wallet :emoji "👻"})
:address :legacy})) (h/is-truthy (h/get-by-text qr-label)))
(h/is-truthy (h/get-by-text qr-label)))
(h/test "Wallet multichain" (h/test "Wallet Multichain"
(render-share-qr-code (merge default-props (render-share-qr-code {:type :wallet-multichain
wallet-props :qr-data qr-label
{:type :wallet :emoji "👻"})
:address :multichain})) (h/is-truthy (h/get-by-text qr-label)))))
(h/is-truthy (h/get-by-text qr-label)))
(h/test "Saved address legacy"
(render-share-qr-code (merge default-props
wallet-props
{:type :saved-address
:address :legacy}))
(h/is-truthy (h/get-by-text qr-label)))
(h/test "Saved address multichain"
(render-share-qr-code (merge default-props
wallet-props
{:type :saved-address
:address :multichain}))
(h/is-truthy (h/get-by-text qr-label)))
(h/test "Watched address legacy"
(render-share-qr-code (merge default-props
wallet-props
{:type :watched-address
:address :legacy}))
(h/is-truthy (h/get-by-text qr-label)))
(h/test "Watched address multichain"
(render-share-qr-code (merge default-props
wallet-props
{:type :watched-address
:address :multichain}))
(h/is-truthy (h/get-by-text qr-label))))
(h/describe "Fires all events for all types" (h/describe "Fires all events for all types"
(letfn [(test-fire-events [props test-seq] (letfn [(test-fire-events [props test-seq]
@@ -128,86 +44,68 @@
(h/describe "Profile" (h/describe "Profile"
(test-fire-events (test-fire-events
(merge default-props {:type :profile}
profile-props) [{:test-name "Text pressed"
[text-press-event :accessibility-label :share-qr-code-info-text
text-long-press-event :event-name :press
share-press-event])) :callback-prop-key :on-text-press}
{:test-name "Text long pressed"
:accessibility-label :share-qr-code-info-text
:event-name :long-press
:callback-prop-key :on-text-long-press}
{:test-name "Share button"
:accessibility-label :link-to-profile
:event-name :press
:callback-prop-key :on-share-press}]))
(h/describe "Wallet Legacy" (h/describe "Wallet Legacy"
(test-fire-events (test-fire-events
(merge default-props {:type :wallet-legacy :emoji "👽"}
wallet-props [{:test-name "Text pressed"
{:type :wallet :accessibility-label :share-qr-code-info-text
:address :legacy :event-name :press
:emoji "👻"}) :callback-prop-key :on-text-press}
[text-press-event {:test-name "Text long pressed"
text-long-press-event :accessibility-label :share-qr-code-info-text
share-press-event :event-name :long-press
multichain-press-event :callback-prop-key :on-text-long-press}
legacy-press-event])) {:test-name "Share button pressed"
:accessibility-label :link-to-profile
:event-name :press
:callback-prop-key :on-share-press}
{:test-name "Legacy tab pressed"
:accessibility-label :share-qr-code-legacy-tab
:event-name :press
:callback-prop-key :on-legacy-press}
{:test-name "Multichain tab pressed"
:accessibility-label :share-qr-code-multichain-tab
:event-name :press
:callback-prop-key :on-multichain-press}]))
(h/describe "Wallet Multichain" (h/describe "Wallet Multichain"
(test-fire-events (test-fire-events
(merge default-props {:type :wallet-multichain :emoji "👽"}
wallet-props [{:test-name "Text pressed"
{:type :wallet :accessibility-label :share-qr-code-info-text
:address :multichain :event-name :press
:emoji "👻"}) :callback-prop-key :on-text-press}
[text-press-event {:test-name "Text long pressed"
text-long-press-event :accessibility-label :share-qr-code-info-text
share-press-event :event-name :long-press
legacy-press-event :callback-prop-key :on-text-long-press}
multichain-press-event {:test-name "Share button pressed"
settings-press-event])) :accessibility-label :link-to-profile
:event-name :press
(h/describe "Saved Address Legacy" :callback-prop-key :on-share-press}
(test-fire-events {:test-name "Legacy tab pressed"
(merge default-props :accessibility-label :share-qr-code-legacy-tab
wallet-props :event-name :press
{:type :saved-address :callback-prop-key :on-legacy-press}
:address :legacy}) {:test-name "Multichain tab pressed"
[text-press-event :accessibility-label :share-qr-code-multichain-tab
text-long-press-event :event-name :press
share-press-event :callback-prop-key :on-multichain-press}
legacy-press-event {:test-name "Settings pressed"
multichain-press-event])) :accessibility-label :share-qr-code-settings
:event-name :press
(h/describe "Saved Address Multichain" :callback-prop-key :on-settings-press}])))))
(test-fire-events
(merge default-props
wallet-props
{:type :saved-address :address :multichain})
[text-press-event
text-long-press-event
share-press-event
legacy-press-event
multichain-press-event
settings-press-event]))
(h/describe "Watched Address Legacy"
(test-fire-events
(merge default-props
wallet-props
{:type :watched-address
:address :legacy
:emoji "👽"})
[text-press-event
text-long-press-event
share-press-event
legacy-press-event
multichain-press-event]))
(h/describe "Watched Address Multichain"
(test-fire-events
(merge default-props
wallet-props
{:type :watched-address
:address :multichain
:emoji "👽"})
[text-press-event
text-long-press-event
share-press-event
legacy-press-event
multichain-press-event
settings-press-event])))))
@@ -1,68 +0,0 @@
(ns quo.components.share.share-qr-code.schema
(:require
[quo.foundations.resources :as resources]))
(defn- valid-network?
[network]
(-> network resources/get-network boolean))
(def ?base
[:map
[:type [:enum :profile :wallet :saved-address :watched-address]]
[:full-name :string]
[:qr-image-uri :string]
[:qr-data :string]
[:on-text-press {:optional true} [:maybe fn?]]
[:on-text-long-press {:optional true} [:maybe fn?]]
[:on-share-press {:optional true} [:maybe fn?]]
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
[:unblur-on-android? {:optional true} [:maybe :boolean]]])
(def ?emoji :string)
(def ?profile
[:map
[:type [:= :profile]]
[:profile-picture :schema.common/image-source]])
(def ?wallet
[:map
[:type [:= :wallet]]
[:emoji {:optional true} [:maybe ?emoji]]])
(def ?address-multichain
[:map
[:address [:= :multichain]]
[:on-settings-press {:optional true} fn?]])
(def ?address-base
[:merge
[:map
[:networks [:sequential [:fn valid-network?]]]
[:on-legacy-press {:optional true} [:maybe fn?]]
[:on-multichain-press {:optional true} [:maybe fn?]]
[:address [:enum :legacy :multichain]]]
[:multi {:dispatch :address}
[:multichain ?address-multichain]]])
(def ?saved-address
[:map
[:type [:= :saved-address]]
[:on-settings-press {:optional true} fn?]])
(def ?watched-address
[:map
[:type [:= :watched-address]]
[:emoji {:optional true} [:maybe ?emoji]]])
(def ?schema
[:=>
[:catn
[:props
[:multi {:dispatch :type}
[:profile [:merge ?base ?profile]]
[:wallet [:merge ?base ?address-base ?wallet]]
[:saved-address [:merge ?base ?address-base ?saved-address]]
[:watched-address [:merge ?base ?address-base ?watched-address]]]]]
:any])
@@ -106,6 +106,3 @@
{:color (-> network-short-name {:color (-> network-short-name
(get-network-full-name :unknown) (get-network-full-name :unknown)
(colors/resolve-color nil))}) (colors/resolve-color nil))})
(def watched-account-icon
{:margin-left 4})
@@ -3,25 +3,19 @@
[clojure.string :as string] [clojure.string :as string]
[oops.core :as oops] [oops.core :as oops]
[quo.components.avatars.account-avatar.view :as account-avatar] [quo.components.avatars.account-avatar.view :as account-avatar]
[quo.components.avatars.user-avatar.view :as user-avatar]
[quo.components.avatars.wallet-user-avatar.view :as wallet-user-avatar]
[quo.components.buttons.button.view :as button] [quo.components.buttons.button.view :as button]
[quo.components.gradient.gradient-cover.view :as gradient-cover] [quo.components.gradient.gradient-cover.view :as gradient-cover]
[quo.components.icon :as icons]
[quo.components.markdown.text :as text] [quo.components.markdown.text :as text]
[quo.components.share.qr-code.view :as qr-code] [quo.components.share.qr-code.view :as qr-code]
[quo.components.share.share-qr-code.schema :as component-schema]
[quo.components.share.share-qr-code.style :as style] [quo.components.share.share-qr-code.style :as style]
[quo.components.tabs.tab.view :as tab] [quo.components.tabs.tab.view :as tab]
[quo.foundations.colors :as colors]
[quo.theme] [quo.theme]
[react-native.core :as rn] [react-native.core :as rn]
[reagent.core :as reagent] [reagent.core :as reagent]
[schema.core :as schema]
[utils.i18n :as i18n])) [utils.i18n :as i18n]))
(defn- header (defn- header
[{:keys [on-legacy-press on-multichain-press address]}] [{:keys [share-qr-type on-legacy-press on-multichain-press]}]
[rn/view {:style style/header-container} [rn/view {:style style/header-container}
[tab/view [tab/view
{:accessibility-label :share-qr-code-legacy-tab {:accessibility-label :share-qr-code-legacy-tab
@@ -29,7 +23,7 @@
:active-item-container-style style/header-tab-active :active-item-container-style style/header-tab-active
:item-container-style style/header-tab-inactive :item-container-style style/header-tab-inactive
:size 24 :size 24
:active (= :legacy address) :active (= :wallet-legacy share-qr-type)
:on-press on-legacy-press} :on-press on-legacy-press}
(i18n/label :t/legacy)] (i18n/label :t/legacy)]
[rn/view {:style style/space-between-tabs}] [rn/view {:style style/space-between-tabs}]
@@ -39,7 +33,7 @@
:active-item-container-style style/header-tab-active :active-item-container-style style/header-tab-active
:item-container-style style/header-tab-inactive :item-container-style style/header-tab-inactive
:size 24 :size 24
:active (= :multichain address) :active (= :wallet-multichain share-qr-type)
:on-press on-multichain-press} :on-press on-multichain-press}
(i18n/label :t/multichain)]]) (i18n/label :t/multichain)]])
@@ -127,69 +121,77 @@
:on-press on-settings-press} :on-press on-settings-press}
:i/advanced]]) :i/advanced]])
(defn- header-icon
[{:keys [share-qr-type customization-color emoji profile-picture full-name]}]
(case share-qr-type
:profile [user-avatar/user-avatar
{:size :small
:status-indicator? false
:profile-picture profile-picture
:customization-color customization-color}]
(:wallet :watched-address) [account-avatar/view
{:customization-color customization-color
:emoji emoji
:size 32}]
:saved-address [wallet-user-avatar/wallet-user-avatar
{:size :size-32
:customization-color customization-color
:full-name full-name}]
nil))
(defn- share-qr-code (defn- share-qr-code
[{:keys [share-qr-type qr-image-uri component-width customization-color full-name [{:keys [share-qr-type qr-image-uri component-width customization-color full-name
profile-picture emoji on-share-press address] profile-picture emoji on-share-press]
:as props}] :as props}]
[:<> [:<>
[rn/view {:style style/gradient-bg} [rn/view {:style style/gradient-bg}
[gradient-cover/view {:customization-color customization-color :height 463}]] [gradient-cover/view {:customization-color customization-color :height 463}]]
[rn/view {:style style/content-container} [rn/view {:style style/content-container}
[rn/view {:style style/share-qr-container} [rn/view
[rn/view {:style style/share-qr-inner-container} {:style style/share-qr-container}
[header-icon props] [rn/view
{:style style/share-qr-inner-container}
[account-avatar/view
{:customization-color customization-color
:emoji emoji
:size 32}]
[text/text [text/text
{:size :heading-2 {:size :heading-2
:weight :semi-bold :weight :semi-bold
:style {:margin-left 8}} full-name] :style {:margin-left 8}} full-name]]
(when (= share-qr-type :watched-address)
[icons/icon
:i/reveal
{:color colors/white-opa-40
:container-style style/watched-account-icon}])]
[share-button {:on-press on-share-press}]] [share-button {:on-press on-share-press}]]
(when (not= share-qr-type :profile) (when (#{:wallet-legacy :wallet-multichain} share-qr-type)
[header props]) [header props])
[quo.theme/provider {:theme :light} [quo.theme/provider {:theme :light}
[qr-code/view [qr-code/view
{:qr-image-uri qr-image-uri {:qr-image-uri qr-image-uri
:size (style/qr-code-size component-width) :size (style/qr-code-size component-width)
:avatar (case share-qr-type :avatar (if (= share-qr-type :profile)
:profile :profile :profile
(:watched-address :wallet) :wallet-account :wallet-account)
:saved-address :saved-address
nil)
:customization-color customization-color :customization-color customization-color
:full-name full-name :full-name full-name
:profile-picture profile-picture :profile-picture profile-picture
:emoji emoji}]] :emoji emoji}]]
[rn/view {:style style/bottom-container} [rn/view {:style style/bottom-container}
(if (= share-qr-type :profile) (case share-qr-type
[profile-bottom props] :profile [profile-bottom props]
(case address :wallet-legacy [wallet-legacy-bottom props]
:legacy [wallet-legacy-bottom props] :wallet-multichain [wallet-multichain-bottom props]
:multichain [wallet-multichain-bottom props] nil)]]])
nil))]]])
(defn- view-internal (defn- view-internal
"Receives the following properties:
- type: :profile | :wallet-legacy | :wallet-multichain
- qr-image-uri: Image source value.
- qr-data: Text to show below the QR code.
- on-text-press: Callback for the `qr-data` text.
- on-text-long-press: Callback for the `qr-data` text.
- on-share-press: Callback for the share button.
- customization-color: Custom color for the QR code component.
- unblur-on-android?: [Android only] disables blur for this component.
Depending on the `type`, different properties are accepted:
`:profile`
- full-name: User full name.
- profile-picture: map ({:source image-source}) or any image source.
`:wallet-legacy`
- emoji: Emoji in a string to show in the QR code.
- on-legacy-press: Callback for the legacy tab.
- on-multichain-press: Callback for the multichain tab.
`:wallet-multichain`
- networks: A vector of network names as keywords (`[:ethereum, :my-net, ...]`).
- on-settings-press: Callback for the settings button.
- emoji: Emoji in a string to show in the QR code.
- on-legacy-press: Callback for the legacy tab.
- on-multichain-press: Callback for the multichain tab.
WARNING on Android:
Sometimes while using a blur layer on top of another on Android, this component looks
bad because of the `blur/view`, so we can set `unblur-on-android? true` to fix it.
"
[props] [props]
(reagent/with-let [component-width (reagent/atom nil) (reagent/with-let [component-width (reagent/atom nil)
container-component [rn/view {:background-color style/overlay-color}]] container-component [rn/view {:background-color style/overlay-color}]]
@@ -205,6 +207,5 @@
(assoc :component-width @component-width) (assoc :component-width @component-width)
(clojure.set/rename-keys {:type :share-qr-type}))]))]])) (clojure.set/rename-keys {:type :share-qr-type}))]))]]))
(def view
(quo.theme/with-theme (def view (quo.theme/with-theme view-internal))
(schema/instrument #'view-internal component-schema/?schema)))
@@ -1,50 +0,0 @@
(ns quo.components.tags.collectible-tag.style
(:require
[quo.foundations.colors :as colors]))
(defn container
[size options blur? theme]
(let [hold? (= options :hold)]
(merge {:background-color (if blur?
(colors/theme-colors colors/neutral-80-opa-5 colors/white-opa-5 theme)
(colors/theme-colors colors/neutral-10 colors/neutral-90 theme))
:flex-direction :row
:align-items :center
:padding-left 2
:border-width (if hold? 1 0)
:border-radius 0
:border-color (colors/resolve-color :success theme)}
(condp = size
:size-24 {:height (if hold? 26 24)
:padding-right 10
:border-radius 8}
:size-32 {:height (if hold? 34 32)
:padding-right 12
:border-radius 10}))))
(defn options-icon
[size]
(assoc
(condp = size
:size-24 {:right -8
:top -8}
:size-32 {:right -6
:top -6})
:position
:absolute))
(defn collectible-img
[size]
(condp = size
:size-24 {:width 20
:height 20
:margin-right 6
:border-radius 6}
:size-32 {:width 28
:height 28
:margin-right 8
:border-radius 8}))
(defn label
[theme]
{:color (colors/theme-colors colors/neutral-100 colors/white theme)})
@@ -1,70 +0,0 @@
(ns quo.components.tags.collectible-tag.view
(:require
[quo.components.icon :as icons]
[quo.components.markdown.text :as text]
[quo.components.tags.collectible-tag.style :as style]
[quo.theme]
[react-native.core :as rn]
[react-native.hole-view :as hole-view]
[schema.core :as schema]))
(def ?schema
[:=>
[:catn
[:props
[:map {:closed true}
[:options {:optional true} [:maybe [:enum false :add :hold]]]
[:size {:optional true} [:enum :size-24 :size-32]]
[:blur? {:optional true} :boolean]
[:theme :schema.common/theme]
[:collectible-img-src [:or :int :string]]
[:collectible-name :string]
[:collectible-id :string]
[:container-width :number]
[:on-layout {:optional true} [:maybe fn?]]]]]
:any])
(defn- view-internal
[]
(fn [{:keys [options size blur? theme collectible-img-src collectible-name collectible-id
container-width on-layout]
:or {size :size-24}}]
[rn/view
{:on-layout on-layout}
[hole-view/hole-view
{:holes (if options
[{:x (- container-width
(case size
:size-24 10
:size-32 12
nil))
:y (case size
:size-24 -6
:size-32 -4
nil)
:width 16
:height 16
:borderRadius 8}]
[])}
[rn/view {:style (style/container size options blur? theme)}
[rn/image {:style (style/collectible-img size) :source collectible-img-src}]
[text/text
{:size :paragraph-2
:weight :medium
:style (style/label theme)}
collectible-name]
[text/text
{:size :paragraph-2
:weight :medium
:margin-left 5
:style (style/label theme)}
collectible-id]]]
(when options
[rn/view {:style (style/options-icon size)}
[icons/icon (if (= options :hold) :i/hold :i/add-token)
{:size 20
:no-color true}]])]))
(def view
(quo.theme/with-theme
(schema/instrument #'view-internal ?schema)))
+1 -1
View File
@@ -12,7 +12,7 @@
[:cat [:cat
[:map {:closed true} [:map {:closed true}
[:size {:optional true :default 32} [:or keyword? pos-int?]] [:size {:optional true :default 32} [:or keyword? pos-int?]]
[:token {:optional true} [:maybe [:or keyword? string?]]] [:token {:optional true} [:or keyword? string?]]
[:style {:optional true} map?] [:style {:optional true} map?]
;; Ignores `token` and uses this as parameter to `rn/image`'s source. ;; Ignores `token` and uses this as parameter to `rn/image`'s source.
[:image-source {:optional true} [:maybe [:or :schema.common/image-source :string]]]]] [:image-source {:optional true} [:maybe [:or :schema.common/image-source :string]]]]]
@@ -5,7 +5,6 @@
(def username "Alisher account") (def username "Alisher account")
(def empty-username "Account 1") (def empty-username "Account 1")
(def ^:private theme :light)
(defn get-test-data (defn get-test-data
[{:keys [type watch-only? empty-type? loading? no-metrics?]}] [{:keys [type watch-only? empty-type? loading? no-metrics?]}]
@@ -22,54 +21,54 @@
(h/describe "Account_card tests" (h/describe "Account_card tests"
(h/test "Renders Default" (h/test "Renders Default"
(let [data (get-test-data {:type :default})] (let [data (get-test-data {:type :default})]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/is-truthy (h/get-by-text username)))) (h/is-truthy (h/get-by-text username))))
(h/test "Renders Watch-Only" (h/test "Renders Watch-Only"
(let [data (get-test-data {:type :watch-only (let [data (get-test-data {:type :watch-only
:watch-only? true})] :watch-only? true})]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/is-truthy (h/get-by-text username)))) (h/is-truthy (h/get-by-text username))))
(h/test "Renders Add-Account" (h/test "Renders Add-Account"
(let [data {:type :add-account}] (let [data {:type :add-account}]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/is-truthy (h/get-by-label-text :add-account)))) (h/is-truthy (h/get-by-label-text :add-account))))
(h/test "Renders Empty" (h/test "Renders Empty"
(let [data (get-test-data {:type :empty (let [data (get-test-data {:type :empty
:empty-type? true})] :empty-type? true})]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/is-truthy (h/get-by-text empty-username)))) (h/is-truthy (h/get-by-text empty-username))))
(h/test "Renders Missing Keypair" (h/test "Renders Missing Keypair"
(let [data (get-test-data {:type :missing-keypair})] (let [data (get-test-data {:type :missing-keypair})]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/is-truthy (h/get-by-text username)))) (h/is-truthy (h/get-by-text username))))
(h/test "Add account on press fires correctly" (h/test "Add account on press fires correctly"
(let [on-press (h/mock-fn) (let [on-press (h/mock-fn)
data {:type :add-account data {:type :add-account
:on-press on-press}] :on-press on-press}]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/fire-event :on-press (h/get-by-label-text :add-account)) (h/fire-event :on-press (h/get-by-label-text :add-account))
(h/was-called on-press))) (h/was-called on-press)))
(h/test "Renders component without metrics" (h/test "Renders component without metrics"
(let [data (get-test-data {:type :default (let [data (get-test-data {:type :default
:no-metrics? true})] :no-metrics? true})]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/is-falsy (h/query-by-label-text :metrics)))) (h/is-falsy (h/query-by-label-text :metrics))))
(h/test "Renders loading state" (h/test "Renders loading state"
(let [data (get-test-data {:type :default (let [data (get-test-data {:type :default
:loading? true})] :loading? true})]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/is-truthy (h/get-by-label-text :loading)))) (h/is-truthy (h/get-by-label-text :loading))))
(h/test "Renders loading state without metrics" (h/test "Renders loading state without metrics"
(let [data (get-test-data {:type :default (let [data (get-test-data {:type :default
:no-metrics? true :no-metrics? true
:loading? true})] :loading? true})]
(h/render-with-theme-provider [account-card/view data] theme) (h/render [account-card/view data])
(h/is-falsy (h/query-by-label-text :metrics))))) (h/is-falsy (h/query-by-label-text :metrics)))))
@@ -1,33 +0,0 @@
(ns quo.components.wallet.account-card.schema)
(def ^:private ?base
[:map
[:type {:optional true} [:enum :default :watch-only :add-account :empty :missing-keypair]]
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
[:theme :schema.common/theme]
[:metrics? {:optional true} [:maybe :boolean]]
[:on-press {:optional true} [:maybe fn?]]])
(def ^:private ?amount
[:map
[:amount {:optional true} [:maybe :string]]])
(def ^:private ?card
[:map
[:balance {:optional true} [:maybe :string]]
[:loading? {:optional true} [:maybe :boolean]]
[:name {:optional true} [:maybe :string]]
[:percentage-value {:optional true} [:maybe :string]]
[:emoji {:optional true} [:maybe :string]]])
(def ?schema
[:=>
[:catn
[:props
[:multi {:dispatch :type}
[:default [:merge ?base ?amount ?card]]
[:watch-only [:merge ?base ?amount ?card]]
[:missing-keypair [:merge ?base ?amount ?card]]
[:empty [:merge ?base ?card]]
[:add-account ?base]]]]
:any])
@@ -4,15 +4,13 @@
[quo.components.icon :as icon] [quo.components.icon :as icon]
[quo.components.markdown.text :as text] [quo.components.markdown.text :as text]
[quo.components.wallet.account-card.properties :as properties] [quo.components.wallet.account-card.properties :as properties]
[quo.components.wallet.account-card.schema :as component-schema]
[quo.components.wallet.account-card.style :as style] [quo.components.wallet.account-card.style :as style]
[quo.foundations.colors :as colors] [quo.foundations.colors :as colors]
[quo.foundations.customization-colors :as customization-colors] [quo.foundations.customization-colors :as customization-colors]
[quo.theme :as quo.theme] [quo.theme :as quo.theme]
[react-native.core :as rn] [react-native.core :as rn]
[react-native.linear-gradient :as linear-gradient] [react-native.linear-gradient :as linear-gradient]
[reagent.core :as reagent] [reagent.core :as reagent]))
[schema.core :as schema]))
(defn- loading-view (defn- loading-view
[{:keys [customization-color type theme metrics?]}] [{:keys [customization-color type theme metrics?]}]
@@ -185,6 +183,4 @@
:add-account [add-account-view props] :add-account [add-account-view props]
nil)) nil))
(def view (def view (quo.theme/with-theme view-internal))
(quo.theme/with-theme
(schema/instrument #'view-internal component-schema/?schema)))
@@ -3,104 +3,92 @@
[quo.core :as quo] [quo.core :as quo]
[test-helpers.component :as h])) [test-helpers.component :as h]))
(def ^:private theme :light)
(h/describe "account origin tests" (h/describe "account origin tests"
(h/test "component renders" (h/test "component renders"
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :recovery-phrase {:type :recovery-phrase
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name"}] :user-name "Test Name"}])
theme)
(-> (h/expect (h/get-by-translation-text :t/origin)) (-> (h/expect (h/get-by-translation-text :t/origin))
(.toBeTruthy))) (.toBeTruthy)))
(h/test "recovery phrase icon is visible when :type is :recovery-phrase" (h/test "recovery phrase icon is visible when :type is :recovery-phrase"
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :recovery-phrase {:type :recovery-phrase
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name"}] :user-name "Test Name"}])
theme)
(h/is-truthy (h/get-by-label-text :recovery-phrase-icon))) (h/is-truthy (h/get-by-label-text :recovery-phrase-icon)))
(h/test "recovery phrase icon is visible when :type is :recovery-phrase" (h/test "recovery phrase icon is visible when :type is :recovery-phrase"
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :recovery-phrase {:type :recovery-phrase
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name"}] :user-name "Test Name"}])
theme)
(h/is-truthy (h/get-by-label-text :recovery-phrase-icon))) (h/is-truthy (h/get-by-label-text :recovery-phrase-icon)))
(h/test "private-key-icon is visible when :type is :private-key" (h/test "private-key-icon is visible when :type is :private-key"
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :private-key {:type :private-key
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name"}] :user-name "Test Name"}])
theme)
(h/is-truthy (h/get-by-label-text :private-key-icon))) (h/is-truthy (h/get-by-label-text :private-key-icon)))
(h/test "derivation-path-icon is visible when :type is :default-keypair" (h/test "derivation-path-icon is visible when :type is :default-keypair"
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :default-keypair {:type :default-keypair
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name"}] :user-name "Test Name"}])
theme)
(h/is-truthy (h/get-by-label-text :derivation-path-icon))) (h/is-truthy (h/get-by-label-text :derivation-path-icon)))
(h/test "derivation-path-icon is visible when :type is :recovery-phrase" (h/test "derivation-path-icon is visible when :type is :recovery-phrase"
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :recovery-phrase {:type :recovery-phrase
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name"}] :user-name "Test Name"}])
theme)
(h/is-truthy (h/get-by-label-text :derivation-path-icon))) (h/is-truthy (h/get-by-label-text :derivation-path-icon)))
(h/test "on-device text is visible when :stored is :on-device" (h/test "on-device text is visible when :stored is :on-device"
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :recovery-phrase {:type :recovery-phrase
:stored :on-device :stored :on-device
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name"}] :user-name "Test Name"}])
theme)
(-> (h/expect (h/get-by-translation-text :t/on-device)) (-> (h/expect (h/get-by-translation-text :t/on-device))
(.toBeTruthy))) (.toBeTruthy)))
(h/test "on-keycard text is visible when :stored is :on-keycard" (h/test "on-keycard text is visible when :stored is :on-keycard"
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :recovery-phrase {:type :recovery-phrase
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name"}] :user-name "Test Name"}])
theme)
(-> (h/expect (h/get-by-translation-text :t/on-keycard)) (-> (h/expect (h/get-by-translation-text :t/on-keycard))
(.toBeTruthy))) (.toBeTruthy)))
(h/test "on-press is called when :type is :recovery-phrase" (h/test "on-press is called when :type is :recovery-phrase"
(let [on-press (h/mock-fn)] (let [on-press (h/mock-fn)]
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :recovery-phrase {:type :recovery-phrase
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name" :user-name "Test Name"
:on-press on-press}] :on-press on-press}])
theme)
(h/fire-event :press (h/query-by-label-text :derivation-path-button)) (h/fire-event :press (h/query-by-label-text :derivation-path-button))
(h/was-called on-press))) (h/was-called on-press)))
(h/test "on-press is called when :type is :default-keypair" (h/test "on-press is called when :type is :default-keypair"
(let [on-press (h/mock-fn)] (let [on-press (h/mock-fn)]
(h/render-with-theme-provider [quo/account-origin (h/render [quo/account-origin
{:type :default-keypair {:type :default-keypair
:stored :on-keycard :stored :on-keycard
:derivation-path "m / 44 / 60 / 0 / 0 / 2" :derivation-path "m / 44 / 60 / 0 / 0 / 2"
:user-name "Test Name" :user-name "Test Name"
:on-press on-press}] :on-press on-press}])
theme)
(h/fire-event :press (h/query-by-label-text :derivation-path-button)) (h/fire-event :press (h/query-by-label-text :derivation-path-button))
(h/was-called on-press)))) (h/was-called on-press))))
@@ -1,30 +0,0 @@
(ns quo.components.wallet.account-origin.schema)
(def ^:private ?base
[:map
[:type {:optional true} [:enum :default-keypair :recovery-phrase :private-key]]
[:stored {:optional true} [:enum :on-device :on-keycard]]
[:theme :schema.common/theme]])
(def ^:private ?default-keypair
[:map
[:user-name {:optional true} [:maybe :string]]
[:profile-picture {:optional true} [:maybe [:or :schema.common/image-source :string]]]
[:derivation-path {:optional true} [:maybe :string]]
[:on-press {:optional true} [:maybe fn?]]
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]])
(def ^:private ?recovery-phrase
[:map
[:derivation-path {:optional true} [:maybe :string]]
[:on-press {:optional true} [:maybe fn?]]])
(def ?schema
[:=>
[:catn
[:props
[:multi {:dispatch :type}
[:default-keypair [:merge ?base ?default-keypair]]
[:recovery-phrase [:merge ?base ?recovery-phrase]]
[:private-key ?base]]]]
:any])
@@ -3,12 +3,10 @@
[quo.components.avatars.user-avatar.view :as user-avatar] [quo.components.avatars.user-avatar.view :as user-avatar]
[quo.components.icon :as icons] [quo.components.icon :as icons]
[quo.components.markdown.text :as text] [quo.components.markdown.text :as text]
[quo.components.wallet.account-origin.schema :as component-schema]
[quo.components.wallet.account-origin.style :as style] [quo.components.wallet.account-origin.style :as style]
[quo.foundations.colors :as colors] [quo.foundations.colors :as colors]
[quo.theme :as quo.theme] [quo.theme :as quo.theme]
[react-native.core :as rn] [react-native.core :as rn]
[schema.core :as schema]
[utils.i18n :as i18n])) [utils.i18n :as i18n]))
(defn- row-title (defn- row-title
@@ -109,5 +107,14 @@
[card-view theme derivation-path secondary-color on-press])])) [card-view theme derivation-path secondary-color on-press])]))
(def view (def view
(quo.theme/with-theme "Create an account-origin UI component.
(schema/instrument #'view-internal component-schema/?schema))) | key | values |
| ----------------------|------------------------------------------------|
| :type | :default-keypair :recovery-phrase :private-key
| :stored | :on-device :on-keycard
| :profile-picture | image source
| :customization-color | profile color
| :derivation-path | string
| :user-name | string
| :on-press | function"
(quo.theme/with-theme view-internal))
@@ -1,20 +0,0 @@
(ns quo.components.wallet.account-overview.schema)
(def ?schema
[:=>
[:catn
[:props
[:map
[:account-name {:optional true} [:maybe :string]]
[:currency-change {:optional true} [:maybe :string]]
[:current-value {:optional true} [:maybe :string]]
[:percentage-change {:optional true} [:maybe :string]]
[:time-frame-string {:optional true} [:maybe :string]]
[:time-frame-to-string {:optional true} [:maybe :string]]
[:state {:optional true} [:enum :default :loading]]
[:metrics {:optional true} [:enum :negative :positive]]
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
[:account {:optional true} [:enum :default :watched-address]]
[:time-frame {:optional true}
[:enum :one-week :one-month :three-months :one-year :all-time :custom]]]]]
:any])
@@ -2,12 +2,10 @@
(:require (:require
[quo.components.icon :as icons] [quo.components.icon :as icons]
[quo.components.markdown.text :as text] [quo.components.markdown.text :as text]
[quo.components.wallet.account-overview.schema :as component-schema]
[quo.components.wallet.account-overview.style :as style] [quo.components.wallet.account-overview.style :as style]
[quo.foundations.colors :as colors] [quo.foundations.colors :as colors]
[quo.theme :as quo.theme] [quo.theme :as quo.theme]
[react-native.core :as rn] [react-native.core :as rn]
[schema.core :as schema]
[utils.i18n :as i18n])) [utils.i18n :as i18n]))
(defn- loading-state (defn- loading-state
@@ -131,5 +129,16 @@
[numeric-changes percentage-change currency-change customization-color theme up?])]])])) [numeric-changes percentage-change currency-change customization-color theme up?])]])]))
(def view (def view
(quo.theme/with-theme "Create a account-overview UI component.
(schema/instrument #'view-internal component-schema/?schema))) | key | description |
| -------------|-------------|
| `:account-name` | A value representing the account name (default `nil`)
| `:account` | A value that represents if the account is a `:watched-address` or a `:default` account. (default `nil`)
| `:time-frame` | A value that represents the type of the timeframe, Can be from a preset of time frames. `[:1-week :1-month :3-months :1-year :custom]` (default `nil`) if custom is set, We expect a start time and if there's a space between two times that are in `time-frame-string` we'll split them with an arrow to the right icon
| `:loading?` | A value that indicates that component is loading data. (default `nil`)
| `:metrics` | A value that indicates if the account value have increased can be `:positive` or `:negative` (default `nil`)
| `:time-frame-string` | A value representing time frame string. (default `nil`)
| `:current-value` | A value representing the current value of the selected account. (default `nil`)
| `:currency-change` | A value representing the change of the value of the selected account in the selected currency. (default `nil`)
| `:percentage-change` | A value representing the change of the value of the selected account in percentage relative to it's previous value. (default `nil`)"
(quo.theme/with-theme view-internal))
@@ -42,22 +42,18 @@
(render [account-permissions/view (render [account-permissions/view
{:account account {:account account
:token-details [{:token "SNT" :token-details [{:token "SNT"
:amount "100" :amount "100"}]}])
:type :token}]}])
(h/is-truthy (h/get-by-text "100 SNT"))) (h/is-truthy (h/get-by-text "100 SNT")))
(h/test "render with multiple token details" (h/test "render with multiple token details"
(render [account-permissions/view (render [account-permissions/view
{:account account {:account account
:token-details [{:token "SNT" :token-details [{:token "SNT"
:amount "100" :amount "100"}
:type :token}
{:token "ETH" {:token "ETH"
:amount "18" :amount "18"}
:type :token}
{:token "BTM" {:token "BTM"
:amount "1000" :amount "1000"}]}])
:type :token}]}])
(h/is-truthy (h/get-by-text "100 SNT")) (h/is-truthy (h/get-by-text "100 SNT"))
(h/is-truthy (h/get-by-text "18 ETH")) (h/is-truthy (h/get-by-text "18 ETH"))
(h/is-truthy (h/get-by-text "1000 BTM"))) (h/is-truthy (h/get-by-text "1000 BTM")))
@@ -1,22 +0,0 @@
(ns quo.components.wallet.account-permissions.schema
(:require [quo.components.wallet.required-tokens.view :as required-tokens]))
(def ?schema
[:=>
[:catn
[:props
[:map
[:account
[:map
[:name [:maybe :string]]
[:address [:maybe :string]]
[:emoji [:maybe :string]]
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]]]
[:token-details {:optional true} [:maybe [:sequential required-tokens/?schema]]]
[:keycard? {:optional true} [:maybe :boolean]]
[:checked? {:optional true} [:maybe :boolean]]
[:disabled? {:optional true} [:maybe :boolean]]
[:on-change {:optional true} [:maybe fn?]]
[:container-style {:optional true} [:maybe :map]]
[:theme :schema.common/theme]]]]
:any])
@@ -4,7 +4,6 @@
[quo.components.icon :as icons] [quo.components.icon :as icons]
[quo.components.markdown.text :as text] [quo.components.markdown.text :as text]
[quo.components.selectors.selectors.view :as selectors] [quo.components.selectors.selectors.view :as selectors]
[quo.components.wallet.account-permissions.schema :as component-schema]
[quo.components.wallet.account-permissions.style :as style] [quo.components.wallet.account-permissions.style :as style]
[quo.components.wallet.address-text.view :as address-text] [quo.components.wallet.address-text.view :as address-text]
[quo.components.wallet.required-tokens.view :as required-tokens] [quo.components.wallet.required-tokens.view :as required-tokens]
@@ -14,6 +13,26 @@
[schema.core :as schema] [schema.core :as schema]
[utils.i18n :as i18n])) [utils.i18n :as i18n]))
(def ?schema
[:=>
[:catn
[:props
[:map {:closed true}
[:account
[:map {:closed true}
[:name [:maybe :string]]
[:address [:maybe :string]]
[:emoji [:maybe :string]]
[:customization-color [:maybe [:or :string :keyword]]]]]
[:token-details {:optional true} [:maybe [:vector required-tokens/?schema]]]
[:keycard? {:optional true} [:maybe :boolean]]
[:checked? {:optional true} [:maybe :boolean]]
[:disabled? {:optional true} [:maybe :boolean]]
[:on-change {:optional true} [:maybe fn?]]
[:container-style {:optional true} [:maybe :map]]
[:theme :schema.common/theme]]]]
:any])
(defn- token-details-section (defn- token-details-section
[tokens] [tokens]
(when tokens (when tokens
@@ -28,16 +47,14 @@
(i18n/label :t/no-relevant-tokens)] (i18n/label :t/no-relevant-tokens)]
(let [token-length (dec (count tokens))] (let [token-length (dec (count tokens))]
(map-indexed (fn [idx {:keys [type token amount collectible-name collectible-img-src]}] (map-indexed (fn [idx {:keys [token amount]}]
^{:key idx} ^{:key idx}
[required-tokens/view [required-tokens/view
{:container-style style/token-and-text {:container-style style/token-and-text
:type type :type :token
:amount amount :amount amount
:token token :token token
:collectible-img-src collectible-img-src :divider? (not= token-length idx)}])
:collectible-name collectible-name
:divider? (not= token-length idx)}])
tokens)))]])) tokens)))]]))
(defn- view-internal (defn- view-internal
@@ -76,4 +93,4 @@
(def view (def view
(quo.theme/with-theme (quo.theme/with-theme
(schema/instrument #'view-internal component-schema/?schema))) (schema/instrument #'view-internal ?schema)))
@@ -1,14 +0,0 @@
(ns quo.components.wallet.address-text.schema)
(def ?schema
[:=>
[:catn
[:props
[:map
[:address {:optional true} [:maybe :string]]
[:blur? {:optional true} [:maybe :boolean]]
[:format {:optional true} [:enum :short :long]]
[:theme :schema.common/theme]
[:networks {:optional true}
[:maybe [:sequential [:map [:name :keyword] [:short-name :string]]]]]]]]
:any])
@@ -1,10 +1,8 @@
(ns quo.components.wallet.address-text.view (ns quo.components.wallet.address-text.view
(:require [quo.components.markdown.text :as text] (:require [quo.components.markdown.text :as text]
[quo.components.wallet.address-text.schema :as component-schema]
[quo.components.wallet.address-text.style :as style] [quo.components.wallet.address-text.style :as style]
[quo.foundations.colors :as colors] [quo.foundations.colors :as colors]
[quo.theme] [quo.theme]
[schema.core :as schema]
[utils.address :as utils])) [utils.address :as utils]))
(defn- colored-network-text (defn- colored-network-text
@@ -30,6 +28,4 @@
(into [text/text] network-text-xf $) (into [text/text] network-text-xf $)
(conj $ address-text)))) (conj $ address-text))))
(def view (def view (quo.theme/with-theme view-internal))
(quo.theme/with-theme
(schema/instrument #'view-internal component-schema/?schema)))
@@ -1,43 +0,0 @@
(ns quo.components.wallet.amount-input.component-spec
(:require
[oops.core :as oops]
[quo.components.wallet.amount-input.view :as amount-input]
[quo.foundations.colors :as colors]
[test-helpers.component :as h]))
(defn- render
[component]
(h/render-with-theme-provider component :light))
(h/describe "Amount input component"
(h/test "Renders with default value"
(let [text-expected 0]
(render [amount-input/view {:init-value text-expected}])
(h/is-truthy (h/query-by-label-text :amount-input))
(h/is-equal (oops/oget (h/get-by-label-text :amount-input) "props" "value")
(str text-expected))))
(h/test "When the value = minimum dec button is disabled"
(render [amount-input/view
{:init-value 0
:min-value 0}])
(h/is-truthy
(oops/oget (h/get-by-label-text :amount-input-dec-button) "props" "accessibilityState" "disabled")))
(h/test "When the value = maximum inc button is disabled"
(render [amount-input/view
{:init-value 100
:max-value 100}])
(h/is-truthy
(oops/oget (h/get-by-label-text :amount-input-inc-button) "props" "accessibilityState" "disabled")))
(h/test "Renders the error state"
(render [amount-input/view {:status :error}])
(h/is-equal (colors/resolve-color :danger :light)
(oops/oget (h/get-by-label-text :amount-input) "props" "style" "color")))
(h/test "on-change-text function is fired"
(let [on-change-text (h/mock-fn)]
(render [amount-input/view {:on-change-text on-change-text}])
(h/fire-event :change-text (h/get-by-label-text :amount-input) "100")
(h/was-called on-change-text))))

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