Compare commits

...
Author SHA1 Message Date
Ulises M 747d6bb128 WIP: debugging 2024-02-13 13:30:46 -06:00
Ulises M a29264a1a1 Reimplement avatar animations using new worklet approach 2024-02-12 15:06:35 -06:00
Ulises M 1386bd4777 Add worklet translation to shadow-cljs 2024-02-12 15:06:03 -06:00
e86faa0767 feat(quo): implement wallet - input amount component (#18687)
Co-authored-by: Siddarth Kumar <siddarthkay@gmail.com>
Co-authored-by: Jamie Caprani <jamiecaprani@gmail.com>
2024-02-12 07:36:23 -08:00
Shivek Khurana abe0342be0 🚟 Add schema batch 2 (#18696)
* 🚟 Add schema batch 2

*  Add maybe and optionals

* 🧑‍⚖️ Make theme a required prop

* 🍙 Fix misplaced square brackets that broke spec

* 🎨 Assume default theme and fix tests

- Fixes #18734

* ⬆️ Update schema and rebase

* 🧪 Update tests

* 🆙 Update progress bar value to be string or int

* 🔩 Tighten schema
2024-02-12 14:44:40 +00:00
Mohamed Javid 6669c33e33 [Fix] Edited wallet account name persists in other edit account screens (#18729)
This commit fixes the edited wallet account name that persists in other account edit screens.

Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
2024-02-12 19:11:17 +05:30
Ajay Sivan 1351a54fd1 fix - Button colors have become darker (#18776) 2024-02-12 05:06:18 -08:00
Ibrahem Khalil da192dcdb3 Dismiss keyboard when opening mute chat drawer (#18486) 2024-02-12 13:05:56 +02:00
Flavio Fraschetti 6e22e63158 [Communities] Add quo Collectible Tag (#18748)
* register and basic imports for collectible tag component

* implement variations and design for collectible tag component

* Refined based on review feedback and implemented schema enhancements
2024-02-12 07:40:12 -03:00
Mohamed Javid d1f22cd2b8 Wallet - Clear input on long press delete (#18732)
This commit allows clearing the amount input (in the send flow) by long-pressing the delete key.

---------

Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
2024-02-10 00:09:15 +05:30
Parvesh Monu 9dacc9e8af error and app freezing when deselecting account (#18759) 2024-02-09 23:32:58 +05:30
Jamie Caprani 9acf67dd5b feat: add basic infrastructure for contract tests (#18665) 2024-02-09 09:10:09 -08:00
Brian Sztamfater ab73c7e56a feat: show estimated fees when calculating route (#18309)
Signed-off-by: Brian Sztamfater <brian@status.im>
2024-02-09 13:43:14 -03:00
Yevheniia Berdnyk f1db73d149 e2e: updated deep/universal links tests 2024-02-09 15:51:14 +02:00
Ajay Sivan d78d7719cd Account permissions component malli schema fix (#18770) 2024-02-09 05:44:11 -08:00
Alexander e381998b19 Toast notification design fixes (#18468)
* Toast notification design fixes

* Code style fix

* Smaller fix

* Style fix

* Fixes

* Style fixes

* Fixes

* Fixes
2024-02-09 09:54:14 +01:00
Brian Sztamfater 025c38ae88 fix: address is lost on re-render (#18593)
Signed-off-by: Brian Sztamfater <brian@status.im>
2024-02-08 16:29:05 -03:00
mmilad75 523a5809d0 Wallet - Add malli spec to Quo Wallet components (batch 1) #18354 (#18707)
* draft

* add account_card

* add account-origin

* add account_overview

* add account_permission

* add address_text

* add confirmation_progress

* wrapping up

* resolve comments and fix ci issues

* fix ci issues

* fix transaction_progress tests

* fix all tests

* fix lint issues
2024-02-08 20:31:57 +03:30
Icaro Motta 505f2fe624 Communities: Show relevant tokens (#18636)
Show "relevant tokens" in account selection step. Related status-go PR
https://github.com/status-im/status-go/pull/4631.

- Balances are fetched on the account selection screen. Assuming most users
  won't care about selecting addresses, this eliminates unnecessary calls to get
  balances, at the expense of refetching them every time the component is
  mounted. I think for now this is acceptable.
- Relevant tokens is a terminology used in Figma, but more specifically, it
  means "balances for all assets that have at least one Token Criteria
  associated, and for a given address". Or, as I tried to give it a more
  distinct name, "permissioned balances".

Areas that may be impacted: None because all affected code is behind a disabled
feature flag.

Fixes https://github.com/status-im/status-mobile/issues/18126
2024-02-08 11:17:15 -03:00
Ajay Sivan ac32de89f9 Update drawer/bottom-actions component with top & top error variants (#18513) 2024-02-08 02:31:50 -08:00
Mohamed Javid 52a82fffab Bump status-go version to 0.174.2 (#18745)
This commit updates the status-go version to use v0.174.2

Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
2024-02-08 15:19:27 +05:30
Mohamed Javid d1c8f6411d [Feature] Wallet - Display token price (#18438)
This commit adds a feature to display token prices for each token in the Wallet home and Account screens.

Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
2024-02-08 13:31:42 +05:30
Mohsen 7b639f2ffe [#18453] feat: implement change accent colour screen (#18517) 2024-02-07 19:49:21 +03:00
Brian Sztamfater ae7ee33f00 fix: ENS regex not being used to detect an ENS on address input (#18626)
Signed-off-by: Brian Sztamfater <brian@status.im>
2024-02-07 12:39:49 -03:00
Mohamed Javid c70646bd5c [Fix] Scanned address not populated in send flow (#18727)
This commit fixes the scanned address not pasted/populated in the "Send to" input field.

---

Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
2024-02-07 19:56:42 +05:30
mmilad75andLungu Cristian 484ab919b1 Update Wallet: Share QR Code #18454 (#18479)
* add icon

* fix lint issues

* fix preview props and header icon

* fix watched-address icon condition

* fix header tabs

* draft

* fix network name in multichain mode

* fix lint issues

* update tests

* update comments

* add background color

* update preview file

* update usages

* feat: add schema to quo/share-qr-code component

* test: fixed & re-factored tests after adding schema

* bring back gradient structure

* fix scrolling issue

* fix lint issues

* fix usage

---------

Co-authored-by: Lungu Cristian <lungucristian95@gmail.com>
2024-02-07 17:08:41 +03:30
Omar Basem 052d88b531 Wallet: bridging - assets list (#18713)
Wallet: bridging - assets list
2024-02-07 16:55:14 +04:00
Omar Basem 0aba789b5c feat: new keypair - check your backup (#18667)
* feat: new keypair - check your backup
2024-02-07 15:53:29 +04:00
Omar Basem 73450d736a Wallet: fix nested scrollviews warning (#18714)
Wallet: fix nested scrollviews warning (#18714)
2024-02-07 09:32:53 +04:00
Siddarth Kumar cc63c8fff5 init: maestro dev automation (#18712)
The purpose of this commit is to allow running `maestro` automations to enhance productivity by **automating** mundane tasks.

Other flows like
- send contact request
- sync devices
- join a community
etc will be a part of follow ups.

In this commit we provide a `make` command to run a very common task like creating account & login :
`make auto-login`

We also allow another `make` command to run any other custom flow :
`make auto-custom FLOW="maestro/create-account-or-login.yaml"`

A `maestro` folder has been added with 3 `yaml` files which are very easy to understand
ref : https://maestro.mobile.dev/api-reference/commands
2024-02-06 23:29:35 +05:30
Jamie Caprani ef6027575f Add a UI for toggling developer feature flags (#18602) 2024-02-06 08:24:45 -08:00
Anton Iakimov 07feff60ec fleets.json: remove go-waku fleets and update some other ENRs 2024-02-06 12:34:56 +01:00
Siddarth Kumar 59c07050b2 chore: remove hermes enable condition (#18723)
We recently disabled `hermes` for debug builds here -> https://github.com/status-im/status-mobile/pull/18675
A side effect of that is when we run `make nix-update-gradle` the `hermes` pom gets removed from `deps.list`
This pom is necessary for release builds.
Currently that pom exists in `deps.list` but someone may accidentally remove it when running `make nix-update-gradle`

In this commit we remove the conditional implementation of `hermes` or `jsc` in `build.gradle`
This ensures that the `hermes` pom we need during release builds is not removed from `deps.list`.

I also ran `make nix-update-gradle` just to be sure.
I compared the apk in this commit to other PRs and the size increased by 2MB.
A small price to pay so that the team can run Malli locally without crashing their debug app frequently.

I've added a FIXME comment in the code for when we want to cut back on bundle size later.
2024-02-06 16:57:05 +05:30
Lungu Cristian 431b6c36ca fix: collectibles scroll crash (#18658) 2024-02-06 13:15:23 +02:00
Yevheniia Berdnyk 2e7a9c82ff e2e: fix for deep/universal links test 2024-02-05 16:08:18 +02:00
Nikolay 32442945ee chore(wallet): connect remove account rpc request (#18601) 2024-02-05 04:29:25 -08:00
Nikolay 19ac0eea08 Collectible counter component #18632 (#18653) 2024-02-05 04:17:49 -08:00
Jamie Caprani 0964424a36 chore: remove old wallet signals and move signals to status-im ns (#18285) 2024-02-05 03:40:58 -08:00
Parvesh Monu b6ce60eccf Disable multiple button presses (#18478) 2024-02-05 15:26:14 +05:30
Omar Basem a6565b52ce fix: test networks short-name->id (#18692)
* fix: test networks short-name->id
2024-02-05 09:15:30 +04:00
John Ngei 154fbb156d added empty state illustrations image for pinned messages 2024-02-02 23:24:34 +01:00
John Ngei 9c884d1173 fixed: input field does not adjust its size to the scanned data from a QR code 2024-02-02 23:14:49 +01:00
Mohamed Javid 4dded72878 Wallet - Add support for Sepolia testnet and Rarible collectible provider (#18519)
This commit adds support for the Sepolia test network and Rarible collectible/collection provider.

---------

Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
2024-02-02 19:44:00 +05:30
Ulises Manuel c7bf9f00b5 [#18459] - Add cursor-based input to token-input (#18594) 2024-02-01 20:02:00 -06:00
Ulises Manuel b6ddd8b5ff [#18495] Fix token not ready for next screen (#18532)
* Fix exception thrown re-frame don't have the subs' value ready

* Make Token malli schema more lenient

*  Make `get-standard-crypto-format` able to work with `nil` values

*  Refactor token screen to move subscriptions inside render function

* Make token input reactive to on-swap

* Remove `crypto-currency?` atom to properly react to state changes

* Fix component tests
2024-02-01 17:51:12 -06:00
Yevheniia Berdnyk 3f9cd3a688 e2e: fixes 01.02 2024-02-01 20:36:51 +02:00
Mohsen 675897c9ab [#18313] feat: implement change profile picture (#18440) 2024-02-01 19:45:58 +03:30
Siddarth Kumar df76881c90 chore: disable hermes via gradle project env var (#18675)
fixes #18493

We enabled `hermes` for android in the `react-native` upgrade to `0.72.5`
Although things seemed fine but developers were seeing frequent crashes in their local environment.

After some investigation the crashes were traced to max native call stack depth in `hermes` engine.
Disabling `hermes` for local debug builds helps fix that issue.

This commit disables `hermes` by default with the help of a exporting an environment variable in the `make run-android` command.
It is annoying that this also modifies `android/gradle.properties` so we keep `hermesEnabled` as `false` there as well.
We also enable `hermes` when generating release builds so that we can take advantage of `hermes` engine in release builds.

We also add a log to print whether `hermes` is enabled or not. I think its helpful to have this so that we know whether `hermes` is enabled or not.
2024-02-01 20:56:18 +05:30
Brian Sztamfater e54932057d fix: reintroduce changes for sending erc20 token and collectibles (#18679)
Signed-off-by: Brian Sztamfater <brian@status.im>
2024-02-01 12:03:04 -03:00
Volodymyr Kozieiev a95f2a0f52 Implement menu on collectible preview page (#18651) 2024-02-01 12:48:48 +00:00
Icaro Motta 38dbd6687e Disable flag ACCOUNT_SELECTION_ENABLED by default (#18690) 2024-01-31 23:58:37 -03:00
Ajay SivanandIcaro Motta 4633fc22ed Show token permissions only for role permissions (#18549)
Token requirements that are not role permissions (currently channel permissions)
should not be displayed to the user while they see permissions to join.

Admin, Master, Owner or minted token permissions are not membership permissions,
but they still should be displayed so the user understand the role they will
assume after joining.

Co-authored-by: Icaro Motta <icaro.ldm@gmail.com>
2024-01-31 21:03:54 -03:00
Ibrahem Khalil 7e31e028fa Bring back enable-notifications onboarding screen static image (#18654) 2024-01-31 16:01:30 +02:00
Mohamed Javid 067b2d5afb [Fix] Wallet - Route not found (#18682)
This commit fixes the route not fetched bug on the Wallet send flow.

Signed-off-by: Mohamed Javid <19339952+smohamedjavid@users.noreply.github.com>
2024-01-31 16:45:21 +05:30
BalogunofAfrica e4ba0d3062 fix: android shadow (#18504) 2024-01-31 12:02:27 +01:00
Icaro Motta 11e49c0cc3 Fix community logo/name not rendered correctly (#18633) 2024-01-30 19:37:45 -03:00
269 changed files with 5091 additions and 2286 deletions
+13 -12
View File
@@ -16,18 +16,19 @@
: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
taoensso.timbre log}} status-im.feature-flags ff
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}
+28 -3
View File
@@ -160,10 +160,12 @@ 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! /' \
> resources/config/fleets.json > $(FLEETS_FILE)
echo >> $(FLEETS_FILE)
$(KEYSTORE_PATH): export TARGET := keytool $(KEYSTORE_PATH): export TARGET := keytool
$(KEYSTORE_PATH): $(KEYSTORE_PATH):
@@ -273,6 +275,9 @@ 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
@@ -368,15 +373,20 @@ 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 := ^(?!status-im\.integration-test).*-test$$ test-unit: export SHADOW_NS_REGEXP := ^(?!tests\.integration-test)(?!tests-im\.contract-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 := ^status-im\.integration-test.*$$ test-integration: export SHADOW_NS_REGEXP := ^tests\.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:
@@ -452,3 +462,18 @@ 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)"
+13 -14
View File
@@ -267,25 +267,24 @@ 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
if (hermesEnabled.toBoolean()) { // https://github.com/status-im/status-mobile/pull/18675
implementation("com.facebook.react:hermes-android") implementation("com.facebook.react:hermes-android")
} else { // FIXME: implementing both hermes & JSC increases bundle size by ~ 2MB
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")
} }
+3 -1
View File
@@ -57,4 +57,6 @@ 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.
hermesEnabled=true # Disabled for debug builds to avoid 'maximum call stack exceeded' errors.
# 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.4' library 'status-jenkins-lib@v1.8.5'
/* 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.4' library 'status-jenkins-lib@v1.8.5'
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.4' library 'status-jenkins-lib@v1.8.5'
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.4' library 'status-jenkins-lib@v1.8.5'
/* 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.4' library 'status-jenkins-lib@v1.8.5'
/* 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.7.15' library 'status-jenkins-lib@v1.8.5'
pipeline { pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.15' library 'status-jenkins-lib@v1.8.5'
pipeline { pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.15' library 'status-jenkins-lib@v1.8.5'
pipeline { pipeline {
+1 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env groovy #!/usr/bin/env groovy
library 'status-jenkins-lib@v1.7.15' library 'status-jenkins-lib@v1.8.5'
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.7.15' library 'status-jenkins-lib@v1.8.5'
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.7.15' library 'status-jenkins-lib@v1.8.5'
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.7.15' library 'status-jenkins-lib@v1.8.5'
pipeline { pipeline {
agent { agent {
+11
View File
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,5 @@
appId: im.status.ethereum.debug
---
- tapOn: "password-input"
- inputText: "password123" # update your account password here
- tapOn: login-button
+15
View File
@@ -0,0 +1,15 @@
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.0.0-rc-2", "path": "com/google/protobuf/protobuf-bom/4.26.0-RC1",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"protobuf-bom-4.0.0-rc-2.pom": { "protobuf-bom-4.26.0-RC1.pom": {
"sha1": "1cf14b7774313bc34805dd58fffa3cbc35601184", "sha1": "95b890ee6f318b67514a9d3573c78aebfd8cf4c1",
"sha256": "sha256-45/pSYKw70HwkoTPbtPkj0Bsu/ZtioKD0MYmk04KYTI=" "sha256": "sha256-rGscgQUEAvrvFw6SnyMSbIw7N0J6SEgo4bo8nmAbO04="
} }
} }
}, },
@@ -11520,16 +11520,16 @@
}, },
{ {
"path": "com/google/protobuf/protobuf-java/4.0.0-rc-2", "path": "com/google/protobuf/protobuf-java/4.26.0-RC1",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"protobuf-java-4.0.0-rc-2.pom": { "protobuf-java-4.26.0-RC1.pom": {
"sha1": "8fab0fe0746b1d370663a3db7dd483c2c4d34a6f", "sha1": "9b053265705abd2eb8dd06831b4728ed19e8f79a",
"sha256": "sha256-q//aKX5NdsCktWMRsnjG/L3jNI9g/ucIGLN119ZzT50=" "sha256": "sha256-cexXywR1/FPS885SUYezfvvww1TAjy6gAtAmxJVxn0Y="
}, },
"protobuf-java-4.0.0-rc-2.jar": { "protobuf-java-4.26.0-RC1.jar": {
"sha1": "ae590f34383d2d6fde2b3b8e2ffb668e64579099", "sha1": "a4718e6e4943736bb27aa3c7f8ef3c0a851c35b1",
"sha256": "sha256-PMJSvvZfetM8UwzuxxZkzR2gsmUhrWZzpl2fpJMegio=" "sha256": "sha256-cgTa51zMiegEQa2I9pyGy9psCQ5tPJU9MfMoC8DyDDg="
} }
} }
}, },
@@ -11627,38 +11627,38 @@
}, },
{ {
"path": "com/google/protobuf/protobuf-parent/4.0.0-rc-2", "path": "com/google/protobuf/protobuf-parent/4.26.0-RC1",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"protobuf-parent-4.0.0-rc-2.pom": { "protobuf-parent-4.26.0-RC1.pom": {
"sha1": "c5391c7917ca1197cbbda4efc6454a87e7e7107e", "sha1": "80963cafb79bc1b0f5dd2c1c82c67016c2362ad4",
"sha256": "sha256-4NJwgSugXAqrlx4wtRyl0VcmYBkGxiGsIM3LLkq2fi8=" "sha256": "sha256-n+4hEMufYvUwFQts4WiDUYKyGGnivQQhyc2bS7fODMs="
} }
} }
}, },
{ {
"path": "com/google/truth/truth-parent/1.2.0", "path": "com/google/truth/truth-parent/1.4.0",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"truth-parent-1.2.0.pom": { "truth-parent-1.4.0.pom": {
"sha1": "d24447b2a11846a354e503575ed95e393ba5158d", "sha1": "08b3f870d82e4e34caa1aa94ca03c29d9b40d3d2",
"sha256": "sha256-Q8/2l2yxZ5ETlTWluYDpwTW8Fgxk7hGc/6qNHv9aquI=" "sha256": "sha256-K+3ssiZ3EYKh/sxgh3NFLyTPuMEjreDzymb4pmmU3Gs="
} }
} }
}, },
{ {
"path": "com/google/truth/truth/1.2.0", "path": "com/google/truth/truth/1.4.0",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"truth-1.2.0.pom": { "truth-1.4.0.pom": {
"sha1": "44853be2a0532449235377b3eea680b679cefa7e", "sha1": "6ff4bdfe8a3758a755b52ad894b7d983c88e4850",
"sha256": "sha256-4snQPEXLKYR49KPOM37mXXsk+nVA/PSEy/OkvuQCuVo=" "sha256": "sha256-v4+lYqfRXWNEU9f/LidC/eACm2VNhwtK0uejf89mTnY="
}, },
"truth-1.2.0.jar": { "truth-1.4.0.jar": {
"sha1": "0135db6c1dfab1b3ca326c8ce51c09381d332d43", "sha1": "2a9475ed8cf2081b859fda8f9c860d5c449cd9ed",
"sha256": "sha256-tGEIQNXjffFOZqqwuEDA7j+l6Vl9o6KQIGQYcXHCM5o=" "sha256": "sha256-I1wo6W7mcBqwHMhS+ylMsPNHVvY2qBVLmu8I+xIVu8Q="
} }
} }
}, },
@@ -17512,16 +17512,16 @@
}, },
{ {
"path": "org/jetbrains/kotlin/kotlin-reflect/2.0.0-Beta2", "path": "org/jetbrains/kotlin/kotlin-reflect/2.0.0-Beta3",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"kotlin-reflect-2.0.0-Beta2.pom": { "kotlin-reflect-2.0.0-Beta3.pom": {
"sha1": "71908b10dd3fefa0509880918948931ad0b8d7c8", "sha1": "dc97aad46542eaa0cb64120911ac1013483969ac",
"sha256": "sha256-TmkaczZz+Eqbux6yz2SyE9WhflLrknrULgk8j/2sfUs=" "sha256": "sha256-NnPskjZQvqH3zdWL94mDT/EMvy51senYGEbKjz+ya64="
}, },
"kotlin-reflect-2.0.0-Beta2.jar": { "kotlin-reflect-2.0.0-Beta3.jar": {
"sha1": "0cf9ed5d13e31c4e4ab74be627b7cedc0ecc7715", "sha1": "6915153788502bdccc98753f41dcbd5bf7c7e128",
"sha256": "sha256-PAz62O51jigTUVGhAJHGrWdbLoVdCFwwhhI883u50bw=" "sha256": "sha256-k4zOXYaKP8MBwjWAOLuEt0ahsLlSHtdnldJma/o0e2Y="
} }
} }
}, },
@@ -18769,28 +18769,28 @@
}, },
{ {
"path": "org/jetbrains/kotlin/kotlin-stdlib/2.0.0-Beta2", "path": "org/jetbrains/kotlin/kotlin-stdlib/2.0.0-Beta3",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"kotlin-stdlib-2.0.0-Beta2.pom": { "kotlin-stdlib-2.0.0-Beta3.pom": {
"sha1": "a1310fbc42c0cbc786766d2e35dcbfdaf3f8a8b1", "sha1": "1005b3f259dffb93f972e5227eb18fc579b71811",
"sha256": "sha256-8upeJFveFokz2f2rBOXj2KZ9+OzyWxWtqZ9/2qcJGnI=" "sha256": "sha256-2qxjaqrwUBME9CbB4lpEKGV4qi2VGn8USteyCSZ8lq4="
}, },
"kotlin-stdlib-2.0.0-Beta2-all.jar": { "kotlin-stdlib-2.0.0-Beta3-all.jar": {
"sha1": "c844df2813fa56f8baa346530a5172ccf03277d0", "sha1": "845c7a75152307a41522e800bb9706a58e02b228",
"sha256": "sha256-o8TV9hZ9IGumB5g+8nq6R6YU+VxlRV0PJ3IsSsMRsSM=" "sha256": "sha256-YwNHMM8zT64dAULHPNt+zLXQ5xTeAvtP/HKybthMDWI="
}, },
"kotlin-stdlib-2.0.0-Beta2-common.jar": { "kotlin-stdlib-2.0.0-Beta3-common.jar": {
"sha1": "e0224f6b9468655e1feffe789ab7ebd4965a9431", "sha1": "e0224f6b9468655e1feffe789ab7ebd4965a9431",
"sha256": "sha256-ikItp8AZFxM/bokvCF68e2Q+oNGbbJxTILtPDnj7uMI=" "sha256": "sha256-ikItp8AZFxM/bokvCF68e2Q+oNGbbJxTILtPDnj7uMI="
}, },
"kotlin-stdlib-2.0.0-Beta2.jar": { "kotlin-stdlib-2.0.0-Beta3.jar": {
"sha1": "61be8a13ad24f43c915ba6962440cd30af4700ec", "sha1": "9982637ebb69602015ed823cceca7054d2ab8bbe",
"sha256": "sha256-yDOkRXCSzieZ5nejro0ku4suO6qDwWlDBdnb5ZHgquA=" "sha256": "sha256-1+6KuGuMgmiuPLpxx+cJSZ3/pnVOMmLdtzmk3mwB0ro="
}, },
"kotlin-stdlib-2.0.0-Beta2.module": { "kotlin-stdlib-2.0.0-Beta3.module": {
"sha1": "22702775430e8d3a9f8d824167e00484e07d5932", "sha1": "5026675037ebf81e108eb3cc581a24570ec7ceb2",
"sha256": "sha256-J6vVZxhfZbGpw8tTtV4RQTPJrkFqMwetPevDDG/iO/U=" "sha256": "sha256-rlVFQM89Ga0h57LsViIgT8iSdE18G0rd/TN7/u9UKrU="
} }
} }
}, },
@@ -19055,16 +19055,16 @@
}, },
{ {
"path": "org/junit/junit-bom/5.10.1", "path": "org/junit/junit-bom/5.10.2",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"junit-bom-5.10.1.pom": { "junit-bom-5.10.2.pom": {
"sha1": "41a86ea51227739a5b7ca3430ae88ce44a64a42a", "sha1": "b25ed98a5bd08cdda60e569cf22822a760e76019",
"sha256": "sha256-IcSwKG9LIAaVd/9LIJeKhcEArIpGtvHIZy+6qzN7w/I=" "sha256": "sha256-Fp3ZBKSw9lIM/+ZYzGIpK/6fPBSpifqSEgckzeQ6mWg="
}, },
"junit-bom-5.10.1.module": { "junit-bom-5.10.2.module": {
"sha1": "1b577334c47deb59a29dc31e5211499d0eb3c17b", "sha1": "ce536748a853ae6ac09e7815fce0678a96cff778",
"sha256": "sha256-IbCvz//i7LN3D16wCuehn+rulOdx+jkYFzhQ2ueAZ7c=" "sha256": "sha256-3iOxFLPkEZqP5usXvtWjhSgWaYus5nBxV51tkn67CAo="
} }
} }
}, },
@@ -19160,16 +19160,16 @@
}, },
{ {
"path": "org/mockito/mockito-core/5.9.0", "path": "org/mockito/mockito-core/5.10.0",
"repo": "https://repo.maven.apache.org/maven2", "repo": "https://repo.maven.apache.org/maven2",
"files": { "files": {
"mockito-core-5.9.0.pom": { "mockito-core-5.10.0.pom": {
"sha1": "2054dcc15b9ede899cb9ec6e8e960e36c68b4574", "sha1": "25e309d012d326eef980de463edeb2a592cf9cdb",
"sha256": "sha256-BJDEL+Yu7WRzQdpAojcHGW2BO0TbKj3KMB2IFz56yPc=" "sha256": "sha256-D4gyKTuHHyO2/0QkET7mXBdfq9G2uswY7Dg8s5akOq8="
}, },
"mockito-core-5.9.0.jar": { "mockito-core-5.10.0.jar": {
"sha1": "faa88b96db3aeb96a93e83dec7491345bfbfc414", "sha1": "b3812fa2ee069f1d0b41c1c0155da79d0e1dcde0",
"sha256": "sha256-u62Rhe1zSWX6x+Nn8OUVlvaVMeUdiyy87BBI3W+0Hyw=" "sha256": "sha256-AyP1kbBNOg18qevuu56fNKB8DskWm3RE7jlRtx1MrVY="
} }
} }
}, },
+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.0.0-rc-2/protobuf-bom-4.0.0-rc-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-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.0.0-rc-2/protobuf-java-4.0.0-rc-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-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.0.0-rc-2/protobuf-parent-4.0.0-rc-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/truth/truth-parent/1.2.0/truth-parent-1.2.0.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/1.2.0/truth-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/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-Beta2/kotlin-reflect-2.0.0-Beta2.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-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-Beta2/kotlin-stdlib-2.0.0-Beta2.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-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.1/junit-bom-5.10.1.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/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.9.0/mockito-core-5.9.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-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,6 +79,9 @@ 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,4 +97,5 @@ 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
@@ -0,0 +1,29 @@
{ 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 yarn nodejs python310 maestro
] # and some special cases ] # and some special cases
++ lib.optionals stdenv.isDarwin ([ cocoapods clang tcl ] ++ appleSDKFrameworks) ++ lib.optionals stdenv.isDarwin ([ cocoapods clang tcl idb-companion ] ++ appleSDKFrameworks)
++ lib.optionals (!stdenv.isDarwin) [ gcc8 ] ++ lib.optionals (!stdenv.isDarwin) [ gcc8 ]
); );
+74 -43
View File
@@ -1,7 +1,7 @@
{ {
"meta": { "meta": {
"hostname": "node-01.do-ams3.sites.misc", "hostname": "node-01.do-ams3.sites.misc",
"timestamp": "2023-01-05T10:03:38.657813", "timestamp": "2024-02-02T14:48:22.521541",
"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:-M-4QLdAB-KyzT3QEsDoNa4LXT6RGH9BIylvTlDFLQhigWmxKEesulgc8AoKmVEUKj_4St6ThBKwyBc69tBfCe2hVTABgmlkgnY0gmlwhLymh5GKbXVsdGlhZGRyc7EALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi5wcm9kLnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDbl1X_zJIw3EAJGtmHMVn4Z2xhpSoUaP5ElsHKCv7hlWDdGNwgnZfg3VkcIIjKIV3YWt1Mg8", "node-01.do-ams3.wakuv2.prod": "enr:-P-4QJI8tS1WTdIQxq_yIrD05oIIW1Xg-tm_qfP0CHfJGnp9dfr6ttQJmHwTNxGEl4Le8Q7YHcmi-kXTtphxFysS11oBgmlkgnY0gmlwhLymh5GKbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi5wcm9kLnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDbl1X_zJIw3EAJGtmHMVn4Z2xhpSoUaP5ElsHKCv7hlWDdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
"node-01.gc-us-central1-a.wakuv2.prod": "enr:-Nm4QNgc2L6L-4nk6jgllNDE1QDcn6kv2922rTRYs1wM3My_OmSsTimkMCIMh8fat6enFdYfuJ23KjWdF5whBz3zXgUBgmlkgnY0gmlwhCJ5ZGyKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA_30kHgQqfXZRioa4J_u5asgXTJ5iw_8w3lEICH4TFu_g3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "node-01.gc-us-central1-a.wakuv2.prod": "enr:-QERuEC0EGWTjg_gYdnuPypJ9LAbB3lml6M8GiRajGegL2iWEj1MJzUMV9X6jXw7mMAQQLozLCTLFT-zv-ELQLPwWdACAYJpZIJ2NIJpcIQieWRsim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdXYyLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA_30kHgQqfXZRioa4J_u5asgXTJ5iw_8w3lEICH4TFu_g3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-01.ac-cn-hongkong-c.wakuv2.prod": "enr:-Nm4QOdTOKZJKTUUZ4O_W932CXIET-M9NamewDnL78P5u9DOGnZlK0JFZ4k0inkfe6iY-0JAaJVovZXc575VV3njeiABgmlkgnY0gmlwhAjS3ueKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAo0C-VvfgHiXrxZi3umDiooXMGY9FvYj5_d1Q4EeS7eyg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP" "node-01.ac-cn-hongkong-c.wakuv2.prod": "enr:-QERuEDABor1lVmSa5ek8of5eBc8jZoxxdleJVLLdMl8UeZHNwhsVp64SFiCT4BRIIfcs7uxTPUCjmWxK_OA1s-FfIW7AYJpZIJ2NIJpcIQI0t7nim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdXYyLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIucHJvZC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAo0C-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:-M-4QCtJKX2WDloRYDT4yjeMGKUCRRcMlsNiZP3cnPO0HZn6IdJ035RPCqsQ5NvTyjqHzKnTM6pc2LoKliV4CeV0WrgBgmlkgnY0gmlwhIbRi9KKbXVsdGlhZGRyc7EALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi50ZXN0LnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDnr03Tuo77930a7sYLikftxnuG3BbC3gCFhA4632ooDaDdGNwgnZfg3VkcIIjKIV3YWt1Mg8", "node-01.do-ams3.wakuv2.test": "enr:-P-4QPLMQ1zIYRAs4-F0mYmMxMihSySRtEIuGHJ_Qd_GL8XqUE78hpVUE97rgwlXnxPkzMJHkWyiNq7DT1fdZSy3QcgBgmlkgnY0gmlwhIbRi9KKbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLndha3V2Mi50ZXN0LnN0YXR1c2ltLm5ldAYfQN4DiXNlY3AyNTZrMaEDnr03Tuo77930a7sYLikftxnuG3BbC3gCFhA4632ooDaDdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
"node-01.gc-us-central1-a.wakuv2.test": "enr:-Nm4QLHYoJ5WYQoVzyqPR-pwIeQvi3ONWs-EPwk3uUiBiDseN9Dd7fYbCvkMdeXcuZ-8U9IYdGm38VxSDf_Oq3zZ0cEBgmlkgnY0gmlwhGia74CKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA1giYsmWV9r2yJZYAiMGHJfjLlLeqAuTAokUGPN__pkxg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "node-01.gc-us-central1-a.wakuv2.test": "enr:-QERuEDZcXS5tjppj4TIlOm-TLanjmqx3-uk2kGFvvAQR1NVrklUhiN1JCb5dWucEQ_oDADOb6nG_1mJ5goF5CHneZ-VAYJpZIJ2NIJpcIRomu-Aim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEud2FrdXYyLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhA1giYsmWV9r2yJZYAiMGHJfjLlLeqAuTAokUGPN__pkxg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-01.ac-cn-hongkong-c.wakuv2.test": "enr:-Nm4QC0_ClHzbsutYzgT3jJm7ZY1D4shylAdd6Ac-L4uwAUha1oHM0zwoEkTORVt94W5Cpa0IiyrTcXAYLgpRXpVNUsBgmlkgnY0gmlwhC_y0kmKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAhAm-P4q6mWONKcGnbLPU8WXZJ4Qs3AxIbrycvc7PVKsg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP" "node-01.ac-cn-hongkong-c.wakuv2.test": "enr:-QERuEC2LyiXKURIKxNHa7Mj7frsM-lZiAGJ-2mopR3w8LMn2UhKmahZ9RHKV5ehBN1fXbRYqAeiXuOxD9t2igF4PIizAYJpZIJ2NIJpcIQv8tJJim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMud2FrdXYyLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy53YWt1djIudGVzdC5zdGF0dXNpbS5uZXQGH0DeA4lzZWNwMjU2azGhAhAm-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,6 +116,23 @@
"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",
@@ -126,12 +143,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:-M-4QLOTEs_ZFxCb09FgIezZd5KeTru5CWWyEtMWMN-yUABrerWxckU-pMIh3yO8VjxHpgZ4jU2WSXuK3goW4uYb6c4BgmlkgnY0gmlwhI_G-a6KbXVsdGlhZGRyc7EALzYobm9kZS0wMS5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaECoVyonsTGEQvVioM562Q1fjzTb_vKD152PPIdsV7sM6SDdGNwgnZfg3VkcIIjKIV3YWt1MgM", "node-01.do-ams3.status.prod": "enr:-P-4QGVNANzbhCI49du6Moyw98AjuMhKoOpE_Jges9JlCq-ICAVadktjfcNpuhQgT0g1cu86_S3nbM7eYkCsqDAQG7UBgmlkgnY0gmlwhI_G-a6KbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaECoVyonsTGEQvVioM562Q1fjzTb_vKD152PPIdsV7sM6SDdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
"node-02.do-ams3.status.prod": "enr:-M-4QIhQjPgSnoKXLsJAxbRzF8cZYYjOfdt1ysBkibcriCvXb9lWHDiRghIv11JQltK5KYFs2zrCKoQ-_ZoRXEs5FasBgmlkgnY0gmlwhKEj9HmKbXVsdGlhZGRyc7EALzYobm9kZS0wMi5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaED1AYI2Ox27DnSqf2qoih5M2fNpHFq-OzJ3thREEApdiiDdGNwgnZfg3VkcIIjKIV3YWt1MgM", "node-02.do-ams3.status.prod": "enr:-P-4QMXNung2KVE9xLMzctM754vz4kbavb4Stai3RBPfN-5XMfuf2i0x8J5l8fkxkiZ3Vpd0IkN9Gg0PbbDh2BUyIF8BgmlkgnY0gmlwhKEj9HmKbXVsdGlhZGRyc7hgAC02KG5vZGUtMDIuZG8tYW1zMy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMi5kby1hbXMzLnN0YXR1cy5wcm9kLnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaED1AYI2Ox27DnSqf2qoih5M2fNpHFq-OzJ3thREEApdiiDdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
"node-01.gc-us-central1-a.status.prod": "enr:-Nm4QPRAGqCjHCuu3DjbDVoLPqpE35Lfc3mjdCsmGTqdWmxjOF2NAbdYezEnukrz38TkTNXzEdslw_n_H5uUQ3hi-2EBgmlkgnY0gmlwhCPKN5mKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAhoqdPkAZNvNRuzEecDGwnt5UbF98qwM16PZG3JmW6kUg3RjcIJ2X4N1ZHCCIyiFd2FrdTID", "node-01.gc-us-central1-a.status.prod": "enr:-QERuEAFZ-rlajEo617uz0NDycgW4cPqqBumBvTOWywyFzIg4UOmbctTjYi6sfMArMgJEIDpphaXpLkCt5r12_gmtDQlAYJpZIJ2NIJpcIQjyjeZim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEuc3RhdHVzLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAhoqdPkAZNvNRuzEecDGwnt5UbF98qwM16PZG3JmW6kUg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-02.gc-us-central1-a.status.prod": "enr:-Nm4QEdveBFdGPTVPCmYBikMKtGFlvLnzvXfYLOWDLPtTejBLcV_9e5Ry7dqx5K027rn5zedG-HnNiHP_GBcdCpGnq0BgmlkgnY0gmlwhCKE1emKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDIuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAwtASPpiz5Gq3zuFuWF4MTviQVipi3HaQGytF-4wfbdvg3RjcIJ2X4N1ZHCCIyiFd2FrdTID", "node-02.gc-us-central1-a.status.prod": "enr:-QERuEA_42Fh7Kq3drLxfIuRkqMfoJpfKpjwRcUXLv1PUQdUt1AAhIOUpun_kHKAMBmrREU9y2VoTKykl0dPBw02Fbh-AYJpZIJ2NIJpcIQihNXpim11bHRpYWRkcnO4cgA2NjFub2RlLTAyLmdjLXVzLWNlbnRyYWwxLWEuc3RhdHVzLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDIuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAwtASPpiz5Gq3zuFuWF4MTviQVipi3HaQGytF-4wfbdvg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-01.ac-cn-hongkong-c.status.prod": "enr:-Nm4QOxEmmi5LQo3EwmHCagXOzVXzsLDGDwPDTL6ECmUCoXPYV0ldWvzMVqPOEPzXMCtECdk7xpleiNN85oKQxFiGnYBgmlkgnY0gmlwhC_yyjuKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAgwDLi50TMXqxWTCnR_rjQP3Eeznjs645ZNBoRh5B3jhg3RjcIJ2X4N1ZHCCIyiFd2FrdTID", "node-01.ac-cn-hongkong-c.status.prod": "enr:-QERuEAVmLHSKOsMq2Atya-0mhdvu718BAcynh40JAPBprvhpgcsTqkXV5kRrxaZbtzKa5-b0I4aO9U_O7-zHe24UDMAAYJpZIJ2NIJpcIQv8so7im11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMuc3RhdHVzLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAgwDLi50TMXqxWTCnR_rjQP3Eeznjs645ZNBoRh5B3jhg3RjcIJ2X4N1ZHCCIyiFd2FrdTIL",
"node-02.ac-cn-hongkong-c.status.prod": "enr:-Nm4QOqKQ4bi7sYE1ZXAqnryEGeJOnQxIzo9UK5xHY_GeP4healoFVspoG2FaUCSyIg8pa4X2P99BbC15iSh98NIgPYBgmlkgnY0gmlwhC_zgIaKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDIuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAzE4YIBrPK5oT_9MvYEeggmaDd205iU4Nn1MAhU5xqY5g3RjcIJ2X4N1ZHCCIyiFd2FrdTID" "node-02.ac-cn-hongkong-c.status.prod": "enr:-QERuECscpffU15jE9GD77vwwKCeAWn8jBl7IXS9fMj8FcY6YzBPNNr17pXuOHPqhLbieZxM3zc0AMWDa5tWqpfbtzMKAYJpZIJ2NIJpcIQv84CGim11bHRpYWRkcnO4cgA2NjFub2RlLTAyLmFjLWNuLWhvbmdrb25nLWMuc3RhdHVzLnByb2Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDIuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAzE4YIBrPK5oT_9MvYEeggmaDd205iU4Nn1MAhU5xqY5g3RjcIJ2X4N1ZHCCIyiFd2FrdTIP"
}, },
"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",
@@ -149,9 +166,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:-M-4QI1qCnM3DMuZR2Y86FygFXPtm9fIRc4rFdUaDj0NbEA3Jl4In8mXAjUWgoei7W9Grc7oqtgibmIo-HIHHg7wrhMBgmlkgnY0gmlwhEDhUe2KbXVsdGlhZGRyc7EALzYobm9kZS0wMS5kby1hbXMzLnN0YXR1cy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaECBNx5Erw5Jdsw-uI9pBjB_V2R6brvuVWE-MJwYCQKVv6DdGNwgnZfg3VkcIIjKIV3YWt1Mg8", "node-01.do-ams3.status.test": "enr:-P-4QOg_CbInUakb3TEQBeCICyC-QDPeWK-CGtV9-nWp1W5DOKE2va63re3nPw-_hgvJfJkvshTaV0VmditigxKxT_kBgmlkgnY0gmlwhEDhUe2KbXVsdGlhZGRyc7hgAC02KG5vZGUtMDEuZG8tYW1zMy5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGdl8ALzYobm9kZS0wMS5kby1hbXMzLnN0YXR1cy50ZXN0LnN0YXR1c2ltLm5ldAYBu94DiXNlY3AyNTZrMaECBNx5Erw5Jdsw-uI9pBjB_V2R6brvuVWE-MJwYCQKVv6DdGNwgnZfg3VkcIIjKIV3YWt1Mg8",
"node-01.gc-us-central1-a.status.test": "enr:-Nm4QFxGf89g3MGnCLYBxBgpXejyB44mvXvJSpNzjlRwNXO6BIn7hl66OJpESPWdH7ipHNemmz0e04wtJHe_wVV5woABgmlkgnY0gmlwhCJ6_HaKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAzToWxPoQnnubNH_CIu7YHPV0RHadQVIKlpfMJxxC2eFg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "node-01.gc-us-central1-a.status.test": "enr:-QERuED3i2Oj7jWVR6QyPE_R0WO4Kec4CuUf8Pf6YrEXB6mvFwW_Y2wyHExqajqKR-ke-129TwAwovz2QjErTUga6rM8AYJpZIJ2NIJpcIQievx2im11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmdjLXVzLWNlbnRyYWwxLWEuc3RhdHVzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAzToWxPoQnnubNH_CIu7YHPV0RHadQVIKlpfMJxxC2eFg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP",
"node-01.ac-cn-hongkong-c.status.test": "enr:-Nm4QCF2zwCuAZzxTtjjjbo5hn6vx0ICcEJBGRBMdDCfpoX5BGiApbfhEljEjpI4ePhYra_k0o5uI8eTTGYHkr6208gBgmlkgnY0gmlwhC_y6SSKbXVsdGlhZGRyc7g6ADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAmRvsjqPlfX7OOJ4x4F3GAOpBa4y4NQSoNHjX2XIo1lvg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP" "node-01.ac-cn-hongkong-c.status.test": "enr:-QERuEDoxPEax-hctqp6vg2cmvd2UNPjgdf6iWmgvShX2-hL_Wj2JHpjVua9buZTYLsLD-Or5e71hwlgZlFaceEfopnzAYJpZIJ2NIJpcIQv8ukkim11bHRpYWRkcnO4cgA2NjFub2RlLTAxLmFjLWNuLWhvbmdrb25nLWMuc3RhdHVzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MW5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5zdGF0dXMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAmRvsjqPlfX7OOJ4x4F3GAOpBa4y4NQSoNHjX2XIo1lvg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP"
}, },
"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",
@@ -159,38 +176,52 @@
"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"
} }
}, },
"go-waku.prod": { "shards.test": {
"tcp/p2p/waku": { "tcp/p2p/waku/boot": {
"node-01.do-ams3.go-waku.prod": "/dns4/node-01.do-ams3.go-waku.prod.statusim.net/tcp/30303/p2p/16Uiu2HAkyScd7DiwgMwzfw8CFFhznH3wRzciqEUfjDzn7vyimR8c", "boot-01.do-ams3.shards.test": "/dns4/boot-01.do-ams3.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAmAR24Mbb6VuzoyUiGx42UenDkshENVDj4qnmmbabLvo31",
"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.gc-us-central1-a.shards.test": "/dns4/boot-01.gc-us-central1-a.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAm8mUZ18tBWPXDQsaF7PbCKYA35z7WB2xNZH2EVq1qS8LJ",
"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" "boot-01.ac-cn-hongkong-c.shards.test": "/dns4/boot-01.ac-cn-hongkong-c.shards.test.statusim.net/tcp/30303/p2p/16Uiu2HAmGwcE8v7gmJNEWFtZtojYpPMTHy2jBLL6xRk33qgDxFWX"
}, },
"enr/p2p/waku": { "enr/p2p/waku/boot": {
"node-01.do-ams3.go-waku.prod": "enr:-NC4QGRYrus1rbuI183CZmxjb1wL4_wdNMcJDKaxaTaRs-RUTXP6KQ0VxL8zGaPNNxLT45ItXS8dmQvcyBWUlTwqXfYBgmlkgnY0gmlwhIbRh8OKbXVsdGlhZGRyc7IAMDYpbm9kZS0wMS5kby1hbXMzLmdvLXdha3UucHJvZC5zdGF0dXNpbS5uZXQGAbveA4lzZWNwMjU2azGhAjusiHwKZa-rftTSq-KnDnirfCBW-q5ClJf4YEw9N8_Jg3RjcIJ2X4N1ZHCCIyiFd2FrdTIP", "boot-01.do-ams3.shards.test": "enr:-QEOuEAuAK49evunDoidpHqcmeVqZz73wt4jwHnHJlmCVBFj6EdIbZ9uH5BnCYKOEPJTns2QJKUR2XLtWyzIspPAfJF9AYJpZIJ2NIJpcISnYxMvim11bHRpYWRkcnO4YAAtNihib290LTAxLmRvLWFtczMuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfAC82KGJvb3QtMDEuZG8tYW1zMy5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAt60bRUEoHNuLlnsM12sU2PIQwBwfLIJ8a_ZPEY2-Rnkg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN",
"node-01.gc-us-central1-a.go-waku.prod": "enr:-Nq4QJuKC3qwV704_zzThJiIaV2Jb1YLLjRzSalpgrgAUV7vU0_fMYTQUshz6hcqds0lR3lHFzhCDEdrT6TmP1rBF1IBgmlkgnY0gmlwhCJ6XvOKbXVsdGlhZGRyc7g7ADk2Mm5vZGUtMDEuZ2MtdXMtY2VudHJhbDEtYS5nby13YWt1LnByb2Quc3RhdHVzaW0ubmV0BgG73gOJc2VjcDI1NmsxoQNlE4TEM5FmqnyDaMQ4viBkHpx2FZb9SPVl_XsVCrn5q4N0Y3CCdl-DdWRwgiMohXdha3UyDw", "boot-01.gc-us-central1-a.shards.test": "enr:-QEguEC3wjzOk7U5rIqiX32CCD-0_J1cYYGK_YwKSah5di2NTxJUaKQ9B7NMiEQ_-YGm-Eus4SzHtxN_fXEuVaNHql9aAYJpZIJ2NIJpcIQihw1Xim11bHRpYWRkcnO4cgA2NjFib290LTAxLmdjLXVzLWNlbnRyYWwxLWEuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MWJvb3QtMDEuZ2MtdXMtY2VudHJhbDEtYS5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAsY6oA0NFskUjopWFN9gwOZP1zZQ4rN5tVXV5CvcTOpDg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN",
"node-01.ac-cn-hongkong-c.go-waku.prod": "enr:-Nq4QFd-E6Ej3RuGF_-zZWYLfIb4vpfhKNi6RiLWrt30O90oNuJnbhUo8rMvuX_sO95X6QoyHa9RaUYx9N7cywA4WWkBgmlkgnY0gmlwhAjSBH6KbXVsdGlhZGRyc7g7ADk2Mm5vZGUtMDEuYWMtY24taG9uZ2tvbmctYy5nby13YWt1LnByb2Quc3RhdHVzaW0ubmV0BgG73gOJc2VjcDI1NmsxoQIeZXd0MFV5YU9q0pWt05cUEc0RnptCtJarNlnxV7OpJYN0Y3CCdl-DdWRwgiMohXdha3UyDw" "boot-01.ac-cn-hongkong-c.shards.test": "enr:-QEguEBb4rlxsdYCIZ8NcAlcjnb2zp4C9JbDsz-01Ix2sKNdWzI79KRFnhlakX-4F8gRYcviDvQL5eEZDOxHTupUW7VXAYJpZIJ2NIJpcIQI2hdMim11bHRpYWRkcnO4cgA2NjFib290LTAxLmFjLWNuLWhvbmdrb25nLWMuc2hhcmRzLnRlc3Quc3RhdHVzaW0ubmV0BnZfADg2MWJvb3QtMDEuYWMtY24taG9uZ2tvbmctYy5zaGFyZHMudGVzdC5zdGF0dXNpbS5uZXQGAbveA4Jyc4sAEAQAIABAAIABAIlzZWNwMjU2azGhAz-wm0ZPmCicDhRTOGfZ3stBj3O1jyWgsBpKTUcpWu5gg3RjcIJ2X4N1ZHCCIyiFd2FrdTIN"
}, },
"wss/p2p/waku": { "wss/p2p/waku/boot": {
"node-01.do-ams3.go-waku.prod": "/dns4/node-01.do-ams3.go-waku.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAkyScd7DiwgMwzfw8CFFhznH3wRzciqEUfjDzn7vyimR8c", "boot-01.do-ams3.shards.test": "/dns4/boot-01.do-ams3.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmAR24Mbb6VuzoyUiGx42UenDkshENVDj4qnmmbabLvo31",
"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.gc-us-central1-a.shards.test": "/dns4/boot-01.gc-us-central1-a.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAm8mUZ18tBWPXDQsaF7PbCKYA35z7WB2xNZH2EVq1qS8LJ",
"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" "boot-01.ac-cn-hongkong-c.shards.test": "/dns4/boot-01.ac-cn-hongkong-c.shards.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmGwcE8v7gmJNEWFtZtojYpPMTHy2jBLL6xRk33qgDxFWX"
},
"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"
} }
}, },
"go-waku.test": { "notify.prod": {
"tcp/p2p/waku": { "tcp/p2p/waku": {
"node-01.do-ams3.go-waku.test": "/dns4/node-01.do-ams3.go-waku.test.statusim.net/tcp/30303/p2p/16Uiu2HAm9vnvCQgCDrynDK1h7GJoEZVGvnuzq84RyDQ3DEdXmcX7", "node-01.do-ams3.notify.prod": "enode://401ba5eda402678dc78a0a40fd0795f4ea8b1e34972c4d15cf33ac01292341c89f0cbc637fa9f7a3ffe0b9dfe90e9cdae7a14925500ab01b6a91c67bae42a97a@178.128.139.80: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.gc-us-central1-a.notify.prod": "enode://181141b1d111908aaf05f4788e6778ec07073a1d4e1ce43c73815c40ee4e7345a1cbf5a90a45f601bf3763f12be63b01624ba1f36eeb9572455e7034b8f9f2c4@34.71.141.140: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" "node-01.ac-cn-hongkong-c.notify.prod": "enode://5ffc34d5ffda180d94cd3974d9ed2bb082ede68f342babdbe801ceffb7da902087d43f9aa961c7b85029358874c08ef04ecad9f1d95a1f0e448cbdd5d04350c7@47.242.88.117:1443"
},
"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.

After

Width:  |  Height:  |  Size: 695 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

+7
View File
@@ -33,10 +33,17 @@ 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'
+30 -7
View File
@@ -45,6 +45,9 @@
;; 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!`.
@@ -63,10 +66,17 @@
{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_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_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_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_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"}
: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
@@ -90,10 +100,17 @@
{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_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_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_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_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"}
: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
@@ -123,10 +140,17 @@
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_OPTIMISM_GOERLI_TOKEN #shadow/env "ALCHEMY_OPTIMISM_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_MAINNET_TOKEN #shadow/env "ALCHEMY_OPTIMISM_MAINNET_TOKEN"
status-im.config/ALCHEMY_ARBITRUM_MAINNET_TOKEN #shadow/env "ALCHEMY_ARBITRUM_MAINNET_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"}
: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
@@ -155,7 +179,6 @@
;; 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,22 +44,37 @@
[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 {:canRequestAccess :can-request-access? (set/rename-keys
:canManageUsers :can-manage-users? {:canRequestAccess :can-request-access?
:canDeleteMessageForEveryone :can-delete-message-for-everyone? :canManageUsers :can-manage-users?
:canJoin :can-join? :canDeleteMessageForEveryone :can-delete-message-for-everyone?
:requestedToJoinAt :requested-to-join-at ;; This flag is misleading based on its name alone
:isMember :is-member? ;; because it should not be used to decide if the user
:adminSettings :admin-settings ;; is *allowed* to join. Allowance is based on token
:tokenPermissions :token-permissions ;; permissions. Still, the flag can be used to know
:communityTokensMetadata :tokens-metadata ;; whether or not the user will have to wait until an
:introMessage :intro-message ;; admin approves a join request.
:muteTill :muted-till :canJoin :can-join?
:lastOpenedAt :last-opened-at :requestedToJoinAt :requested-to-join-at
:joinedAt :joined-at}) :isMember :is-member?
: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?})
@@ -67,9 +82,16 @@
(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?
(some #(= (:type %) constants/community-token-permission-become-member) (->> c
(vals (:tokenPermissions c)))) :tokenPermissions
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))
@@ -1,93 +0,0 @@
(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,7 +8,6 @@
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,7 +19,8 @@
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
@@ -110,6 +111,14 @@
#(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
@@ -130,6 +139,7 @@
(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]
@@ -145,6 +155,7 @@
: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/dispatch-and-chill [::network/connect-network-pressed target-network-id] :on-press #(debounce/throttle-and-dispatch [::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/dispatch-and-chill :on-press #(debounce/throttle-and-dispatch
[(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/dispatch-and-chill [::ens/input-submitted] 3000)} {:on-press #(debounce/throttle-and-dispatch [::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,8 +365,9 @@
: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/dispatch-and-chill [::ens/register-name-pressed address] :on-press #(debounce/throttle-and-dispatch [::ens/register-name-pressed
2000)} address]
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/dispatch-and-chill [:group-chats.ui/create-pressed :on-press #(debounce/throttle-and-dispatch [: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 [dispatch-and-chill]] [utils.debounce :refer [throttle-and-dispatch]]
[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 #(dispatch-and-chill [::network/connect-network-pressed id] 1000)} {:on-press #(throttle-and-dispatch [::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/dispatch-and-chill event 2000)) (debounce/throttle-and-dispatch event 2000))
(defn invitation-sheet (defn invitation-sheet
[{:keys [id]} contact] [{:keys [id]} contact]
@@ -4,14 +4,19 @@
(def backgrounds #{:photo :blur}) (def backgrounds #{:photo :blur})
(defn custom-color-type ;; Note: We hardcode the :light theme for the background-color and apply an overlay when necessary, such
;; 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/custom-color customization-color 50) :background-color (colors/resolve-color customization-color :light)
: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)
@@ -24,7 +29,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)
@@ -32,7 +37,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)
@@ -40,7 +45,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)
@@ -50,7 +55,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)
@@ -58,7 +63,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)
@@ -66,29 +71,32 @@
(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?]}]
(cond (let [customization-color (get {:primary customization-color
(= type :primary) (custom-color-type customization-color icon-only?) :positive :success
(= type :positive) (custom-color-type customization-color icon-only?) :danger :danger}
(= type :danger) (custom-color-type customization-color icon-only?) type)]
(and (= :photo background) (= type :grey)) (grey-photo theme pressed?) (cond
(and (= :blur background) (= type :grey)) (grey-blur theme pressed?) (contains? #{:primary :positive :danger} type) (custom-color-type customization-color
(and (= :blur background) (= type :outline)) (outline-blur theme pressed?) icon-only?)
(= type :grey) (grey theme pressed?) (and (= :photo background) (= type :grey)) (grey-photo theme pressed?)
(= type :dark-grey) (dark-grey theme pressed?) (and (= :blur background) (= type :grey)) (grey-blur theme pressed?)
(= type :outline) (outline theme pressed?) (and (= :blur background) (= type :outline)) (outline-blur theme pressed?)
(= type :ghost) (ghost theme pressed?) (= type :grey) (grey theme pressed?)
(= type :black) (black pressed?))) (= type :dark-grey) (dark-grey theme pressed?)
(= type :outline) (outline theme pressed?)
(= type :ghost) (ghost theme pressed?)
(= type :black) (black pressed?))))
+16 -18
View File
@@ -34,16 +34,13 @@
(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] pressed? on-press-in on-press-out allow-multiple-presses?]
:or {type :primary :or {type :primary
size 40 size 40
customization-color (cond (= type :primary) :blue customization-color (if (= type :primary) :blue nil)}}
(= 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]} blur-overlay-color border-radius overlay-customization-color]}
(button-properties/get-values {:customization-color customization-color (button-properties/get-values {:customization-color customization-color
:background background :background background
:type type :type type
@@ -52,16 +49,17 @@
: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
:on-long-press on-long-press} :allow-multiple-presses? allow-multiple-presses?
: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)
@@ -78,9 +76,9 @@
:icon-left icon-left :icon-left icon-left
:icon-right icon-right}) :icon-right icon-right})
inner-style)} inner-style)}
(when customization-color (when overlay-customization-color
[customization-colors/overlay [customization-colors/overlay
{:customization-color customization-color {:customization-color overlay-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,11 +15,12 @@
[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
:size 24 :allow-multiple-presses? true
:on-press #(on-change (utils/previous-month year month))} :size 24
: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
@@ -27,11 +28,12 @@
: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
:size 24 :allow-multiple-presses? true
:type :outline :size 24
:on-press #(on-change (utils/next-month year month))} :type :outline
: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))
+4 -3
View File
@@ -31,9 +31,10 @@
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
:on-press #(on-press color)} :allow-multiple-presses? true
: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 true {:animated false
:index index :index index
:viewPosition 0.5}))))) :viewPosition 0.5})))))
50))) 50)))
@@ -0,0 +1,34 @@
(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))))
@@ -0,0 +1,57 @@
(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)})
@@ -0,0 +1,39 @@
(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,9 +3,11 @@
[quo.foundations.colors :as colors])) [quo.foundations.colors :as colors]))
(defn divider (defn divider
[theme] [theme blur?]
{:border-top-width 1 {:border-top-width 1
:border-top-color (colors/theme-colors colors/neutral-10 colors/neutral-90 theme) :border-top-color (if blur?
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] [theme blur?]
[rn/view [rn/view
{:style (style/divider theme) {:style (style/divider theme blur?)
:accessible true :accessible true
:accessibility-label :divider}]) :accessibility-label :divider}])
@@ -45,7 +45,7 @@
blur?]}] blur?]}]
[:<> [:<>
(when add-divider? (when add-divider?
[divider theme]) [divider theme blur?])
[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,34 +3,60 @@
[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"
(h/render [bottom-actions/view {:button-one-label "Request to join"}]) (render [bottom-actions/view {:actions :one-action :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" (h/test "render with description & 1 action"
(h/render [bottom-actions/view {:description "Sample description"}]) (render [bottom-actions/view
(h/is-truthy (h/get-by-text "Sample description"))) {:description :bottom
: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"]
(h/render [bottom-actions/view (render [bottom-actions/view
{:actions :2-actions {:actions :two-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"
(h/render [bottom-actions/view (render [bottom-actions/view
{:description "Sample description" {:description :bottom
:button-one-props {:disabled? true} :actions :one-action
:button-one-label "button"}]) :description-text "Sample description"
: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 "sane defaults" (h/test "render with error & 1 action"
(h/render [bottom-actions/view {}]) (render [bottom-actions/view
(h/is-truthy (h/get-by-label-text :button-one)))) {:description :top-error
: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,34 +2,58 @@
(: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 button-container-2-actions (def description-top
(assoc button-container :margin-right 12)) {:flex-direction :row
:align-items :center
:gap 5
:padding-top 12
:padding-bottom 4
:justify-content :center})
(defn description (defn description-top-text
[theme scroll?] [scroll? blur? theme]
{:color (colors/theme-colors {:color (text-color scroll? blur? theme)})
(if scroll?
(colors/custom-color colors/neutral-80 70) (defn description-bottom
colors/neutral-50) [scroll? blur? theme]
(if scroll? {:color (text-color scroll? blur? theme)
colors/white-opa-70
colors/neutral-40)
theme)
:text-align :center :text-align :center
:padding-bottom 12
:padding-horizontal 40}) :padding-horizontal 40})
(def scroll (def error-message
{:margin-top 21 {:flex-direction :row
:margin-horizontal 120 :gap 4
:margin-bottom 8 :justify-content :center
:width 134 :align-items :center
:height 5}) :padding-top 15
:padding-horizontal 20
:padding-bottom 7})
@@ -2,55 +2,96 @@
(: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 default-props (def ?schema
{:button-one-type :primary [:=>
:button-two-type :grey [:catn
:customization-color :blue}) [:props
[: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
"Options: [{:keys [actions description description-text error-message role button-one-label button-two-label
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]])
:actions - keyword (default nil) - :1-action/:2-actions (when (= description :top)
:description - string (default nil) - Description to display below the title [rn/view
:button-one-label - string (default nil) - Label for the first button {:style style/description-top}
:button-two-label - string (default nil) - Label for the second button [text/text
:button-one-props - map with props for button one {:size :paragraph-2
:button-two-props - map with props for button two :style (style/description-top-text scroll? blur? theme)}
:theme - :light/:dark (i18n/label :t/eligible-to-join-as)]
:scroll? - bool (default false) - Whether the iOS Home Indicator should be rendered" [context-tag/view
[props] {:type :icon
(let [{:keys [actions description button-one-label button-two-label :size 24
button-one-props button-two-props theme scroll? customization-color container-style]} :icon (role role-icon)
(merge default-props props)] :blur? blur?
[rn/view {:style container-style} :context (i18n/label (keyword "t" role))}]])
[rn/view {:style style/buttons-container}
(when (= actions :2-actions) [rn/view {:style style/buttons-container}
[button/button (when (= actions :two-actions)
(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-one :accessibility-label :button-two}
:customization-color customization-color} button-two-props)
button-one-props) button-two-label])
button-one-label]] [button/button
(when description (merge
[text/text {:size 40
{:size :paragraph-2 :container-style style/button-container
:style (style/description theme scroll?)} description])])) :background (when (or blur? scroll?) :blur)
: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 (quo.theme/with-theme view-internal)) (def view
(quo.theme/with-theme
(schema/instrument #'view-internal ?schema)))
@@ -3,97 +3,110 @@
[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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 [quo/drawer-top (h/render-with-theme-provider [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 account-name emoji context-tag-type
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,6 +214,7 @@
: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,14 +6,21 @@
[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] :or {customization-color :blue}}] [{:keys [customization-color opacity container-style height]
(let [color-top (colors/custom-color customization-color 50 20) :or {customization-color :blue}}]
color-bottom (colors/custom-color customization-color 50 0)] ;; `when` added for safety, `linear-gradient` will break if `nil` is passed,
[linear-gradient/linear-gradient ;; the `:or` destructuring won't work because it's only applied when the
{:accessibility-label :gradient-cover ;; `:customization-color` key is non-existent. While deleting an account the key exists
:colors [color-top color-bottom] ;; and has a `nil` value.
:start {:x 0 :y 0} (when customization-color
:end {:x 0 :y 1} (let [color-top (colors/resolve-color customization-color 50 20)
:style (merge (style/root-container opacity height) container-style)}])) color-bottom (colors/resolve-color customization-color 50 0)]
[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,24 +61,30 @@
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 address-regex valid-ens-or-address? on-detect-ens on-detect-address on-detect-unclassified address-regex ens-regex
container-style]}] valid-ens-or-address? 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 (> (count text) 0)) (when (and on-detect-ens ens?)
(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,79 +4,83 @@
[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 [account/view]) (h/render-with-theme-provider [account/view] theme)
(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 [account/view]) (h/render-with-theme-provider [account/view] theme)
(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 [account/view {:blur? true}]) (h/render-with-theme-provider [account/view {:blur? true}] theme)
(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 [account/view {:state :active}]) (h/render-with-theme-provider [account/view {:state :active}] theme)
(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 [account/view (h/render-with-theme-provider [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 [account/view {:state :selected}]) (h/render-with-theme-provider [account/view {:state :selected}] theme)
(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 [account/view {:on-press on-press}]) (h/render-with-theme-provider [account/view {:on-press on-press}] theme)
(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 [account/view {:type :tag}]) (h/render-with-theme-provider [account/view {:type :tag}] theme)
(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 [account/view {:title-icon :i/placeholder}]) (h/render-with-theme-provider [account/view {:title-icon :i/placeholder}] theme)
(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 [account/view]) (h/render-with-theme-provider [account/view] theme)
(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 [account/view {:type :balance-neutral}]) (h/render-with-theme-provider [account/view {:type :balance-neutral}] theme)
(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 [account/view {:type :balance-negative}]) (h/render-with-theme-provider [account/view {:type :balance-negative}] theme)
(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 [account/view {:type :balance-positive}]) (h/render-with-theme-provider [account/view {:type :balance-positive}] theme)
(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 [account/view (h/render-with-theme-provider [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,8 +9,10 @@
[utils.i18n :as i18n])) [utils.i18n :as i18n]))
(defn- view-internal (defn- view-internal
[{:keys [state theme number word] :as props}] [{:keys [state theme number word on-press] :as props}]
[rn/view {:style (style/container props)} [rn/pressable
{: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)
+8 -6
View File
@@ -39,13 +39,15 @@
(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)
:accessibility-label :user-list :allow-multiple-presses? allow-multiple-presses?
:on-press (when on-press on-press) :accessibility-label :user-list
:on-long-press (when on-long-press on-long-press)} :on-press (when on-press on-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,12 +47,13 @@
: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
:on-press on-press :allow-multiple-presses? true
:on-press-in #(toggle-background-color background-color false pass-through?) :on-press on-press
:on-press-out #(toggle-background-color background-color true pass-through?) :on-press-in #(toggle-background-color background-color false pass-through?)
:accessibility-label accessibility-label} :on-press-out #(toggle-background-color background-color true pass-through?)
: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,9 +24,7 @@
{: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-vertical 8 :padding 8
:padding-left 10
:padding-right 8
:border-radius 12}) :border-radius 12})
(defn title (defn title
@@ -47,8 +45,13 @@
theme)) theme))
:container-style {:width 20 :height 20}}) :container-style {:width 20 :height 20}})
(def left-side-container {:padding 2}) (def left-side-container
(def right-side-container {:padding 4 :flex 1}) {:padding 2
:padding-top 3})
(def right-side-container
{:padding 4
:flex 1})
(defn action-container (defn action-container
[theme] [theme]
@@ -45,7 +45,6 @@
: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]
@@ -77,16 +76,19 @@
: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 :i/correct :positive (if (= theme :light)
:negative :i/incorrect :i/correct
: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,19 +15,23 @@
(defn- view-internal (defn- view-internal
[] []
(let [pressed? (reagent/atom false)] (let [pressed? (reagent/atom false)]
(fn [{:keys [disabled? theme blur? on-press type]} label] (fn [{:keys [disabled? theme blur? on-press on-long-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-press-in #(reset! pressed? true) :on-long-press (fn []
:on-press-out #(reset! pressed? false) (when (fn? on-long-press)
:hit-slop {:top 8 :bottom 8 :left 25 :right 25} (on-long-press label)))
:style (style/container background-color)} :allow-multiple-presses? true
: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,18 +6,19 @@
[react-native.core :as rn])) [react-native.core :as rn]))
(defn keyboard-item (defn keyboard-item
[{:keys [item type disabled? on-press blur? theme]}] [{:keys [item type disabled? on-press on-long-press blur? theme]}]
[keyboard-key/view [keyboard-key/view
{:disabled? disabled? {:disabled? disabled?
:on-press on-press :on-press on-press
:blur? blur? :on-long-press on-long-press
:theme theme :blur? blur?
:type type} :theme theme
:type type}
item]) item])
(defn- view-internal (defn- view-internal
[] []
(fn [{:keys [disabled? theme blur? left-action delete-key? on-press on-delete (fn [{:keys [disabled? theme blur? left-action delete-key? on-press on-delete on-long-press-delete
container-style] container-style]
:or {left-action :none}}] :or {left-action :none}}]
[rn/view [rn/view
@@ -62,12 +63,13 @@
: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
:blur? blur? :on-long-press on-long-press-delete
:theme theme}] :blur? blur?
:theme theme}]
[keyboard-item])]])) [keyboard-item])]]))
(def view (quo.theme/with-theme view-internal)) (def view (quo.theme/with-theme view-internal))
@@ -3,7 +3,6 @@
[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
@@ -25,7 +24,12 @@
{: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))]]
[fast-image/fast-image ;; NOTE: using react-native-fast-image here causes a crash on devices when used inside a
;; 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,12 +12,13 @@
accessibility-label] accessibility-label]
:or {accessibility-label :reaction}}] :or {accessibility-label :reaction}}]
[rn/pressable [rn/pressable
{:accessibility-label accessibility-label {:accessibility-label accessibility-label
:style (merge (style/container @pressed?) :allow-multiple-presses? true
container-style) :style (merge (style/container @pressed?)
:on-press (fn [e] container-style)
(swap! pressed? not) :on-press (fn [e]
(when on-press (swap! pressed? not)
(on-press e)))} (when on-press
(on-press e)))}
[rn/text [rn/text
(reactions.resource/system-emojis emoji)]]))) (reactions.resource/system-emojis emoji)]])))
@@ -30,7 +30,8 @@
: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 container-style (style/container size card? blur? theme))} :style (merge (style/container size card? blur? theme) container-style)}
[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,9 +2,64 @@
(: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
[{share-qr-type :type :as props}] [props]
(let [component-rendered (h/render [share-qr-code/view {:type share-qr-type}]) ;; NOTE: rendering the profile type first, so that the re-render is triggered.
;; 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
@@ -13,23 +68,52 @@
(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"
(let [qr-label "Text shown below QR"] (h/test "Profile"
(h/test "Profile" (render-share-qr-code (merge default-props
(render-share-qr-code {:type :profile profile-props))
:qr-data qr-label}) (h/is-truthy (h/get-by-text qr-label)))
(h/is-truthy (h/get-by-text qr-label)))
(h/test "Wallet Legacy" (h/test "Wallet Legacy"
(render-share-qr-code {:type :wallet-legacy (render-share-qr-code (merge default-props
:qr-data qr-label wallet-props
:emoji "👻"}) {:type :wallet
(h/is-truthy (h/get-by-text qr-label))) :address :legacy}))
(h/is-truthy (h/get-by-text qr-label)))
(h/test "Wallet Multichain" (h/test "Wallet multichain"
(render-share-qr-code {:type :wallet-multichain (render-share-qr-code (merge default-props
:qr-data qr-label wallet-props
:emoji "👻"}) {:type :wallet
(h/is-truthy (h/get-by-text qr-label))))) :address :multichain}))
(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]
@@ -44,68 +128,86 @@
(h/describe "Profile" (h/describe "Profile"
(test-fire-events (test-fire-events
{:type :profile} (merge default-props
[{:test-name "Text pressed" profile-props)
:accessibility-label :share-qr-code-info-text [text-press-event
:event-name :press text-long-press-event
:callback-prop-key :on-text-press} share-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}
{: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
{:type :wallet-legacy :emoji "👽"} (merge default-props
[{:test-name "Text pressed" wallet-props
:accessibility-label :share-qr-code-info-text {:type :wallet
:event-name :press :address :legacy
:callback-prop-key :on-text-press} :emoji "👻"})
{:test-name "Text long pressed" [text-press-event
:accessibility-label :share-qr-code-info-text text-long-press-event
:event-name :long-press share-press-event
:callback-prop-key :on-text-long-press} multichain-press-event
{:test-name "Share button pressed" legacy-press-event]))
: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
{:type :wallet-multichain :emoji "👽"} (merge default-props
[{:test-name "Text pressed" wallet-props
:accessibility-label :share-qr-code-info-text {:type :wallet
:event-name :press :address :multichain
:callback-prop-key :on-text-press} :emoji "👻"})
{:test-name "Text long pressed" [text-press-event
:accessibility-label :share-qr-code-info-text text-long-press-event
:event-name :long-press share-press-event
:callback-prop-key :on-text-long-press} legacy-press-event
{:test-name "Share button pressed" multichain-press-event
:accessibility-label :link-to-profile settings-press-event]))
:event-name :press
:callback-prop-key :on-share-press} (h/describe "Saved Address Legacy"
{:test-name "Legacy tab pressed" (test-fire-events
:accessibility-label :share-qr-code-legacy-tab (merge default-props
:event-name :press wallet-props
:callback-prop-key :on-legacy-press} {:type :saved-address
{:test-name "Multichain tab pressed" :address :legacy})
:accessibility-label :share-qr-code-multichain-tab [text-press-event
:event-name :press text-long-press-event
:callback-prop-key :on-multichain-press} share-press-event
{:test-name "Settings pressed" legacy-press-event
:accessibility-label :share-qr-code-settings multichain-press-event]))
:event-name :press
:callback-prop-key :on-settings-press}]))))) (h/describe "Saved Address Multichain"
(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])))))
@@ -0,0 +1,68 @@
(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,3 +106,6 @@
{: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,19 +3,25 @@
[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 [share-qr-type on-legacy-press on-multichain-press]}] [{:keys [on-legacy-press on-multichain-press address]}]
[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
@@ -23,7 +29,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 (= :wallet-legacy share-qr-type) :active (= :legacy address)
: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}]
@@ -33,7 +39,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 (= :wallet-multichain share-qr-type) :active (= :multichain address)
:on-press on-multichain-press} :on-press on-multichain-press}
(i18n/label :t/multichain)]]) (i18n/label :t/multichain)]])
@@ -121,77 +127,69 @@
: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] profile-picture emoji on-share-press address]
: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 [rn/view {:style style/share-qr-container}
{:style style/share-qr-container} [rn/view {:style style/share-qr-inner-container}
[rn/view [header-icon props]
{: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 (#{:wallet-legacy :wallet-multichain} share-qr-type) (when (not= share-qr-type :profile)
[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 (if (= share-qr-type :profile) :avatar (case share-qr-type
:profile :profile :profile
:wallet-account) (:watched-address :wallet) :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}
(case share-qr-type (if (= share-qr-type :profile)
:profile [profile-bottom props] [profile-bottom props]
:wallet-legacy [wallet-legacy-bottom props] (case address
:wallet-multichain [wallet-multichain-bottom props] :legacy [wallet-legacy-bottom props]
nil)]]]) :multichain [wallet-multichain-bottom props]
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}]]
@@ -207,5 +205,6 @@
(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
(def view (quo.theme/with-theme view-internal)) (quo.theme/with-theme
(schema/instrument #'view-internal component-schema/?schema)))
@@ -0,0 +1,50 @@
(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)})
@@ -0,0 +1,70 @@
(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} [:or keyword? string?]] [:token {:optional true} [:maybe [: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,6 +5,7 @@
(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?]}]
@@ -21,54 +22,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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(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 [account-card/view data]) (h/render-with-theme-provider [account-card/view data] theme)
(h/is-falsy (h/query-by-label-text :metrics))))) (h/is-falsy (h/query-by-label-text :metrics)))))
@@ -0,0 +1,33 @@
(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,13 +4,15 @@
[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?]}]
@@ -183,4 +185,6 @@
:add-account [add-account-view props] :add-account [add-account-view props]
nil)) nil))
(def view (quo.theme/with-theme view-internal)) (def view
(quo.theme/with-theme
(schema/instrument #'view-internal component-schema/?schema)))
@@ -3,92 +3,104 @@
[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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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 [quo/account-origin (h/render-with-theme-provider [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))))
@@ -0,0 +1,30 @@
(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,10 +3,12 @@
[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
@@ -107,14 +109,5 @@
[card-view theme derivation-path secondary-color on-press])])) [card-view theme derivation-path secondary-color on-press])]))
(def view (def view
"Create an account-origin UI component. (quo.theme/with-theme
| key | values | (schema/instrument #'view-internal component-schema/?schema)))
| ----------------------|------------------------------------------------|
| :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))
@@ -0,0 +1,20 @@
(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,10 +2,12 @@
(: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
@@ -129,16 +131,5 @@
[numeric-changes percentage-change currency-change customization-color theme up?])]])])) [numeric-changes percentage-change currency-change customization-color theme up?])]])]))
(def view (def view
"Create a account-overview UI component. (quo.theme/with-theme
| key | description | (schema/instrument #'view-internal component-schema/?schema)))
| -------------|-------------|
| `: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,18 +42,22 @@
(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")))
@@ -0,0 +1,22 @@
(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,6 +4,7 @@
[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]
@@ -13,26 +14,6 @@
[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
@@ -47,14 +28,16 @@
(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 [token amount]}] (map-indexed (fn [idx {:keys [type token amount collectible-name collectible-img-src]}]
^{:key idx} ^{:key idx}
[required-tokens/view [required-tokens/view
{:container-style style/token-and-text {:container-style style/token-and-text
:type :token :type type
:amount amount :amount amount
:token token :token token
:divider? (not= token-length idx)}]) :collectible-img-src collectible-img-src
:collectible-name collectible-name
:divider? (not= token-length idx)}])
tokens)))]])) tokens)))]]))
(defn- view-internal (defn- view-internal
@@ -93,4 +76,4 @@
(def view (def view
(quo.theme/with-theme (quo.theme/with-theme
(schema/instrument #'view-internal ?schema))) (schema/instrument #'view-internal component-schema/?schema)))
@@ -0,0 +1,14 @@
(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,8 +1,10 @@
(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
@@ -28,4 +30,6 @@
(into [text/text] network-text-xf $) (into [text/text] network-text-xf $)
(conj $ address-text)))) (conj $ address-text))))
(def view (quo.theme/with-theme view-internal)) (def view
(quo.theme/with-theme
(schema/instrument #'view-internal component-schema/?schema)))
@@ -0,0 +1,43 @@
(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