Compare commits
51
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
472f1a949c | ||
|
|
43573d199b | ||
|
|
199381a4c7 | ||
|
|
6839b71524 | ||
|
|
3ea06b4495 | ||
|
|
ab722b3420 | ||
|
|
c057b3b4b0 | ||
|
|
3e00ccf7cc | ||
|
|
3d22ace169 | ||
|
|
3e1ffdea08 | ||
|
|
ae75eaeb33 | ||
|
|
424bbc39c4 | ||
|
|
5a7bfc61cc | ||
|
|
50f6c1ef1b | ||
|
|
3c6b38aeea | ||
|
|
c44ba69676 | ||
|
|
f394fcc3d5 | ||
|
|
107f263fb1 | ||
|
|
678bc548ca | ||
|
|
d77033e346 | ||
|
|
8f85e3c726 | ||
|
|
ed427cf485 | ||
|
|
9362d12bbd | ||
|
|
bfed36d19f | ||
|
|
456ccb4c69 | ||
|
|
be2c697b7c | ||
|
|
b27f323dd7 | ||
|
|
a33e7f2e90 | ||
|
|
54d9e5ebeb | ||
|
|
49567596da | ||
|
|
2e23dc7ad7 | ||
|
|
dc53bddb66 | ||
|
|
10f9fe11db | ||
|
|
2e13cfc47f | ||
|
|
e6ea8ae9a9 | ||
|
|
834c0a3800 | ||
|
|
2c96c38339 | ||
|
|
1d2c01c16b | ||
|
|
8dc71f6432 | ||
|
|
25f9499454 | ||
|
|
42cab08553 | ||
|
|
83523b1923 | ||
|
|
f762cdcf9b | ||
|
|
357db52720 | ||
|
|
5fdaf0054d | ||
|
|
4e3ce54ac4 | ||
|
|
37be08d2d7 | ||
|
|
3c4d27b6ff | ||
|
|
c5df51d944 | ||
|
|
b1c467de19 | ||
|
|
c766d21296 |
@@ -194,3 +194,6 @@ test/appium/tests/users.py
|
||||
|
||||
## git hooks
|
||||
lefthook.yml
|
||||
|
||||
## build time logs
|
||||
/logs/*.log
|
||||
|
||||
@@ -36,6 +36,8 @@ endif
|
||||
export TMPDIR = /tmp/tmp-status-mobile-$(BUILD_TAG)
|
||||
# This has to be specified for both the Node.JS server process and the Qt process.
|
||||
export REACT_SERVER_PORT ?= 5001
|
||||
# Default metro port used by scripts/run-android.sh.
|
||||
export RCT_METRO_PORT ?= 8081
|
||||
# Fix for ERR_OSSL_EVP_UNSUPPORTED error.
|
||||
export NODE_OPTIONS += --openssl-legacy-provider
|
||||
# The path can be anything, but home is usually safest.
|
||||
@@ -44,7 +46,7 @@ export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
||||
# Our custom config is located in nix/nix.conf
|
||||
export NIX_USER_CONF_FILES = $(PWD)/nix/nix.conf
|
||||
# Location of symlinks to derivations that should not be garbage collected
|
||||
export _NIX_GCROOTS = /nix/var/nix/gcroots/per-user/$(USER)/status-mobile
|
||||
export _NIX_GCROOTS = ./.nix-gcroots
|
||||
# Defines which variables will be kept for Nix pure shell, use semicolon as divider
|
||||
export _NIX_KEEP ?= TMPDIR,BUILD_ENV,\
|
||||
BUILD_TYPE,BUILD_NUMBER,COMMIT_HASH,\
|
||||
@@ -214,7 +216,7 @@ build-fdroid: ##@build Build release for F-Droid
|
||||
|
||||
build-android: export BUILD_ENV ?= prod
|
||||
build-android: export BUILD_TYPE ?= nightly
|
||||
build-android: export BUILD_NUMBER ?= $(TMP_BUILD_NUMBER)
|
||||
build-android: export ORG_GRADLE_PROJECT_versionCode ?= $(TMP_BUILD_NUMBER)
|
||||
build-android: export ANDROID_ABI_SPLIT ?= false
|
||||
build-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86
|
||||
build-android: ##@build Build unsigned Android APK
|
||||
@@ -267,7 +269,7 @@ run-clojure: ##@run Watch for and build Clojure changes for mobile
|
||||
|
||||
run-metro: export TARGET := clojure
|
||||
run-metro: ##@run Start Metro to build React Native changes
|
||||
@scripts/start-react-native.sh
|
||||
@scripts/run-metro.sh
|
||||
|
||||
run-re-frisk: export TARGET := clojure
|
||||
run-re-frisk: ##@run Start re-frisk server
|
||||
@@ -278,22 +280,15 @@ 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.
|
||||
run-android: export ANDROID_ABI_INCLUDE ?= $(shell ./scripts/adb_devices_abis.sh)
|
||||
run-android: ##@run Build Android APK and start it on the device
|
||||
npx react-native run-android --appIdSuffix debug
|
||||
@scripts/run-android.sh
|
||||
|
||||
SIMULATOR=iPhone 13
|
||||
# TODO: fix IOS_STATUS_GO_TARGETS to be either amd64 or arm64 when RN is upgraded
|
||||
run-ios: export TARGET := ios
|
||||
run-ios: export IOS_STATUS_GO_TARGETS := ios/arm64;iossimulator/amd64
|
||||
run-ios: export XCBeautify=$(shell which xcbeautify) # for react-native-cli to pick this up and to auto format output
|
||||
run-ios: ##@run Build iOS app and start it in a simulator/device
|
||||
ifneq ("$(SIMULATOR)", "")
|
||||
npx react-native run-ios --simulator="$(SIMULATOR)"
|
||||
else
|
||||
npx react-native run-ios
|
||||
endif
|
||||
run-ios: ##@run Build iOS app and start it in on the simulator
|
||||
@scripts/run-ios.sh "${SIMULATOR}"
|
||||
|
||||
show-ios-devices: ##@other shows connected ios device and its name
|
||||
xcrun xctrace list devices
|
||||
@@ -301,11 +296,8 @@ show-ios-devices: ##@other shows connected ios device and its name
|
||||
# TODO: fix IOS_STATUS_GO_TARGETS to be either amd64 or arm64 when RN is upgraded
|
||||
run-ios-device: export TARGET := ios
|
||||
run-ios-device: export IOS_STATUS_GO_TARGETS := ios/arm64;iossimulator/amd64
|
||||
run-ios-device: ##@run iOS app and start it on a connected device by its name
|
||||
ifndef DEVICE_NAME
|
||||
$(error Usage: make run-ios-device DEVICE_NAME=your-device-name)
|
||||
endif
|
||||
react-native run-ios --device "$(DEVICE_NAME)"
|
||||
run-ios-device: ##@run iOS app and start it on the first connected iPhone
|
||||
@scripts/run-ios-device.sh
|
||||
|
||||
#--------------
|
||||
# Tests
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux && x86_64 && nix-2.14' }
|
||||
agent { label 'linux && x86_64 && nix-2.19' }
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
+2
-2
@@ -1,11 +1,11 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos && arm64 && nix-2.14 && xcode-15.1' }
|
||||
agent { label 'macos && arm64 && nix-2.19 && xcode-15.1' }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux && x86_64 && nix-2.14' }
|
||||
agent { label 'linux && x86_64 && nix-2.19' }
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos' }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
agent { label params.AGENT_LABEL }
|
||||
@@ -82,7 +82,7 @@ pipeline {
|
||||
env.NIXPKGS_SYSTEM_OVERRIDE = nixSysOverride(os, arch, 'android')
|
||||
/* Build/fetch deps required to build android release. */
|
||||
nix.build(
|
||||
attr: 'targets.mobile.android.release.buildInputs',
|
||||
attr: 'targets.mobile.android.build.buildInputs',
|
||||
sandbox: false,
|
||||
pure: false,
|
||||
link: false
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.5'
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
|
||||
[Contributing to status-go](status-go-changes.md)
|
||||
|
||||
[Malli schemas (recorded demo)](https://www.youtube.com/watch?v=SlRio70aYVI) ([slides](files/forging-code-with-schemas-sep-2023-slides.pdf))
|
||||
|
||||
## Testing
|
||||
|
||||
[How to run local tests](testing.md)
|
||||
|
||||
Binary file not shown.
+1
-2
@@ -122,10 +122,9 @@ See below:
|
||||
|
||||
Do the following:
|
||||
|
||||
Ensure you have 3 terminals running the following
|
||||
Ensure you have 2 terminals running the following
|
||||
|
||||
- `make run-clojure`
|
||||
- `make run-metro`
|
||||
- `make run-ios` / `make run-android`
|
||||
|
||||
[See the STARTING GUIDE for details](STARTING_GUIDE.md#development)
|
||||
|
||||
@@ -15,8 +15,7 @@ This step will take a while the first time as it will download all dependencies.
|
||||
There are three steps necessary to start development, in this case for Android:
|
||||
|
||||
1. `make run-clojure` - Compiles Clojure into JavaScript, watches for changes on cljs files, and hot-reloads code in the app.
|
||||
2. `make run-metro` - Starts metro bundler and watches JavaScript code.
|
||||
3. `make run-android` or `make run-ios` - Builds the Android/iOS app and starts it on the device.
|
||||
2. `make run-android` or `make run-ios` - Builds the Android/iOS app, starts it on the device and starts metro bundler.
|
||||
|
||||
The first two will continue watching for changes and keep re-building the app. They need to be ready first.
|
||||
The last one will exit once the app is up and ready.
|
||||
|
||||
+1
-1
@@ -793,7 +793,7 @@ CHECKOUT OPTIONS:
|
||||
:submodules: true
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
boost: 57d2868c099736d80fcd648bf211b4431e51a558
|
||||
boost: 64032b9e9b938fda23325e68a3771f0fabf414dc
|
||||
BVLinearGradient: 612a04ff38e8480291f3379ee5b5a2c571f03fe0
|
||||
CryptoSwift: c4f2debceb38bf44c80659afe009f71e23e4a082
|
||||
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Description
|
||||
|
||||
This directory is the destination of logs created during build time of debug builds.
|
||||
|
||||
# Logs
|
||||
|
||||
* `xcrun_device_install.log` - Output from `status-mobile/scripts/run-ios-device.sh`.
|
||||
- Created by redirecting output of `xcrun simctl install "$UDID" "$APP_PATH"`.
|
||||
* `xcrun_device_process_launch.log` - Output from `status-mobile/scripts/run-ios-device.sh`.
|
||||
- Created by specifying `--json-output` flag for `xcrun devicectl device process launch --no-activate --verbose --device "${DEVICE_UUID}" "${INSTALLATION_URL}"`.
|
||||
* `xcrun_device_process_resume.log` - Output from `status-mobile/scripts/run-ios-device.sh`.
|
||||
- Created by redirecting output of `xcrun devicectl device process resume --device "${DEVICE_UUID}" --pid "${STATUS_PID}"`.
|
||||
* `adb_install.log` - Output from `scripts/run-android.sh`.
|
||||
- Created by redirecting output of `adb install -r ./result/app-debug.apk`.
|
||||
* `adb_shell_monkey.log` - Output from `status-mobile/scripts/run-android.sh`.
|
||||
- Created by redirecting output of `adb shell monkey -p im.status.ethereum.debug 1 >`.
|
||||
* `ios_simulators_list.log` - Output from `status-mobile/scripts/run-ios.sh`.
|
||||
- Created by redirecting output of `xcrun simctl list devices -j`.
|
||||
@@ -120,9 +120,12 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(checkAddressChecksum:(NSString *)address)
|
||||
return StatusgoCheckAddressChecksum(address);
|
||||
}
|
||||
|
||||
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isAddress:(NSString *)address) {
|
||||
return StatusgoIsAddress(address);
|
||||
}
|
||||
|
||||
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(toChecksumAddress:(NSString *)address) {
|
||||
return StatusgoToChecksumAddress(address);
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
+7
-5
@@ -61,7 +61,7 @@ We will use the `make jsbundle` target as an example of a derivation you can bui
|
||||
3. [`build.sh`](/nix/scripts/build.sh) calls `nix-build --attr targets.mobile.jsbundle` with extra arguments
|
||||
4. `nix-build` builds the derivation from [`nix/mobile/jsbundle/default.nix`](/nix/mobile/jsbundle/default.nix)
|
||||
|
||||
The same can be done for other targets like `targets.mobile.android.release`.
|
||||
The same can be done for other targets like `targets.mobile.android.build`.
|
||||
Except in that case extra arguments are required which is why the [`scripts/release-android.sh`](/scripts/release-android.sh) is used in the `make release-android` target.
|
||||
|
||||
If you run `make release-android` you'll see the `nix-build` command used:
|
||||
@@ -71,21 +71,23 @@ nix-build \
|
||||
--fallback \
|
||||
--no-out-link \
|
||||
--show-trace \
|
||||
--attr targets.mobile.android.release \
|
||||
--attr targets.mobile.android.build \
|
||||
--argstr secrets-file '/tmp/tmp-status-mobile-559a3a441/tmp.xAnrPuNtAP' \
|
||||
--option extra-sandbox-paths '/home/joe/.gradle/status-im.keystore /tmp/tmp-status-mobile-559a3a441/tmp.xAnrPuNtAP' \
|
||||
default.nix
|
||||
```
|
||||
Some of those are required which is why just calling:
|
||||
```
|
||||
nix-build --attr targets.mobile.android.release
|
||||
nix-build --attr targets.mobile.android.build
|
||||
```
|
||||
Would fail.
|
||||
|
||||
# Garbage Collection
|
||||
|
||||
The `make nix-gc` target calls `nix-store --gc` and normally would remove almost everything, but to prevent that we place symlinks to protected derivations in `/nix/var/nix/gcroots` subfolder. Specifically:
|
||||
The `make nix-gc` target calls `nix-store --gc` and normally would remove almost everything, but to prevent that we place symlinks to protected derivations in `.nix-gcroots` folder. Specifically:
|
||||
```sh
|
||||
_NIX_GCROOTS="${_NIX_GCROOTS:-/nix/var/nix/gcroots/per-user/${USER}/status-mobile}"
|
||||
_NIX_GCROOTS="${_NIX_GCROOTS:-${GIT_ROOT}/.nix-gcroots}
|
||||
```
|
||||
These symlinks in turn will be symlinked from `/nix/var/nix/gcroots/auto` through use of `nix-store --add-gcroots`.
|
||||
|
||||
Whenever `nix/scripts/build.sh` or `nix/scripts/shell.sh` are called they update symlinks named after given targets in that folder. This in combination with `keep-outputs = true` set in `nix/nix.conf` prevents garbage collection from removing too much.
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@ export STATUS_GO_IPFS_GATEWAY_URL="https://ipfs.status.im/"
|
||||
```
|
||||
You can see the defaults in code:
|
||||
- [`nix/status-go/default.nix`](./status-go/default.nix)
|
||||
- [`nix/mobile/android/release.nix`](./mobile/android/release.nix)
|
||||
- [`nix/mobile/android/release.nix`](./mobile/android/build.nix)
|
||||
|
||||
## Shell
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ This directory contains the tools and the data that allows Nix to manage Gradle
|
||||
|
||||
Simply calling `generate.sh` should result in a `deps.json` file which is used in the derivation that provides Gradle dependencies when building the Android app.
|
||||
|
||||
You can see in [`nix/mobile/android/release.nix`](../../mobile/android/release.nix) that it's used via the `-Dmaven.repo.local='${deps.gradle}'` Gradle flag.
|
||||
You can see in [`nix/mobile/android/release.nix`](../../mobile/android/build.nix) that it's used via the `-Dmaven.repo.local='${deps.gradle}'` Gradle flag.
|
||||
|
||||
# Files
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@
|
||||
# Path to the file containing secret environment variables
|
||||
secretsFile ? "",
|
||||
# Build type (influences which .env file gets used for feature flags)
|
||||
# TODO: pr or relase for default?
|
||||
buildType ? lib.getEnvWithDefault "BUILD_TYPE" "release",
|
||||
# Used for versionCode
|
||||
buildNumber ? lib.getEnvWithDefault "BUILD_NUMBER" 9999,
|
||||
versionCode ? lib.getEnvWithDefault "ORG_GRADLE_PROJECT_versionCode" 9999,
|
||||
# Included in APK Manifest for easier identification.
|
||||
# TODO: or GIT_COMMIT from Jenkins?
|
||||
commitHash ? lib.getEnvWithDefault "COMMIT_HASH" "unknown",
|
||||
# Gradle options passed for Android builds
|
||||
androidGradleOpts ? lib.getEnvWithDefault "ANDROID_GRADLE_OPTS" null,
|
||||
commitHash ? lib.getEnvWithDefault "ORG_GRADLE_PROJECT_commitHash" "unknown",
|
||||
# Disabled for debug builds to avoid 'maximum call stack exceeded' errors.
|
||||
# https://github.com/status-im/status-mobile/issues/18493
|
||||
hermesEnabled ? lib.getEnvWithDefault "ORG_GRADLE_PROJECT_hermesEnabled" "true",
|
||||
buildUrl ? lib.getEnvWithDefault "ORG_GRADLE_PROJECT_buildUrl" null,
|
||||
statusGoSrcOverride ? lib.getEnvWithDefault "STATUS_GO_SRC_OVERRIDE" null,
|
||||
# If APKs should be split based on architectures
|
||||
androidAbiSplit ? lib.getEnvWithDefault "ANDROID_ABI_SPLIT" "false",
|
||||
@@ -40,8 +40,10 @@ let
|
||||
else if (elem buildType ["pr" "manual"]) then ".env.jenkins"
|
||||
else ".env";
|
||||
|
||||
# There are only two types of Gradle build targets: pr and release
|
||||
gradleBuildType = if buildType == "pr" then "Pr" else "Release";
|
||||
gradleBuildType =
|
||||
if buildType == "pr" then "Pr"
|
||||
else if buildType == "debug" then "Debug"
|
||||
else "Release";
|
||||
|
||||
apksPath = "./android/app/build/outputs/apk/${toLower gradleBuildType}";
|
||||
|
||||
@@ -81,7 +83,10 @@ in stdenv.mkDerivation rec {
|
||||
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;
|
||||
ORG_GRADLE_PROJECT_versionCode = versionCode;
|
||||
ORG_GRADLE_PROJECT_commitHash = commitHash;
|
||||
ORG_GRADLE_PROJECT_buildUrl = buildUrl;
|
||||
ORG_GRADLE_PROJECT_hermesEnabled = hermesEnabled;
|
||||
|
||||
# Fix for ERR_OSSL_EVP_UNSUPPORTED error.
|
||||
NODE_OPTIONS = "--openssl-legacy-provider";
|
||||
@@ -116,8 +121,6 @@ in stdenv.mkDerivation rec {
|
||||
|
||||
# Symlink React Native entrypoint.
|
||||
cp -Lr ${builtJsBundle} ./result
|
||||
pwd
|
||||
find -L result
|
||||
|
||||
# Copy android/ directory
|
||||
mkdir -p ./android/build
|
||||
@@ -144,7 +147,6 @@ in stdenv.mkDerivation rec {
|
||||
"LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${makeLibraryPath [ pkgs.zlib ]}";
|
||||
gradleCommand = ''
|
||||
${pkgs.gradle}/bin/gradle \
|
||||
${toString androidGradleOpts} \
|
||||
--console=plain \
|
||||
--offline \
|
||||
--no-daemon \
|
||||
@@ -152,8 +154,6 @@ in stdenv.mkDerivation rec {
|
||||
--no-watch-fs \
|
||||
--no-build-cache \
|
||||
-Dmaven.repo.local='${deps.gradle}' \
|
||||
-PversionCode=${toString buildNumber} \
|
||||
-PcommitHash=${commitHash} \
|
||||
assemble${gradleBuildType}
|
||||
'';
|
||||
in
|
||||
@@ -171,12 +171,14 @@ in stdenv.mkDerivation rec {
|
||||
${adhocEnvVars} ${gradleCommand}
|
||||
popd > /dev/null
|
||||
'';
|
||||
doCheck = true;
|
||||
checkPhase = ''
|
||||
|
||||
doCheck = buildType != "debug";
|
||||
checkPhase = ''
|
||||
ls ${apksPath}/*.apk \
|
||||
| xargs -n1 ${pkgs.unzip}/bin/unzip -qql \
|
||||
| grep 'index.android.bundle'
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp ${apksPath}/*.apk $out/
|
||||
@@ -2,7 +2,7 @@
|
||||
, jsbundle, status-go, androidPkgs, androidShell }:
|
||||
|
||||
rec {
|
||||
release = callPackage ./release.nix {
|
||||
build = callPackage ./build.nix {
|
||||
inherit jsbundle status-go;
|
||||
};
|
||||
|
||||
@@ -15,7 +15,7 @@ rec {
|
||||
];
|
||||
|
||||
inputsFrom = [
|
||||
(release {})
|
||||
(build {})
|
||||
androidShell
|
||||
];
|
||||
|
||||
|
||||
@@ -20,8 +20,8 @@ in {
|
||||
buildInputs = with pkgs; [
|
||||
xcodeWrapper watchman procps
|
||||
flock # used in nix/scripts/node_modules.sh
|
||||
ios-deploy # used in 'make run-ios-device'
|
||||
xcbeautify # used in 'make run-ios'
|
||||
libimobiledevice # used in `make run-ios-device`
|
||||
];
|
||||
|
||||
# WARNING: Executes shellHook in reverse order.
|
||||
|
||||
@@ -26,18 +26,6 @@ in {
|
||||
react-native = callPackage ./deps/react-native { };
|
||||
};
|
||||
|
||||
# Fix for missing libarclite_macosx.a in Xcode 14.3.
|
||||
# https://github.com/ios-control/ios-deploy/issues/580
|
||||
ios-deploy = super.darwin.ios-deploy.overrideAttrs (old: rec {
|
||||
version = "1.12.2";
|
||||
src = super.fetchFromGitHub {
|
||||
owner = "ios-control";
|
||||
repo = "ios-deploy";
|
||||
rev = version;
|
||||
sha256 = "sha256-TVGC+f+1ow3b93CK3PhIL70le5SZxxb2ug5OkIg8XCA";
|
||||
};
|
||||
});
|
||||
|
||||
# Clojure's linter receives frequent upgrades, and we want to take advantage
|
||||
# of the latest available rules.
|
||||
clj-kondo = super.clj-kondo.override rec {
|
||||
|
||||
@@ -45,7 +45,7 @@ if [[ -z "${TARGET}" ]]; then
|
||||
fi
|
||||
|
||||
# Hack fix for missing Android SDK for aarch64 on Darwin. See systemOverride in `nix/pkgs.nix`.
|
||||
if [[ "${TARGET}" =~ ^(targets.status-go.mobile.android|targets.mobile.android.release)$ ]]; then
|
||||
if [[ "${TARGET}" =~ ^(targets.status-go.mobile.android|targets.mobile.android.build)$ ]]; then
|
||||
os=$(uname -s | tr '[:upper:]' '[:lower:]')
|
||||
export NIXPKGS_SYSTEM_OVERRIDE="x86_64-${os}"
|
||||
fi
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
set -Ee
|
||||
|
||||
_NIX_GCROOTS="${_NIX_GCROOTS:-/nix/var/nix/gcroots/per-user/${USER}/status-mobile}"
|
||||
|
||||
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
|
||||
source "${GIT_ROOT}/nix/scripts/source.sh"
|
||||
source "${GIT_ROOT}/scripts/colors.sh"
|
||||
|
||||
_NIX_GCROOTS="${_NIX_GCROOTS:-${GIT_ROOT}/.nix-gcroots}"
|
||||
|
||||
TARGET="${1}"
|
||||
shift
|
||||
if [[ -z "${TARGET}" ]]; then
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# WARNING: Versions 2.14, 2.15, 2.16 have an issue creating gcroots:
|
||||
# https://github.com/NixOS/nix/issues/8564
|
||||
export NIX_VERSION="2.13.4"
|
||||
export NIX_PACKAGE="nixVersions.nix_2_13"
|
||||
export NIX_VERSION="2.19.3"
|
||||
export NIX_PACKAGE="nixVersions.nix_2_19"
|
||||
export NIX_INSTALL_URL="https://nixos.org/releases/nix/nix-${NIX_VERSION}/install"
|
||||
export NIX_INSTALL_SHA256="a9908cc48f5886b4f22172bdd2f9657873276fd295e78c6ed97fb308c6d284d0"
|
||||
export NIX_INSTALL_SHA256="73d47b0ab783fddca1b2d44a03d52a74c97c28a1fc8ff5a29419079302ef9c3d"
|
||||
export NIX_INSTALL_PATH="/tmp/nix-install-${NIX_VERSION}"
|
||||
|
||||
@@ -21,8 +21,6 @@ function append_env_export() {
|
||||
VAR_VALUE=$(must_get_env "${VAR_NAME}")
|
||||
echo "export ${VAR_NAME}=\"${VAR_VALUE}\";" >> "${SECRETS_FILE_PATH}"
|
||||
}
|
||||
|
||||
export COMMIT_HASH="$(git rev-parse --verify HEAD)"
|
||||
nixOpts=()
|
||||
|
||||
# We create if now so the trap knows its location
|
||||
@@ -73,4 +71,4 @@ else
|
||||
fi
|
||||
|
||||
|
||||
"${GIT_ROOT}/nix/scripts/build.sh" targets.mobile.android.release "${nixOpts[@]}"
|
||||
"${GIT_ROOT}/nix/scripts/build.sh" targets.mobile.android.build "${nixOpts[@]}"
|
||||
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
|
||||
ADB_INSTALL_LOG_FILE="${GIT_ROOT}/logs/adb_install.log"
|
||||
ADB_SHELL_MONKEY_LOG_FILE="${GIT_ROOT}/logs/adb_shell_monkey.log"
|
||||
|
||||
# Generate android debug build.
|
||||
export ANDROID_ABI_INCLUDE=$("${GIT_ROOT}/scripts/adb_devices_abis.sh")
|
||||
export BUILD_ENV=debug
|
||||
export BUILD_TYPE=debug
|
||||
"${GIT_ROOT}/scripts/build-android.sh"
|
||||
|
||||
# Install the APK on running emulator or android device.
|
||||
installAndLaunchApp() {
|
||||
adb install -r ./result/app-debug.apk > "${ADB_INSTALL_LOG_FILE}" 2>&1
|
||||
"${GIT_ROOT}/scripts/wait-for-metro-port.sh" 2>&1
|
||||
# connected android devices need this port to be exposed for metro
|
||||
adb reverse "tcp:${RCT_METRO_PORT}" "tcp:${RCT_METRO_PORT}"
|
||||
adb shell monkey -p im.status.ethereum.debug 1 > "${ADB_SHELL_MONKEY_LOG_FILE}" 2>&1
|
||||
}
|
||||
|
||||
showAdbLogs() {
|
||||
cat "${ADB_INSTALL_LOG_FILE}" >&2;
|
||||
cat "${ADB_SHELL_MONKEY_LOG_FILE}" >&2;
|
||||
}
|
||||
|
||||
trap showAdbLogs EXIT ERR INT QUIT
|
||||
installAndLaunchApp &
|
||||
exec "${GIT_ROOT}/scripts/run-metro.sh" 2>&1
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
set -m # needed to access jobs
|
||||
|
||||
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
|
||||
XCRUN_DEVICE_INSTALL_LOG_DIR="${GIT_ROOT}/logs/xcrun_device_install.log"
|
||||
XCRUN_DEVICE_PROCESS_LAUNCH_LOG_DIR="${GIT_ROOT}/logs/xcrun_device_process_launch.log"
|
||||
XCRUN_DEVICE_PROCESS_RESUME_LOG_DIR="${GIT_ROOT}/logs/xcrun_device_process_resume.log"
|
||||
|
||||
# Install on the connected device
|
||||
installAndLaunchApp() {
|
||||
xcrun devicectl device install app --device "${DEVICE_UUID}" "${APP_PATH}" --json-output "${XCRUN_DEVICE_INSTALL_LOG_DIR}" 2>&1
|
||||
|
||||
# Extract installationURL
|
||||
INSTALLATION_URL=$(jq -r '.result.installedApplications[0].installationURL' "${XCRUN_DEVICE_INSTALL_LOG_DIR}")
|
||||
|
||||
# launch the app and put it in background
|
||||
xcrun devicectl device process launch --no-activate --verbose --device "${DEVICE_UUID}" "${INSTALLATION_URL}" --json-output "${XCRUN_DEVICE_PROCESS_LAUNCH_LOG_DIR}"
|
||||
|
||||
# Extract background PID of status app
|
||||
STATUS_PID=$(jq -r '.result.process.processIdentifier' "${XCRUN_DEVICE_PROCESS_LAUNCH_LOG_DIR}")
|
||||
"${GIT_ROOT}/scripts/wait-for-metro-port.sh" 2>&1
|
||||
|
||||
# now that metro is ready, resume the app from background
|
||||
xcrun devicectl device process resume --device "${DEVICE_UUID}" --pid "${STATUS_PID}" > "${XCRUN_DEVICE_PROCESS_RESUME_LOG_DIR}" 2>&1
|
||||
}
|
||||
|
||||
showXcrunLogs() {
|
||||
cat "${XCRUN_DEVICE_INSTALL_LOG_DIR}" >&2;
|
||||
cat "${XCRUN_DEVICE_PROCESS_LAUNCH_LOG_DIR}" >&2;
|
||||
cat "${XCRUN_DEVICE_PROCESS_RESUME_LOG_DIR}" >&2;
|
||||
}
|
||||
|
||||
# find the first connected iPhone's UUID
|
||||
DEVICE_UUID=$(idevice_id -l)
|
||||
|
||||
# Check if any device is connected
|
||||
if [ -z "${DEVICE_UUID}" ]; then
|
||||
echo "No connected iPhone device detected."
|
||||
exit 1
|
||||
else
|
||||
echo "Connected iPhone UDID: ${DEVICE_UUID}"
|
||||
fi
|
||||
|
||||
BUILD_DIR="${GIT_ROOT}/build"
|
||||
|
||||
#iOS build of debug scheme
|
||||
xcodebuild -workspace "ios/StatusIm.xcworkspace" -configuration Debug -scheme StatusIm -destination id="${DEVICE_UUID}" -derivedDataPath "${BUILD_DIR}" -verbose | xcbeautify
|
||||
|
||||
APP_PATH="${BUILD_DIR}/Build/Products/Debug-iphoneos/StatusIm.app"
|
||||
|
||||
trap showXcrunLogs EXIT ERR INT QUIT
|
||||
installAndLaunchApp &
|
||||
exec "${GIT_ROOT}/scripts/run-metro.sh" 2>&1
|
||||
|
||||
Executable
+69
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
set -m # needed to access jobs
|
||||
|
||||
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
|
||||
XCRUN_INSTALL_LOG_FILE="${GIT_ROOT}/logs/xcrun_install.log"
|
||||
XCRUN_LAUNCH_LOG_FILE="${GIT_ROOT}/logs/xcrun_launch.log"
|
||||
XCRUN_SIMULATOR_JSON_FILE="${GIT_ROOT}/logs/ios_simulators_list.log"
|
||||
|
||||
# Install on the simulator
|
||||
installAndLaunchApp() {
|
||||
xcrun simctl install "$UDID" "$APP_PATH" > "${XCRUN_INSTALL_LOG_FILE}" 2>&1
|
||||
"${GIT_ROOT}/scripts/wait-for-metro-port.sh" 2>&1
|
||||
xcrun simctl launch "$UDID" im.status.ethereum.debug > "${XCRUN_LAUNCH_LOG_FILE}" 2>&1
|
||||
|
||||
}
|
||||
|
||||
showXcrunLogs() {
|
||||
cat "${XCRUN_INSTALL_LOG_FILE}" >&2;
|
||||
cat "${XCRUN_LAUNCH_LOG_FILE}" >&2;
|
||||
}
|
||||
|
||||
# Check if the first argument is provided
|
||||
if [ -z "${1-}" ]; then
|
||||
echo "Error: No simulator name provided." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# fetch available iOS Simulators
|
||||
xcrun simctl list devices -j > "${XCRUN_SIMULATOR_JSON_FILE}"
|
||||
|
||||
SIMULATOR=${1}
|
||||
|
||||
# get the first available UDID for Simulators that match the name
|
||||
read -r UDID SIMULATOR_STATE IS_AVAILABLE < <(jq --raw-output --arg simulator "${SIMULATOR}" '
|
||||
[ .devices[] | .[] | select(.name == $simulator) ] |
|
||||
map(select(.isAvailable)) + map(select(.isAvailable | not)) |
|
||||
first |
|
||||
"\(.udid) \(.state) \(.isAvailable)"
|
||||
' "${XCRUN_SIMULATOR_JSON_FILE}")
|
||||
|
||||
if [ "${IS_AVAILABLE}" == false ] || [ "${UDID}" == null ]; then
|
||||
echo "Error: Simulator ${SIMULATOR} is not available, Please find and install them."
|
||||
echo "For help please refer"
|
||||
echo "https://developer.apple.com/documentation/safari-developer-tools/adding-additional-simulators#Add-and-remove-Simulators " >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# sometimes a simulator is already running, shut it down to avoid errors
|
||||
if [ "${SIMULATOR_STATE}" != "Shutdown" ]; then
|
||||
xcrun simctl shutdown "${UDID}"
|
||||
fi
|
||||
|
||||
# boot up iOS for simulator
|
||||
xcrun simctl boot "${UDID}"
|
||||
|
||||
# start the simulator
|
||||
open -a Simulator --args -CurrentDeviceUDID "${UDID}"
|
||||
|
||||
BUILD_DIR="${GIT_ROOT}/build"
|
||||
|
||||
#iOS build of debug scheme
|
||||
xcodebuild -workspace "ios/StatusIm.xcworkspace" -configuration Debug -scheme StatusIm -destination id="${UDID}" -derivedDataPath "${BUILD_DIR}" -verbose | xcbeautify
|
||||
|
||||
APP_PATH="${BUILD_DIR}/Build/Products/Debug-iphonesimulator/StatusIm.app"
|
||||
|
||||
trap showXcrunLogs EXIT ERR INT QUIT
|
||||
installAndLaunchApp &
|
||||
exec "${GIT_ROOT}/scripts/run-metro.sh" 2>&1
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
pkill -f 'react-native start'
|
||||
|
||||
react-native start --reset-cache
|
||||
@@ -1,17 +0,0 @@
|
||||
|
||||
#!/usr/bin/env bash
|
||||
|
||||
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
|
||||
source "${GIT_ROOT}/scripts/colors.sh"
|
||||
|
||||
METRO_PORT=8081
|
||||
METRO_PID="$(lsof -i :${METRO_PORT} | awk 'NR!=1 {print $2}' | sort -u | tr '\r\n' ' ')"
|
||||
if [ ! -z "$METRO_PID" ]; then
|
||||
echo -e "${YLW}TCP port ${METRO_PORT} is required by the Metro packager.\nThe following processes currently have the port open, preventing Metro from starting:${RST}"
|
||||
ps -fp $METRO_PID
|
||||
echo -e "${YLW}Do you want to terminate them (y/n)?${RST}"
|
||||
read -n 1 term
|
||||
[[ $term == 'y' ]] && kill $METRO_PID
|
||||
fi
|
||||
|
||||
react-native start --reset-cache
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
TIMEOUT=10 # Metro should not take this long to start.
|
||||
|
||||
while [ "${TIMEOUT}" -gt 0 ]; do
|
||||
if ! lsof -i:8081 &> /dev/null; then
|
||||
echo "."
|
||||
sleep 1
|
||||
((TIMEOUT--))
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
@@ -1,6 +1,6 @@
|
||||
(ns legacy.status-im.data-store.activities-test
|
||||
(:require
|
||||
[cljs.test :refer [deftest is testing]]
|
||||
[cljs.test :refer [deftest is]]
|
||||
[legacy.status-im.data-store.activities :as store]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.shell.activity-center.notification-types :as notification-types]))
|
||||
@@ -18,89 +18,6 @@
|
||||
:name chat-name
|
||||
:replyMessage {}})
|
||||
|
||||
(deftest <-rpc-test
|
||||
(testing "renames keys"
|
||||
(is (= {:name chat-name
|
||||
:chat-id chat-id
|
||||
:contact-verification-status constants/contact-verification-status-pending}
|
||||
(-> raw-notification
|
||||
store/<-rpc
|
||||
(dissoc :last-message :message :reply-message)))))
|
||||
|
||||
(testing "transforms messages from RPC response"
|
||||
(is
|
||||
(= {:last-message {:quoted-message nil
|
||||
:outgoing-status nil
|
||||
:command-parameters nil
|
||||
:link-previews []
|
||||
:content {:sticker nil
|
||||
:rtl? nil
|
||||
:ens-name nil
|
||||
:parsed-text nil
|
||||
:response-to nil
|
||||
:chat-id nil
|
||||
:image nil
|
||||
:line-count nil
|
||||
:links nil
|
||||
:text nil}
|
||||
:outgoing false}
|
||||
:message nil
|
||||
:reply-message {:quoted-message nil
|
||||
:outgoing-status nil
|
||||
:command-parameters nil
|
||||
:link-previews []
|
||||
:content {:sticker nil
|
||||
:rtl? nil
|
||||
:ens-name nil
|
||||
:parsed-text nil
|
||||
:response-to nil
|
||||
:chat-id nil
|
||||
:image nil
|
||||
:line-count nil
|
||||
:links nil
|
||||
:text nil}
|
||||
:outgoing false}}
|
||||
(-> raw-notification
|
||||
store/<-rpc
|
||||
(select-keys [:last-message :message :reply-message])))))
|
||||
|
||||
(testing "augments notification based on its type"
|
||||
(is (= {:chat-name chat-name
|
||||
:chat-type constants/private-group-chat-type
|
||||
:name chat-name}
|
||||
(-> raw-notification
|
||||
(assoc :type notification-types/reply)
|
||||
store/<-rpc
|
||||
(select-keys [:name :chat-type :chat-name :public? :group-chat]))))
|
||||
|
||||
(is (= {:chat-name chat-name
|
||||
:chat-type constants/private-group-chat-type
|
||||
:name chat-name}
|
||||
(-> raw-notification
|
||||
(assoc :type notification-types/mention)
|
||||
store/<-rpc
|
||||
(select-keys [:name :chat-type :chat-name :public? :group-chat]))))
|
||||
|
||||
(is (= {:chat-name chat-name
|
||||
:chat-type constants/private-group-chat-type
|
||||
:group-chat true
|
||||
:name chat-name
|
||||
:public? false}
|
||||
(-> raw-notification
|
||||
(assoc :type notification-types/private-group-chat)
|
||||
store/<-rpc
|
||||
(select-keys [:name :chat-type :chat-name :public? :group-chat]))))
|
||||
|
||||
(is (= {:chat-name chat-name
|
||||
:chat-type constants/one-to-one-chat-type
|
||||
:group-chat false
|
||||
:name chat-name
|
||||
:public? false}
|
||||
(-> raw-notification
|
||||
(assoc :type notification-types/one-to-one-chat)
|
||||
store/<-rpc
|
||||
(select-keys [:name :chat-type :chat-name :public? :group-chat]))))))
|
||||
|
||||
(deftest remove-pending-contact-request-test
|
||||
(is (true? (store/pending-contact-request?
|
||||
"contact-id"
|
||||
|
||||
@@ -4,13 +4,6 @@
|
||||
[clojure.walk :as walk]
|
||||
[status-im.constants :as constants]))
|
||||
|
||||
(defn rpc->channel-permissions
|
||||
[rpc-channels-permissions]
|
||||
(update-vals rpc-channels-permissions
|
||||
(fn [{:keys [viewAndPostPermissions viewOnlyPermissions]}]
|
||||
{:view-only (set/rename-keys viewOnlyPermissions {:satisfied :satisfied?})
|
||||
:view-and-post (set/rename-keys viewAndPostPermissions {:satisfied :satisfied?})})))
|
||||
|
||||
(defn <-revealed-accounts-rpc
|
||||
[accounts]
|
||||
(mapv
|
||||
@@ -34,8 +27,9 @@
|
||||
(assoc acc
|
||||
(name k)
|
||||
(-> v
|
||||
(assoc :can-post? (:canPost v))
|
||||
(dissoc :canPost)
|
||||
(assoc :token-gated? (:tokenGated v)
|
||||
:can-post? (:canPost v))
|
||||
(dissoc :canPost :tokenGated)
|
||||
(update :members walk/stringify-keys))))
|
||||
{}
|
||||
chats))
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
(ns legacy.status-im.data-store.communities-test
|
||||
(:require
|
||||
[cljs.test :refer [deftest is]]
|
||||
[legacy.status-im.data-store.communities :as sut]))
|
||||
|
||||
(def permissions
|
||||
{"community-id-chat-1"
|
||||
{:viewOnlyPermissions {:satisfied false
|
||||
:permissions {:token-permission-id-01 {:criteria [false]}}}
|
||||
:viewAndPostPermissions {:satisfied true :permissions {}}}
|
||||
"community-id-chat-2"
|
||||
{:viewOnlyPermissions {:satisfied true :permissions {}}
|
||||
:viewAndPostPermissions {:satisfied true :permissions {}}}})
|
||||
|
||||
(deftest rpc->channel-permissions-test
|
||||
(is (= {"community-id-chat-1"
|
||||
{:view-only {:satisfied? false
|
||||
:permissions {:token-permission-id-01 {:criteria [false]}}}
|
||||
:view-and-post {:satisfied? true :permissions {}}}
|
||||
"community-id-chat-2"
|
||||
{:view-only {:satisfied? true :permissions {}}
|
||||
:view-and-post {:satisfied? true :permissions {}}}}
|
||||
(sut/rpc->channel-permissions permissions))))
|
||||
@@ -53,7 +53,14 @@
|
||||
:new :new?
|
||||
:albumImagesCount :album-images-count
|
||||
:displayName :display-name
|
||||
:linkPreviews :link-previews})
|
||||
:linkPreviews :link-previews
|
||||
:statusLinkPreviews :status-link-previews
|
||||
:bridgeMessage :bridge-message})
|
||||
(update :bridge-message
|
||||
set/rename-keys
|
||||
{:bridgeName :bridge-name
|
||||
:userName :user-name
|
||||
:userAvatar :user-avatar})
|
||||
(update :link-previews #(map <-link-preview-rpc %))
|
||||
(update :quoted-message
|
||||
set/rename-keys
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
:image nil
|
||||
:response-to "a"
|
||||
:links nil}
|
||||
:bridge-message nil
|
||||
:whisper-timestamp 1
|
||||
:contact-verification-state 1
|
||||
:contact-request-state 2
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
[(mailserver/process-next-messages-request)
|
||||
(bottom-sheet/hide-bottom-sheet-old)
|
||||
(wallet/restart-wallet-service nil)
|
||||
(add-new-contact/set-new-identity-reconnected)]
|
||||
#(add-new-contact/set-new-identity-reconnected %)]
|
||||
|
||||
logged-in?
|
||||
[(mailserver/process-next-messages-request)
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
(let [key-uid (get-in db [:profile/profile :key-uid])]
|
||||
(rf/merge cofx
|
||||
{:set-root :progress
|
||||
:chat.ui/clear-inputs nil
|
||||
:effects.shell/reset-state nil
|
||||
:hide-popover nil
|
||||
::logout nil
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
:PeerExchange true
|
||||
:Port 0
|
||||
:UDPPort 0
|
||||
:LightClient true})
|
||||
:LightClient false})
|
||||
|
||||
(def login-node-config
|
||||
{:WalletConfig (cond-> {:Enabled true}
|
||||
|
||||
@@ -81,5 +81,9 @@
|
||||
{:db (-> db
|
||||
(assoc :contacts/identity identity)
|
||||
(assoc :contacts/ens-name ens-name))
|
||||
:dispatch [:contacts/build-contact identity ens-name true]}
|
||||
:dispatch [:contacts/build-contact
|
||||
{:pubkey identity
|
||||
:ens ens-name
|
||||
:success-fn (fn [_]
|
||||
{:dispatch [:open-modal :profile]})}]}
|
||||
{:dispatch [:navigate-to :my-profile]})))
|
||||
|
||||
@@ -55,7 +55,8 @@
|
||||
:on-change (fn [text]
|
||||
(re-frame/dispatch [:wallet-legacy/search-recipient-filter-changed text])
|
||||
(re-frame/dispatch [:set-in [:contacts/new-identity :state] :searching])
|
||||
(debounce/debounce-and-dispatch [:contacts/set-new-identity text] 300))}]]))
|
||||
(debounce/debounce-and-dispatch [:contacts/set-new-identity {:input text}]
|
||||
300))}]]))
|
||||
|
||||
(defn section
|
||||
[_ _ _]
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
(def container
|
||||
{:height 40
|
||||
:flex-direction :row
|
||||
:padding-horizontal 20
|
||||
:padding-horizontal 16
|
||||
:align-items :center})
|
||||
|
||||
(defn text
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
(defn circular-progress
|
||||
[{:keys [color percentage]}]
|
||||
(let [strength-indicator-radius 6.5
|
||||
(let [strength-indicator-radius 7.5
|
||||
strength-indicator-circumference (* 2 Math/PI strength-indicator-radius)]
|
||||
[svg/svg
|
||||
{:view-box "0 0 16 16"
|
||||
@@ -63,7 +63,10 @@
|
||||
:alert [icon/icon :i/alert
|
||||
{:color color
|
||||
:size 16}]
|
||||
[circular-progress {:color color :percentage percentage}])))
|
||||
[rn/view
|
||||
{:padding-left 4
|
||||
:padding-right 2}
|
||||
[circular-progress {:color color :percentage percentage}]])))
|
||||
|
||||
(defn view
|
||||
"Options
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
:style {:color (colors/theme-colors colors/danger-50 colors/danger-60 theme)}}
|
||||
error-message]])
|
||||
|
||||
(when (= description :top)
|
||||
(when (and (= description :top) role)
|
||||
[rn/view
|
||||
{:style style/description-top}
|
||||
[text/text
|
||||
|
||||
@@ -137,7 +137,8 @@
|
||||
:description description}]))
|
||||
|
||||
(defn- right-icon
|
||||
[{:keys [theme type on-button-press on-button-long-press button-disabled? button-icon]}]
|
||||
[{:keys [theme type on-button-press on-button-long-press button-disabled? button-icon button-type]
|
||||
:or {button-type :primary}}]
|
||||
(cond
|
||||
(= :info type)
|
||||
[icons/icon
|
||||
@@ -153,7 +154,7 @@
|
||||
:on-press on-button-press
|
||||
:on-long-press on-button-long-press
|
||||
:disabled? button-disabled?
|
||||
:type :primary
|
||||
:type button-type
|
||||
:size 24
|
||||
:icon-only? true}
|
||||
button-icon]))
|
||||
@@ -182,7 +183,7 @@
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [title title-icon type theme description blur? community-name community-logo button-icon
|
||||
account-name emoji context-tag-type
|
||||
account-name emoji context-tag-type button-type
|
||||
on-button-press
|
||||
on-button-long-press
|
||||
button-disabled? account-avatar-emoji account-avatar-type customization-color icon-avatar
|
||||
@@ -221,6 +222,7 @@
|
||||
[right-icon
|
||||
{:theme theme
|
||||
:type type
|
||||
:button-type button-type
|
||||
:on-button-press on-button-press
|
||||
:on-button-long-press on-button-long-press
|
||||
:button-disabled? button-disabled?
|
||||
|
||||
@@ -5,19 +5,19 @@
|
||||
|
||||
(h/describe "tests for markdown/list component"
|
||||
(h/test "renders component with title"
|
||||
(h/render [list/view {:title "test title"}])
|
||||
(h/render-with-theme-provider [list/view {:title "test title"}])
|
||||
(h/is-truthy (h/get-by-text "test title")))
|
||||
|
||||
(h/test "renders component with description"
|
||||
(h/render [list/view
|
||||
{:title "test title"
|
||||
:description "test description"}])
|
||||
(h/render-with-theme-provider [list/view
|
||||
{:title "test title"
|
||||
:description "test description"}])
|
||||
(h/is-truthy (h/get-by-text "test description")))
|
||||
|
||||
(h/test "renders component with title and description"
|
||||
(h/render [list/view
|
||||
{:title "test title"
|
||||
:description "test description"}])
|
||||
(h/render-with-theme-provider [list/view
|
||||
{:title "test title"
|
||||
:description "test description"}])
|
||||
(h/is-truthy (h/get-by-text "test title"))
|
||||
(h/is-truthy (h/get-by-text "test description")))
|
||||
|
||||
@@ -29,11 +29,11 @@
|
||||
(h/is-truthy (h/get-by-label-text :step-counter)))
|
||||
|
||||
(h/test "renders decription with a context tag component and description after the tag"
|
||||
(h/render [list/view
|
||||
{:step-number 1
|
||||
:description "Lorem ipsum "
|
||||
:tag-name "dolor"
|
||||
:description-after-tag "text after tag"}])
|
||||
(h/render-with-theme-provider [list/view
|
||||
{:step-number 1
|
||||
:description "Lorem ipsum "
|
||||
:tag-name "dolor"
|
||||
:description-after-tag "text after tag"}])
|
||||
(h/is-truthy (h/get-by-text "Lorem ipsum"))
|
||||
(h/is-truthy (h/get-by-label-text :user-avatar))
|
||||
(h/is-truthy (h/get-by-text "dolor"))
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
"
|
||||
[{:keys [icon new-notifications? notification-indicator counter-label
|
||||
on-press pass-through? icon-color-anim accessibility-label test-ID
|
||||
customization-color on-long-press]
|
||||
customization-color]
|
||||
:or {customization-color :blue}}]
|
||||
(let [icon-animated-style (reanimated/apply-animations-to-style
|
||||
{:tint-color icon-color-anim}
|
||||
@@ -48,7 +48,6 @@
|
||||
:border-radius 10})]
|
||||
[rn/touchable-without-feedback
|
||||
{:test-ID test-ID
|
||||
:on-long-press on-long-press ;;NOTE - this is temporary while supporting old wallet
|
||||
:allow-multiple-presses? true
|
||||
:on-press on-press
|
||||
:on-press-in #(toggle-background-color background-color false pass-through?)
|
||||
|
||||
@@ -311,7 +311,7 @@
|
||||
- title
|
||||
- description
|
||||
- picture: a valid rn/image `:source` value
|
||||
`:wallet-network`
|
||||
`:wallet-networks`
|
||||
- networks: a vector of network image source
|
||||
- networks-on-press: a callback
|
||||
`:community`
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
:padding-bottom 8})
|
||||
|
||||
(defn settings-items
|
||||
[{:keys [blur? theme]}]
|
||||
{:margin-top 12
|
||||
[{:keys [label blur? theme]}]
|
||||
{:margin-top (if label 12 4)
|
||||
:border-radius 16
|
||||
:background-color (if blur?
|
||||
colors/white-opa-5
|
||||
|
||||
@@ -12,47 +12,47 @@
|
||||
|
||||
(h/describe "Settings list tests"
|
||||
(h/test "Default render of Setting list component"
|
||||
(h/render [settings-item/view props])
|
||||
(h/render-with-theme-provider [settings-item/view props])
|
||||
(h/is-truthy (h/get-by-label-text :settings-item)))
|
||||
|
||||
(h/test "It renders a title"
|
||||
(h/render [settings-item/view props])
|
||||
(h/render-with-theme-provider [settings-item/view props])
|
||||
(h/is-truthy (h/get-by-text "Account")))
|
||||
|
||||
(h/test "its gets passed an on press event"
|
||||
(let [event (h/mock-fn)]
|
||||
(h/render [settings-item/view
|
||||
(merge props {:on-press event})])
|
||||
(h/render-with-theme-provider [settings-item/view
|
||||
(merge props {:on-press event})])
|
||||
(h/fire-event :press (h/get-by-text "Account"))
|
||||
(h/was-called event)))
|
||||
|
||||
(h/test "on change event gets fired for toggle"
|
||||
(let [on-change (h/mock-fn)]
|
||||
(h/render [settings-item/view
|
||||
(merge props
|
||||
{:action :selector
|
||||
:action-props {:on-change on-change}})])
|
||||
(h/render-with-theme-provider [settings-item/view
|
||||
(merge props
|
||||
{:action :selector
|
||||
:action-props {:on-change on-change}})])
|
||||
(h/fire-event :press (h/get-by-label-text :toggle-off))
|
||||
(h/was-called on-change)))
|
||||
|
||||
(h/test "It renders a label"
|
||||
(h/render [settings-item/view (merge props {:label :color})])
|
||||
(h/render-with-theme-provider [settings-item/view (merge props {:label :color})])
|
||||
(h/is-truthy (h/get-by-label-text :label-component)))
|
||||
|
||||
(h/test "It renders a status tag component"
|
||||
(h/render [settings-item/view
|
||||
(merge props
|
||||
{:tag :context
|
||||
:tag-props {:context "Test Tag"
|
||||
:icon :i/placeholder}})])
|
||||
(h/render-with-theme-provider [settings-item/view
|
||||
(merge props
|
||||
{:tag :context
|
||||
:tag-props {:context "Test Tag"
|
||||
:icon :i/placeholder}})])
|
||||
(h/is-truthy (h/get-by-text "Test Tag")))
|
||||
|
||||
(h/test "on press event gets fired for button"
|
||||
(let [event (h/mock-fn)]
|
||||
(h/render [settings-item/view
|
||||
(merge props
|
||||
{:action :button
|
||||
:action-props {:button-text "test button"
|
||||
:on-press event}})])
|
||||
(h/render-with-theme-provider [settings-item/view
|
||||
(merge props
|
||||
{:action :button
|
||||
:action-props {:button-text "test button"
|
||||
:on-press event}})])
|
||||
(h/fire-event :press (h/get-by-text "test button"))
|
||||
(h/was-called event))))
|
||||
|
||||
@@ -83,35 +83,35 @@
|
||||
(h/is-truthy (h/get-by-label-text :gif)))
|
||||
|
||||
(h/test "Status: Read, Type: Audio, Avatar: true"
|
||||
(h/render [group-messaging-card/view
|
||||
{:avatar true
|
||||
:status :read
|
||||
:type :audio
|
||||
:title "Title"
|
||||
:content {:duration "00:32"}}])
|
||||
(h/render-with-theme-provider [group-messaging-card/view
|
||||
{:avatar true
|
||||
:status :read
|
||||
:type :audio
|
||||
:title "Title"
|
||||
:content {:duration "00:32"}}])
|
||||
(h/is-truthy (h/get-by-text (utils/subtitle :audio nil)))
|
||||
(h/is-truthy (h/get-by-text "00:32")))
|
||||
|
||||
(h/test "Status: Read, Type: Community, Avatar: true"
|
||||
(h/render [group-messaging-card/view
|
||||
{:avatar true
|
||||
:status :read
|
||||
:type :community
|
||||
:title "Title"
|
||||
:content {:community-avatar coinbase-community
|
||||
:community-name "Coinbase"}}])
|
||||
(h/render-with-theme-provider [group-messaging-card/view
|
||||
{:avatar true
|
||||
:status :read
|
||||
:type :community
|
||||
:title "Title"
|
||||
:content {:community-avatar coinbase-community
|
||||
:community-name "Coinbase"}}])
|
||||
(h/is-truthy (h/get-by-text (utils/subtitle :community nil)))
|
||||
(h/is-truthy (h/get-by-label-text :group-avatar))
|
||||
(h/is-truthy (h/get-by-text "Coinbase")))
|
||||
|
||||
(h/test "Status: Read, Type: Link, Avatar: true"
|
||||
(h/render [group-messaging-card/view
|
||||
{:avatar true
|
||||
:status :read
|
||||
:type :link
|
||||
:title "Title"
|
||||
:content {:icon :placeholder
|
||||
:text "Rolling St..."}}])
|
||||
(h/render-with-theme-provider [group-messaging-card/view
|
||||
{:avatar true
|
||||
:status :read
|
||||
:type :link
|
||||
:title "Title"
|
||||
:content {:icon :placeholder
|
||||
:text "Rolling St..."}}])
|
||||
(h/is-truthy (h/get-by-text (utils/subtitle :link nil)))
|
||||
(h/is-truthy (h/get-by-label-text :group-avatar))
|
||||
(h/is-truthy (h/get-by-text "Rolling St..."))))
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
(ns quo.components.tags.collectible-tag.component-spec
|
||||
(:require
|
||||
[quo.components.tags.collectible-tag.view :as collectible-tag]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(def collectible-name "Collectible")
|
||||
(def collectible-id "#123")
|
||||
|
||||
(defn get-test-data
|
||||
[{:keys [options blur? size]}]
|
||||
{:collectible-name collectible-name
|
||||
:collectible-id collectible-id
|
||||
:collectible-img-src {:uri "https://example.com/image.jpg"}
|
||||
:options options
|
||||
:blur? (or blur? false)
|
||||
:size (or size :size-24)})
|
||||
|
||||
(h/describe "Collectible_tag tests"
|
||||
(h/test "Renders Default option"
|
||||
(let [data (get-test-data {})]
|
||||
(h/render-with-theme-provider [collectible-tag/view data])
|
||||
(h/is-truthy (h/get-by-text collectible-name))))
|
||||
|
||||
(h/test "Renders Add option"
|
||||
(let [data (get-test-data {:options :add})]
|
||||
(h/render-with-theme-provider [collectible-tag/view data])
|
||||
(h/is-truthy (h/get-by-text collectible-name))))
|
||||
|
||||
(h/test "Renders Hold option"
|
||||
(let [data (get-test-data {:options :hold})]
|
||||
(h/render-with-theme-provider [collectible-tag/view data])
|
||||
(h/is-truthy (h/get-by-text collectible-name))))
|
||||
|
||||
(h/test "Renders with Blur"
|
||||
(let [data (get-test-data {:blur? true})]
|
||||
(h/render-with-theme-provider [collectible-tag/view data])
|
||||
(h/is-truthy (h/get-by-text collectible-name))))
|
||||
|
||||
(h/test "Renders without Blur"
|
||||
(let [data (get-test-data {:blur? false})]
|
||||
(h/render-with-theme-provider [collectible-tag/view data])
|
||||
(h/is-truthy (h/get-by-text collectible-name))))
|
||||
|
||||
(h/test "Renders with Size 24"
|
||||
(let [data (get-test-data {:size :size-24})]
|
||||
(h/render-with-theme-provider [collectible-tag/view data])
|
||||
(h/is-truthy (h/get-by-text collectible-name))))
|
||||
|
||||
(h/test "Renders with Size 32"
|
||||
(let [data (get-test-data {:size :size-32})]
|
||||
(h/render-with-theme-provider [collectible-tag/view data])
|
||||
(h/is-truthy (h/get-by-text collectible-name)))))
|
||||
@@ -0,0 +1,15 @@
|
||||
(ns quo.components.tags.collectible-tag.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:options {:optional true} [:maybe [:enum :add :hold]]]
|
||||
[:size {:optional true} [:maybe [:enum :size-24 :size-32]]]
|
||||
[:blur? {:optional true} [:maybe :boolean]]
|
||||
[:theme :schema.common/theme]
|
||||
[:collectible-img-src :schema.common/image-source]
|
||||
[:collectible-name :string]
|
||||
[:collectible-id :string]]]]
|
||||
:any])
|
||||
@@ -1,70 +1,59 @@
|
||||
(ns quo.components.tags.collectible-tag.view
|
||||
(:require
|
||||
[oops.core :as oops]
|
||||
[quo.components.icon :as icons]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.collectible-tag.schema :as component-schema]
|
||||
[quo.components.tags.collectible-tag.style :as style]
|
||||
[quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.hole-view :as hole-view]
|
||||
[reagent.core :as reagent]
|
||||
[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}]])]))
|
||||
(let [container-width (reagent/atom 0)
|
||||
on-layout #(->> (oops/oget % :nativeEvent :layout :width)
|
||||
(reset! container-width))]
|
||||
(fn [{:keys [options blur? theme collectible-img-src collectible-name collectible-id] :as props}]
|
||||
(let [size (or (:size props) :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)))
|
||||
(schema/instrument #'view-internal component-schema/?schema)))
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
(ns quo.components.tags.context-tag.schema
|
||||
(:require [malli.core :as malli]))
|
||||
|
||||
(def ^:private ?context-base
|
||||
[:map
|
||||
[:type {:optional true}
|
||||
[:maybe
|
||||
[:enum :default :multiuser :group :channel :community :token :network :multinetwork :account
|
||||
:collectible :address :icon :audio]]]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
|
||||
[:theme :schema.common/theme]
|
||||
[:blur? {:optional true} [:maybe :boolean]]
|
||||
[:state {:optional true} [:maybe [:enum :selected :default]]]])
|
||||
|
||||
(def ^:private ?size
|
||||
[:map
|
||||
[:size {:optional true} [:maybe [:enum 24 32]]]])
|
||||
|
||||
(def ^:private ?default
|
||||
[:map
|
||||
[:profile-picture {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:full-name {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?multiuser
|
||||
[:map
|
||||
[:users {:optional true}
|
||||
[:maybe
|
||||
[:sequential
|
||||
[:map [:profile-picture {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:full-name {:optional true} [:maybe :string]]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]]]]]])
|
||||
|
||||
(def ^:private ?group
|
||||
[:map
|
||||
[:group-name {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?channel
|
||||
[:map
|
||||
[:community-name {:optional true} [:maybe :string]]
|
||||
[:channel-name {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?community
|
||||
[:map
|
||||
[:community-name {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?token
|
||||
[:map
|
||||
[:amount {:optional true} [:maybe [:or :string :int]]]
|
||||
[:token {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?network
|
||||
[:map
|
||||
[:network-logo {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:network-name {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?multinetwork
|
||||
[:map
|
||||
[:networks {:optional true} [:maybe [:sequential ?network]]]])
|
||||
|
||||
(def ^:private ?account
|
||||
[:map
|
||||
[:account-name {:optional true} [:maybe :string]]
|
||||
[:emoji {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?collectible
|
||||
[:map
|
||||
[:collectible {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:collectible-name {:optional true} [:maybe :string]]
|
||||
[:collectible-number {:optional true} [:maybe [:or :string :int]]]])
|
||||
|
||||
(def ^:private ?address
|
||||
[:map
|
||||
[:address {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?icon
|
||||
[:map
|
||||
[:icon {:optional true} [:maybe :keyword]]
|
||||
[:context {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?audio
|
||||
[:map
|
||||
[:duration {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:multi {:dispatch :type}
|
||||
[::malli/default [:merge ?default ?size ?context-base]]
|
||||
[:default [:merge ?default ?size ?context-base]]
|
||||
[:multiuser [:merge ?multiuser ?context-base]]
|
||||
[:group [:merge ?group ?size ?context-base]]
|
||||
[:channel [:merge ?channel ?size ?context-base]]
|
||||
[:community [:merge ?community ?size ?context-base]]
|
||||
[:token [:merge ?token ?size ?context-base]]
|
||||
[:network [:merge ?network ?context-base]]
|
||||
[:multinetwork [:merge ?multinetwork ?context-base]]
|
||||
[:account [:merge ?account ?size ?context-base]]
|
||||
[:collectible [:merge ?collectible ?size ?context-base]]
|
||||
[:address [:merge ?address ?size ?context-base]]
|
||||
[:icon [:merge ?icon ?size ?context-base]]
|
||||
[:audio [:merge ?audio ?context-base]]]]]
|
||||
:any])
|
||||
@@ -6,11 +6,13 @@
|
||||
[quo.components.icon :as icons]
|
||||
[quo.components.list-items.preview-list.view :as preview-list]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.context-tag.schema :as component-schema]
|
||||
[quo.components.tags.context-tag.style :as style]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]))
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(defn- tag-skeleton
|
||||
[{:keys [theme size text] :or {size 24}} logo-component]
|
||||
@@ -157,67 +159,5 @@
|
||||
nil)])
|
||||
|
||||
(def view
|
||||
"Properties:
|
||||
type, state, blur? & customization-color
|
||||
|
||||
Depending on the `type` selected, different properties are accepted:
|
||||
- `:default` or `nil`:
|
||||
- size
|
||||
- profile-picture
|
||||
- full-name
|
||||
|
||||
- `:multiuser`:
|
||||
- users (vector of {:profile-picture pic, :full-name \"a name\"})
|
||||
|
||||
- `:group`
|
||||
- size
|
||||
- group-name
|
||||
|
||||
- `:community`
|
||||
- size
|
||||
- community-logo (valid rn/image :source value)
|
||||
- community-name
|
||||
|
||||
- `:channel`
|
||||
- size
|
||||
- community-logo (valid rn/image :source value)
|
||||
- community-name
|
||||
- channel-name
|
||||
|
||||
- `:token`
|
||||
- size
|
||||
- amount
|
||||
- token
|
||||
|
||||
- `:network`
|
||||
- size
|
||||
- network-logo (valid rn/image :source value)
|
||||
- network-name
|
||||
|
||||
- `:multinetworks`
|
||||
- networks (vector of {:network-logo pic, :network-name \"a name\"})
|
||||
|
||||
- `:account`
|
||||
- size
|
||||
- account-name
|
||||
- emoji (string containing an emoji)
|
||||
|
||||
- `:collectible`
|
||||
- size
|
||||
- collectible (valid rn/image :source value)
|
||||
- collectible-name
|
||||
- collectible-number
|
||||
|
||||
- `:address`
|
||||
- size
|
||||
- address (string)
|
||||
|
||||
- `:icon`
|
||||
- size
|
||||
- icon
|
||||
- context (string)
|
||||
|
||||
- `:audio`
|
||||
- duration (string)
|
||||
"
|
||||
(quo.theme/with-theme view-internal))
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal component-schema/?schema)))
|
||||
|
||||
@@ -27,6 +27,19 @@
|
||||
:blurred-border-color colors/white-opa-10
|
||||
:text-color {:style {:color colors/white}}}}})
|
||||
|
||||
(defn- emoji-comp
|
||||
[size resource]
|
||||
(let [dimension (case size
|
||||
32 20
|
||||
24 12
|
||||
nil)]
|
||||
(if (string? resource)
|
||||
[rn/text {:style {:margin-right 4 :font-size dimension}}
|
||||
resource]
|
||||
[rn/image
|
||||
{:source resource
|
||||
:style {:margin-right 4 :width dimension :height dimension}}])))
|
||||
|
||||
(defn tag-resources
|
||||
[size type resource icon-color label text-color labelled?]
|
||||
[rn/view
|
||||
@@ -47,13 +60,7 @@
|
||||
24 12)
|
||||
:color icon-color}])
|
||||
(when (= type :emoji)
|
||||
[text/text
|
||||
{:style {:margin-right 4}
|
||||
:size (case size
|
||||
32 :paragraph-1
|
||||
24 :paragraph-2
|
||||
nil)}
|
||||
resource])
|
||||
[emoji-comp size resource])
|
||||
(when labelled?
|
||||
[text/text
|
||||
(merge {:size (case size
|
||||
@@ -73,7 +80,7 @@
|
||||
:size 32/24
|
||||
:on-press fn
|
||||
:blurred? true/false
|
||||
:resource icon/image
|
||||
:resource icon/image/text(emojis)
|
||||
:labelled? true/false
|
||||
:disabled? true/false}
|
||||
|
||||
@@ -107,4 +114,3 @@
|
||||
[tag-resources size type resource icon-color label text-color labelled?]]]))
|
||||
|
||||
(def tag (quo.theme/with-theme tag-internal))
|
||||
|
||||
|
||||
@@ -37,26 +37,26 @@
|
||||
(h/is-truthy (h/get-by-text "This is a textual description")))
|
||||
|
||||
(h/test "Context tag"
|
||||
(h/render [page-top/view
|
||||
{:title "Title"
|
||||
:description :context-tag
|
||||
:context-tag context-tag-data}])
|
||||
(h/render-with-theme-provider [page-top/view
|
||||
{:title "Title"
|
||||
:description :context-tag
|
||||
:context-tag context-tag-data}])
|
||||
|
||||
(h/is-truthy (h/get-by-text "Title"))
|
||||
(h/is-truthy (h/get-by-label-text :context-tag)))
|
||||
|
||||
(h/test "Summary"
|
||||
(h/render [page-top/view
|
||||
{:title "Title"
|
||||
:description :summary
|
||||
:summary {:row-1 {:text-1 "Send"
|
||||
:text-2 "from"
|
||||
:context-tag-1 context-tag-data
|
||||
:context-tag-2 context-tag-data}
|
||||
:row-2 {:text-1 "to"
|
||||
:text-2 "via"
|
||||
:context-tag-1 context-tag-data
|
||||
:context-tag-2 context-tag-data}}}])
|
||||
(h/render-with-theme-provider [page-top/view
|
||||
{:title "Title"
|
||||
:description :summary
|
||||
:summary {:row-1 {:text-1 "Send"
|
||||
:text-2 "from"
|
||||
:context-tag-1 context-tag-data
|
||||
:context-tag-2 context-tag-data}
|
||||
:row-2 {:text-1 "to"
|
||||
:text-2 "via"
|
||||
:context-tag-1 context-tag-data
|
||||
:context-tag-2 context-tag-data}}}])
|
||||
|
||||
(h/is-truthy (h/get-by-text "Title"))
|
||||
(h/is-truthy (h/get-by-text "Send"))
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
(defn view-internal
|
||||
[{:keys [container-style
|
||||
title
|
||||
title-number-of-lines
|
||||
avatar
|
||||
title-accessibility-label
|
||||
description
|
||||
@@ -28,7 +29,8 @@
|
||||
button-icon
|
||||
button-on-press
|
||||
customization-color
|
||||
emoji-hash]}]
|
||||
emoji-hash]
|
||||
:or {title-number-of-lines 1}}]
|
||||
[rn/view {:style container-style}
|
||||
[rn/view
|
||||
{:style {:flex-direction :row
|
||||
@@ -41,7 +43,7 @@
|
||||
{:accessibility-label title-accessibility-label
|
||||
:weight :semi-bold
|
||||
:ellipsize-mode :tail
|
||||
:number-of-lines 1
|
||||
:number-of-lines title-number-of-lines
|
||||
:size :heading-1}
|
||||
title]]
|
||||
(when button-icon
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
[:token {:optional true} [:maybe [:or keyword? string?]]]
|
||||
[:style {:optional true} map?]
|
||||
;; 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 :schema.common/image-source]]]]
|
||||
:any])
|
||||
|
||||
(defn- size->number
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
(def ^:private ?default-keypair
|
||||
[:map
|
||||
[:user-name {:optional true} [:maybe :string]]
|
||||
[:profile-picture {:optional true} [:maybe [:or :schema.common/image-source :string]]]
|
||||
[:profile-picture {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:derivation-path {:optional true} [:maybe :string]]
|
||||
[:on-press {:optional true} [:maybe fn?]]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]])
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
(ns quo.components.wallet.account-permissions.schema
|
||||
(:require [quo.components.wallet.required-tokens.view :as required-tokens]))
|
||||
(:require [quo.components.wallet.required-tokens.schema :as required-tokens-schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
@@ -12,11 +12,12 @@
|
||||
[:address [:maybe :string]]
|
||||
[:emoji [:maybe :string]]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]]]
|
||||
[:token-details {:optional true} [:maybe [:sequential required-tokens/?schema]]]
|
||||
[:token-details {:optional true} [:maybe [:sequential required-tokens-schema/?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]]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
|
||||
[:theme :schema.common/theme]]]]
|
||||
:any])
|
||||
|
||||
@@ -42,9 +42,11 @@
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys
|
||||
[checked? disabled? on-change token-details keycard? theme container-style]
|
||||
[checked? disabled? on-change token-details keycard? theme container-style customization-color]
|
||||
{:keys
|
||||
[name address emoji customization-color]} :account}]
|
||||
[name address emoji]
|
||||
:as account} :account
|
||||
:or {customization-color :blue}}]
|
||||
[rn/view
|
||||
{:style (merge (style/container theme) container-style)
|
||||
:accessibility-label :wallet-account-permissions}
|
||||
@@ -52,7 +54,7 @@
|
||||
[account-avatar/view
|
||||
{:size 32
|
||||
:emoji emoji
|
||||
:customization-color customization-color}]
|
||||
:customization-color (:customization-color account)}]
|
||||
[rn/view {:style style/account-details}
|
||||
[rn/view {:style style/name-and-keycard}
|
||||
[text/text
|
||||
@@ -67,10 +69,11 @@
|
||||
{:address address
|
||||
:format :short}]]
|
||||
[selectors/view
|
||||
{:type :checkbox
|
||||
:checked? checked?
|
||||
:disabled? disabled?
|
||||
:on-change on-change}]]
|
||||
{:type :checkbox
|
||||
:checked? checked?
|
||||
:customization-color customization-color
|
||||
:disabled? disabled?
|
||||
:on-change on-change}]]
|
||||
|
||||
[token-details-section token-details]])
|
||||
|
||||
|
||||
@@ -15,101 +15,101 @@
|
||||
|
||||
(h/describe "Confirmation Progress"
|
||||
(h/test "component renders when state is sending and network is optimism"
|
||||
(h/render-with-theme-provider [quo/confirmation-propgress
|
||||
(h/render-with-theme-provider [quo/confirmation-progress
|
||||
(get-test-data {:state :sending
|
||||
:network :optimism})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box))))
|
||||
|
||||
(h/test "component renders when state is confirmed and network is optimism"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :confirmed
|
||||
:network :optimism})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is finalising and network is optimism"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :finalising
|
||||
:network :optimism})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is finalized and network is optimism"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :finalized
|
||||
:network :optimism})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is error and network is optimism"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :error
|
||||
:network :optimism})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is sending and network is arbitrum"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :sending
|
||||
:network :arbitrum})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is confirmed and network is arbitrum"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :confirmed
|
||||
:network :arbitrum})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is finalising and network is arbitrum"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :finalising
|
||||
:network :arbitrum})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is finalized and network is arbitrum"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :finalized
|
||||
:network :arbitrum})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is error and network is arbitrum"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :error
|
||||
:network :arbitrum})])
|
||||
(h/is-truthy (h/get-by-label-text :progress-box)))
|
||||
|
||||
(h/test "component renders when state is pending and network is mainnet"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress (get-test-data {})])
|
||||
[quo/confirmation-progress (get-test-data {})])
|
||||
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
|
||||
|
||||
(h/test "component renders when state is sending and network is mainnet"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress (get-test-data {:state :sending})])
|
||||
[quo/confirmation-progress (get-test-data {:state :sending})])
|
||||
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
|
||||
|
||||
(h/test "component renders when state is confirmed and network is mainnet"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress (get-test-data {:state :confirmed})])
|
||||
[quo/confirmation-progress (get-test-data {:state :confirmed})])
|
||||
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
|
||||
|
||||
(h/test "component renders when state is finalising and network is mainnet"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress (get-test-data {:state :finalising})])
|
||||
[quo/confirmation-progress (get-test-data {:state :finalising})])
|
||||
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
|
||||
|
||||
(h/test "component renders when state is finalized and network is mainnet"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress (get-test-data {:state :finalized})])
|
||||
[quo/confirmation-progress (get-test-data {:state :finalized})])
|
||||
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
|
||||
|
||||
(h/test "component renders when state is error and network is mainnet"
|
||||
(h/render-with-theme-provider
|
||||
[quo/confirmation-propgress
|
||||
[quo/confirmation-progress
|
||||
(get-test-data {:state :error})])
|
||||
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
(ns quo.components.wallet.network-amount.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:amount {:optional true} [:maybe :string]]
|
||||
[:token {:optional true} [:or :keyword :string]]
|
||||
[:theme :schema.common/theme]]]]
|
||||
:any])
|
||||
@@ -3,21 +3,12 @@
|
||||
[clojure.string :as string]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.components.wallet.network-amount.schema :as network-amount-schema]
|
||||
[quo.components.wallet.network-amount.style :as style]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:amount {:optional true} [:maybe :string]]
|
||||
[:token {:optional true} [:or :keyword :string]]
|
||||
[:theme :schema.common/theme]]]]
|
||||
:any])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [amount token theme]}]
|
||||
[rn/view {:style style/container}
|
||||
@@ -30,4 +21,4 @@
|
||||
[rn/view
|
||||
{:style (style/divider theme)}]])
|
||||
|
||||
(def view (quo.theme/with-theme (schema/instrument #'view-internal ?schema)))
|
||||
(def view (quo.theme/with-theme (schema/instrument #'view-internal network-amount-schema/?schema)))
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
(ns quo.components.wallet.network-bridge.schema)
|
||||
|
||||
(def ^:private ?network-bridge-status
|
||||
[:enum :add :loading :locked :disabled :default])
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:theme :schema.common/theme]
|
||||
[:network {:optional true} [:maybe :keyword]]
|
||||
[:status {:optional true} [:maybe ?network-bridge-status]]
|
||||
[:amount {:optional true} [:maybe :string]]
|
||||
[:container-style {:optional true} [:maybe :map]]
|
||||
[:on-press {:optional true} [:maybe fn?]]]]]
|
||||
:any])
|
||||
@@ -3,6 +3,7 @@
|
||||
[clojure.string :as string]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.wallet.network-bridge.schema :as network-bridge-schema]
|
||||
[quo.components.wallet.network-bridge.style :as style]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.foundations.resources :as resources]
|
||||
@@ -25,22 +26,6 @@
|
||||
(= network :ethereum) "Mainnet"
|
||||
:else (string/capitalize (name network))))
|
||||
|
||||
(def ^:private ?network-bridge-status
|
||||
[:enum :add :loading :locked :disabled :default])
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:theme :schema.common/theme]
|
||||
[:network {:optional true} [:maybe :keyword]]
|
||||
[:status {:optional true} [:maybe ?network-bridge-status]]
|
||||
[:amount {:optional true} [:maybe :string]]
|
||||
[:container-style {:optional true} [:maybe :map]]
|
||||
[:on-press {:optional true} [:maybe fn?]]]]]
|
||||
:any])
|
||||
|
||||
(defn view-internal
|
||||
[{:keys [theme network status amount container-style on-press] :as args}]
|
||||
(if (= status :add)
|
||||
@@ -81,4 +66,4 @@
|
||||
|
||||
(def view
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal ?schema)))
|
||||
(schema/instrument #'view-internal network-bridge-schema/?schema)))
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
(ns quo.components.wallet.network-link.schema)
|
||||
|
||||
(def ^:private ?networks [:enum :optimism :arbitrum :ethereum])
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:shape {:optional true} [:maybe [:enum :linear :1x :2x]]]
|
||||
[:source {:optional true} [:maybe ?networks]]
|
||||
[:destination {:optional true} [:maybe ?networks]]
|
||||
[:theme :schema.common/theme]]]]
|
||||
:any])
|
||||
@@ -1,9 +1,11 @@
|
||||
(ns quo.components.wallet.network-link.view
|
||||
(:require
|
||||
[quo.components.wallet.network-link.schema :as component-schema]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.svg :as svg]))
|
||||
[react-native.svg :as svg]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(defn link-linear
|
||||
[{:keys [source theme]}]
|
||||
@@ -84,4 +86,6 @@
|
||||
:1x [link-1x props]
|
||||
:2x [link-2x props])])
|
||||
|
||||
(def view (quo.theme/with-theme view-internal))
|
||||
(def view
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal component-schema/?schema)))
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
(ns quo.components.wallet.network-routing.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:networks {:optional true}
|
||||
[:maybe
|
||||
[:sequential
|
||||
[:map
|
||||
[:amount :int]
|
||||
[:max-amount :int]
|
||||
[:network-name [:or :string :keyword]]]]]]
|
||||
[:container-style {:optional true} [:maybe :map]]
|
||||
[:theme :schema.common/theme]]]]
|
||||
:any])
|
||||
@@ -2,6 +2,7 @@
|
||||
(:require
|
||||
[oops.core :as oops]
|
||||
[quo.components.wallet.network-routing.animation :as animation]
|
||||
[quo.components.wallet.network-routing.schema :as network-routing-schema]
|
||||
[quo.components.wallet.network-routing.style :as style]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
@@ -173,22 +174,6 @@
|
||||
[rn/view {:style (style/max-limit-bar-background network-name)}]
|
||||
[dashed-line network-name]])]))))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:networks {:optional true}
|
||||
[:maybe
|
||||
[:sequential
|
||||
[:map
|
||||
[:amount :int]
|
||||
[:max-amount :int]
|
||||
[:network-name [:or :string :keyword]]]]]]
|
||||
[:container-style {:optional true} [:maybe :map]]
|
||||
[:theme :schema.common/theme]]]]
|
||||
:any])
|
||||
|
||||
(defn view-internal
|
||||
[{:keys [networks container-style theme] :as params}]
|
||||
(reagent/with-let [total-width (reagent/atom nil)]
|
||||
@@ -205,4 +190,4 @@
|
||||
|
||||
(def view
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal ?schema)))
|
||||
(schema/instrument #'view-internal network-routing-schema/?schema)))
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
(ns quo.components.wallet.progress-bar.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
|
||||
[:theme :schema.common/theme]
|
||||
[:progressed-value {:optional true} [:maybe [:or :string :int]]]
|
||||
[:full-width? {:optional true} [:maybe :boolean]]]]]
|
||||
:any])
|
||||
@@ -1,21 +1,11 @@
|
||||
(ns quo.components.wallet.progress-bar.view
|
||||
(:require
|
||||
[quo.components.wallet.progress-bar.schema :as progress-bar-schema]
|
||||
[quo.components.wallet.progress-bar.style :as style]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
|
||||
[:theme :schema.common/theme]
|
||||
[:progressed-value {:optional true} [:maybe [:or :string :int]]]
|
||||
[:full-width? {:optional true} [:maybe :boolean]]]]]
|
||||
:any])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [full-width?] :as props}]
|
||||
[rn/view
|
||||
@@ -26,4 +16,4 @@
|
||||
|
||||
(def view
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal ?schema)))
|
||||
(schema/instrument #'view-internal progress-bar-schema/?schema)))
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
(ns quo.components.wallet.required-tokens.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:type [:enum :token :collectible]]
|
||||
[:amount {:optional true} [:maybe [:or :string :int]]]
|
||||
[:token {:optional true} [:maybe :string]]
|
||||
[:token-img-src {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:collectible-img-src {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:collectible-name {:optional true} [:maybe :string]]
|
||||
[:divider? {:optional true} [:maybe :boolean]]
|
||||
[:theme :schema.common/theme]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
@@ -1,27 +1,12 @@
|
||||
(ns quo.components.wallet.required-tokens.view
|
||||
(:require [quo.components.markdown.text :as text]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.components.wallet.required-tokens.schema :as required-tokens-schema]
|
||||
[quo.components.wallet.required-tokens.style :as style]
|
||||
quo.theme
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:type [:enum :token :collectible]]
|
||||
[:amount {:optional true} [:maybe [:or :string :int]]]
|
||||
[:token {:optional true} [:maybe :string]]
|
||||
[:token-img-src {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:collectible-img-src {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:collectible-name {:optional true} [:maybe :string]]
|
||||
[:divider? {:optional true} [:maybe :boolean]]
|
||||
[:theme :schema.common/theme]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [type amount token token-img-src collectible-img-src collectible-name divider? theme
|
||||
container-style]}]
|
||||
@@ -53,4 +38,4 @@
|
||||
|
||||
(def view
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal ?schema)))
|
||||
(schema/instrument #'view-internal required-tokens-schema/?schema)))
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
(ns quo.components.wallet.summary-info.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:theme :schema.common/theme]
|
||||
[:type [:enum :status-account :saved-account :account :user]]
|
||||
[:account-props {:optional true} [:maybe :map]]
|
||||
[:networks? {:optional true} [:maybe :boolean]]
|
||||
[:values {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
@@ -4,6 +4,7 @@
|
||||
[quo.components.avatars.user-avatar.view :as user-avatar]
|
||||
[quo.components.avatars.wallet-user-avatar.view :as wallet-user-avatar]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.wallet.summary-info.schema :as summary-info-schema]
|
||||
[quo.components.wallet.summary-info.style :as style]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.foundations.resources :as resources]
|
||||
@@ -52,18 +53,6 @@
|
||||
:amount (str (:amount arbitrum) " " (or (:token-symbol arbitrum) "ARB"))
|
||||
:theme theme}])]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:theme :schema.common/theme]
|
||||
[:type [:enum :status-account :saved-account :account :user]]
|
||||
[:account-props {:optional true} [:maybe :map]]
|
||||
[:networks? {:optional true} [:maybe :boolean]]
|
||||
[:values {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [theme type account-props networks? values]}]
|
||||
[rn/view
|
||||
@@ -106,4 +95,4 @@
|
||||
|
||||
(def view
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal ?schema)))
|
||||
(schema/instrument #'view-internal summary-info-schema/?schema)))
|
||||
|
||||
@@ -5,15 +5,15 @@
|
||||
|
||||
(h/describe "Wallet: Token Input"
|
||||
(h/test "Token label renders"
|
||||
(h/render [token-input/view
|
||||
{:token :snt
|
||||
:currency :eur
|
||||
:conversion 1}])
|
||||
(h/render-with-theme-provider [token-input/view
|
||||
{:token :snt
|
||||
:currency :eur
|
||||
:conversion 1}])
|
||||
(h/is-truthy (h/get-by-text "SNT")))
|
||||
|
||||
(h/test "Amount renders"
|
||||
(h/render [token-input/view
|
||||
{:token :snt
|
||||
:currency :eur
|
||||
:conversion 1}])
|
||||
(h/render-with-theme-provider [token-input/view
|
||||
{:token :snt
|
||||
:currency :eur
|
||||
:conversion 1}])
|
||||
(h/is-truthy (h/get-by-text "€0.00"))))
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
(ns quo.components.wallet.token-input.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:token {:optional true} [:maybe :keyword]]
|
||||
[:currency {:optional true} [:maybe :keyword]]
|
||||
[:error? {:optional true} [:maybe :boolean]]
|
||||
[:title {:optional true} [:maybe :string]]
|
||||
[:conversion {:optional true} [:maybe :double]]
|
||||
[:show-keyboard? {:optional true} [:maybe :boolean]]
|
||||
[:networks {:optional true}
|
||||
[:maybe [:sequential [:map [:source [:maybe :schema.common/image-source]]]]]]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
|
||||
[:value {:optional true} [:maybe :string]]
|
||||
[:theme :schema.common/theme]]]]
|
||||
:any])
|
||||
@@ -7,11 +7,13 @@
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.network-tags.view :as network-tag]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.components.wallet.token-input.schema :as component-schema]
|
||||
[quo.components.wallet.token-input.style :as style]
|
||||
[quo.foundations.common :as common]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]))
|
||||
[reagent.core :as reagent]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(defn fiat-format
|
||||
[currency num-value conversion]
|
||||
@@ -149,4 +151,6 @@
|
||||
:crypto? @crypto?
|
||||
:amount (or value @value-atom))]]))))
|
||||
|
||||
(def view (quo.theme/with-theme view-internal))
|
||||
(def view
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal component-schema/?schema)))
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
(ns quo.components.wallet.transaction-progress.schema)
|
||||
|
||||
(def ^:private ?network
|
||||
[:map
|
||||
[:network {:optional true} [:maybe [:enum :mainnet :optimism :arbitrum]]]
|
||||
[:state {:optional true} [:maybe [:enum :pending :sending :confirmed :finalising :finalized :error]]]
|
||||
[:counter {:optional true} [:maybe :int]]
|
||||
[:total-box {:optional true} [:maybe :int]]
|
||||
[:epoch-number {:optional true} [:maybe :string]]
|
||||
[:progress {:optional true} [:maybe :int]]])
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:theme :schema.common/theme]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
|
||||
[:title {:optional true} [:maybe :string]]
|
||||
[:tag-name {:optional true} [:maybe :string]]
|
||||
[:tag-number {:optional true} [:maybe [:or :string :int]]]
|
||||
[:tag-photo {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:on-press {:optional true} [:maybe fn?]]
|
||||
[:networks {:optional true} [:maybe [:sequential ?network]]]]]]
|
||||
:any])
|
||||
@@ -4,10 +4,12 @@
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.context-tag.view :as context-tag]
|
||||
[quo.components.wallet.confirmation-progress.view :as confirmation-progress]
|
||||
[quo.components.wallet.transaction-progress.schema :as component-schema]
|
||||
[quo.components.wallet.transaction-progress.style :as style]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(def ^:private max-mainnet-verifications 4)
|
||||
@@ -184,4 +186,6 @@
|
||||
^{:key (:network network)}
|
||||
[view-network (assoc-props (:network network))]))]])
|
||||
|
||||
(def view (quo.theme/with-theme view-internal))
|
||||
(def view
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal component-schema/?schema)))
|
||||
|
||||
@@ -5,24 +5,20 @@
|
||||
|
||||
(h/describe "Transaction summary"
|
||||
(h/test "default render"
|
||||
(h/render [transaction-summary/view {}])
|
||||
(h/is-truthy (h/query-by-label-text :transaction-summary)))
|
||||
|
||||
(h/test "incorrect setting doesn't crash render"
|
||||
(h/render [transaction-summary/view {:transaction :unknown}])
|
||||
(h/render-with-theme-provider [transaction-summary/view {}])
|
||||
(h/is-truthy (h/query-by-label-text :transaction-summary)))
|
||||
|
||||
(h/test "icon displayed"
|
||||
(h/render [transaction-summary/view {:transaction :send}])
|
||||
(h/render-with-theme-provider [transaction-summary/view {:transaction :send}])
|
||||
(h/is-truthy (h/query-by-label-text :header-icon)))
|
||||
|
||||
(h/test "Context tag rendered"
|
||||
(h/render [transaction-summary/view
|
||||
{:transaction :send
|
||||
:first-tag {:size 24
|
||||
:type :token
|
||||
:token "SNT"
|
||||
:amount 1500}}])
|
||||
(h/render-with-theme-provider [transaction-summary/view
|
||||
{:transaction :send
|
||||
:first-tag {:size 24
|
||||
:type :token
|
||||
:token "SNT"
|
||||
:amount 1500}}])
|
||||
(h/is-truthy (h/query-by-label-text :context-tag))))
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
(ns quo.components.wallet.transaction-summary.schema
|
||||
(:require [quo.components.tags.context-tag.schema :as context-tag-schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:theme :schema.common/theme]
|
||||
[:transaction {:optional true} [:maybe [:enum :send :swap :bridge]]]
|
||||
[:first-tag {:optional true} [:maybe context-tag-schema/?schema]]
|
||||
[:second-tag {:optional true} [:maybe context-tag-schema/?schema]]
|
||||
[:third-tag {:optional true} [:maybe context-tag-schema/?schema]]
|
||||
[:fourth-tag {:optional true} [:maybe context-tag-schema/?schema]]
|
||||
[:fifth-tag {:optional true} [:maybe context-tag-schema/?schema]]
|
||||
[:second-tag-prefix {:optional true} [:maybe :keyword]]
|
||||
[:third-tag-prefix {:optional true} [:maybe :keyword]]
|
||||
[:fourth-tag-prefix {:optional true} [:maybe :keyword]]
|
||||
[:max-fees {:optional true} [:maybe :string]]
|
||||
[:nonce {:optional true} [:maybe :int]]
|
||||
[:input-data {:optional true} [:maybe :string]]
|
||||
[:on-press {:optional true} [:maybe fn?]]]]]
|
||||
:any])
|
||||
@@ -3,9 +3,11 @@
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.context-tag.view :as context-tag]
|
||||
[quo.components.wallet.transaction-summary.schema :as component-schema]
|
||||
[quo.components.wallet.transaction-summary.style :as style]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(def transaction-translation
|
||||
@@ -101,24 +103,5 @@
|
||||
:theme theme}]]])
|
||||
|
||||
(def view
|
||||
"Properties:
|
||||
- :transaction - type of transaction`. Possible values:
|
||||
- :send
|
||||
- :swap
|
||||
- :bridge
|
||||
|
||||
- :first-tag - props for context tag component that will be first on the first line
|
||||
- :second-tag - props for context tag component that will be second on the first line
|
||||
- :third-tag - props for context tag component that will be first on the second line
|
||||
- :fourth-tag - props for context tag component that will be second on the second line
|
||||
- :fifth-tag - props for context tag component that will be second on the second line
|
||||
|
||||
- :second-tag-prefix - translation keyword to be used with label before second context tag
|
||||
- :third-tag-prefix - translation keyword to be used with label before third context tag
|
||||
- :fourth-tag-prefix - translation keyword to be used with label before fourth context tag
|
||||
|
||||
- :max-fees - string
|
||||
- :nonce - digit
|
||||
- :input data - string
|
||||
"
|
||||
(quo.theme/with-theme view-internal))
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal component-schema/?schema)))
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
|
||||
(h/describe "Wallet activity"
|
||||
(h/test "default render"
|
||||
(h/render [wallet-activity/view {}])
|
||||
(h/render-with-theme-provider [wallet-activity/view {}])
|
||||
(h/is-truthy (h/query-by-label-text :wallet-activity)))
|
||||
|
||||
(h/test "Should call :on-press"
|
||||
(let [on-press (h/mock-fn)]
|
||||
(h/render [wallet-activity/view {:on-press on-press}])
|
||||
(h/render-with-theme-provider [wallet-activity/view {:on-press on-press}])
|
||||
(h/is-truthy (h/query-by-label-text :wallet-activity))
|
||||
(h/fire-event :press (h/query-by-label-text :wallet-activity))
|
||||
(h/was-called on-press))))
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
(ns quo.components.wallet.wallet-activity.schema
|
||||
(:require [quo.components.tags.context-tag.schema :as context-tag-schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:transaction {:optional true} [:maybe [:enum :receive :send :swap :bridge :buy :destroy :mint]]]
|
||||
[:status {:optional true} [:maybe [:enum :pending :confirmed :finalised :failed]]]
|
||||
[:counter {:optional true} [:maybe :int]]
|
||||
[:timestamp {:optional true} [:maybe :string]]
|
||||
[:blur? {:optional true} [:maybe :boolean]]
|
||||
[:on-press {:optional true} [:maybe fn?]]
|
||||
[:state {:optional true} [:maybe [:= :disabled]]]
|
||||
[:theme :schema.common/theme]
|
||||
[:second-tag-prefix {:optional true} [:maybe :keyword]]
|
||||
[:third-tag-prefix {:optional true} [:maybe :keyword]]
|
||||
[:fourth-tag-prefix {:optional true} [:maybe :keyword]]
|
||||
[:first-tag {:optional true} [:maybe context-tag-schema/?schema]]
|
||||
[:second-tag {:optional true} [:maybe context-tag-schema/?schema]]
|
||||
[:third-tag {:optional true} [:maybe context-tag-schema/?schema]]
|
||||
[:fourth-tag {:optional true} [:maybe context-tag-schema/?schema]]]]]
|
||||
:any])
|
||||
@@ -3,11 +3,13 @@
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.context-tag.view :as context-tag]
|
||||
[quo.components.wallet.wallet-activity.schema :as component-schema]
|
||||
[quo.components.wallet.wallet-activity.style :as style]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.hole-view :as hole-view]
|
||||
[reagent.core :as reagent]
|
||||
[schema.core :as schema]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(def transaction-translation
|
||||
@@ -132,35 +134,5 @@
|
||||
(when fourth-tag [prop-tag fourth-tag blur?])]]]])))
|
||||
|
||||
(def view
|
||||
"Properties:
|
||||
- :transaction - type of transaction`. Possible values:
|
||||
- :receive
|
||||
- :send
|
||||
- :swap
|
||||
- :bridge
|
||||
- :buy
|
||||
- :destroy
|
||||
- :mint
|
||||
|
||||
- :status - transaction status. Possible values:
|
||||
- :pending
|
||||
- :confirmed
|
||||
- :finalised
|
||||
- :failed
|
||||
|
||||
- :counter - amount of transactions shown by instance of the component
|
||||
|
||||
- :timestamp - when transaction occured (string)
|
||||
- :blur?
|
||||
|
||||
- :first-tag - props for context tag component that will be first on the first line
|
||||
- :second-tag - props for context tag component that will be second on the first line
|
||||
- :third-tag - props for context tag component that will be first on the second line
|
||||
- :fourth-tag - props for context tag component that will be second on the second line
|
||||
|
||||
- :second-tag-prefix - translation keyword to be used with label before second context tag
|
||||
- :third-tag-prefix - translation keyword to be used with label before third context tag
|
||||
- :fourth-tag-prefix - translation keyword to be used with label before fourth context tag
|
||||
|
||||
"
|
||||
(quo.theme/with-theme view-internal))
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal component-schema/?schema)))
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
(h/describe
|
||||
"Wallet overview test"
|
||||
(h/test "renders correct balance"
|
||||
(h/render [wallet-overview/view
|
||||
{:state :default
|
||||
:time-frame :one-week
|
||||
:metrics :positive
|
||||
:balance "€0.01"}])
|
||||
(h/render-with-theme-provider [wallet-overview/view
|
||||
{:state :default
|
||||
:time-frame :one-week
|
||||
:metrics :positive
|
||||
:balance "€0.01"}])
|
||||
(h/is-truthy (h/get-by-text "€0.01"))))
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
(ns quo.components.wallet.wallet-overview.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:state {:optional true} [:maybe [:enum :default :loading]]]
|
||||
[:time-frame {:optional true}
|
||||
[:maybe [:enum :none :selected :one-week :one-month :three-months :one-year :all-time :custom]]]
|
||||
[:metrics {:optional true} [:maybe [:enum :none :negative :positive]]]
|
||||
[:balance {:optional true} [:maybe :string]]
|
||||
[:date {:optional true} [:maybe :string]]
|
||||
[:begin-date {:optional true} [:maybe :string]]
|
||||
[:end-date {:optional true} [:maybe :string]]
|
||||
[:currency-change {:optional true} [:maybe :string]]
|
||||
[:percentage-change {:optional true} [:maybe :string]]
|
||||
[:theme :schema.common/theme]
|
||||
[:dropdown-on-press {:optional true} [:maybe fn?]]
|
||||
[:networks {:optional true}
|
||||
[:maybe [:sequential [:map [:source [:maybe :schema.common/image-source]]]]]]
|
||||
[:dropdown-state {:optional true} [:maybe [:enum :default :disabled]]]]]]
|
||||
:any])
|
||||
@@ -3,9 +3,11 @@
|
||||
[quo.components.dropdowns.network-dropdown.view :as network-dropdown]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.wallet.wallet-overview.schema :as component-schema]
|
||||
[quo.components.wallet.wallet-overview.style :as style]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(def ^:private time-frames
|
||||
@@ -117,4 +119,5 @@
|
||||
[view-info-bottom props]])
|
||||
|
||||
(def view
|
||||
(quo.theme/with-theme view-internal))
|
||||
(quo.theme/with-theme
|
||||
(schema/instrument #'view-internal component-schema/?schema)))
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user