Compare commits

..
Author SHA1 Message Date
pavloburykh 166de36195 updated go ver for testing PR feat/mixedcase-address 2022-05-12 14:57:25 +03:00
148 changed files with 9056 additions and 5827 deletions
+3
View File
@@ -2,6 +2,7 @@ CACHED_WEBVIEWS_ENABLED=1
DEBUG_WEBVIEW=1
DEFAULT_NETWORK=mainnet_rpc
DEV_BUILD=1
ERC20_CONTRACT_WARNINGS=0
ETHEREUM_DEV_CLUSTER=1
EXTENSIONS=0
FLEET=eth.prod
@@ -21,11 +22,13 @@ STATUS_GO_ENABLE_NIMBUS=0
KEYCARD_TEST_MENU=0
QR_READ_TEST_MENU=1
ENABLE_ROOT_ALERT=1
ENABLE_REFERRAL_INVITE=1
ENABLE_QUO_PREVIEW=1
MAX_IMAGES_BATCH=5
APN_TOPIC=im.status.ethereum.pr
COMMUNITIES_ENABLED=1
DATABASE_MANAGEMENT_ENABLED=1
METRICS_ENABLED=0
DELETE_MESSAGE_ENABLED=1
COLLECTIBLES_ENABLED=1
COMMANDS_ENABLED=1
+3
View File
@@ -1,5 +1,6 @@
DEBUG_WEBVIEW=1
DEFAULT_NETWORK=testnet_rpc
ERC20_CONTRACT_WARNINGS=1
ETHEREUM_DEV_CLUSTER=1
EXTENSIONS=0
FLEET=eth.staging
@@ -21,6 +22,7 @@ COMMANDS_ENABLED=1
KEYCARD_TEST_MENU=1
QR_READ_TEST_MENU=1
ENABLE_ROOT_ALERT=0
ENABLE_REFERRAL_INVITE=1
MAX_IMAGES_BATCH=5
APN_TOPIC=im.status.ethereum.pr
VERIFY_TRANSACTION_CHAIN_ID=3
@@ -29,6 +31,7 @@ TEST_STATEOFUS=1
DATABASE_MANAGEMENT_ENABLED=1
COMMUNITIES_ENABLED=1
COMMUNITIES_MANAGEMENT_ENABLED=1
METRICS_ENABLED=0
DELETE_MESSAGE_ENABLED=1
TWO_MINUTES_SYNCING=1
STICKERS_TEST_ENABLED=1
+4
View File
@@ -1,6 +1,7 @@
CACHED_WEBVIEWS_ENABLED=1
DEBUG_WEBVIEW=1
DEFAULT_NETWORK=testnet_rpc
ERC20_CONTRACT_WARNINGS=0
ETHEREUM_DEV_CLUSTER=1
EXTENSIONS=0
FLEET=eth.prod
@@ -20,6 +21,7 @@ STATUS_GO_ENABLE_NIMBUS=0
COMMANDS_ENABLED=1
KEYCARD_TEST_MENU=0
ENABLE_ROOT_ALERT=1
ENABLE_REFERRAL_INVITE=1
DISABLE_WALLET_ON_MOBILE_NETWORK=1
APN_TOPIC=im.status.ethereum.pr
VERIFY_TRANSACTION_CHAIN_ID=3
@@ -27,9 +29,11 @@ VERIFY_ENS_CHAIN_ID=3
TEST_STATEOFUS=1
BLANK_PREVIEW=0
MAX_IMAGES_BATCH=5
GOOGLE_FREE=0
DATABASE_MANAGEMENT_ENABLED=1
COMMUNITIES_ENABLED=1
COMMUNITIES_MANAGEMENT_ENABLED=1
METRICS_ENABLED=0
DELETE_MESSAGE_ENABLED=1
TWO_MINUTES_SYNCING=1
ENABLE_QUO_PREVIEW=1
+3
View File
@@ -1,5 +1,6 @@
DEBUG_WEBVIEW=1
DEFAULT_NETWORK=mainnet_rpc
ERC20_CONTRACT_WARNINGS=0
ETHEREUM_DEV_CLUSTER=1
EXTENSIONS=0
FLEET=eth.prod
@@ -16,8 +17,10 @@ RPC_NETWORKS_ONLY=0
PARTITIONED_TOPIC=0
CONTRACT_NODES=1
ENABLE_ROOT_ALERT=1
ENABLE_REFERRAL_INVITE=0
MAX_IMAGES_BATCH=5
BLANK_PREVIEW=0
COMMUNITIES_ENABLED=1
DATABASE_MANAGEMENT_ENABLED=1
METRICS_ENABLED=0
DELETE_MESSAGE_ENABLED=1
+3
View File
@@ -1,5 +1,6 @@
DEBUG_WEBVIEW=0
DEFAULT_NETWORK=mainnet_rpc
ERC20_CONTRACT_WARNINGS=0
ETHEREUM_DEV_CLUSTER=0
EXTENSIONS=0
FLEET=eth.prod
@@ -16,5 +17,7 @@ RPC_NETWORKS_ONLY=1
PARTITIONED_TOPIC=0
ENABLE_ROOT_ALERT=1
MAX_IMAGES_BATCH=1
ENABLE_REFERRAL_INVITE=0
METRICS_ENABLED=0
DELETE_MESSAGE_ENABLED=1
COLLECTIBLES_ENABLED=1
+1 -5
View File
@@ -170,8 +170,4 @@ project.clj
##appium
test/appium/report/
result.xml
test/appium/tests/users.py
##node bindings
/bin/
/lib/
test/appium/tests/users.py
+25 -35
View File
@@ -32,12 +32,10 @@ ifndef BUILD_TAG
export BUILD_TAG := $(shell git rev-parse --short HEAD)
endif
# We don't want to use /run/user/$UID because it runs out of space too easilly.
# We don't want to use /run/user/$UID because it runs out of space too easilly
export TMPDIR = /tmp/tmp-status-react-$(BUILD_TAG)
# This has to be specified for both the Node.JS server process and the Qt process.
# this has to be specified for both the Node.JS server process and the Qt process
export REACT_SERVER_PORT ?= 5001
# The path can be anything, but home is usually safest.
export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
# Our custom config is located in nix/nix.conf
export NIX_CONF_DIR = $(PWD)/nix
@@ -155,12 +153,11 @@ update-fleets: ##@prepare Download up-to-date JSON file with current fleets stat
| jq --indent 4 --sort-keys . \
> resources/config/fleets.json
$(KEYSTORE_PATH): export TARGET := keytool
$(KEYSTORE_PATH):
keystore: export TARGET := keytool
keystore: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
keystore: ##@prepare Generate a Keystore for signing Android APKs
@./scripts/generate-keystore.sh
keystore: $(KEYSTORE_PATH) ##@prepare Generate a Keystore for signing Android APKs
fdroid-max-watches: SHELL := /bin/sh
fdroid-max-watches: ##@prepare Bump max_user_watches to avoid ENOSPC errors
sysctl fs.inotify.max_user_watches=524288
@@ -193,26 +190,25 @@ xcode-clean: ##@prepare Clean XCode derived data and archives
#----------------
release: release-android release-ios ##@build Build release for Android and iOS
build-fdroid: export BUILD_ENV = prod
build-fdroid: export BUILD_TYPE = release
build-fdroid: export ANDROID_ABI_SPLIT = false
build-fdroid: export ANDROID_ABI_INCLUDE = armeabi-v7a;arm64-v8a;x86;x86_64
build-fdroid: ##@build Build release for F-Droid
@scripts/build-android.sh
build-android: SHELL := /bin/sh
build-android: export BUILD_ENV ?= prod
build-android: export BUILD_TYPE ?= nightly
build-android: export BUILD_NUMBER ?= $(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
@scripts/build-android.sh
release-android: export TARGET := keytool
release-android: export BUILD_ENV ?= prod
release-android: export BUILD_TYPE ?= nightly
release-android: export BUILD_NUMBER ?= $(TMP_BUILD_NUMBER)
release-android: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
release-android: keystore build-android ##@build Build signed Android APK
@scripts/sign-android.sh result/app-release-unsigned.apk
release-android: export ANDROID_APK_SIGNED ?= true
release-android: export ANDROID_ABI_SPLIT ?= false
release-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86
release-android: keystore ##@build Build release for Android
scripts/release-android.sh
release-fdroid: export BUILD_ENV = prod
release-fdroid: export BUILD_TYPE = release
release-fdroid: export ANDROID_APK_SIGNED = false
release-fdroid: export ANDROID_ABI_SPLIT = false
release-fdroid: export ANDROID_ABI_INCLUDE = armeabi-v7a;arm64-v8a;x86;x86_64
release-fdroid: export READER_FEATURES = google-free
release-fdroid: ##@build Build release for F-Droid
scripts/google-free.sh
scripts/release-android.sh
release-ios: export TARGET := ios
release-ios: export BUILD_ENV ?= prod
@@ -227,7 +223,7 @@ jsbundle-android: export BUILD_ENV ?= prod
jsbundle-android: ##@jsbundle Compile JavaScript and Clojurescript into app directory
# Call nix-build to build the 'targets.mobile.android.jsbundle' attribute and copy the.js files to the project root
nix/scripts/build.sh targets.mobile.android.jsbundle && \
mv result/*.js ./
mv result/* ./
jsbundle-ios: export TARGET := ios
jsbundle-ios: export BUILD_ENV ?= prod
@@ -246,10 +242,6 @@ status-go-ios: SHELL := /bin/sh
status-go-ios: ##@status-go Compile status-go for iOS app
nix/scripts/build.sh targets.status-go.mobile.ios
status-go-library: SHELL := /bin/sh
status-go-library: ##@status-go Compile status-go for node-js
nix/scripts/build.sh targets.status-go.library
#--------------
# Watch, Build & Review changes
#--------------
@@ -295,9 +287,7 @@ lint-fix: ##@test Run code style checks and fix issues
clojure -Scp "$$CLASS_PATH" -m cljfmt.main fix src --indents indentation.edn
test: export TARGET := clojure
test: status-go-library ##@test Run tests once in NodeJS
# Here we creates the gyp bindings for nodejs
yarn install
test: ##@test Run tests once in NodeJS
yarn shadow-cljs compile mocks && \
yarn shadow-cljs compile test && \
node --require ./test-resources/override.js target/test/test.js
+40 -10
View File
@@ -123,6 +123,11 @@ def jscFlavor = 'org.webkit:android-jsc:+'
*/
def enableHermes = project.ext.react.get("enableHermes", false);
/**
* Exclude google library so we can publish to external android stores
*/
def googleFree = project.env.get("GOOGLE_FREE", 0) == '1'
def getCommitHash = { ->
if (project.hasProperty("commitHash")) {
return project.commitHash
@@ -229,6 +234,23 @@ android {
jumboMode true
javaMaxHeapSize "8g"
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
/* Caution! In production, you need to generate your own keystore file.
* See: https://facebook.github.io/react-native/docs/signed-apk-android */
release {
/* environment variables take precedence over gradle.properties file */
storeFile file(getEnvOrConfig('KEYSTORE_PATH').replaceAll("~", System.properties['user.home']))
storePassword getEnvOrConfig('KEYSTORE_PASSWORD')
keyAlias getEnvOrConfig('KEYSTORE_ALIAS')
keyPassword getEnvOrConfig('KEYSTORE_KEY_PASSWORD')
}
}
splits {
abi {
reset()
@@ -237,26 +259,20 @@ android {
universalApk true
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
buildTypes {
debug {
applicationIdSuffix ".debug"
debuggable true
versionNameSuffix "-SNAPSHOT"
resValue "string", "build_config_package", "im.status.ethereum"
signingConfig signingConfigs.debug
resValue "string", "build_config_package", "im.status.ethereum"
}
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig null
if (getEnvOrConfig('ANDROID_APK_SIGNED').toBoolean()) {
signingConfig signingConfigs.release
}
}
pr {
initWith release
@@ -319,6 +335,16 @@ dependencies {
implementation jscFlavor
}
if (googleFree) {
implementation(project(':react-native-device-info')) {
exclude group: 'com.google.firebase'
exclude group: 'com.google.android.gms'
exclude group: 'com.android.installreferrer'
}
} else {
implementation 'com.google.firebase:firebase-messaging:23.0.0'
}
// react-native-screens
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
@@ -370,3 +396,7 @@ task hemroidBuild(type: Exec) {
preBuild.dependsOn hemroidBuild
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
if (!googleFree) {
apply plugin: "com.google.gms.google-services"
}
+119
View File
@@ -0,0 +1,119 @@
{
"project_info": {
"project_number": "854811651919",
"firebase_url": "https://status-react-app.firebaseio.com",
"project_id": "status-react-app",
"storage_bucket": "status-react-app.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:854811651919:android:11ee7444ded8a00a",
"android_client_info": {
"package_name": "im.status.ethereum"
}
},
"oauth_client": [
{
"client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAOF4W1j8GYeXzzVKRfNKlXywD6bx0rJtQ"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "854811651919-30s20e3l0me0ins0vc4185jbnj7ja49o.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "im.status.ethereum"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:854811651919:android:15dbe4af1e06ca3e005f3a",
"android_client_info": {
"package_name": "im.status.ethereum.debug"
}
},
"oauth_client": [
{
"client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAOF4W1j8GYeXzzVKRfNKlXywD6bx0rJtQ"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "854811651919-30s20e3l0me0ins0vc4185jbnj7ja49o.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "im.status.ethereum"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:854811651919:android:1d0d69fe8c1bb89b005f3a",
"android_client_info": {
"package_name": "im.status.ethereum.pr"
}
},
"oauth_client": [
{
"client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAOF4W1j8GYeXzzVKRfNKlXywD6bx0rJtQ"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "854811651919-30s20e3l0me0ins0vc4185jbnj7ja49o.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "im.status.ethereum"
}
}
]
}
}
}
],
"configuration_version": "1"
}
+6
View File
@@ -81,6 +81,12 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths" />
</provider>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/notification_icon" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/notification_icon_color" />
</application>
</manifest>
@@ -2,4 +2,5 @@
<resources>
<color name="alert_background">#ffffff</color>
<color name="alert_text">#000000</color>
<color name="notification_icon_color">#4360DF</color>
</resources>
+1
View File
@@ -22,6 +22,7 @@ buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31"
classpath "com.android.tools.build:gradle:${project.ext.gradlePluginVersion}"
classpath "com.google.gms:google-services:4.3.10"
// WARNING: Do not place your application dependencies here!
// They belong in the individual module build.gradle files.
}
+2
View File
@@ -42,6 +42,8 @@ KEYSTORE_KEY_PASSWORD=password
ANDROID_ABI_SPLIT=false
# Some platforms are excluded though
ANDROID_ABI_INCLUDE=armeabi-v7a;arm64-v8a;x86
# F-Droid builds need to be unsigned
ANDROID_APK_SIGNED=true
org.gradle.jvmargs=-Xmx8704M
-38
View File
@@ -1,38 +0,0 @@
{
"variables": {
"module_name%": "status_nodejs_addon",
"module_path%": "./lib/binding/"
},
"targets": [{
"target_name": "<(module_name)",
"sources": [
"./modules/react-native-status/nodejs/status.cpp"
],
"xcode_settings": {
"MACOSX_DEPLOYMENT_TARGET": "10.7"
},
"libraries": [
"<!(pwd)/result/libstatus.a"
],
"conditions": [
["OS=='mac'", {
"libraries": [
"-framework IOKit",
"-framework CoreFoundation",
"-framework CoreServices",
"-framework Security"
]
}]
]
}, {
"target_name": "action_after_build",
"type": "none",
"dependencies": ["<(module_name)"],
"copies": [
{
"files": [ "<(PRODUCT_DIR)/<(module_name).node" ],
"destination": "<(module_path)"
}
]
}]
}
+1 -6
View File
@@ -1,4 +1,4 @@
library 'status-jenkins-lib@v1.4.3'
library 'status-jenkins-lib@v1.4.2'
pipeline {
agent { label 'linux && x86_64 && nix-2.8' }
@@ -81,11 +81,6 @@ pipeline {
script { apks = android.bundle() }
}
}
stage('Sign') {
steps {
script { apks = android.sign(apks) }
}
}
} }
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
library 'status-jenkins-lib@v1.4.3'
library 'status-jenkins-lib@v1.4.2'
pipeline {
agent { label 'linux' }
+1 -1
View File
@@ -1,4 +1,4 @@
library 'status-jenkins-lib@v1.4.3'
library 'status-jenkins-lib@v1.4.2'
pipeline {
agent { label 'macos && x86_64 && nix-2.8 && xcode-13.3' }
+1 -1
View File
@@ -1,4 +1,4 @@
library 'status-jenkins-lib@v1.4.3'
library 'status-jenkins-lib@v1.4.2'
pipeline {
agent { label params.AGENT_LABEL }
+2 -3
View File
@@ -1,4 +1,4 @@
library 'status-jenkins-lib@v1.4.3'
library 'status-jenkins-lib@v1.4.2'
pipeline {
@@ -61,8 +61,6 @@ pipeline {
def extraPytestOpts = ''
if (params.TR_CASE_IDS != '') {
extraPytestOpts = "--run_testrail_ids='${params.TR_CASE_IDS}'"
} else {
extraPytestOpts = "-m \"${params.TEST_MARKERS}\""
}
withCredentials([
@@ -102,6 +100,7 @@ pipeline {
--numprocesses 9 \
--rerun_count=2 \
--testrail_report=True \
-m \"${params.TEST_MARKERS}\" \
-k \"${params.KEYWORD_EXPRESSION}\" \
--apk=${params.APK_NAME} \
--build=PR-${params.PR_ID}-${utils.timestamp()} \
+1 -1
View File
@@ -1,4 +1,4 @@
library 'status-jenkins-lib@v1.4.3'
library 'status-jenkins-lib@v1.4.2'
pipeline {
agent { label 'macos' }
+1 -1
View File
@@ -1,4 +1,4 @@
library 'status-jenkins-lib@v1.4.3'
library 'status-jenkins-lib@v1.4.2'
pipeline {
agent { label 'linux' }
+15 -3
View File
@@ -2,7 +2,7 @@ PODS:
- boost-for-react-native (1.63.0)
- BVLinearGradient (2.5.6):
- React
- CryptoSwift (1.4.3)
- CryptoSwift (1.5.1)
- DoubleConversion (1.1.6)
- FBLazyVector (0.63.4)
- FBReactNativeSpec (0.63.4):
@@ -226,6 +226,8 @@ PODS:
- React-Core
- react-native-netinfo (4.7.0):
- React
- react-native-notifications (4.1.3):
- React-Core
- react-native-randombytes (3.6.1):
- React-Core
- react-native-safe-area-context (2.0.0):
@@ -324,6 +326,8 @@ PODS:
- React
- RNCPushNotificationIOS (1.4.1):
- React
- RNDeviceInfo (7.4.0):
- React-Core
- RNFastImage (8.5.11):
- React-Core
- SDWebImage (~> 5.11.1)
@@ -432,6 +436,7 @@ DEPENDENCIES:
- react-native-image-resizer (from `../node_modules/react-native-image-resizer`)
- react-native-mail (from `../node_modules/react-native-mail`)
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-notifications (from `../node_modules/react-native-notifications`)
- react-native-randombytes (from `../node_modules/react-native-randombytes`)
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
- react-native-shake (from `../node_modules/react-native-shake`)
@@ -456,6 +461,7 @@ DEPENDENCIES:
- "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)"
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
- "RNCPushNotificationIOS (from `../node_modules/@react-native-community/push-notification-ios`)"
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
- RNFastImage (from `../node_modules/react-native-fast-image`)
- RNFS (from `../node_modules/react-native-fs`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
@@ -543,6 +549,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-mail"
react-native-netinfo:
:path: "../node_modules/@react-native-community/netinfo"
react-native-notifications:
:path: "../node_modules/react-native-notifications"
react-native-randombytes:
:path: "../node_modules/react-native-randombytes"
react-native-safe-area-context:
@@ -591,6 +599,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-community/masked-view"
RNCPushNotificationIOS:
:path: "../node_modules/@react-native-community/push-notification-ios"
RNDeviceInfo:
:path: "../node_modules/react-native-device-info"
RNFastImage:
:path: "../node_modules/react-native-fast-image"
RNFS:
@@ -633,12 +643,12 @@ CHECKOUT OPTIONS:
SPEC CHECKSUMS:
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
CryptoSwift: a0799ee936271bd2253a006f1e4523df21845000
CryptoSwift: c4f2debceb38bf44c80659afe009f71e23e4a082
DoubleConversion: cde416483dac037923206447da6e1454df403714
FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e
FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
glog: 2d7c14bbcd0c3139c6258f813895cb61d7860fcc
glog: 61334f8bdb4deea07543d4fbac3fb5948e78a7a5
HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352
Keycard: 07f1b4d4fadcf1218084cb3e1bb3a8bac3870c5a
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
@@ -663,6 +673,7 @@ SPEC CHECKSUMS:
react-native-image-resizer: 2f1577efa3bc762597681f530c8e8d05ce0ceeb3
react-native-mail: 8fdcd3aef007c33a6877a18eb4cf7447a1d4ce4a
react-native-netinfo: ddaca8bbb9e6e914b1a23787ccb879bc642931c9
react-native-notifications: 805108822ceff3440644d5701944f0cda35f5b4b
react-native-randombytes: 421f1c7d48c0af8dbcd471b0324393ebf8fe7846
react-native-safe-area-context: 60f654e00b6cc416573f6d5dbfce3839958eb57a
react-native-shake: de052eaa3eadc4a326b8ddd7ac80c06e8d84528c
@@ -687,6 +698,7 @@ SPEC CHECKSUMS:
RNCClipboard: 8148e21ac347c51fd6cd4b683389094c216bb543
RNCMaskedView: 71fc32d971f03b7f03d6ab6b86b730c4ee64f5b6
RNCPushNotificationIOS: c145c6253ea016e5efeff604f2720736b4a596f7
RNDeviceInfo: 9538a884f862fe4aa0d7cead9f34e292d41ba8f6
RNFastImage: 1f2cab428712a4baaf78d6169eaec7f622556dd7
RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df
RNGestureHandler: 7a5833d0f788dbd107fbb913e09aa0c1ff333c39
-6
View File
@@ -1,6 +0,0 @@
var binary = require('@mapbox/node-pre-gyp');
var path = require('path');
var binding_path = binary.find(path.resolve(path.join(__dirname,'./../../../package.json')));
module.exports = require(binding_path);
File diff suppressed because it is too large Load Diff
+1
View File
@@ -19,6 +19,7 @@ Here is a sample structure of the `config` attribute set:
build-number = 9999; # Used for versionCode and CFBundleVersion in Android and iOS respectively
android = {
gradle-opts = ""; # Gradle options passed for Android builds
keystore-path = ""; # Path to keystore for signing the APK
abi-split = false; # If APKs should be split based on architectures
abi-include = "x86"; # Android architectures to build for
};
+1
View File
@@ -7,6 +7,7 @@
android = {
gradle-opts = null; # Gradle options passed for Android builds
keystore-path = null; # Path to keystore for signing the APK
apk-signed = true; # F-Droid builds aren't signed by us
abi-split = false; # If APKs should be split based on architectures
abi-include = "armeabi-v7a;arm64-v8a;x86"; # Android architectures to build for
+3255 -3
View File
File diff suppressed because it is too large Load Diff
+103
View File
@@ -70,6 +70,7 @@ androidx.savedstate:savedstate:1.1.0
androidx.slidingpanelayout:slidingpanelayout:1.0.0
androidx.swiperefreshlayout:swiperefreshlayout:1.0.0
androidx.swiperefreshlayout:swiperefreshlayout:1.1.0
androidx.test:monitor:1.2.0
androidx.tracing:tracing:1.0.0
androidx.transition:transition:1.2.0
androidx.transition:transition:1.2.0-rc01
@@ -83,6 +84,8 @@ androidx.versionedparcelable:versionedparcelable:1.1.1
androidx.viewpager2:viewpager2:1.0.0
androidx.viewpager:viewpager:1.0.0
androidx.webkit:webkit:1.4.0
backport-util-concurrent:backport-util-concurrent:3.1
classworlds:classworlds:1.1-alpha-2
commons-codec:commons-codec:1.4
commons-codec:commons-codec:1.6
commons-codec:commons-codec:1.9
@@ -93,6 +96,7 @@ commons-logging:commons-logging:1.2
com.adobe.xmp:xmpcore:5.1.2
com.afollestad.material-dialogs:commons:0.9.6.0
com.afollestad.material-dialogs:core:0.9.6.0
com.almworks.sqlite4java:sqlite4java:0.282
com.android.databinding:baseLibrary:1.0-rc5
com.android.databinding:baseLibrary:3.0.0
com.android.databinding:baseLibrary:3.0.1
@@ -104,6 +108,7 @@ com.android.databinding:compilerCommon:1.0-rc5
com.android.databinding:compilerCommon:3.0.0
com.android.databinding:compilerCommon:3.0.1
com.android.databinding:compilerCommon:3.1.4
com.android.installreferrer:installreferrer:1.1.2
com.android.tools.analytics-library:crash:26.2.1
com.android.tools.analytics-library:crash:26.3.1
com.android.tools.analytics-library:crash:26.5.4
@@ -360,8 +365,25 @@ com.github.wix-playground:reflow-animator:1.0.6
com.github.yalantis:ucrop:2.2.6-native
com.googlecode.json-simple:json-simple:1.1
com.googlecode.juniversalchardet:juniversalchardet:1.0.3
com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.1
com.google.android.datatransport:transport-api:2.2.1
com.google.android.datatransport:transport-api:3.0.0
com.google.android.datatransport:transport-backend-cct:2.3.3
com.google.android.datatransport:transport-backend-cct:3.0.0
com.google.android.datatransport:transport-runtime:2.2.5
com.google.android.datatransport:transport-runtime:3.0.0
com.google.android.gms:play-services-basement:17.0.0
com.google.android.gms:play-services-base:17.0.0
com.google.android.gms:play-services-cloud-messaging:16.0.0
com.google.android.gms:play-services-cloud-messaging:17.0.0
com.google.android.gms:play-services-iid:17.0.0
com.google.android.gms:play-services-stats:17.0.0
com.google.android.gms:play-services-tasks:17.0.0
com.google.android.gms:strict-version-matcher-plugin:1.2.2
com.google.android.material:material:1.2.0-alpha03
com.google.auto.service:auto-service:1.0-rc4
com.google.auto.value:auto-value:1.5.2
com.google.auto:auto-common:0.8
com.google.code.findbugs:jsr305:1.3.9
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.2.4
@@ -374,6 +396,28 @@ com.google.errorprone:error_prone_annotations:2.0.18
com.google.errorprone:error_prone_annotations:2.1.2
com.google.errorprone:error_prone_annotations:2.2.0
com.google.errorprone:error_prone_annotations:2.3.1
com.google.firebase:firebase-annotations:16.0.0
com.google.firebase:firebase-common:19.5.0
com.google.firebase:firebase-common:20.0.0
com.google.firebase:firebase-components:16.1.0
com.google.firebase:firebase-components:17.0.0
com.google.firebase:firebase-datatransport:17.0.10
com.google.firebase:firebase-datatransport:18.0.0
com.google.firebase:firebase-encoders-json:17.1.0
com.google.firebase:firebase-encoders-json:18.0.0
com.google.firebase:firebase-encoders:16.1.0
com.google.firebase:firebase-encoders:17.0.0
com.google.firebase:firebase-iid-interop:17.1.0
com.google.firebase:firebase-iid:21.1.0
com.google.firebase:firebase-installations-interop:16.0.1
com.google.firebase:firebase-installations-interop:17.0.0
com.google.firebase:firebase-installations:16.3.5
com.google.firebase:firebase-installations:17.0.0
com.google.firebase:firebase-measurement-connector:18.0.0
com.google.firebase:firebase-measurement-connector:19.0.0
com.google.firebase:firebase-messaging:21.1.0
com.google.firebase:firebase-messaging:23.0.0
com.google.gms:google-services:4.3.10
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:17.0
com.google.guava:guava:22.0
@@ -384,12 +428,15 @@ com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.1
com.google.jimfs:jimfs:1.1
com.google.protobuf:protobuf-java-util:3.4.0
com.google.protobuf:protobuf-java:2.6.1
com.google.protobuf:protobuf-java:3.0.0
com.google.protobuf:protobuf-java:3.4.0
com.google.zxing:core:3.3.0
com.ibm.icu:icu4j:53.1
com.intellij:annotations:12.0
com.parse.bolts:bolts-applinks:1.4.0
com.parse.bolts:bolts-tasks:1.4.0
com.squareup.assertj:assertj-android:1.1.1
com.squareup.okhttp3:okhttp-tls:3.12.12
com.squareup.okhttp3:okhttp-urlconnection:3.12.12
com.squareup.okhttp3:okhttp:3.12.12
@@ -405,10 +452,17 @@ com.tunnelvisionlabs:antlr4:4.5
de.undercouch:gradle-download-task:3.4.3
de.undercouch:gradle-download-task:4.0.2
it.unimi.dsi:fastutil:7.2.0
javax.annotation:javax.annotation-api:1.3.2
javax.inject:javax.inject:1
javax.xml.bind:jaxb-api:2.2.12-b140109.1041
junit:junit:4.12
me.zhanghai.android.materialprogressbar:library:1.4.2
nekohtml:nekohtml:1.9.6.2
nekohtml:xercesMinimal:1.9.6.2
net.bytebuddy:byte-buddy-agent:1.9.10
net.bytebuddy:byte-buddy-agent:1.10.18
net.bytebuddy:byte-buddy:1.9.10
net.bytebuddy:byte-buddy:1.10.18
net.sf.jopt-simple:jopt-simple:4.9
net.sf.kxml:kxml2:2.3.0
net.sf.proguard:proguard-base:5.1
@@ -425,6 +479,8 @@ org.antlr:antlr4-runtime:4.5.2-1
org.antlr:antlr4:4.5.3
org.antlr:antlr-runtime:3.5.2
org.antlr:antlr:3.5.2
org.apache.ant:ant-launcher:1.8.0
org.apache.ant:ant:1.8.0
org.apache.commons:commons-compress:1.8.1
org.apache.commons:commons-compress:1.12
org.apache.commons:commons-lang3:3.3.2
@@ -442,15 +498,35 @@ org.apache.httpcomponents:httpcore:4.4.10
org.apache.httpcomponents:httpmime:4.1
org.apache.httpcomponents:httpmime:4.5.2
org.apache.httpcomponents:httpmime:4.5.6
org.apache.maven.wagon:wagon-file:1.0-beta-6
org.apache.maven.wagon:wagon-http-lightweight:1.0-beta-6
org.apache.maven.wagon:wagon-http-shared:1.0-beta-6
org.apache.maven.wagon:wagon-provider-api:1.0-beta-6
org.apache.maven:maven-ant-tasks:2.1.3
org.apache.maven:maven-artifact-manager:2.2.1
org.apache.maven:maven-artifact:2.2.1
org.apache.maven:maven-error-diagnostics:2.2.1
org.apache.maven:maven-model:2.2.1
org.apache.maven:maven-plugin-registry:2.2.1
org.apache.maven:maven-profile:2.2.1
org.apache.maven:maven-project:2.2.1
org.apache.maven:maven-repository-metadata:2.2.1
org.apache.maven:maven-settings:2.2.1
org.apiguardian:apiguardian-api:1.1.0
org.assertj:assertj-core:3.8.0
org.bouncycastle:bcpkix-jdk15on:1.48
org.bouncycastle:bcpkix-jdk15on:1.56
org.bouncycastle:bcprov-jdk15on:1.48
org.bouncycastle:bcprov-jdk15on:1.52
org.bouncycastle:bcprov-jdk15on:1.56
org.bouncycastle:bcprov-jdk15on:1.60
org.checkerframework:checker-qual:2.5.2
org.codehaus.groovy:groovy-all:2.4.15
org.codehaus.mojo:animal-sniffer-annotations:1.14
org.codehaus.mojo:animal-sniffer-annotations:1.17
org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1
org.codehaus.plexus:plexus-interpolation:1.11
org.codehaus.plexus:plexus-utils:1.5.15
org.conscrypt:conscrypt-android:2.0.0
org.eclipse.jdt.core.compiler:ecj:4.4
org.eclipse.jdt.core.compiler:ecj:4.4.2
@@ -459,6 +535,7 @@ org.glassfish.jaxb:jaxb-core:2.2.11
org.glassfish.jaxb:jaxb-runtime:2.2.11
org.glassfish.jaxb:txw2:2.2.11
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest-library:1.3
org.jacoco:org.jacoco.core:0.7.4.201502262128
org.jacoco:org.jacoco.report:0.7.4.201502262128
org.jdom:jdom2:2.0.6
@@ -467,6 +544,7 @@ org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.2
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8
org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.4.31
org.jetbrains.kotlin:kotlin-android-extensions:1.3.50
org.jetbrains.kotlin:kotlin-android-extensions:1.4.31
org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.3.50
@@ -512,10 +590,12 @@ org.jetbrains.kotlin:kotlin-stdlib-common:1.5.30
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.71
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.20
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.30
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.71
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.20
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.50
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.30
org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.0
org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.0
@@ -531,18 +611,41 @@ org.jetbrains.kotlin:kotlin-util-io:1.4.31
org.jetbrains.kotlin:kotlin-util-klib:1.4.31
org.jetbrains.trove4j:trove4j:20160824
org.jetbrains:annotations:13.0
org.junit.jupiter:junit-jupiter-api:5.7.0
org.junit.platform:junit-platform-commons:1.7.0
org.jvnet.staxex:stax-ex:1.7.7
org.mockito:mockito-core:2.28.2
org.mockito:mockito-core:3.6.28
org.objenesis:objenesis:2.6
org.objenesis:objenesis:3.1
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:5.0.3
org.ow2.asm:asm-analysis:5.1
org.ow2.asm:asm-analysis:6.0
org.ow2.asm:asm-analysis:7.0
org.ow2.asm:asm-commons:5.1
org.ow2.asm:asm-commons:6.0
org.ow2.asm:asm-commons:7.0
org.ow2.asm:asm-debug-all:5.0.1
org.ow2.asm:asm-tree:5.0.3
org.ow2.asm:asm-tree:5.1
org.ow2.asm:asm-tree:6.0
org.ow2.asm:asm-tree:7.0
org.ow2.asm:asm-util:5.1
org.ow2.asm:asm-util:6.0
org.ow2.asm:asm-util:7.0
org.ow2.asm:asm:5.0.3
org.ow2.asm:asm:5.1
org.ow2.asm:asm:6.0
org.ow2.asm:asm:7.0
org.robolectric:annotations:4.3
org.robolectric:junit:4.3
org.robolectric:pluginapi:4.3
org.robolectric:plugins-maven-dependency-resolver:4.3
org.robolectric:resources:4.3
org.robolectric:robolectric:4.3
org.robolectric:sandbox:4.3
org.robolectric:shadowapi:4.3
org.robolectric:shadows-framework:4.3
org.robolectric:utils-reflector:4.3
org.robolectric:utils:4.3
+255 -1
View File
@@ -82,6 +82,7 @@ https://dl.google.com/dl/android/maven2/androidx/savedstate/savedstate/1.1.0/sav
https://dl.google.com/dl/android/maven2/androidx/slidingpanelayout/slidingpanelayout/1.0.0/slidingpanelayout-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/swiperefreshlayout/swiperefreshlayout/1.0.0/swiperefreshlayout-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/swiperefreshlayout/swiperefreshlayout/1.1.0/swiperefreshlayout-1.1.0.pom
https://dl.google.com/dl/android/maven2/androidx/test/monitor/1.2.0/monitor-1.2.0.pom
https://dl.google.com/dl/android/maven2/androidx/tracing/tracing/1.0.0/tracing-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/transition/transition/1.0.0/transition-1.0.0.pom
https://dl.google.com/dl/android/maven2/androidx/transition/transition/1.2.0-rc01/transition-1.2.0-rc01.pom
@@ -109,14 +110,17 @@ https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary/3.5.
https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCommon/3.0.0/compilerCommon-3.0.0.pom
https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCommon/3.0.1/compilerCommon-3.0.1.pom
https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCommon/3.1.4/compilerCommon-3.1.4.pom
https://dl.google.com/dl/android/maven2/com/android/installreferrer/installreferrer/1.1.2/installreferrer-1.1.2.pom
https://dl.google.com/dl/android/maven2/com/android/support/animated-vector-drawable/26.0.2/animated-vector-drawable-26.0.2.pom
https://dl.google.com/dl/android/maven2/com/android/support/animated-vector-drawable/27.0.1/animated-vector-drawable-27.0.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/26.0.2/appcompat-v7-26.0.2.pom
https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/27.0.1/appcompat-v7-27.0.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/recyclerview-v7/27.0.1/recyclerview-v7-27.0.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/22.2.1/support-annotations-22.2.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/26.0.2/support-annotations-26.0.2.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/26.1.0/support-annotations-26.1.0.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/27.0.1/support-annotations-27.0.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-compat/26.0.2/support-compat-26.0.2.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-compat/27.0.1/support-compat-27.0.1.pom
https://dl.google.com/dl/android/maven2/com/android/support/support-core-ui/26.0.2/support-core-ui-26.0.2.pom
@@ -280,8 +284,46 @@ https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.1.4/sdk-
https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.2.1/sdk-common-26.2.1.pom
https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.3.1/sdk-common-26.3.1.pom
https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.5.4/sdk-common-26.5.4.pom
https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-api/2.2.0/transport-api-2.2.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-api/2.2.1/transport-api-2.2.1.pom
https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-api/3.0.0/transport-api-3.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-backend-cct/2.3.3/transport-backend-cct-2.3.3.pom
https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-backend-cct/3.0.0/transport-backend-cct-3.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-runtime/2.2.0/transport-runtime-2.2.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-runtime/2.2.5/transport-runtime-2.2.5.pom
https://dl.google.com/dl/android/maven2/com/google/android/datatransport/transport-runtime/3.0.0/transport-runtime-3.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-basement/17.0.0/play-services-basement-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-base/17.0.0/play-services-base-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-cloud-messaging/16.0.0/play-services-cloud-messaging-16.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-cloud-messaging/17.0.0/play-services-cloud-messaging-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-iid/17.0.0/play-services-iid-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/gms/strict-version-matcher-plugin/1.2.2/strict-version-matcher-plugin-1.2.2.pom
https://dl.google.com/dl/android/maven2/com/google/android/material/material/1.0.0/material-1.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/android/material/material/1.2.0-alpha03/material-1.2.0-alpha03.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-annotations/16.0.0/firebase-annotations-16.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-common/19.5.0/firebase-common-19.5.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-common/20.0.0/firebase-common-20.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-components/16.1.0/firebase-components-16.1.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-components/17.0.0/firebase-components-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-datatransport/17.0.10/firebase-datatransport-17.0.10.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-datatransport/18.0.0/firebase-datatransport-18.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-encoders-json/17.1.0/firebase-encoders-json-17.1.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-encoders-json/18.0.0/firebase-encoders-json-18.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-encoders/16.1.0/firebase-encoders-16.1.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-encoders/17.0.0/firebase-encoders-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-iid-interop/17.1.0/firebase-iid-interop-17.1.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-iid/21.1.0/firebase-iid-21.1.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-installations-interop/16.0.1/firebase-installations-interop-16.0.1.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-installations-interop/17.0.0/firebase-installations-interop-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-installations/16.3.5/firebase-installations-16.3.5.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-installations/17.0.0/firebase-installations-17.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-measurement-connector/19.0.0/firebase-measurement-connector-19.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-messaging/21.1.0/firebase-messaging-21.1.0.pom
https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-messaging/23.0.0/firebase-messaging-23.0.0.pom
https://dl.google.com/dl/android/maven2/com/google/gms/google-services/4.3.10/google-services-4.3.10.pom
https://jitpack.io/com/github/status-im/function/0.0.1/function-0.0.1.pom
https://jitpack.io/com/github/status-im/status-keycard-java/android/3.0.4/android-3.0.4.pom
https://jitpack.io/com/github/status-im/status-keycard-java/lib/3.0.4/lib-3.0.4.pom
@@ -299,18 +341,27 @@ https://plugins.gradle.org/m2/com/facebook/fresco/nativeimagefilters/2.2.0/nativ
https://plugins.gradle.org/m2/com/facebook/fresco/stetho/2.2.0/stetho-2.2.0.pom
https://repo.maven.apache.org/maven2/antlr/antlr/2.7.1/antlr-2.7.1.pom
https://repo.maven.apache.org/maven2/antlr/antlr/2.7.7/antlr-2.7.7.pom
https://repo.maven.apache.org/maven2/aopalliance/aopalliance/1.0/aopalliance-1.0.pom
https://repo.maven.apache.org/maven2/backport-util-concurrent/backport-util-concurrent/3.1/backport-util-concurrent-3.1.pom
https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.pom
https://repo.maven.apache.org/maven2/commons-cli/commons-cli/1.2/commons-cli-1.2.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.2/commons-codec-1.2.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.4/commons-codec-1.4.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.6/commons-codec-1.6.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.9/commons-codec-1.9.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10.pom
https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.15/commons-codec-1.15.pom
https://repo.maven.apache.org/maven2/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.pom
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.pom
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.pom
https://repo.maven.apache.org/maven2/commons-io/commons-io/2.11.0/commons-io-2.11.0.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.pom
https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.pom
https://repo.maven.apache.org/maven2/com/adobe/xmp/xmpcore/5.1.2/xmpcore-5.1.2.pom
https://repo.maven.apache.org/maven2/com/afollestad/material-dialogs/commons/0.9.6.0/commons-0.9.6.0.pom
https://repo.maven.apache.org/maven2/com/afollestad/material-dialogs/core/0.9.6.0/core-0.9.6.0.pom
https://repo.maven.apache.org/maven2/com/almworks/sqlite4java/sqlite4java/0.282/sqlite4java-0.282.pom
https://repo.maven.apache.org/maven2/com/android/databinding/baseLibrary/1.0-rc5/baseLibrary-1.0-rc5.pom
https://repo.maven.apache.org/maven2/com/android/databinding/compilerCommon/1.0-rc5/compilerCommon-1.0-rc5.pom
https://repo.maven.apache.org/maven2/com/android/tools/annotations/24.1.3/annotations-24.1.3.pom
@@ -410,7 +461,11 @@ https://repo.maven.apache.org/maven2/com/github/clans/fab/1.6.4/fab-1.6.4.pom
https://repo.maven.apache.org/maven2/com/github/gundy/semver4j/0.16.4/semver4j-0.16.4.pom
https://repo.maven.apache.org/maven2/com/googlecode/json-simple/json-simple/1.1/json-simple-1.1.pom
https://repo.maven.apache.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.pom
https://repo.maven.apache.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.1/accessibility-test-framework-2.1.pom
https://repo.maven.apache.org/maven2/com/google/auto/auto-common/0.8/auto-common-0.8.pom
https://repo.maven.apache.org/maven2/com/google/auto/auto-parent/3/auto-parent-3.pom
https://repo.maven.apache.org/maven2/com/google/auto/auto-parent/5/auto-parent-5.pom
https://repo.maven.apache.org/maven2/com/google/auto/service/auto-service/1.0-rc4/auto-service-1.0-rc4.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.9/auto-value-annotations-1.9.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-parent/1.9/auto-value-parent-1.9.pom
https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value/1.5.2/auto-value-1.5.2.pom
@@ -428,6 +483,7 @@ https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.7/gson-2.7.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.0/gson-2.8.0.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5.pom
https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.pom
https://repo.maven.apache.org/maven2/com/google/dagger/dagger/2.24/dagger-2.24.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.0.18/error_prone_annotations-2.0.18.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.1.2/error_prone_annotations-2.1.2.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.2.0/error_prone_annotations-2.2.0.pom
@@ -439,6 +495,7 @@ https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.3.1/error_prone_parent-2.3.1.pom
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.13.1/error_prone_parent-2.13.1.pom
https://repo.maven.apache.org/maven2/com/google/google/1/google-1.pom
https://repo.maven.apache.org/maven2/com/google/google/5/google-5.pom
https://repo.maven.apache.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/17.0/guava-parent-17.0.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/22.0/guava-parent-22.0.pom
@@ -455,12 +512,15 @@ https://repo.maven.apache.org/maven2/com/google/guava/guava/26.0-jre/guava-26.0-
https://repo.maven.apache.org/maven2/com/google/guava/guava/27.0.1-jre/guava-27.0.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.pom
https://repo.maven.apache.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.pom
https://repo.maven.apache.org/maven2/com/google/inject/guice-parent/5.1.0/guice-parent-5.1.0.pom
https://repo.maven.apache.org/maven2/com/google/inject/guice/5.1.0/guice-5.1.0.pom
https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.pom
https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.pom
https://repo.maven.apache.org/maven2/com/google/jimfs/jimfs-parent/1.1/jimfs-parent-1.1.pom
https://repo.maven.apache.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-bom/4.0.0-rc-2/protobuf-bom-4.0.0-rc-2.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util/3.4.0/protobuf-java-util-3.4.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/2.6.1/protobuf-java-2.6.1.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.0.0/protobuf-java-3.0.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.4.0/protobuf-java-3.4.0.pom
https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/4.0.0-rc-2/protobuf-java-4.0.0-rc-2.pom
@@ -471,9 +531,11 @@ https://repo.maven.apache.org/maven2/com/google/truth/truth-parent/1.1.3/truth-p
https://repo.maven.apache.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3.pom
https://repo.maven.apache.org/maven2/com/google/zxing/core/3.3.0/core-3.3.0.pom
https://repo.maven.apache.org/maven2/com/google/zxing/zxing-parent/3.3.0/zxing-parent-3.3.0.pom
https://repo.maven.apache.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.pom
https://repo.maven.apache.org/maven2/com/intellij/annotations/12.0/annotations-12.0.pom
https://repo.maven.apache.org/maven2/com/parse/bolts/bolts-applinks/1.4.0/bolts-applinks-1.4.0.pom
https://repo.maven.apache.org/maven2/com/parse/bolts/bolts-tasks/1.4.0/bolts-tasks-1.4.0.pom
https://repo.maven.apache.org/maven2/com/squareup/assertj/assertj-android/1.1.1/assertj-android-1.1.1.pom
https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.8.0/javapoet-1.8.0.pom
https://repo.maven.apache.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5.0.pom
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp-tls/3.12.12/okhttp-tls-3.12.12.pom
@@ -520,14 +582,29 @@ https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api-paren
https://repo.maven.apache.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/4.0.0/jakarta.xml.bind-api-4.0.0.pom
https://repo.maven.apache.org/maven2/javax/activation/activation/1.1/activation-1.1.pom
https://repo.maven.apache.org/maven2/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.pom
https://repo.maven.apache.org/maven2/javax/annotation/javax.annotation-api/1.2/javax.annotation-api-1.2.pom
https://repo.maven.apache.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.pom
https://repo.maven.apache.org/maven2/javax/el/javax.el-api/3.0.1-b06/javax.el-api-3.0.1-b06.pom
https://repo.maven.apache.org/maven2/javax/enterprise/cdi-api/1.2/cdi-api-1.2.pom
https://repo.maven.apache.org/maven2/javax/enterprise/cdi-api/2.0-PFD2/cdi-api-2.0-PFD2.pom
https://repo.maven.apache.org/maven2/javax/inject/javax.inject/1/javax.inject-1.pom
https://repo.maven.apache.org/maven2/javax/interceptor/javax.interceptor-api/1.2.2/javax.interceptor-api-1.2.2.pom
https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api-parent/2.4.0-b180830.0359/jaxb-api-parent-2.4.0-b180830.0359.pom
https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api/2.2.12-b140109.1041/jaxb-api-2.2.12-b140109.1041.pom
https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.pom
https://repo.maven.apache.org/maven2/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.pom
https://repo.maven.apache.org/maven2/junit/junit/3.8.1/junit-3.8.1.pom
https://repo.maven.apache.org/maven2/junit/junit/4.12/junit-4.12.pom
https://repo.maven.apache.org/maven2/junit/junit/4.13.2/junit-4.13.2.pom
https://repo.maven.apache.org/maven2/me/zhanghai/android/materialprogressbar/library/1.4.2/library-1.4.2.pom
https://repo.maven.apache.org/maven2/nekohtml/nekohtml/1.9.6.2/nekohtml-1.9.6.2.pom
https://repo.maven.apache.org/maven2/nekohtml/xercesMinimal/1.9.6.2/xercesMinimal-1.9.6.2.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.9.10/byte-buddy-agent-1.9.10.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.18/byte-buddy-agent-1.10.18.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.9.10/byte-buddy-parent-1.9.10.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.10.18/byte-buddy-parent-1.10.18.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.9.10/byte-buddy-1.9.10.pom
https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.10.18/byte-buddy-1.10.18.pom
https://repo.maven.apache.org/maven2/net/java/jvnet-parent/1/jvnet-parent-1.pom
https://repo.maven.apache.org/maven2/net/java/jvnet-parent/3/jvnet-parent-3.pom
https://repo.maven.apache.org/maven2/net/java/jvnet-parent/4/jvnet-parent-4.pom
@@ -566,7 +643,13 @@ https://repo.maven.apache.org/maven2/org/antlr/antlr-runtime/3.5.3/antlr-runtime
https://repo.maven.apache.org/maven2/org/antlr/antlr/3.5.2/antlr-3.5.2.pom
https://repo.maven.apache.org/maven2/org/antlr/stringtemplate/3.2.1/stringtemplate-3.2.1.pom
https://repo.maven.apache.org/maven2/org/antlr/stringtemplate/4.0.2/stringtemplate-4.0.2.pom
https://repo.maven.apache.org/maven2/org/apache/ant/ant-launcher/1.8.0/ant-launcher-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/ant/ant-parent/1.8.0/ant-parent-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/ant/ant/1.8.0/ant-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/apache/1/apache-1.pom
https://repo.maven.apache.org/maven2/org/apache/apache/3/apache-3.pom
https://repo.maven.apache.org/maven2/org/apache/apache/4/apache-4.pom
https://repo.maven.apache.org/maven2/org/apache/apache/5/apache-5.pom
https://repo.maven.apache.org/maven2/org/apache/apache/9/apache-9.pom
https://repo.maven.apache.org/maven2/org/apache/apache/13/apache-13.pom
https://repo.maven.apache.org/maven2/org/apache/apache/15/apache-15.pom
@@ -574,10 +657,12 @@ https://repo.maven.apache.org/maven2/org/apache/apache/16/apache-16.pom
https://repo.maven.apache.org/maven2/org/apache/apache/18/apache-18.pom
https://repo.maven.apache.org/maven2/org/apache/apache/21/apache-21.pom
https://repo.maven.apache.org/maven2/org/apache/apache/23/apache-23.pom
https://repo.maven.apache.org/maven2/org/apache/apache/25/apache-25.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.12/commons-compress-1.12.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/5/commons-parent-5.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/11/commons-parent-11.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/22/commons-parent-22.pom
@@ -587,8 +672,12 @@ https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/33/common
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/34/commons-parent-34.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/35/commons-parent-35.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/39/commons-parent-39.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/42/commons-parent-42.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/48/commons-parent-48.pom
https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/52/commons-parent-52.pom
https://repo.maven.apache.org/maven2/org/apache/geronimo/genesis/genesis-default-flava/2.3/genesis-default-flava-2.3.pom
https://repo.maven.apache.org/maven2/org/apache/geronimo/genesis/genesis-java8-flava/2.3/genesis-java8-flava-2.3.pom
https://repo.maven.apache.org/maven2/org/apache/geronimo/genesis/genesis/2.3/genesis-2.3.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/httpclient-4.2.6.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4.5.2/httpclient-4.5.2.pom
@@ -621,9 +710,68 @@ https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpmime/4.5.2/ht
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpmime/4.5.6/httpmime-4.5.6.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/project/4.1.1/project-4.1.1.pom
https://repo.maven.apache.org/maven2/org/apache/httpcomponents/project/7/project-7.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-ant-tasks/2.1.3/maven-ant-tasks-2.1.3.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact-manager/2.2.1/maven-artifact-manager-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact/2.2.1/maven-artifact-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact/3.8.5/maven-artifact-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-builder-support/3.8.5/maven-builder-support-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-compat/3.8.5/maven-compat-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-core/3.8.5/maven-core-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-error-diagnostics/2.2.1/maven-error-diagnostics-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-model-builder/3.8.5/maven-model-builder-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-model/2.2.1/maven-model-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-model/3.8.5/maven-model-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/10/maven-parent-10.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/11/maven-parent-11.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/19/maven-parent-19.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/34/maven-parent-34.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/35/maven-parent-35.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin-api/3.8.5/maven-plugin-api-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin-registry/2.2.1/maven-plugin-registry-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-profile/2.2.1/maven-profile-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-project-builder/3.0-alpha-2/maven-project-builder-3.0-alpha-2.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-project/2.2.1/maven-project-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-project/3.0-alpha-2/maven-project-3.0-alpha-2.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-repository-metadata/2.2.1/maven-repository-metadata-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-repository-metadata/3.8.5/maven-repository-metadata-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-resolver-provider/3.8.5/maven-resolver-provider-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-settings-builder/3.8.5/maven-settings-builder-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-settings/2.2.1/maven-settings-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven-settings/3.8.5/maven-settings-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven/2.2.1/maven-2.2.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven/3.0-alpha-2/maven-3.0-alpha-2.pom
https://repo.maven.apache.org/maven2/org/apache/maven/maven/3.8.5/maven-3.8.5.pom
https://repo.maven.apache.org/maven2/org/apache/maven/resolver/maven-resolver-api/1.8.0/maven-resolver-api-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/maven/resolver/maven-resolver-impl/1.8.0/maven-resolver-impl-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/maven/resolver/maven-resolver-named-locks/1.8.0/maven-resolver-named-locks-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/maven/resolver/maven-resolver-spi/1.8.0/maven-resolver-spi-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/maven/resolver/maven-resolver-util/1.8.0/maven-resolver-util-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/maven/resolver/maven-resolver/1.8.0/maven-resolver-1.8.0.pom
https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-components/34/maven-shared-components-34.pom
https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-utils/3.3.4/maven-shared-utils-3.3.4.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-file/1.0-beta-6/wagon-file-1.0-beta-6.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-file/3.5.1/wagon-file-3.5.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-http-lightweight/1.0-beta-6/wagon-http-lightweight-1.0-beta-6.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-http-lightweight/3.5.1/wagon-http-lightweight-3.5.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-http-shared/1.0-beta-6/wagon-http-shared-1.0-beta-6.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-http-shared/3.5.1/wagon-http-shared-3.5.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-providers/1.0-beta-6/wagon-providers-1.0-beta-6.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-providers/3.5.1/wagon-providers-3.5.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-provider-api/1.0-beta-6/wagon-provider-api-1.0-beta-6.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-provider-api/3.5.1/wagon-provider-api-3.5.1.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon/1.0-beta-6/wagon-1.0-beta-6.pom
https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon/3.5.1/wagon-3.5.1.pom
https://repo.maven.apache.org/maven2/org/apache/xbean/xbean-reflect/4.21/xbean-reflect-4.21.pom
https://repo.maven.apache.org/maven2/org/apache/xbean/xbean/4.21/xbean-4.21.pom
https://repo.maven.apache.org/maven2/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.pom
https://repo.maven.apache.org/maven2/org/assertj/assertj-core/1.7.1/assertj-core-1.7.1.pom
https://repo.maven.apache.org/maven2/org/assertj/assertj-core/3.8.0/assertj-core-3.8.0.pom
https://repo.maven.apache.org/maven2/org/assertj/assertj-parent-pom/1.2.6/assertj-parent-pom-1.2.6.pom
https://repo.maven.apache.org/maven2/org/assertj/assertj-parent-pom/2.1.6/assertj-parent-pom-2.1.6.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-jdk15on-1.56.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-jdk15on-1.52.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-jdk15on-1.56.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.60/bcprov-jdk15on-1.60.pom
https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.70/bcprov-jdk15on-1.70.pom
@@ -640,6 +788,45 @@ https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-parent/1.2
https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/34/mojo-parent-34.pom
https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/40/mojo-parent-40.pom
https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/65/mojo-parent-65.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-cipher/2.0/plexus-cipher-2.0.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/2.4/plexus-classworlds-2.4.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/2.5.2/plexus-classworlds-2.5.2.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/2.6.0/plexus-classworlds-2.6.0.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-components/1.1.14/plexus-components-1.1.14.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-annotations/1.5.5/plexus-component-annotations-1.5.5.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-annotations/1.5.6/plexus-component-annotations-1.5.6.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-annotations/1.6/plexus-component-annotations-1.6.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-annotations/2.1.0/plexus-component-annotations-2.1.0.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-annotations/2.1.1/plexus-component-annotations-2.1.1.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0.3/plexus-containers-1.0.3.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.5.5/plexus-containers-1.5.5.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.5.6/plexus-containers-1.5.6.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.6/plexus-containers-1.6.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/2.1.0/plexus-containers-2.1.0.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/2.1.1/plexus-containers-2.1.1.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-container-default/1.0-alpha-9-stable-1/plexus-container-default-1.0-alpha-9-stable-1.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-container-default/2.1.1/plexus-container-default-2.1.1.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.11/plexus-interpolation-1.11.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.26/plexus-interpolation-1.26.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-sec-dispatcher/2.0/plexus-sec-dispatcher-2.0.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.5.15/plexus-utils-1.5.15.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/2.0.5/plexus-utils-2.0.5.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.18/plexus-utils-3.0.18.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.24/plexus-utils-3.0.24.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.4.1/plexus-utils-3.4.1.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/2.0.2/plexus-2.0.2.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/2.0.6/plexus-2.0.6.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/2.0.7/plexus-2.0.7.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/3.3.1/plexus-3.3.1.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/3.3.2/plexus-3.3.2.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/4.0/plexus-4.0.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/5.1/plexus-5.1.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/6.5/plexus-6.5.pom
https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/8/plexus-8.pom
https://repo.maven.apache.org/maven2/org/codehaus/woodstox/wstx-asl/3.2.6/wstx-asl-3.2.6.pom
https://repo.maven.apache.org/maven2/org/codehaus/woodstox/wstx-asl/4.0.6/wstx-asl-4.0.6.pom
https://repo.maven.apache.org/maven2/org/conscrypt/conscrypt-android/2.0.0/conscrypt-android-2.0.0.pom
https://repo.maven.apache.org/maven2/org/easymock/easymockclassextension/3.2/easymockclassextension-3.2.pom
https://repo.maven.apache.org/maven2/org/easymock/easymock-parent/3.2/easymock-parent-3.2.pom
@@ -651,6 +838,10 @@ https://repo.maven.apache.org/maven2/org/eclipse/ee4j/project/1.0.7/project-1.0.
https://repo.maven.apache.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.pom
https://repo.maven.apache.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.4/ecj-4.4.pom
https://repo.maven.apache.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.pom
https://repo.maven.apache.org/maven2/org/eclipse/sisu/org.eclipse.sisu.inject/0.3.5/org.eclipse.sisu.inject-0.3.5.pom
https://repo.maven.apache.org/maven2/org/eclipse/sisu/org.eclipse.sisu.plexus/0.3.5/org.eclipse.sisu.plexus-0.3.5.pom
https://repo.maven.apache.org/maven2/org/eclipse/sisu/sisu-inject/0.3.5/sisu-inject-0.3.5.pom
https://repo.maven.apache.org/maven2/org/eclipse/sisu/sisu-plexus/0.3.5/sisu-plexus-0.3.5.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-bom/2.2.11/jaxb-bom-2.2.11.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-bom/4.0.0-M4/jaxb-bom-4.0.0-M4.pom
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-core/2.2.11/jaxb-core-2.2.11.pom
@@ -660,6 +851,7 @@ https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.2.11.
https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/4.0.0-M4/txw2-4.0.0-M4.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/2.2/hamcrest-core-2.2.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-parent/1.3/hamcrest-parent-1.3.pom
https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest/2.2/hamcrest-2.2.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.build/0.7.4.201502262128/org.jacoco.build-0.7.4.201502262128.pom
@@ -667,6 +859,8 @@ https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.build/0.8.8/org.jacoc
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.core/0.8.8/org.jacoco.core-0.8.8.pom
https://repo.maven.apache.org/maven2/org/jacoco/org.jacoco.report/0.7.4.201502262128/org.jacoco.report-0.7.4.201502262128.pom
https://repo.maven.apache.org/maven2/org/jboss/weld/weld-parent/26/weld-parent-26.pom
https://repo.maven.apache.org/maven2/org/jboss/weld/weld-parent/36/weld-parent-36.pom
https://repo.maven.apache.org/maven2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.pom
https://repo.maven.apache.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.pom
@@ -676,6 +870,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-co
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.1.1/kotlinx-coroutines-core-1.1.1.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.3.8/kotlinx-coroutines-core-1.3.8.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-android-extensions-runtime/1.4.31/kotlin-android-extensions-runtime-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-android-extensions/1.3.50/kotlin-android-extensions-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-android-extensions/1.4.31/kotlin-android-extensions-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-annotation-processing-gradle/1.3.50/kotlin-annotation-processing-gradle-1.3.50.pom
@@ -719,6 +914,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.31/kotlin-stdlib-common-1.3.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.50/kotlin-stdlib-common-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.71/kotlin-stdlib-common-1.3.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.10/kotlin-stdlib-common-1.4.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.31/kotlin-stdlib-common-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.10/kotlin-stdlib-common-1.5.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.30/kotlin-stdlib-common-1.5.30.pom
@@ -727,10 +923,12 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.2.71/kotlin-stdlib-jdk7-1.2.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.50/kotlin-stdlib-jdk7-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.5.30/kotlin-stdlib-jdk7-1.5.30.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.2.71/kotlin-stdlib-jdk8-1.2.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.50/kotlin-stdlib-jdk8-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.5.30/kotlin-stdlib-jdk8-1.5.30.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre7/1.2.0/kotlin-stdlib-jre7-1.2.0.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre8/1.2.0/kotlin-stdlib-jre8-1.2.0.pom
@@ -743,6 +941,7 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/k
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.31/kotlin-stdlib-1.3.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.50/kotlin-stdlib-1.3.50.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.3.71/kotlin-stdlib-1.3.71.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.4.10/kotlin-stdlib-1.4.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.4.31/kotlin-stdlib-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.10/kotlin-stdlib-1.5.10.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.30/kotlin-stdlib-1.5.30.pom
@@ -750,17 +949,31 @@ https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-util-io/1.3.50/
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-util-io/1.4.31/kotlin-util-io-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-util-klib/1.4.31/kotlin-util-klib-1.4.31.pom
https://repo.maven.apache.org/maven2/org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.9.0-M1/junit-bom-5.9.0-M1.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.7.0/junit-bom-5.7.0.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.7.1/junit-bom-5.7.1.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.7.2/junit-bom-5.7.2.pom
https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.8.2/junit-bom-5.8.2.pom
https://repo.maven.apache.org/maven2/org/junit/jupiter/junit-jupiter-api/5.7.0/junit-jupiter-api-5.7.0.pom
https://repo.maven.apache.org/maven2/org/junit/platform/junit-platform-commons/1.7.0/junit-platform-commons-1.7.0.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.pom
https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/2.1.0/stax-ex-2.1.0.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/2.28.2/mockito-core-2.28.2.pom
https://repo.maven.apache.org/maven2/org/mockito/mockito-core/3.6.28/mockito-core-3.6.28.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/2.6/objenesis-parent-2.6.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/3.1/objenesis-parent-3.1.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis-parent/3.2/objenesis-parent-3.2.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis/3.1/objenesis-3.1.pom
https://repo.maven.apache.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2.pom
https://repo.maven.apache.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/6.0/asm-analysis-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/7.0/asm-analysis-7.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/9.3/asm-analysis-9.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/6.0/asm-commons-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/7.0/asm-commons-7.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/9.3/asm-commons-9.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-debug-all/6.0_BETA/asm-debug-all-6.0_BETA.pom
@@ -772,18 +985,59 @@ https://repo.maven.apache.org/maven2/org/ow2/asm/asm-parent/6.0_BETA/asm-parent-
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/6.0/asm-tree-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/7.0/asm-tree-7.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/9.3/asm-tree-9.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/6.0/asm-util-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/7.0/asm-util-7.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/5.0.3/asm-5.0.3.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/6.0/asm-6.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/7.0/asm-7.0.pom
https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.3/asm-9.3.pom
https://repo.maven.apache.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
https://repo.maven.apache.org/maven2/org/ow2/ow2/1.5/ow2-1.5.pom
https://repo.maven.apache.org/maven2/org/robolectric/annotations/4.3/annotations-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/junit/4.3/junit-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/pluginapi/4.3/pluginapi-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.3/plugins-maven-dependency-resolver-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/resources/4.3/resources-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/robolectric/4.3/robolectric-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/sandbox/4.3/sandbox-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/shadowapi/4.3/shadowapi-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/shadows-framework/4.3/shadows-framework-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/utils-reflector/4.3/utils-reflector-4.3.pom
https://repo.maven.apache.org/maven2/org/robolectric/utils/4.3/utils-4.3.pom
https://repo.maven.apache.org/maven2/org/slf4j/jcl-over-slf4j/2.0.0-alpha7/jcl-over-slf4j-2.0.0-alpha7.pom
https://repo.maven.apache.org/maven2/org/slf4j/jul-to-slf4j/2.0.0-alpha7/jul-to-slf4j-2.0.0-alpha7.pom
https://repo.maven.apache.org/maven2/org/slf4j/slf4j-api/2.0.0-alpha7/slf4j-api-2.0.0-alpha7.pom
https://repo.maven.apache.org/maven2/org/slf4j/slf4j-jdk14/2.0.0-alpha7/slf4j-jdk14-2.0.0-alpha7.pom
https://repo.maven.apache.org/maven2/org/slf4j/slf4j-parent/2.0.0-alpha7/slf4j-parent-2.0.0-alpha7.pom
https://repo.maven.apache.org/maven2/org/slf4j/slf4j-simple/2.0.0-alpha7/slf4j-simple-2.0.0-alpha7.pom
https://repo.maven.apache.org/maven2/org/sonatype/buildsupport/buildsupport/5/buildsupport-5.pom
https://repo.maven.apache.org/maven2/org/sonatype/buildsupport/buildsupport/12/buildsupport-12.pom
https://repo.maven.apache.org/maven2/org/sonatype/buildsupport/public-parent/5/public-parent-5.pom
https://repo.maven.apache.org/maven2/org/sonatype/buildsupport/public-parent/12/public-parent-12.pom
https://repo.maven.apache.org/maven2/org/sonatype/forge/forge-parent/3/forge-parent-3.pom
https://repo.maven.apache.org/maven2/org/sonatype/forge/forge-parent/6/forge-parent-6.pom
https://repo.maven.apache.org/maven2/org/sonatype/forge/forge-parent/10/forge-parent-10.pom
https://repo.maven.apache.org/maven2/org/sonatype/forge/forge-parent/38/forge-parent-38.pom
https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/4/oss-parent-4.pom
https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/7/oss-parent-7.pom
https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/9/oss-parent-9.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/inject/cglib/3.1.1/cglib-3.1.1.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/inject/guice-parent/2.9.4/guice-parent-2.9.4.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/inject/guice-parent/4.2.0/guice-parent-4.2.0.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/inject/wrappers/2.6.0/wrappers-2.6.0.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/sisu-guice/2.9.4/sisu-guice-2.9.4.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/sisu-guice/4.2.0/sisu-guice-4.2.0.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/sisu-inject-bean/2.6.0/sisu-inject-bean-2.6.0.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/sisu-inject-plexus/2.6.0/sisu-inject-plexus-2.6.0.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/sisu-inject/2.6.0/sisu-inject-2.6.0.pom
https://repo.maven.apache.org/maven2/org/sonatype/sisu/sisu-parent/2.6.0/sisu-parent-2.6.0.pom
https://repo.maven.apache.org/maven2/org/sonatype/spice/model-builder/1.10/model-builder-1.10.pom
https://repo.maven.apache.org/maven2/org/sonatype/spice/spice-parent/10/spice-parent-10.pom
https://repo.maven.apache.org/maven2/org/sonatype/spice/spice-parent/17/spice-parent-17.pom
https://repo.maven.apache.org/maven2/stax/stax-api/1.0.1/stax-api-1.0.1.pom
https://repo.maven.apache.org/maven2/xerces/xercesImpl/2.8.1/xercesImpl-2.8.1.pom
https://repo.maven.apache.org/maven2/xml-apis/xml-apis/1.3.03/xml-apis-1.3.03.pom
+1 -2
View File
@@ -52,8 +52,7 @@ function gen_deps_json() {
# Format URLs into a Nix consumable file.
URLS=$(cat ${DEPS_URLS})
# Avoid rate limiting by using 4 of the available threads.
parallel --will-cite --keep-order --jobs 4 \
parallel --will-cite --keep-order \
"${CUR_DIR}/url2json.sh" \
::: ${URLS} \
>> ${DEPS_JSON}
+2
View File
@@ -10,6 +10,7 @@ react-native-community_masked-view
react-native-community_netinfo
react-native-community_slider
react-native-config
react-native-device-info
react-native-dialogs
react-native-fast-image
react-native-fs
@@ -23,6 +24,7 @@ react-native-linear-gradient
react-native-mail
react-native-navigation
react-native-nfc-manager
react-native-notifications
react-native-permissions
react-native-randombytes
react-native-reanimated
+4 -18
View File
@@ -66,30 +66,16 @@ POM_SHA256=$(get_nix_sha "${POM_NIX_FETCH_OUT}")
POM_SHA1=$(get_sha1 "${POM_PATH}")
# Identify packaging type, JAR, AAR, or just POM.
OBJ_TYPE_RAW=$(grep -oP '<packaging>\K[^<]+' "${POM_PATH}")
OBJ_TYPE=$(grep -oP '<packaging>\K[^<]+' "${POM_PATH}")
# Bundle is a JAR made using maven-bundle-plugin.
case "${OBJ_TYPE_RAW}" in
case "${OBJ_TYPE}" in
''|'bundle') OBJ_TYPE=jar;;
'aar.asc') OBJ_TYPE=aar;;
*) OBJ_TYPE="${OBJ_TYPE_RAW}"
esac
# Some deps are Eclipse plugins, and we don't need those.
if [[ "${OBJ_TYPE}" == "eclipse-plugin" ]]; then
exit 0
fi
# Some deps are just POMs, in which case there is no JAR to fetch.
# Some dependencies have only a POM file.
if [[ "${OBJ_TYPE}" != "pom" ]]; then
OBJ_NIX_FETCH_OUT=$(nix_fetch "${OBJ_REL_URL}.${OBJ_TYPE}")
# If type was a JAR or other, not getting one is an error.
if [[ ${?} -ne 0 ]]; then
# POMs without packaging type defined can still include JARs.
if [[ "${OBJ_TYPE_RAW}" != "" ]]; then
echo " ! Failed to fetch: ${OBJ_REL_URL}.${OBJ_TYPE}" >&2
exit 1
fi
else
if [[ ${?} -eq 0 ]]; then
OBJ_PATH=$(get_nix_path "${OBJ_NIX_FETCH_OUT}")
OBJ_SHA256=$(get_nix_sha "${OBJ_NIX_FETCH_OUT}")
OBJ_SHA1=$(get_sha1 "${OBJ_PATH}")
+5 -2
View File
@@ -2,6 +2,9 @@
, status-go, androidPkgs, androidShell }:
let
# For generating a temporary keystore for local development
keystore = callPackage ./keystore.nix { };
# Import a jsbundle compiled out of clojure codebase
jsbundle = callPackage ./jsbundle { };
@@ -10,12 +13,12 @@ let
# TARGETS
release = callPackage ./release.nix {
inherit jsbundle status-go watchmanFactory;
inherit keystore jsbundle status-go watchmanFactory;
};
in {
# TARGETS
inherit release jsbundle;
inherit keystore release jsbundle;
shell = mkShell {
buildInputs = with pkgs; [
+44
View File
@@ -0,0 +1,44 @@
#
# Generates an ad-hoc and temporary keystore for signing debug/pr builds.
#
# WARNING: Do NOT use this to make a keystore that needs to be secret!
# Using a derivation will store the inputs in a .drv file.
#
{ stdenv, lib, pkgs }:
let
inherit (lib) getAttr;
gradleProps = pkgs.gradlePropParser ../../../android/gradle.properties;
# Loading defaults from gradle.properties which should be safe.
KEYSTORE_ALIAS = getAttr "KEYSTORE_ALIAS" gradleProps;
KEYSTORE_PASSWORD = getAttr "KEYSTORE_PASSWORD" gradleProps;
KEYSTORE_KEY_PASSWORD = getAttr "KEYSTORE_KEY_PASSWORD" gradleProps;
in stdenv.mkDerivation {
name = "status-react-android-keystore";
buildInputs = [ pkgs.openjdk8 ];
phases = [ "generatePhase" ];
generatePhase = ''
keytool -genkey -v \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
-deststoretype pkcs12 \
-dname "CN=, OU=, O=, L=, S=, C=" \
-keystore "$out" \
-alias "${KEYSTORE_ALIAS}" \
-storepass "${KEYSTORE_PASSWORD}" \
-keypass "${KEYSTORE_KEY_PASSWORD}" \
>&2
'';
shellHook = ''
export KEYSTORE_ALIAS="${KEYSTORE_ALIAS}"
export KEYSTORE_PASSWORD="${KEYSTORE_PASSWORD}"
export KEYSTORE_KEY_PASSWORD="${KEYSTORE_KEY_PASSWORD}"
'';
}
+19 -6
View File
@@ -1,6 +1,6 @@
{ stdenv, pkgs, deps, lib, config, callPackage,
watchmanFactory, androidPkgs, patchMavenSources,
jsbundle, status-go }:
keystore, jsbundle, status-go }:
{
# Value for BUILD_ENV checked by Clojure code at compile time
@@ -28,6 +28,9 @@ let
gradleOpts = getConfig "android.gradle-opts" null;
# Used to detect end-to-end builds
androidAbiInclude = getConfig "android.abi-include" "armeabi-v7a;arm64-v8a;x86";
# Keystore can be provided via config and extra-sandbox-paths.
# If it is not we use an ad-hoc one generated with default password.
keystorePath = getConfig "android.keystore-path" keystore;
baseName = "${buildType}-android";
name = "status-react-build-${baseName}";
@@ -73,6 +76,7 @@ in stdenv.mkDerivation rec {
# custom env variables derived from config
STATUS_GO_SRC_OVERRIDE = getConfig "status-go.src-override" null;
ANDROID_APK_SIGNED = getConfig "android.apk-signed" "true";
ANDROID_ABI_SPLIT = getConfig "android.abi-split" "false";
ANDROID_ABI_INCLUDE = androidAbiInclude;
@@ -84,7 +88,8 @@ in stdenv.mkDerivation rec {
STATUS_GO_ANDROID_LIBDIR = status-go { inherit secretsFile; };
phases = [
"unpackPhase" "secretsPhase" "buildPhase" "checkPhase" "installPhase"
"unpackPhase" "secretsPhase" "keystorePhase"
"buildPhase" "checkPhase" "installPhase"
];
unpackPhase = ''
@@ -115,13 +120,21 @@ in stdenv.mkDerivation rec {
${patchMavenSources} ./android/build.gradle
'';
# Secrets file is passed to sandbox using extra-sandbox-paths.
# if secretsFile is not set we use generate keystore
secretsPhase = if (secretsFile != "") then ''
source "${secretsFile}"
'' else ''
echo 'WARNING: No secrets provided!' >&2
'';
${checkEnvVarSet "KEYSTORE_ALIAS"}
${checkEnvVarSet "KEYSTORE_PASSWORD"}
${checkEnvVarSet "KEYSTORE_KEY_PASSWORD"}
'' else keystore.shellHook;
# if keystorePath is set copy it into build directory
keystorePhase =
assert assertMsg (keystorePath != null) "keystorePath has to be set!";
''
export KEYSTORE_PATH="$PWD/status-im.keystore"
cp -a --no-preserve=ownership "${keystorePath}" "$KEYSTORE_PATH"
'';
buildPhase = let
adhocEnvVars = optionalString stdenv.isLinux
"LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${makeLibraryPath [ pkgs.zlib ]}";
+1 -1
View File
@@ -58,7 +58,7 @@ nixOpts=(
${GIT_ROOT}/nix/scripts/gcroots.sh "${TARGET}" "${@}"
# Run the actual build
echo "${GRN}Running:${RST} nix-build "${nixOpts[@]}" "${@}" default.nix"
echo "Running: nix-build "${nixOpts[@]}" "${@}" default.nix"
nixResultPath=$(nix-build "${nixOpts[@]}" "${@}" default.nix)
echo -e "\n${YLW}Extracting result${RST}: ${BLD}${nixResultPath}${RST}"
+9 -22
View File
@@ -23,28 +23,15 @@ nix_install_type() {
NIX_STORE_DIR_GROUP=$(file_group /nix/store)
if [[ "$(os_name)" =~ NixOS ]]; then
echo "nixos"
elif [[ "${NIX_STORE_DIR_GROUP}" == "nixbld" ]]; then
echo "multi"
elif [[ "${NIX_STORE_DIR_GROUP}" == "${USER}" ]]; then
echo "single"
elif [[ "${NIX_STORE_DIR_GROUP}" == "" ]]; then
echo "No Nix installtion detected!" >&2
echo "none"
else
case "${NIX_STORE_DIR_GROUP}" in
"nixbld") echo "multi";;
"30000") echo "multi";;
"(30000)") echo "multi";;
"wheel") echo "single";;
"users") echo "single";;
"${USER}") echo "single";;
"${UID}") echo "single";;
"(${UID})") echo "single";;
"") echo "none";
echo "No Nix installtion detected!" >&2;;
*) echo "Unknown Nix installtion type!" >&2; exit 1;;
esac
echo "Unknown Nix installtion type!" >&2
exit 1
fi
}
nix_root() {
NIX_ROOT="/nix"
if [[ $(uname -s) == "Darwin" ]]; then
# Special case due to read-only root on MacOS Catalina
NIX_ROOT="/opt/nix"
fi
echo "${NIX_ROOT}"
}
+26 -68
View File
@@ -5,58 +5,20 @@ GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
source "${GIT_ROOT}/nix/scripts/lib.sh"
source "${GIT_ROOT}/scripts/colors.sh"
nix_purge_linux_multi_user_service() {
NIX_SERVICES=(nix-daemon.service nix-daemon.socket)
for NIX_SERVICE in "${NIX_SERVICES[@]}"; do
sudo systemctl stop "${NIX_SERVICE}"
sudo systemctl disable "${NIX_SERVICE}"
done
nix_purge_multi_user() {
sudo systemctl stop nix-daemon.socket
sudo systemctl stop nix-daemon.service
sudo systemctl disable nix-daemon.socket
sudo systemctl disable nix-daemon.service
sudo systemctl daemon-reload
}
sudo rm -fr /etc/nix
sudo rm -f /etc/profile.d/nix.sh*
nix_purge_linux_multi_user_users() {
# Remove nix build users and groups
for NIX_USER in $(awk -F: '/nixbld/{print $1}' /etc/passwd); do
sudo userdel "${NIX_USER}"
done
sudo groupdel nixbld
}
nix_purge_darwin_multi_user_service() {
cd /Library/LaunchDaemons
NIX_SERVICES=(org.nixos.darwin-store.plist org.nixos.nix-daemon.plist)
for NIX_SERVICE in "${NIX_SERVICES[@]}"; do
sudo launchctl unload "${NIX_SERVICE}"
sudo launchctl remove "${NIX_SERVICE}"
done
}
nix_purge_darwin_multi_user_users() {
for NIX_USER in $(dscl . list /Users | grep nixbld); do
sudo dscl . -delete "/Users/${NIX_USER}"
done
sudo dscl . -delete /Groups/nixbld
}
# This still leaves an empty /nix, which will disappear after reboot.
nix_purge_darwin_multi_user_volumes() {
sudo sed -i.bkp '/nix/d' /etc/synthetic.conf
sudo sed -i.bkp '/nix/d' /etc/fstab
sudo diskutil apfs deleteVolume /nix
echo -e "${YLW}You will need to reboot your system!${RST}" >&2
}
nix_purge_multi_user() {
if [[ $(uname -s) == "Darwin" ]]; then
nix_purge_darwin_multi_user_service
nix_purge_darwin_multi_user_users
nix_purge_darwin_multi_user_volumes
else
nix_purge_linux_multi_user_service
nix_purge_linux_multi_user_users
fi
sudo rm -fr /etc/nix
sudo rm -f /etc/profile.d/nix.sh*
# Restore old shell profiles
NIX_PROFILE_FILES=(
@@ -79,7 +41,11 @@ nix_purge_user_profile() {
}
nix_purge_root() {
NIX_ROOT=$(nix_root)
NIX_ROOT="/nix"
if [[ $(uname -s) == "Darwin" ]]; then
# Special case due to read-only root on MacOS Catalina
NIX_ROOT="/opt/nix"
fi
if [[ -z "${NIX_ROOT}" ]]; then
echo -e "${RED}Unable to identify Nix root!${RST}" >&2
exit 1
@@ -87,35 +53,27 @@ nix_purge_root() {
sudo rm -fr "${NIX_ROOT}"
}
# Don't run anything if script is just sourced.
if (return 0 2>/dev/null); then
echo -e "${YLW}Script sourced, not running purge.${RST}"
return
fi
# Confirm user decission, unless --force is used.
if [[ "${1}" != "--force" ]]; then
echo -e "${YLW}Are you sure you want to purge Nix?${RST}" >&2
read -p "[y/n]: " -n 1 -r
echo
if [[ $REPLY =~ ^[^Yy]$ ]]; then
echo -e "${GRN}Aborting Nix purge!${RST}" >&2
exit 0
fi
fi
NIX_INSTALL_TYPE=$(nix_install_type)
# Purging /nix on NixOS would be disasterous.
if [[ "${1}" == "--force" ]] && [[ "${NIX_INSTALL_TYPE}" != "nixos" ]]; then
echo -e "${YLW}Purge forced, no checks performed!${RST}" >&2
nix_purge_multi_user
nix_purge_user_profile
nix_purge_root
exit
fi
# Purging /nix on NixOS would be disasterous
if [[ "${NIX_INSTALL_TYPE}" == "nixos" ]]; then
echo -e "${RED}You should not purge Nix files on NixOS!${RST}" >&2
exit
elif [[ "${NIX_INSTALL_TYPE}" == "none" ]] && [[ "${1}" != "--force" ]]; then
elif [[ "${NIX_INSTALL_TYPE}" == "none" ]]; then
echo -e "${YLW}Nothing to remove, Nix not installed.${RST}" >&2
exit
elif [[ "${NIX_INSTALL_TYPE}" == "multi" ]] || [[ "${1}" == "--force" ]]; then
elif [[ "${NIX_INSTALL_TYPE}" == "multi" ]]; then
echo -e "${YLW}Detected multi-user Nix installation.${RST}" >&2
nix_purge_multi_user
elif [[ "${NIX_INSTALL_TYPE}" == "single" ]] || [[ "${1}" == "--force" ]]; then
elif [[ "${NIX_INSTALL_TYPE}" == "single" ]]; then
echo -e "${YLW}Detected single-user Nix installation.${RST}" >&2
nix_purge_user_profile
fi
+1 -1
View File
@@ -58,7 +58,7 @@ let
# for 'scripts/generate-keystore.sh'
keytool = mkShell {
buildInputs = with pkgs; [ openjdk8 apksigner ];
buildInputs = with pkgs; [ openjdk8 ];
};
# for targets that need 'adb' and other SDK/NDK tools
+3 -6
View File
@@ -1,7 +1,9 @@
{ lib, callPackage, mkShell, openjdk, androidPkgs }:
let
inherit (lib) attrValues mapAttrs;
inherit (lib)
catAttrs concatStrings concatStringsSep fileContents makeBinPath
getConfig optional attrValues mapAttrs attrByPath;
# Metadata common to all builds of status-go
meta = {
@@ -36,11 +38,6 @@ in rec {
inherit meta source goBuildFlags goBuildLdFlags;
};
library = callPackage ./library {
inherit meta source;
};
shell = mkShell {
inputsFrom = [ mobile.android mobile.ios ];
};
-33
View File
@@ -1,33 +0,0 @@
{ lib, stdenv, utils, buildGo117Package
, go, xcodeWrapper
# object with source attributes
, meta, source}:
let
inherit (stdenv) isDarwin;
inherit (lib) optional;
in buildGo117Package {
pname = source.repo;
version = "${source.cleanVersion}-${source.shortRev}";
inherit meta;
inherit (source) src goPackagePath;
phases = ["unpackPhase" "configurePhase" "buildPhase"];
preBuild = ''
pushd go/src/$goPackagePath
go run cmd/library/*.go > $NIX_BUILD_TOP/main.go
popd
'';
# Build the Go library
buildPhase = ''
runHook preBuild
go build -buildmode=c-archive -o $out/libstatus.a $NIX_BUILD_TOP/main.go
runHook postBuild
'';
}
+3 -8
View File
@@ -1,7 +1,6 @@
{
"name": "StatusIm-Mobile",
"version": "0.0.1",
"main": "modules/react-native-status/nodejs/bindings.js",
"private": true,
"scripts": {
"start": "react-native start",
@@ -12,7 +11,6 @@
"app:android": "react-native run-android"
},
"dependencies": {
"@mapbox/node-pre-gyp": "^1.0.9",
"@react-native-community/async-storage": "^1.11.0",
"@react-native-community/audio-toolkit": "git+https://github.com/tbenr/react-native-audio-toolkit.git#refs/tags/v2.0.3-status-v6",
"@react-native-community/blur": "^3.6.0",
@@ -32,6 +30,7 @@
"emojilib": "^2.4.0",
"eth-phishing-detect": "^1.1.13",
"functional-red-black-tree": "^1.0.1",
"hermes-engine": "0.5.2-rc1",
"hi-base32": "^0.5.0",
"i18n-js": "^3.3.0",
"node-libs-react-native": "^1.2.1",
@@ -43,6 +42,7 @@
"react-native-blob-util": "^0.13.18",
"react-native-camera-kit": "^8.0.4",
"react-native-config": "git+https://github.com/status-im/react-native-config.git#refs/tags/v1.4.2-status",
"react-native-device-info": "^7.4.0",
"react-native-dialogs": "^1.0.4",
"react-native-draggable-flatlist": "^3.0.3",
"react-native-fast-image": "^8.5.11",
@@ -58,6 +58,7 @@
"react-native-linear-gradient": "^2.5.6",
"react-native-mail": "^6.1.1",
"react-native-navigation": "^7.27.1",
"react-native-notifications": "^4.1.3",
"react-native-permissions": "^2.1.5",
"react-native-randombytes": "^3.6.1",
"react-native-reanimated": "^2.1.0",
@@ -87,11 +88,5 @@
"process": "0.11.10",
"rn-snoopy": "git+https://github.com/status-im/rn-snoopy.git#refs/tags/v2.0.2-status",
"shadow-cljs": "^2.10.14"
},
"binary": {
"module_name": "status_nodejs_addon",
"module_path": "./lib/binding/",
"host": "https://github.com/status-im/status-react/releases/download/",
"remote_path": "{version}"
}
}
+4 -1
View File
@@ -32,6 +32,7 @@ KEYSTORE_PATH=${KEYSTORE_PATH/#\~/$HOME}
if [[ -e "${KEYSTORE_PATH}" ]]; then
echo -e "${YLW}Keystore file already exists:${RST} ${KEYSTORE_PATH}" >&2
echo "${KEYSTORE_PATH}"
exit 0
fi
@@ -40,7 +41,7 @@ KEYSTORE_DIR=$(dirname "${KEYSTORE_PATH}")
echo -e "${GRN}Generating keystore...${RST}" >&2
exec keytool -genkey -v \
keytool -genkey -v \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
@@ -51,3 +52,5 @@ exec keytool -genkey -v \
-storepass "${KEYSTORE_PASSWORD}" \
-keypass "${KEYSTORE_KEY_PASSWORD}" \
> /dev/stderr
echo "${KEYSTORE_PATH}"
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
set -e
# Used by Clojure to condition code and Gradle to make dependencies optional
sed -i -e '$aGOOGLE_FREE=1' .env.release
# remove react-native-notifications(uses google dependencies) and google-services.json for the fdroid-build
yarn remove react-native-notifications
rm android/app/google-services.json
@@ -26,9 +26,13 @@ config=''
if [[ -n "${STATUS_GO_SRC_OVERRIDE}" ]]; then
config+="status-im.status-go.src-override=\"${STATUS_GO_SRC_OVERRIDE}\";"
fi
if [[ "${ANDROID_APK_SIGNED}" == "true" ]]; then
config+="status-im.android.keystore-path=\"$(must_get_env KEYSTORE_PATH)\";"
fi
config+="status-im.commit-hash=\"$(git rev-parse --verify HEAD)\";"
config+="status-im.build-type=\"$(must_get_env BUILD_TYPE)\";"
config+="status-im.build-number=\"$(must_get_env BUILD_NUMBER)\";"
config+="status-im.android.apk-signed=\"$(must_get_env ANDROID_APK_SIGNED)\";"
config+="status-im.android.abi-split=\"$(must_get_env ANDROID_ABI_SPLIT)\";"
config+="status-im.android.abi-include=\"$(must_get_env ANDROID_ABI_INCLUDE)\";"
nixOpts=()
@@ -38,10 +42,24 @@ export SECRETS_FILE_PATH=$(mktemp)
chmod 644 ${SECRETS_FILE_PATH}
# If secrets file was created we want to remove it.
trap "rm -vf ${SECRETS_FILE_PATH}" EXIT ERR INT QUIT
# Secrets like this can't be passed via args or they end up in derivation.
if [[ -n "${INFURA_TOKEN}" ]]; then append_env_export 'INFURA_TOKEN'; fi
if [[ -n "${OPENSEA_API_KEY}" ]]; then append_env_export 'OPENSEA_API_KEY'; fi
if [[ -n "${KEYSTORE_ALIAS}${KEYSTORE_ALIAS}${KEYSTORE_ALIAS}" ]]; then
# WARNING: All three have to be set!
append_env_export 'KEYSTORE_PASSWORD'
append_env_export 'KEYSTORE_ALIAS'
append_env_export 'KEYSTORE_KEY_PASSWORD'
fi
if [[ -n "${INFURA_TOKEN}" ]]; then
append_env_export 'INFURA_TOKEN'
fi
if [[ -n "${OPENSEA_API_KEY}" ]]; then
append_env_export 'OPENSEA_API_KEY'
fi
# Used by Clojure at compile time for remove import of react-native-notifications for fdroid release
if [[ -n "${READER_FEATURES}" ]]; then
append_env_export 'READER_FEATURES'
fi
# If no secrets were passed there's no need to pass the 'secretsFile'.
if [[ -s "${SECRETS_FILE_PATH}" ]]; then
-48
View File
@@ -1,48 +0,0 @@
#!/usr/bin/env bash
set -e
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
source "${GIT_ROOT}/scripts/colors.sh"
function property() {
grep "${2}" "${1}" | cut -d'=' -f2
}
function gradle_property() {
property ${GIT_ROOT}/android/gradle.properties ${1}
}
function env_var_or_gradle_prop() {
VAR_NAME="${1}"
if [[ -n "${!VAR_NAME}" ]]; then
echo "${!VAR_NAME}"
else
gradle_property "${VAR_NAME}"
fi
}
function must_get_env() {
declare -n VAR_VALUE="$1"
if [[ -n "${VAR_VALUE}" ]]; then
echo "${VAR_VALUE}"
return
fi
echo -e "${RED}No required env variable:${RST} ${BLD}${!VAR_VALUE}${RST}" 1>&2
exit 1
}
# If filename contains string "unsigned" change that to signed.
# Otherwise sign in-place and overwrite the current unsigned file.
if [[ "${1}" =~ unsigned ]]; then
OUTPUT_FLAGS="--out=${1/unsigned/signed}"
fi
echo -e "${GRN}Signing APK:${RST} ${1}" >&2
exec apksigner sign --verbose \
--ks="$(env_var_or_gradle_prop KEYSTORE_PATH)" \
--ks-pass="pass:$(env_var_or_gradle_prop KEYSTORE_PASSWORD)" \
--ks-key-alias="$(env_var_or_gradle_prop KEYSTORE_ALIAS)" \
--key-pass="pass:$(env_var_or_gradle_prop KEYSTORE_KEY_PASSWORD)" \
"${OUTPUT_FLAGS}" \
"${1}"
+3 -2
View File
@@ -16,7 +16,7 @@
[refactor-nrepl "2.5.0"]
[cider/cider-nrepl "0.25.3"]
[cider/piggieback "0.4.1"]
[re-frisk-remote "1.6.0"]
[re-frisk-remote "1.5.0"]
;; routing
[bidi "2.1.6"]
;; test dependencies
@@ -64,7 +64,8 @@
:static-fns true
:fn-invoke-direct true
:optimizations :advanced
:js-options {:js-provider :closure}}}}
:js-options {:js-provider :closure}
:reader-features #{#shadow/env ["READER_FEATURES" :as :keyword :default :cljs]}}}}
;; the tests are ran with node, react-native dependencies are mocked
;; by using node --require override.js, which uses the node-library
;; produced by the target :mocks below and redefines node require
+4 -2
View File
@@ -1,7 +1,6 @@
(ns mocks.js-dependencies
(:require-macros [status-im.utils.slurp :refer [slurp]])
(:require [status-im.fleet.default-fleet :refer (default-fleets)])
(:require [status-im.utils.test :as utils.test])
(:require [status-im.chat.default-chats :refer (default-chats)]))
(def action-button #js {:default #js {:Item #js {}}})
@@ -20,7 +19,6 @@
(def react-native
(clj->js {:NativeModules {:RNGestureHandlerModule {:Direction (fn [])}
:PushNotifications {}
:Status utils.test/status
:ReanimatedModule {:configureProps (fn [])}}
:View {}
@@ -213,6 +211,9 @@
(def react-native-draggable-flatlist
#js {:default #js {}})
(def react-native-notifications
#js {:Notifications #js {}})
(def react-native-blur
(clj->js {:BlurView {}}))
@@ -256,6 +257,7 @@
"@react-native-community/blur" react-native-blur
"react-native-camera-kit" react-native-camera-kit
"rn-emoji-keyboard" rn-emoji-keyboard
"react-native-notifications" react-native-notifications
"react-native-draggable-flatlist" react-native-draggable-flatlist
"./fleets.js" default-fleets
"./chats.js" default-chats
+35
View File
@@ -0,0 +1,35 @@
(ns status-im.acquisition.advertiser
(:require [status-im.utils.fx :as fx]
[status-im.popover.core :as popover]
[status-im.ethereum.core :as ethereum]
[status-im.acquisition.gateway :as gateway]
[status-im.acquisition.claim :as claim]
[status-im.acquisition.notifications :as notifications]
[status-im.acquisition.persistance :as persistence]))
(fx/defn start-acquisition
[cofx _]
(popover/show-popover cofx
{:prevent-closing? true
:view :advertiser-invite}))
(fx/defn advertiser-decide
{:events [::decision]}
[{:keys [db] :as cofx} decision]
(let [referral (get-in db [:acquisition :referrer])
{:keys [rewardable]} (get-in db [:acquisition :metadata])
payload {:chat_key (get-in db [:multiaccount :public-key])
:address (ethereum/default-address db)
:invite_code referral}]
(fx/merge cofx
(if (= decision :accept)
(fn [cofx]
(fx/merge cofx
(when rewardable
(notifications/accept))
(gateway/handle-acquisition {:message payload
:method "PATCH"
:url [:clicks referral]
:on-success [::claim/success-starter-pack-claim]})))
{::persistence/set-referrer-state :declined})
(popover/hide-popover))))
+65
View File
@@ -0,0 +1,65 @@
(ns status-im.acquisition.chat
(:require [re-frame.core :as re-frame]
[status-im.utils.fx :as fx]
[status-im.acquisition.claim :as claim]
[status-im.ethereum.core :as ethereum]
[status-im.acquisition.persistance :as persistence]
[status-im.acquisition.notifications :as notifications]
[status-im.acquisition.gateway :as gateway]
[status-im.chat.models :as chat]
[status-im.navigation :as navigation]
[status-im.bottom-sheet.core :as bottom-sheet]))
(def public-chat "public-chat")
(fx/defn start-acquisition
[{:keys [db]} {:keys [key id] :as referrer} public]
{:db (assoc-in db [:acquisition :chat-referrer (or key id)] referrer)
::persistence/chat-initialized? (fn [state]
(when-not (= "initialized" state)
(if public
(re-frame/dispatch [::start-public-chat referrer public])
(re-frame/dispatch [::start-chat referrer public]))))})
(fx/defn start-chat
{:events [::start-chat]}
[cofx {:keys [key id]} public]
(fx/merge cofx
{::persistence/chat-initalized! true}
(chat/start-chat key nil)))
(fx/defn start-public-chat
{:events [::start-public-chat]}
[cofx referrer chat-name]
(fx/merge cofx
{::persistence/chat-initalized! true}
(navigation/navigate-to-cofx :referral-enclav nil)))
(fx/defn join-public-chat
[cofx chat-name]
(chat/start-public-chat cofx chat-name nil))
(fx/defn accept-pack
{:events [::accept-pack]}
[{:keys [db] :as cofx}]
(let [referral (get-in db [:acquisition :referrer])
{:keys [type id rewardable]} (get-in db [:acquisition :metadata])
payload {:chat_key (get-in db [:multiaccount :public-key])
:address (ethereum/default-address db)
:invite_code referral}]
(fx/merge cofx
(when rewardable
(notifications/accept))
(when (= type public-chat)
(join-public-chat id))
(gateway/handle-acquisition {:message payload
:method "PATCH"
:url [:clicks referral]
:on-success [::claim/success-starter-pack-claim]}))))
(fx/defn decline
{:events [::decline]}
[cofx]
(fx/merge cofx
{::persistence/set-referrer-state :declined}
(bottom-sheet/hide-bottom-sheet)))
+44
View File
@@ -0,0 +1,44 @@
(ns status-im.acquisition.claim
(:require [status-im.utils.fx :as fx]
[status-im.ethereum.transactions.core :as transaction]
[status-im.acquisition.notifications :as notifications]
[status-im.acquisition.persistance :as persistence]
[status-im.ethereum.json-rpc :as json-rpc]
[re-frame.core :as re-frame]))
(fx/defn success-tx-received
{:events [::success-tx-received]}
[cofx]
(fx/merge cofx
(notifications/claimed)
{::persistence/set-referrer-state :claimed}))
(fx/defn add-tx-watcher
{:events [::add-tx-watcher]}
[cofx tx]
(fx/merge cofx
{::persistence/set-watch-tx tx}
(transaction/watch-transaction tx
{:trigger-fn (constantly true)
:on-trigger
(fn []
{:dispatch [::success-tx-received]})})))
(fx/defn check-transaction-receipt
{:events [::check-transaction-receipt]}
[cofx tx]
(when tx
{::json-rpc/call [{:method "eth_getTransactionReceipt"
:params [tx]
:on-success (fn [receipt]
(if receipt
(re-frame/dispatch [::success-tx-received])
(re-frame/dispatch [::add-tx-watcher tx])))}]}))
(fx/defn success-starter-pack-claim
{:events [::success-starter-pack-claim]}
[cofx {:keys [tx]}]
(fx/merge cofx
{::persistence/set-referrer-state (if tx :accepted :claimed)}
(when tx
(add-tx-watcher tx))))
+127
View File
@@ -0,0 +1,127 @@
(ns status-im.acquisition.core
(:require [re-frame.core :as re-frame]
[clojure.string :as string]
[status-im.utils.fx :as fx]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.ens :as ens]
[status-im.ethereum.contracts :as contracts]
[status-im.acquisition.notifications :as notifications]
[status-im.acquisition.chat :as chat]
[status-im.acquisition.dapp :as dapp]
[status-im.acquisition.claim :as claim]
[status-im.acquisition.advertiser :as advertiser]
[status-im.acquisition.persistance :as persistence]
[status-im.acquisition.gateway :as gateway]
[status-im.utils.config :as config]
[status-im.acquisition.install-referrer :as install-referrer]))
(def not-found-code "notfound.click_id")
(def advertiser-type "advertiser")
(def chat-type "chat")
(def chat-public-type "public-chat")
(def dapp-type "dapp")
(fx/defn handle-registration
[cofx {:keys [message on-success]}]
(gateway/handle-acquisition cofx
{:message message
:on-success on-success
:method "POST"
:url [:registrations nil]}))
(re-frame/reg-fx
::get-referrer
(fn []
(persistence/get-referrer-flow-state
(fn [^js data]
(install-referrer/get-referrer
(fn [install-referrer]
(persistence/set-referrer install-referrer)
(when (not= install-referrer "unknown")
(when-let [referrer (install-referrer/parse-referrer install-referrer)]
(re-frame/dispatch [::has-referrer data referrer])))))))))
(re-frame/reg-fx
::check-referrer
(fn [external-referrer]
(persistence/get-referrer-flow-state
(fn [^js data]
(if external-referrer
(re-frame/dispatch [::has-referrer data external-referrer])
(persistence/get-referrer
(fn [install-referrer]
(when (not= install-referrer "unknown")
(when-let [referrer (install-referrer/parse-referrer install-referrer)]
(re-frame/dispatch [::has-referrer data referrer]))))))))))
(fx/defn referrer-registered
{:events [::referrer-registered]}
[{:keys [db] :as cofx} referrer {:keys [type attributed] :as referrer-meta}]
(when-not attributed
(fx/merge cofx
{:db (assoc-in db [:acquisition :metadata] referrer-meta)
::notifications/create-channel nil}
(cond
(= type advertiser-type)
(advertiser/start-acquisition referrer-meta)
(#{chat-type chat-public-type} type)
(chat/start-acquisition referrer-meta (= type chat-public-type))
(= type dapp-type)
(dapp/start-acquisition referrer-meta)))))
(fx/defn outdated-referrer
{:events [::outdated-referrer]}
[_ _]
{::persistence/set-referrer-state :outdated})
(fx/defn has-referrer
{:events [::has-referrer]}
[{:keys [db] :as cofx} flow-state referrer]
(when referrer
(fx/merge cofx
{:db (-> db
(assoc-in [:acquisition :referrer] referrer)
(assoc-in [:acquisition :flow-state] flow-state))}
(cond
(nil? flow-state)
(gateway/get-referrer
referrer
(fn [resp] [::referrer-registered referrer resp])
(fn [{:keys [code]}] (= code not-found-code))
(fn [resp]
(re-frame/dispatch [::outdated-referrer resp])))
(= flow-state (:accepted persistence/referrer-state))
(fn [_]
{::persistence/check-tx-state (fn [tx]
(when-not (nil? tx)
(re-frame/dispatch [::claim/check-transaction-receipt tx])))})))))
(re-frame/reg-fx
::resolve-contract
(fn [{:keys [chain-id contract on-success]}]
(when contract
(if (string/starts-with? contract "0x")
(on-success contract)
(ens/address chain-id contract on-success)))))
(fx/defn create [{:keys [db]}]
(when-not config/google-free
{::resolve-contract {:chain (ethereum/chain-id db)
:contract (contracts/get-address db :status/acquisition)
:on-success #(re-frame/dispatch [:set-in [:acquisition :contract] %])}
::get-referrer nil}))
(fx/defn login [{:keys [db]}]
(when-not config/google-free
{::resolve-contract {:chain (ethereum/chain-id db)
:contract (contracts/get-address db :status/acquisition)
:on-success #(re-frame/dispatch [:set-in [:acquisition :contract] %])}
::check-referrer nil}))
(re-frame/reg-sub
::metadata
(fn [db]
(get-in db [:acquisition :metadata])))
+40
View File
@@ -0,0 +1,40 @@
(ns status-im.acquisition.dapp
(:require [status-im.utils.fx :as fx]
[status-im.popover.core :as popover]
[status-im.ethereum.core :as ethereum]
[status-im.acquisition.gateway :as gateway]
[status-im.acquisition.claim :as claim]
[status-im.browser.core :as browser]
[status-im.utils.security :as security]
[status-im.acquisition.persistance :as persistence]))
(fx/defn start-acquisition
[cofx _]
(popover/show-popover cofx
{:prevent-closing? true
:view :dapp-invite}))
(fx/defn succes-claim
{:events [::success-claim]}
[cofx response]
(let [link (get-in cofx [:db :acquisition :metadata :url])]
(fx/merge cofx
(when (security/safe-link? link)
(browser/open-url link))
(claim/success-starter-pack-claim response))))
(fx/defn dapp-decision
{:events [::decision]}
[{:keys [db] :as cofx} decision]
(let [referral (get-in db [:acquisition :referrer])
payload {:chat_key (get-in db [:multiaccount :public-key])
:address (ethereum/default-address db)
:invite_code referral}]
(fx/merge cofx
(if (= decision :accept)
(gateway/handle-acquisition {:message payload
:method "PATCH"
:url [:clicks referral]
:on-success [::success-claim]})
{::persistence/set-referrer-state :declined})
(popover/hide-popover))))
+87
View File
@@ -0,0 +1,87 @@
(ns status-im.acquisition.gateway
(:require [re-frame.core :as re-frame]
[status-im.utils.fx :as fx]
[status-im.ethereum.core :as ethereum]
[status-im.i18n.i18n :as i18n]
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.utils.types :as types]))
(def acquisition-gateway {:mainnet "https://get.status.im"
:rinkeby "https://test-referral.status.im"})
(defn acquisition-routes [network type]
(get {:clicks (str (get acquisition-gateway network) "/clicks")
:registrations (str (get acquisition-gateway network) "/registrations")}
type))
(def network-statuses {:initiated 1
:in-flight 2
:error 3
:success 4})
(defn get-url [network [type referral]]
(if (= type :clicks)
(str (acquisition-routes network :clicks) "/" referral)
(acquisition-routes network :registrations)))
(fx/defn handle-error
{:events [::on-error]}
[{:keys [db]} error]
{:db (assoc-in db [:acquisition :network-status]
(get network-statuses :error))
:utils/show-popup {:title (i18n/label :t/http-gateway-error)
:content (str error)}})
(fx/defn handle-acquisition
{:events [::handle-acquisition]}
[{:keys [db] :as cofx} {:keys [message on-success method url]}]
(let [msg (types/clj->json message)
network (ethereum/chain-keyword db)]
{:db (assoc-in db [:acquisition :network-status]
(get network-statuses :initiated))
::json-rpc/call [{:method "wakuext_signMessageWithChatKey"
:params [msg]
:on-error #(re-frame/dispatch [::on-error (i18n/label :t/sign-request-failed)])
:on-success #(re-frame/dispatch [::call-acquisition-gateway
{:chat-key (get-in db [:multiaccount :public-key])
:message msg
:method method
:url (get-url network url)
:on-success on-success} %])}]}))
(fx/defn call-acquisition-gateway
{:events [::call-acquisition-gateway]}
[{:keys [db]}
{:keys [chat-key message on-success type url method]}
sig]
(let [payload {:chat_key chat-key
:msg message
:sig sig
:version 2}]
{:db (assoc-in db [:acquisition :network-status]
(get network-statuses :in-flight))
:http-post {:url url
:opts {:headers {"Content-Type" "application/json"}
:method method}
:data (types/clj->json payload)
:on-success (fn [response]
(re-frame/dispatch [:set-in [:acquisition :network-status]]
(get network-statuses :success))
(re-frame/dispatch (conj on-success (types/json->clj (get response :response-body)))))
:on-error (fn [error]
(re-frame/dispatch [::on-error (:error (types/json->clj (get error :response-body)))]))}}))
(fx/defn get-referrer
[{:keys [db]} referrer on-success handled-error handle-error]
(let [network (ethereum/chain-keyword db)]
{:http-get {:url (get-url network [:clicks referrer])
:on-success (fn [response]
(re-frame/dispatch (on-success (types/json->clj response))))
:on-error (fn [response]
(let [error (types/json->clj response)]
(if (handled-error error)
(handle-error error)
(re-frame/dispatch [::on-error (:error error)]))))}}))
(re-frame/reg-sub
::network-status
(fn [db]
(get-in db [:acquisition :network-status])))
@@ -0,0 +1,14 @@
(ns status-im.acquisition.install-referrer
(:require [taoensso.timbre :as log]
["react-native-device-info" :refer [getInstallReferrer]]
[status-im.utils.http :as http]))
(defn parse-referrer
"Google return query params for referral with all utm tags"
[referrer]
(-> referrer http/query->map (get "referrer")))
(defn get-referrer [cb]
(-> (getInstallReferrer)
(.then cb)
(.catch #(log/error "[install-referrer]" %))))
@@ -0,0 +1,33 @@
(ns status-im.acquisition.notifications
(:require [re-frame.core :as re-frame]
[status-im.notifications.android :as pn-android]
[status-im.utils.fx :as fx]
[status-im.i18n.i18n :as i18n]
[status-im.notifications.core :as notifications]
[status-im.ui.components.react :as react]
[quo.platform :as platform]
[status-im.ethereum.tokens :as tokens]))
(def channel-id "status-im-referrals")
(re-frame/reg-fx
::create-channel
(fn []
(when platform/android?
(pn-android/create-channel {:channel-id channel-id
:channel-name "Status referrals push notifications"}))))
(fx/defn accept
[_]
{::notifications/local-notification
{:title (i18n/label :t/starter-pack-coming)
:message (i18n/label :t/starter-pack-coming-description)
:channel-id channel-id
:icon (:uri (react/resolve-asset-source tokens/snt-icon-source))}})
(fx/defn claimed
[_]
{::notifications/local-notification {:title (i18n/label :t/starter-pack-received)
:message (i18n/label :t/starter-pack-received-description)
:channel-id channel-id
:icon (:uri (react/resolve-asset-source tokens/snt-icon-source))}})
@@ -0,0 +1,84 @@
(ns status-im.acquisition.persistance
(:require [re-frame.core :as re-frame]
[taoensso.timbre :as log]
["@react-native-community/async-storage" :default async-storage]))
(def chat-initialized-key "acquisition-chat-initialized")
(def referrer-flow-state-key "acquisition-referrer-flow-state")
(def tx-store-key "acquisition-watch-tx")
(def referrer-key "acquisition-referrer")
(def referrer-state {:accepted "accepted"
:declined "declined"
:claimed "claimed"
:outdated "outdated"})
(re-frame/reg-fx
::set-referrer-state
(fn [decision]
(-> ^js async-storage
(.setItem referrer-flow-state-key (get referrer-state decision))
(.then (fn []
(re-frame/dispatch [:set-in [:acquisition :flow-state]
(get referrer-state decision)])))
(.catch (fn [error]
(log/error "[async-storage]" error))))))
(defn get-referrer-flow-state [on-success]
(-> ^js async-storage
(.getItem referrer-flow-state-key)
(.then (fn [^js data]
(on-success data)))
(.catch (fn [error]
(log/error "[async-storage]" error)))))
(re-frame/reg-fx
::check-tx-state
(fn [on-success]
(-> ^js async-storage
(.getItem tx-store-key)
(.then (fn [^js tx]
(on-success tx)))
(.catch (fn [error]
(log/error "[async-storage]" error))))))
(re-frame/reg-fx
::set-watch-tx
(fn [tx]
(when tx
(-> ^js async-storage
(.setItem tx-store-key tx)
(.catch (fn [error]
(log/error "[async-storage]" error)))))))
(re-frame/reg-fx
::chat-initalized!
(fn []
(-> ^js async-storage
(.setItem chat-initialized-key "initialized")
(.catch (fn [error]
(log/error "[async-storage]" error))))))
(re-frame/reg-fx
::chat-initialized?
(fn [on-success]
(-> ^js async-storage
(.getItem chat-initialized-key)
(.then (fn [^js data]
(on-success data)))
(.catch (fn [error]
(log/error "[async-storage]" error))))))
(defn set-referrer [referrer]
(-> ^js async-storage
(.setItem referrer-key referrer)
(.catch (fn [error]
(log/error "[async-storage]" error)))))
(defn get-referrer [on-success]
(-> ^js async-storage
(.getItem referrer-key)
(.then (fn [^js data]
(on-success data)))
(.catch (fn [error]
(log/error "[async-storage]" error)))))
+182
View File
@@ -0,0 +1,182 @@
(ns status-im.anon-metrics.core
(:require [taoensso.timbre :as log]
[re-frame.core :as re-frame]
[re-frame.interceptor :refer [->interceptor]]
[status-im.async-storage.core :as async-storage]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.utils.async :refer [async-periodic-exec async-periodic-stop!]]
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.utils.platform :as platform]
[status-im.utils.build :as build]
[status-im.utils.fx :as fx]
[status-im.utils.config :as config]
[status-im.anon-metrics.transformers :as txf]))
(defonce events-foyer (atom []))
(defonce periodic-tasks-chan (atom nil))
(defn onboard-events
"Check if there are any events in the foyer,
flush them to the backend and clear foyer on-success."
[]
(let [outstanding-events @events-foyer]
(when (seq outstanding-events)
(reset! events-foyer [])
(json-rpc/call
{:method "appmetrics_saveAppMetrics"
:params [outstanding-events]
:on-success #()
:on-error (fn [err]
(log/error {:error err
:events outstanding-events})
(log/warn "The logged events will be rejected"))}))))
(re-frame/reg-fx
::transfer-data
(fn [transfer?]
(if (and transfer?
;; double run safety
(not @periodic-tasks-chan))
(do
(log/info "[anon-metrics] Start collection service")
(reset! periodic-tasks-chan
;; interval = 4000 ms (run every `interval` ms)
;; timeout = 5000 ms (exit if the fn doesn't exit within `timeout` ms)
(async-periodic-exec onboard-events 4000 5000)))
(do
(log/info "[anon-metrics] Stop collection service")
(when @periodic-tasks-chan
(async-periodic-stop! @periodic-tasks-chan)
(onboard-events) ; final onboard, will save and clear any pending events
(reset! periodic-tasks-chan nil))))))
(fx/defn start-transferring
[_]
{::transfer-data true})
(fx/defn stop-transferring
[_]
{::transfer-data false})
(defn transform-and-log [context]
(let [transformed-payload (txf/transform context)
should-send? (get-in context
[:coeffects
:db
:multiaccount
:anon-metrics/should-send?]
false)]
(when (and config/metrics-enabled? ;metrics are enabled
should-send? ; user opted-in
transformed-payload); we were able to transform metrics-shape
(swap!
events-foyer
conj
{:event (-> context :coeffects :event first)
:value transformed-payload
:app_version build/version
:os platform/os}))))
(re-frame/reg-fx ::transform-and-log transform-and-log)
(defn catch-events-before [context]
(transform-and-log context)
context)
(def interceptor
(->interceptor
:id :catch-events
:before catch-events-before))
(fx/defn hoax-capture-event
"Due to usage of fx/defn with fx/merge, it might not be able to
intercept some events (like navigate-to-cofx). In cases like that,
this hoax capture event can be used in conjunction with `fx/merge`"
{:events [::hoax-capture-event]}
[_ {:keys [og-event]}]
;; re-shape event to look like a context object
{::transform-and-log {:coeffects {:event og-event}}})
(fx/defn fetch-local-metrics-success
{:events [::fetch-local-metrics-success]}
[{:keys [db]} {:keys [metrics total-count clear-existing?]}]
{:db (-> db
(as-> db
(if clear-existing?
(assoc db
:anon-metrics/events metrics
:anon-metrics/total-count total-count)
(update db :anon-metrics/events concat metrics)))
(dissoc :anon-metrics/fetching?))})
(fx/defn fetch-local-metrics
{:events [::fetch-local-metrics]}
[{:keys [db]} {:keys [limit offset clear-existing?]}]
{::json-rpc/call [{:method "appmetrics_getAppMetrics"
:params [(or limit 3) (or offset 0)]
:on-success #(re-frame/dispatch
[::fetch-local-metrics-success
{:metrics (get % :AppMetrics [])
:total-count (get % :TotalCount 0)
:clear-existing? clear-existing?}])}]
:db (assoc db :anon-metrics/fetching? true)})
(fx/defn set-opt-in-screen-displayed-flag
[{:keys [db]}]
{::async-storage/set! {:anon-metrics/opt-in-screen-displayed? true}
:db (assoc db :anon-metrics/opt-in-screen-displayed? true)})
(fx/defn set-show-thank-you
{:events [::set-show-thank-you]}
[{:keys [db]} show?]
{:db (assoc db :anon-metrics/show-thank-you? show?)})
(defn on-opt-in-success [enabled?]
(if enabled?
(do
;; animate
(re-frame/dispatch [::set-show-thank-you true])
;; and redirect after 1 second
(js/setTimeout
(fn []
(re-frame/dispatch [:navigate-reset {:index 0
:routes [{:name :tabs}]}])
(re-frame/dispatch [::set-show-thank-you false]))
1000))
(re-frame/dispatch [:navigate-reset {:index 0
:routes [{:name :tabs}]}])))
(fx/defn fetch-opt-in-displayed-success
{:events [::fetch-opt-in-displayed-success]}
[{:keys [db]} [k v]]
{:db (assoc db k v)})
(fx/defn fetch-opt-in-screen-displayed?
{:events [::fetch-opt-in-screen-displayed?]}
[cofx]
{::async-storage/get
{:keys [:anon-metrics/opt-in-screen-displayed?]
:cb #(re-frame/dispatch [::fetch-opt-in-displayed-success (first %)])}})
(fx/defn opt-in
{:events [::opt-in]}
[cofx enabled?]
(fx/merge cofx
(set-opt-in-screen-displayed-flag)
(if enabled?
(start-transferring)
(stop-transferring))
(multiaccounts.update/multiaccount-update
:anon-metrics/should-send? enabled?
{:on-success #(on-opt-in-success enabled?)})))
(comment
;; read the database
(def events-in-db (atom nil))
(->> events-in-db
deref
(take-last 5))
(json-rpc/call {:method "appmetrics_getAppMetrics"
:params [1000 0] ; limit, offset
:on-success #(reset! events-in-db %)}))
@@ -0,0 +1,24 @@
(ns status-im.anon-metrics.transformers)
(defn navigate-to-txf [context]
(let [event (-> context :coeffects :event)]
{:view_id (second event)
:params {:screen (get-in event [1 :screen] "")}}))
(defn screens-on-will-focus-txf [context]
(let [view-id (-> context :coeffects :event second)]
;; we need this check because in some cases, :screens/on-will-focus is dispatched
;; after navigate to this check ensures that only the events that are not handled
;; via navigate to are captured hence avoiding duplicates
(when (#{:chat :empty-tab :wallet :status :my-profile} view-id)
{:view_id view-id
:params {:screen ""}})))
(def value-transformations
{:navigate-to navigate-to-txf
:screens/on-will-focus screens-on-will-focus-txf})
(defn transform [ctx]
(when-let [txf (-> ctx :coeffects :event first value-transformations)]
(txf ctx)))
+2
View File
@@ -152,6 +152,8 @@
(def ^:const one-week (* one-day 7))
(def ^:const one-month (* one-day 31))
(def ^:const metrics-github-link
"https://github.com/status-im/status-go/blob/develop/_docs/app-metrics.md")
(def ^:const privacy-policy-link "https://status.im/privacy-policy/")
(def ^:const terms-of-service-link "https://status.im/terms-of-use")
(def ^:const docs-link "https://status.im/docs/")
-4
View File
@@ -16,7 +16,6 @@
[status-im.utils.universal-links.core :as utils.universal-links]
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.react :as react]
[status-im.async-storage.core :as async-storage]
["react-native" :refer (DevSettings LogBox)]
["react-native-languages" :default react-native-languages]
["react-native-shake" :as react-native-shake]))
@@ -40,9 +39,6 @@
(utils.universal-links/initialize)
(when config/quo-preview-enabled?
(async-storage/get-item :new-ui-enabled? #(reset! config/new-ui-enabled? %)))
;;DEV
(snoopy/subscribe!)
(when (and js/goog.DEBUG platform/ios? DevSettings)
+4 -1
View File
@@ -15,7 +15,10 @@
:mainnet "0x12824271339304d3a9f7e096e62a2a7e73b4a7e7"}
:status/sticker-pack
{:testnet "0xf852198d0385c4b871e0b91804ecd47c6ba97351"
:mainnet "0x110101156e8F0743948B2A61aFcf3994A8Fb172e"}})
:mainnet "0x110101156e8F0743948B2A61aFcf3994A8Fb172e"}
:status/acquisition
{:rinkeby "statusreferrals.eth"
:mainnet "statusreferrals.eth"}})
(defn get-address
[db contract]
+3 -1
View File
@@ -2,6 +2,7 @@
(:require clojure.set
[re-frame.core :as re-frame]
status-im.add-new.core
[status-im.anon-metrics.core :as anon-metrics]
[status-im.async-storage.core :as async-storage]
status-im.backup.core
status-im.bootnodes.core
@@ -237,7 +238,8 @@
(chat/preload-chat-data cofx constants/timeline-chat-id)))
(fx/defn on-will-focus
{:events [:screens/on-will-focus]}
{:events [:screens/on-will-focus]
:interceptors [anon-metrics/interceptor]}
[{:keys [db] :as cofx} view-id]
(fx/merge cofx
(cond
+1 -2
View File
@@ -6,7 +6,7 @@
(def default-device-language
(keyword (.-language react-native-languages)))
(def languages #{:ar :bn :de :el :en :es :es_419 :es_AR :fil :fr :hi :id :in :it :ja :ko :ms :nl :pl :pt :pt_BR :ru :tr :vi :zh :zh_Hant :zh_TW})
(def languages #{:ar :bn :de :el :en :es :es_419 :es_AR :fil :fr :id :in :it :ja :ko :ms :nl :pl :pt :pt_BR :ru :tr :vi :zh :zh_Hant :zh_TW})
(defonce loaded-languages
(atom
@@ -36,7 +36,6 @@
:es_AR (js/require "../translations/es_AR.json")
:fil (js/require "../translations/fil.json")
:fr (js/require "../translations/fr.json")
:hi (js/require "../translations/hi.json")
:id (js/require "../translations/id.json")
:in (js/require "../translations/id.json")
:it (js/require "../translations/it.json")
+3 -1
View File
@@ -2,6 +2,7 @@
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.multiaccounts.login.core :as multiaccounts.login]
[status-im.anon-metrics.core :as anon-metrics]
[status-im.native-module.core :as status]
[status-im.network.net-info :as network]
[status-im.db :refer [app-db]]
@@ -57,7 +58,8 @@
(assoc :multiaccounts/logout? logout?)
(assoc :multiaccounts/loading false))
:dispatch-n [[::initialize-view]
[:get-opted-in-to-new-terms-of-service]]})))
[:get-opted-in-to-new-terms-of-service]
[::anon-metrics/fetch-opt-in-screen-displayed?]]})))
(fx/defn start-app
{:events [:init/app-started]}
+24 -12
View File
@@ -94,25 +94,37 @@
(common/set-on-card-connected :keycard/sign-typed-data)
{:db (assoc-in db [:signing/sign :keycard-step] :signing)}))))
(fx/defn fetch-currency-token-on-success
{:events [:keycard/fetch-currency-token-on-success]}
[{:keys [db]} {:keys [decimals symbol]}]
{:db (-> db
(assoc-in [:signing/sign :formatted-data :message :formatted-currency] symbol)
(update-in [:signing/sign :formatted-data :message]
#(assoc % :formatted-amount (.dividedBy ^js (money/bignumber (:amount %))
(money/bignumber (money/from-decimal decimals))))))})
(fx/defn fetch-currency-symbol-on-success
{:events [:keycard/fetch-currency-symbol-on-success]}
[{:keys [db] :as cofx} currency]
{:db (assoc-in db [:signing/sign :formatted-data :message :formatted-currency] currency)})
(fx/defn fetch-currency-decimals-on-success
{:events [:keycard/fetch-currency-decimals-on-success]}
[{:keys [db] :as cofx} decimals]
{:db (update-in db [:signing/sign :formatted-data :message]
#(assoc % :formatted-amount (.dividedBy ^js (money/bignumber (:amount %))
(money/bignumber (money/from-decimal decimals)))))})
(fx/defn store-hash-and-sign-typed
{:events [:keycard/store-hash-and-sign-typed]}
[{:keys [db] :as cofx} result]
(let [{:keys [result]} (types/json->clj result)
(let [{:keys [result error]} (types/json->clj result)
message (get-in db [:signing/sign :formatted-data :message])
currency-contract (:currency message)]
(when currency-contract
{::json-rpc/call [{:method "wallet_discoverToken"
:params [(ethereum/chain-id db) currency-contract]
:on-success #(re-frame/dispatch [:keycard/fetch-currency-token-on-success %])}]})
(json-rpc/eth-call {:contract currency-contract
:method "decimals()"
:outputs ["uint8"]
:on-success (fn [[decimals]]
(re-frame/dispatch [:keycard/fetch-currency-decimals-on-success decimals]))})
(json-rpc/eth-call {:contract currency-contract
:method "symbol()"
:outputs ["string"]
:on-success (fn [[currency]]
(re-frame/dispatch [:keycard/fetch-currency-symbol-on-success currency]))}))
(fx/merge cofx
{:db (assoc-in db [:keycard :hash] result)}
sign-typed-data)))
+12
View File
@@ -3,6 +3,7 @@
[status-im.ethereum.stateofus :as stateofus]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.bottom-sheet.core :as bottom-sheet]
[status-im.anon-metrics.core :as anon-metrics]
[status-im.native-module.core :as native-module]
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.utils.fx :as fx]
@@ -149,6 +150,17 @@
:default-sync-period value
{}))
(fx/defn switch-share-anonymous-usage-data
{:events [:multiaccounts.ui/share-anonymous-usage-data-switched]}
[cofx opted-in?]
(fx/merge cofx
(multiaccounts.update/multiaccount-update
:anon-metrics/should-send? (boolean opted-in?)
{})
(if opted-in?
(anon-metrics/start-transferring)
(anon-metrics/stop-transferring))))
(fx/defn switch-preview-privacy-mode-flag
[{:keys [db]}]
(let [private? (get-in db [:multiaccount :preview-privacy?])]
+32 -17
View File
@@ -1,5 +1,6 @@
(ns status-im.multiaccounts.login.core
(:require [re-frame.core :as re-frame]
[status-im.anon-metrics.core :as anon-metrics]
[status-im.contact.core :as contact]
[status-im.utils.config :as config]
[status-im.data-store.settings :as data-store.settings]
@@ -26,6 +27,7 @@
[status-im.utils.utils :as utils]
[status-im.wallet.core :as wallet]
[status-im.wallet.prices :as prices]
[status-im.acquisition.core :as acquisition]
[taoensso.timbre :as log]
[status-im.data-store.invitations :as data-store.invitations]
[status-im.chat.models.link-preview :as link-preview]
@@ -390,6 +392,7 @@
{:on-success
#(do (re-frame/dispatch [:chats-list/load-success %])
(re-frame/dispatch [::get-chats-callback]))})
(acquisition/login)
(initialize-appearance)
(initialize-communities-enabled)
(initialize-wallet-connect)
@@ -416,17 +419,6 @@
[{:keys [db]}]
{::open-last-chat (get-in db [:multiaccount :key-uid])})
(fx/defn update-wallet-accounts
[{:keys [db]} accounts]
(let [existing-accounts (into {} (map #(vector (:address %1) %1) (:multiaccount/accounts db)))
reduce-fn (fn [existing-accs new-acc]
(let [address (:address new-acc)]
(if (:removed new-acc)
(dissoc existing-accs address)
(assoc existing-accs address new-acc))))
new-accounts (reduce reduce-fn existing-accounts (rpc->accounts accounts))]
{:db (assoc db :multiaccount/accounts (vals new-accounts))}))
(fx/defn get-chats-callback
{:events [::get-chats-callback]}
[{:keys [db] :as cofx}]
@@ -471,9 +463,22 @@
(defn redirect-to-root
"Decides which root should be initialised depending on user and app state"
[db]
(if (get db :tos/accepted?)
(re-frame/dispatch [:init-root (if @config/new-ui-enabled? :home-stack :chat-stack)])
(re-frame/dispatch [:init-root :tos])))
(let [tos-accepted? (get db :tos/accepted?)
metrics-opt-in-screen-displayed? (get db :anon-metrics/opt-in-screen-displayed?)]
;; There is a race condition to show metrics opt-in and
;; tos opt-in. Tos is more important and is displayed first.
;; Metrics opt-in is diplayed the next time the user logs in
(cond
(not tos-accepted?)
(re-frame/dispatch [:init-root :tos])
;; TODO <shivekkhurana>: This needs work post new navigation
(and tos-accepted?
(not metrics-opt-in-screen-displayed?)
config/metrics-enabled?)
(navigation/navigate-to :anon-metrics-opt-in {})
:else (re-frame/dispatch [:init-root :chat-stack]))))
(fx/defn login-only-events
[{:keys [db] :as cofx} key-uid password save-password?]
@@ -555,7 +560,8 @@
recovered-account?
(keycard-setup? cofx)))
from-migration? (get-in db [:keycard :from-key-storage-and-migration?])
nodes nil]
nodes nil
should-send-metrics? (get-in db [:multiaccount :anon-metrics/should-send?])]
(log/debug "[multiaccount] multiaccount-login-success"
"login-only?" login-only?
"recovered-account?" recovered-account?)
@@ -564,6 +570,9 @@
::json-rpc/call
[{:method "web3_clientVersion"
:on-success #(re-frame/dispatch [::initialize-web3-client-version %])}]}
;; Start tasks to save usage data locally
(when should-send-metrics?
(anon-metrics/start-transferring))
;;FIXME
(when nodes
(fleet/set-nodes :eth.contract nodes))
@@ -702,8 +711,14 @@
(fx/defn welcome-lets-go
{:events [:welcome-lets-go]}
[_]
{:init-root-fx :chat-stack})
[cofx]
(let [first-account? (get-in cofx [:db :multiaccount :multiaccounts/first-account])]
(fx/merge cofx
{:init-root-fx :chat-stack}
(when first-account?
(acquisition/create))
(when config/metrics-enabled?
{:dispatch [:navigate-to :anon-metrics-opt-in]}))))
(fx/defn multiaccount-selected
{:events [:multiaccounts.login.ui/multiaccount-selected]}
+5 -1
View File
@@ -1,5 +1,6 @@
(ns status-im.multiaccounts.logout.core
(:require [re-frame.core :as re-frame]
[status-im.anon-metrics.core :as anon-metrics]
[status-im.i18n.i18n :as i18n]
[status-im.init.core :as init]
[status-im.native-module.core :as status]
@@ -12,7 +13,8 @@
(fx/defn logout-method
{:events [::logout-method]}
[{:keys [db] :as cofx} {:keys [auth-method logout?]}]
(let [key-uid (get-in db [:multiaccount :key-uid])]
(let [key-uid (get-in db [:multiaccount :key-uid])
should-send-metrics? (get-in db [:multiaccount :anon-metrics/should-send?])]
(fx/merge cofx
{:init-root-fx :progress
:hide-popover nil
@@ -20,6 +22,8 @@
::multiaccounts/webview-debug-changed false
:keychain/clear-user-password key-uid
::init/open-multiaccounts #(re-frame/dispatch [::init/initialize-multiaccounts % {:logout? logout?}])}
(when should-send-metrics?
(anon-metrics/stop-transferring))
(keychain/save-auth-method key-uid auth-method)
(wallet/clear-timeouts)
(init/initialize-app-db))))
@@ -1,7 +0,0 @@
(ns status-im.native-module.core-test
(:require [cljs.test :refer [deftest is testing]]
[status-im.native-module.core :as status]))
(deftest identicon-test
(testing "check if identicon test works"
(is (= "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAjklEQVR4nOzXsQmAMBQGYRV3cUAdQwd0Gm2sJIWSBI6f+0oR8XjwSKYhhCE0htAYQmMITUzI/PXF49yv0vN12cYWP1L7/ZiJGEJjCE31xvm7bXptv5iJGEJjCE31WasVz1oPQ2gMoWlyuyvpfaN8i5mIITSG0BhCYwiNIeokZiKG0BhCYwiNITR3AAAA//+A3RtWaKqXgQAAAABJRU5ErkJggg==" (status/identicon "a")))))
+7 -3
View File
@@ -1,5 +1,6 @@
(ns status-im.navigation
(:require [status-im.utils.fx :as fx]))
(:require [status-im.anon-metrics.core :as anon-metrics]
[status-im.utils.fx :as fx]))
(defn- all-screens-params [db view screen-params]
(cond-> db
@@ -14,7 +15,9 @@
{:db
(-> (assoc db :view-id go-to-view-id)
(all-screens-params go-to-view-id screen-params))
:navigate-to-fx go-to-view-id})
:navigate-to-fx go-to-view-id
;; simulate a navigate-to event so it can be captured be anon-metrics
::anon-metrics/transform-and-log {:coeffects {:event [:navigate-to go-to-view-id screen-params]}}})
(fx/defn navigate-to
{:events [:navigate-to]}
@@ -42,7 +45,8 @@
{:change-tab-fx tab})
(fx/defn navigate-replace
{:events [:navigate-replace]}
{:events [:navigate-replace]
:interceptors [anon-metrics/interceptor]}
[{:keys [db]} go-to-view-id screen-params]
(let [db (cond-> (assoc db :view-id go-to-view-id)
(seq screen-params)
+115 -118
View File
@@ -2,8 +2,7 @@
(:require [quo.design-system.colors :as colors]
[status-im.utils.platform :as platform]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.screens.views :as views]
[status-im.navigation2.roots :as nav2-roots]))
[status-im.ui.screens.views :as views]))
(defn status-bar-options []
(if platform/android?
@@ -66,128 +65,126 @@
;;TODO problem here is that we have two places for screens, here and in screens ns, and we have handler in navigate
(defn roots []
;;TABS
(merge
{:chat-stack
{:root
{:bottomTabs
{:id :tabs-stack
:options (merge (default-root)
{:bottomTabs {:titleDisplayMode :alwaysHide
:tabsAttachMode :onSwitchToTab
:backgroundColor colors/white}})
:children [;CHAT STACK
{:stack {:id :chat-stack
:children [{:component {:name :home
:id :home
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/message :home-tab-button)}}}
;BROWSER STACK
{:stack {:id :browser-stack
:children [{:component {:name :empty-tab
:id :empty-tab
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
{:chat-stack
{:root
{:bottomTabs
{:id :tabs-stack
:options (merge (default-root)
{:bottomTabs {:titleDisplayMode :alwaysHide
:tabsAttachMode :onSwitchToTab
:backgroundColor colors/white}})
:children [;CHAT STACK
{:stack {:id :chat-stack
:children [{:component {:name :home
:id :home
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/message :home-tab-button)}}}
;BROWSER STACK
{:stack {:id :browser-stack
:children [{:component {:name :empty-tab
:id :empty-tab
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/browser :dapp-tab-button)}}}
;WALLET STACK
{:stack {:id :wallet-stack
:children [{:component {:name :wallet
:id :wallet
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/wallet :wallet-tab-button)}}}
;STATUS STACK
{:stack {:id :status-stack
:children [{:component {:name :status
:id :status
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/status :status-tab-button)}}}
;PROFILE STACK
{:stack {:id :profile-stack
:children [{:component {:name :my-profile
:id :my-profile
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/user-profile :profile-tab-button)}}}]}}}
:options {:bottomTab (bottom-tab-general :main-icons/browser :dapp-tab-button)}}}
;WALLET STACK
{:stack {:id :wallet-stack
:children [{:component {:name :wallet
:id :wallet
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/wallet :wallet-tab-button)}}}
;STATUS STACK
{:stack {:id :status-stack
:children [{:component {:name :status
:id :status
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/status :status-tab-button)}}}
;PROFILE STACK
{:stack {:id :profile-stack
:children [{:component {:name :my-profile
:id :my-profile
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/user-profile :profile-tab-button)}}}]}}}
;;INTRO (onboarding carousel)
:intro
{:root {:stack {:children [{:component {:name :intro
:id :intro
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;INTRO (onboarding carousel)
:intro
{:root {:stack {:children [{:component {:name :intro
:id :intro
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;; ONBOARDING
:onboarding
{:root {:stack {:id :onboarding
:children [{:component {:name :get-your-keys
:id :get-your-keys
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :elevation 0 :noBorder true :animate false)})}}}
;; ONBOARDING
:onboarding
{:root {:stack {:id :onboarding
:children [{:component {:name :get-your-keys
:id :get-your-keys
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :elevation 0 :noBorder true :animate false)})}}}
;;PROGRESS
:progress
{:root {:stack {:children [{:component {:name :progress
:id :progress
:options (status-bar-options)}}]
:options (merge (default-root)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;PROGRESS
:progress
{:root {:stack {:children [{:component {:name :progress
:id :progress
:options (status-bar-options)}}]
:options (merge (default-root)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;LOGIN
:multiaccounts
{:root {:stack {:id :multiaccounts-stack
:children [{:component {:name :multiaccounts
:id :multiaccounts
:options (get-screen-options :multiaccounts)}}
{:component {:name :login
:id :login
:options (get-screen-options :login)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (topbar-options)})}}}
;;LOGIN
:multiaccounts
{:root {:stack {:id :multiaccounts-stack
:children [{:component {:name :multiaccounts
:id :multiaccounts
:options (get-screen-options :multiaccounts)}}
{:component {:name :login
:id :login
:options (get-screen-options :login)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (topbar-options)})}}}
:multiaccounts-keycard
{:root {:stack {:id :multiaccounts-stack
:children [{:component {:name :multiaccounts
:id :multiaccounts
:options (get-screen-options :multiaccounts)}}
{:component {:name :keycard-login-pin
:id :keycard-login-pin
:options (get-screen-options :keycard-login-pin)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (topbar-options)})}}}
:multiaccounts-keycard
{:root {:stack {:id :multiaccounts-stack
:children [{:component {:name :multiaccounts
:id :multiaccounts
:options (get-screen-options :multiaccounts)}}
{:component {:name :keycard-login-pin
:id :keycard-login-pin
:options (get-screen-options :keycard-login-pin)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (topbar-options)})}}}
;;WELCOME
:welcome
{:root {:stack {:children [{:component {:name :welcome
:id :welcome
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;WELCOME
:welcome
{:root {:stack {:children [{:component {:name :welcome
:id :welcome
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;NOTIFICATIONS
:onboarding-notification
{:root {:stack {:children [{:component {:name :onboarding-notification
:id :onboarding-notification
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;NOTIFICATIONS
:onboarding-notification
{:root {:stack {:children [{:component {:name :onboarding-notification
:id :onboarding-notification
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;; TERMS OF SERVICE
:tos
{:root {:stack {:children [{:component {:name :force-accept-tos
:id :force-accept-tos
:options (get-screen-options :force-accept-tos)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}}
(nav2-roots/roots)))
;; TERMS OF SERVICE
:tos
{:root {:stack {:children [{:component {:name :force-accept-tos
:id :force-accept-tos
:options (get-screen-options :force-accept-tos)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}})
+2 -13
View File
@@ -1,20 +1,9 @@
(ns status-im.navigation2
(:require [status-im.utils.fx :as fx]
[status-im.reloader :as reloader]
[status-im.utils.config :as config]
[status-im.utils.datetime :as datetime]
[status-im.async-storage.core :as async-storage]))
[status-im.utils.datetime :as datetime]))
(def parent-stack (atom :home-stack))
(fx/defn toggle-new-ui
{:events [:toggle-new-ui]}
[_]
(swap! config/new-ui-enabled? not)
(reloader/reload)
{:dispatch [:init-root (if @config/new-ui-enabled? :home-stack :chat-stack)]
::async-storage/set! {:new-ui-enabled? @config/new-ui-enabled?}})
(fx/defn init-root-nav2
{:events [:init-root-nav2]}
[_ root-id]
@@ -49,7 +38,7 @@
[{:keys [db] :as cofx} go-to-view-id id screen-params from-switcher?]
(let [view-id (:view-id db)
stacks (:navigation2/navigation2-stacks db)
from-home? (= view-id :chat-stack)]
from-home? (= view-id :home-stack)]
(if from-switcher?
(navigate-from-switcher go-to-view-id id db from-home?)
(if from-home?
+2 -2
View File
@@ -11,8 +11,8 @@
:wallet 2
:browser 3})
;; (defonce set-navigation-default-options
;; (.setDefaultOptions Navigation (clj->js {:options {:topBar {:visible false}}})))
(defonce set-navigation-default-options
(.setDefaultOptions Navigation (clj->js {:options {:topBar {:visible false}}})))
;; TODO (parvesh) - improve open-modal and close-modal
(defn open-modal [comp]
+2 -4
View File
@@ -4,8 +4,7 @@
[status-im.switcher.switcher :as switcher]
[status-im.ui.screens.home.views :as home]
[status-im.switcher.constants :as switcher-constants]
[status-im.ui.screens.profile.user.views :as profile.user]
;; [status-im.ui.screens.browser.empty-tab.views :as empty-tab]
[status-im.ui.screens.browser.empty-tab.views :as empty-tab]
[status-im.ui.screens.wallet.accounts.views :as wallet.accounts]
[status-im.switcher.bottom-tabs :as bottom-tabs]))
@@ -19,8 +18,7 @@
:chats-stack [home/home]
:communities-stack [quo2.preview/main-screen]
:wallet-stack [wallet.accounts/accounts-overview]
;;:browser-stack [empty-tab/empty-tab])]))
:browser-stack [profile.user/my-profile])]))
:browser-stack [empty-tab/empty-tab])]))
(defn home []
[:<>
+2 -2
View File
@@ -4,6 +4,6 @@
{:home-stack
{:root
{:stack {:id :home-stack
:children [{:component {:name :chat-stack
:id :chat-stack
:children [{:component {:name :home-stack
:id :home-stack
:options {:topBar {:visible false}}}}]}}}})
+2 -10
View File
@@ -1,14 +1,6 @@
(ns status-im.navigation2.screens
(:require [status-im.ui.screens.chat.views :as chat]
[status-im.navigation2.home-stack :as home-stack]
[status-im.navigation2.stack-with-switcher :as stack-with-switcher]))
(:require [status-im.navigation2.home-stack :as home-stack]))
;; We have to use the home screen name :chat-stack for now, for compatibility with navigation.cljs
(def screens [{:name :chat-stack ;; TODO(parvesh) - rename to home-stack
(def screens [{:name :home-stack
:insets {:top false}
:component home-stack/home}])
;; These screens will overwrite navigation/screens.cljs screens on enabling new UI toggle
(def screen-overwrites
[{:name :chat
:component #(stack-with-switcher/overlap-stack chat/chat :chat)}])
@@ -0,0 +1,50 @@
(ns status-im.notifications.android-remote
(:require #?@(:google-free []
:cljs [[re-frame.core :as re-frame]
[taoensso.timbre :as log]
[status-im.notifications.android :as pn-android]
["react-native-notifications" :refer (Notifications)]])))
#?(:google-free
[(defn register-remote-notifications [] nil)
(defn unregister-remote-notifications [] nil)]
:cljs
[(defonce remote-notifications? (atom false))
(defn remote-notifications-registered-listener []
(.registerRemoteNotificationsRegistered
(.events Notifications)
(fn [^js evn]
(let [token (.-deviceToken evn)]
(when @remote-notifications?
(re-frame/dispatch [:notifications/registered-for-push-notifications token]))))))
(defn remote-notifications-registration-failed-listener []
(.registerRemoteNotificationsRegistrationFailed
(.events Notifications)
(fn [^js err]
(log/info "Remote notifications registration failed" err)
(reset! @remote-notifications? false)
(re-frame/dispatch [:notifications/switch-error true err]))))
(defn notification-opened-listener []
(.registerNotificationOpened
(.events Notifications)
(fn [^js _ cb _]
(when @remote-notifications?
(pn-android/clear-all-message-notifications))
(^js cb))))
(defn register-remote-notifications []
(reset! remote-notifications? true)
;; event listeners registeration
(remote-notifications-registered-listener)
(remote-notifications-registration-failed-listener)
(notification-opened-listener)
;; Register for remote notifications
(.registerRemoteNotifications Notifications))
(defn unregister-remote-notifications []
(reset! remote-notifications? false)
(re-frame/dispatch [:notifications/unregistered-from-push-notifications]))])
+26 -13
View File
@@ -8,7 +8,8 @@
[status-im.notifications.local :as local]
[quo.platform :as platform]
[status-im.utils.config :as config]
[status-im.ethereum.json-rpc :as json-rpc]))
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.notifications.android-remote :as pn-android-remote]))
(def server-type-default 1)
(def server-type-custom 2)
@@ -45,14 +46,22 @@
(.abandonPermissions ^js pn-ios)
(re-frame/dispatch [:notifications/unregistered-from-push-notifications]))
(defn enable-android-notifications []
(pn-android/create-channel
{:channel-id "status-im-notifications"
:channel-name "Status push notifications"})
(pn-android/enable-notifications))
(defn enable-android-notifications [remote-push-notifications-enabled?]
(if (and remote-push-notifications-enabled? (not config/google-free))
(do
(pn-android/disable-notifications)
(pn-android/clear-all-message-notifications)
(pn-android-remote/register-remote-notifications))
(do
(pn-android-remote/unregister-remote-notifications)
(pn-android/create-channel
{:channel-id "status-im-notifications"
:channel-name "Status push notifications"})
(pn-android/enable-notifications))))
(defn disable-android-notifications []
(pn-android/disable-notifications))
(pn-android/disable-notifications)
(pn-android-remote/unregister-remote-notifications))
;; FIXME: Repalce with request permission from audio messages PR lib
(re-frame/reg-fx
@@ -73,9 +82,10 @@
(re-frame/reg-fx
::enable
(fn []
(fn [remote-push-notifications-enabled?]
(if platform/android?
(enable-android-notifications)
(enable-android-notifications
remote-push-notifications-enabled?)
(enable-ios-notifications))))
(re-frame/reg-fx
@@ -92,13 +102,16 @@
(pn-android/disable-notifications)
(.abandonPermissions ^js pn-ios))))
(defn clear-all-message-notifications []
(if platform/android?
(pn-android/clear-all-message-notifications)
(.removeAllDeliveredNotifications ^js pn-ios)))
(re-frame/reg-fx
:clear-message-notifications
(fn [[chat-ids] remote-push-notifications-enabled?]
(fn [[chat-ids remote-push-notifications-enabled?]]
(if remote-push-notifications-enabled?
(if platform/android?
(pn-android/clear-all-message-notifications)
(.removeAllDeliveredNotifications ^js pn-ios))
(clear-all-message-notifications)
(when platform/android?
(doseq [chat-id chat-ids]
(pn-android/clear-message-notifications chat-id))))))
+9 -1
View File
@@ -52,7 +52,8 @@
"g/" group-chat-extractor
["wallet/" :account] :wallet-account
["u/" :user-id] :user
["user/" :user-id] :user}
["user/" :user-id] :user
["referral/" :referrer] :referrals}
ethereum-scheme eip-extractor}])
(defn parse-query-params
@@ -174,6 +175,10 @@
(defn address->eip681 [address]
(match-eip681 (str ethereum-scheme address)))
(defn match-referral [{:keys [referrer]}]
{:type :referrals
:referrer referrer})
(defn match-wallet-account [{:keys [account]}]
{:type :wallet-account
:account (when account (string/lower-case account))})
@@ -212,6 +217,9 @@
(= handler :community-chat)
(cb {:type handler :chat-id (:chat-id route-params)})
(= handler :referrals)
(cb (match-referral route-params))
(= handler :wallet-account)
(cb (match-wallet-account route-params))
+12 -2
View File
@@ -236,6 +236,8 @@
(reg-root-key-sub :push-notifications/servers :push-notifications/servers)
(reg-root-key-sub :push-notifications/preferences :push-notifications/preferences)
(reg-root-key-sub :acquisition :acquisition)
(reg-root-key-sub :buy-crypto/on-ramps :buy-crypto/on-ramps)
;; communities
@@ -251,6 +253,15 @@
(reg-root-key-sub :activity.center/notifications :activity.center/notifications)
(reg-root-key-sub :activity.center/notifications-count :activity.center/notifications-count)
;; anon. metrics
(reg-root-key-sub :anon-metrics/opt-in-screen-displayed? :anon-metrics/opt-in-screen-displayed?)
(reg-root-key-sub :anon-metrics/show-thank-you? :anon-metrics/show-thank-you?)
(reg-root-key-sub :anon-metrics/events :anon-metrics/events)
(reg-root-key-sub :anon-metrics/total-count :anon-metrics/total-count)
(reg-root-key-sub :anon-metrics/fetching? :anon-metrics/fetching?)
(reg-root-key-sub :anon-metrics/data-visible? :anon-metrics/data-visible?)
(reg-root-key-sub :anon-metrics/learn-more-visible? :anon-metrics/learn-more-visible?)
(reg-root-key-sub :bug-report/description-error :bug-report/description-error)
(reg-root-key-sub :bug-report/details :bug-report/details)
@@ -1538,8 +1549,7 @@
:<- [:view-id]
:<- [:home-items-show-number]
(fn [[search-filter filtered-chats communities view-id home-items-show-number]]
(if (or (= view-id :home)
(and config/new-ui-enabled? (= view-id :chat-stack)))
(if (= view-id :home)
(let [communities-count (count communities)
chats-count (count filtered-chats)
;; If we have both communities & chats we want to display
+1 -1
View File
@@ -31,7 +31,7 @@
:justify-content :space-around
:height (constants/bottom-tabs-height)
:position :absolute
:bottom -1
:bottom 0
:right 0
:left 0
:opacity animation/bottom-tabs-opacity
@@ -19,7 +19,6 @@
[status-im.utils.types :as types]
[status-im.constants :as constants]
[status-im.multiaccounts.model :as multiaccounts.model]
[status-im.multiaccounts.login.core :as multiaccounts.login]
[status-im.notifications-center.core :as notifications-center]
[status-im.visibility-status-updates.core :as models.visibility-status-updates]
[status-im.browser.core :as browser]
@@ -52,7 +51,6 @@
^js settings (.-settings response-js)
^js cleared-histories (.-clearedHistories response-js)
^js identity-images (.-identityImages response-js)
^js accounts (.-accounts response-js)
sync-handler (when-not process-async process-response)]
(cond
@@ -161,13 +159,6 @@
(models.visibility-status-updates/handle-visibility-status-updates
visibility-status-updates-clj)))
(seq accounts)
(do
(js-delete response-js "accounts")
(fx/merge cofx
(process-next response-js sync-handler)
(multiaccounts.login/update-wallet-accounts (types/js->clj accounts))))
(seq settings)
(do
(js-delete response-js "settings")
@@ -0,0 +1,19 @@
(ns status-im.ui.components.invite.advertiser
(:require [status-im.ui.components.invite.modal :as modal]
[re-frame.core :as re-frame]
[status-im.i18n.i18n :as i18n]
[status-im.acquisition.core :as acquisition]
[status-im.acquisition.advertiser :as advertiser]))
(defn accept-popover []
(let [{:keys [rewardable]} @(re-frame/subscribe [::acquisition/metadata])]
[modal/popover {:on-accept #(re-frame/dispatch [::advertiser/decision :accept])
:on-decline #(re-frame/dispatch [::advertiser/decision :decline])
:has-reward rewardable
:accept-label (i18n/label :t/advertiser-starter-pack-accept)
:title (if rewardable
(i18n/label :t/advertiser-starter-pack-title)
(i18n/label :t/advertiser-title))
:description (if rewardable
(i18n/label :t/advertiser-starter-pack-description)
(i18n/label :t/advertiser-description))}]))
@@ -0,0 +1,126 @@
(ns status-im.ui.components.invite.chat
(:require [clojure.string :as cstr]
[quo.design-system.colors :as colors]
[quo.design-system.spacing :as spacing]
[quo.react-native :as rn]
[re-frame.core :as re-frame]
[status-im.ui.components.invite.utils :as utils]
[quo.core :as quo]
[status-im.acquisition.chat :as acquisition]
[status-im.ui.components.invite.events :as invite]
[status-im.i18n.i18n :as i18n]
[status-im.acquisition.gateway :as gateway]
[status-im.ui.components.invite.style :as styles]))
(defn messages-wrapper []
(:small spacing/padding-vertical))
(defn message-wrapper []
{:padding-right 96
:padding-left 8
:flex-direction :row})
(defn message-view []
{:border-top-left-radius 16
:border-top-right-radius 16
:border-bottom-right-radius 16
:border-radius 8
:border-bottom-left-radius 4
:border-width 1
:margin-bottom 4
:border-color (:border-01 @colors/theme)})
(defn message-text []
(merge (:small spacing/padding-horizontal)
{:padding-vertical 6}))
(defn author-text []
(merge (:small spacing/padding-horizontal)
{:padding-top (:tiny spacing/spacing)
:paddingbottom (:x-tiny spacing/spacing)}))
(defn button-message []
{:flex-direction :row
:justify-content :center
:align-items :center})
(defn starter-pack-style []
(merge (:small spacing/padding-horizontal)
(:small spacing/padding-vertical)
{:background-color (:interactive-02 @colors/theme)
:flex-direction :row
:border-bottom-width 1
:border-top-width 1
:border-color (:border-02 @colors/theme)}))
(defn starter-pack []
(let [pack @(re-frame/subscribe [::invite/starter-pack])
tokens (utils/transform-tokens pack)
reward-text (->> tokens
(map (comp :symbol first))
(filter (comp not nil?))
(map name)
(cstr/join ", "))]
[rn/view {:style (starter-pack-style)}
[rn/view {:style (styles/reward-tokens-icons (count tokens))}
(doall
(for [[{name :name
{source :source} :icon} _ idx] tokens]
^{:key name}
[rn/view {:style (styles/reward-token-icon idx)}
[rn/image {:source (if (fn? source) (source) source)
:style {:width 40
:height 40}}]]))]
[rn/view {:style styles/reward-description}
[quo/text {:weight :medium}
(i18n/label :t/invite-chat-starter-pack)]
[quo/text {} reward-text]]]))
(defn render-message [{:keys [content]}]
[rn/view {:style (message-wrapper)}
[rn/view {:style (message-view)}
(for [{:keys [type value]} content]
(case type
:text [rn/view {:style (message-text)}
[quo/text value]]
:pack [starter-pack]
:author [rn/view {:style (author-text)}
[quo/text {:color :secondary}
value]]
:button [rn/view {:style (button-message)}
value]
nil))]])
(defn reward-messages []
(let [has-invite @(re-frame/subscribe [::invite/has-chat-invite])
loading (#{(get gateway/network-statuses :initiated)
(get gateway/network-statuses :in-flight)}
@(re-frame/subscribe [::gateway/network-status]))
pending @(re-frame/subscribe [::invite/pending-reward])
messages [{:content [{:type :text
:value "👋"}]}
{:content [{:type :author
:value (i18n/label :t/invite-chat-name)}
{:type :text
:value (i18n/label :t/invite-chat-intro)}
{:type :pack}
{:type :button
:value [quo/button {:type :secondary
:loading loading
:disabled pending
:on-press #(re-frame/dispatch [::acquisition/accept-pack])}
(if pending
(i18n/label :t/invite-chat-pending)
(i18n/label :t/invite-chat-accept))]}]}
{:content [{:type :text
:value (i18n/label :t/invite-chat-rule)}]}
{:content [{:type :text
:value [:<>
(i18n/label :t/invite-privacy-policy1) " "
[quo/text {:color :link
:on-press #(re-frame/dispatch [::invite/terms-and-conditions])}
(i18n/label :t/invite-privacy-policy2)]]}]}]]
(when has-invite
[rn/view {:style (messages-wrapper)}
(for [message messages]
[render-message message])])))
@@ -0,0 +1,17 @@
(ns status-im.ui.components.invite.dapp
(:require [status-im.ui.components.invite.modal :as modal]
[re-frame.core :as re-frame]
[status-im.acquisition.core :as acquisition]
[status-im.i18n.i18n :as i18n]
[status-im.acquisition.dapp :as dapp]))
(defn accept-popover []
(let [{:keys [rewardable]} @(re-frame/subscribe [::acquisition/metadata])]
[modal/popover {:on-accept #(re-frame/dispatch [::dapp/decision :accept])
:on-decline #(re-frame/dispatch [::dapp/decision :decline])
:has-reward rewardable
:accept-label (i18n/label :t/dapp-starter-pack-accept)
:title (i18n/label :t/dapp-starter-pack-title)
:description (i18n/label :t/dapp-starter-pack-description)}]))
+224 -3
View File
@@ -1,9 +1,23 @@
(ns status-im.ui.components.invite.events
(:require [re-frame.core :as re-frame]
[reagent.ratom :refer [make-reaction]]
[taoensso.timbre :as log]
[status-im.utils.fx :as fx]
[status-im.utils.config :as config]
[status-im.ethereum.abi-spec :as abi-spec]
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.i18n.i18n :as i18n]
[status-im.signing.core :as signing]
[status-im.ethereum.core :as ethereum]
[status-im.ui.components.react :as react]
[status-im.utils.universal-links.utils :as universal-links]))
[status-im.navigation :as navigation]
[status-im.utils.universal-links.utils :as universal-links]
[status-im.acquisition.core :as acquisition]
[status-im.acquisition.persistance :as persistence]
[status-im.utils.money :as money]
[status-im.bottom-sheet.core :as bottom-sheet]))
(def privacy-policy-link "https://status.im/referral-program/terms-and-conditions")
(re-frame/reg-fx
::share
@@ -12,9 +26,216 @@
(fx/defn share-link
{:events [::share-link]}
[{:keys [db]}]
[{:keys [db]} response]
(let [{:keys [public-key preferred-name]} (get db :multiaccount)
invite-id (get response :invite_code)
profile-link (universal-links/generate-link :user :external
(or preferred-name public-key))
message (i18n/label :t/join-me {:url profile-link})]
share-link (cond-> profile-link
invite-id
(str "?invite=" invite-id))
message (i18n/label :t/join-me {:url share-link})]
{::share {:message message}}))
(fx/defn generate-invite
{:events [::generate-invite]}
[{:keys [db] :as cofx} {:keys [address]}]
(acquisition/handle-registration cofx
{:message {:address address
:interaction_address (get-in db [:multiaccount :public-key])}
:on-success [::share-link]}))
(re-frame/reg-sub
::has-chat-invite
:<- [:chats/current-chat-id]
:<- [:acquisition]
(fn [[chat-id acquisition]]
(let [{:keys [flow-state attributed]} acquisition
chat-referrer (get-in acquisition [:chat-referrer chat-id])]
(and chat-referrer
(not attributed)
(nil? flow-state)))))
(re-frame/reg-sub
::pending-reward
:<- [:acquisition]
(fn [{:keys [flow-state]}]
(= flow-state (get persistence/referrer-state :accepted))))
(re-frame/reg-sub
::has-public-chat-invite
:<- [:acquisition]
(fn [acquisition]
(let [{:keys [metadata flow-state attributed]} acquisition
{:keys [type]} metadata]
(and (= type "public-chat")
(not attributed)
(nil? flow-state)))))
(fx/defn go-to-invite
{:events [::open-invite]}
[{:keys [db] :as cofx}]
(let [contract (get-in db [:acquisition :contract])
accounts (filter #(not= (:type %) :watch) (get db :multiaccount/accounts))]
(fx/merge cofx
{::get-rewards (mapv (fn [{:keys [address]}]
{:address address
:contract contract
:on-success (fn [type data]
(re-frame/dispatch [::get-reward-success address type data]))})
accounts)}
(navigation/open-modal :referral-invite nil))))
(re-frame/reg-fx
::terms-and-conditions
(fn []
(.openURL ^js react/linking privacy-policy-link)))
(fx/defn open-privacy-policy-link
{:events [::terms-and-conditions]}
[_]
{::terms-and-conditions nil})
(fx/defn redeem-success
{:events [::redeem-success]}
[{:keys [db]} account]
{:db (assoc-in db [:acquisition :accounts account :bonuses] 0)})
(fx/defn redeem-error
{:events [::redeem-error]}
[cofx error]
{:utils/show-popup {:title "Error"
:content error}})
(fx/defn redeem-bonus
{:events [::redeem-bonus]}
[{:keys [db] :as cofx} {:keys [address]}]
(fx/merge cofx
(bottom-sheet/hide-bottom-sheet)
(signing/sign
{:tx-obj {:to (get-in db [:acquisition :contract])
:from address
:data (abi-spec/encode "withdrawAttributions()" [])}
:on-result [::redeem-success address]
:on-error [::redeem-error]})))
;; Invite reward
(re-frame/reg-sub
:invite/accounts-reward
(fn [db]
(get-in db [:acquisition :accounts])))
(re-frame/reg-sub
:invite/account-reward
:<- [:invite/accounts-reward]
(fn [accounts [_ account]]
(get accounts account)))
(defn- get-reward [contract address on-success]
(json-rpc/eth-call
{:contract contract
:method "pendingAttributionCnt(address)"
:params [address]
:outputs ["uint256"]
:on-success (fn [[response]]
(log/info "Attribution count for" address "=" response)
(on-success :attribution response))})
(json-rpc/eth-call
{:contract contract
:method "getReferralReward(address,bool)"
:params [address false]
;; [uint ethAmount, uint tokenLen, uint maxThreshold, uint attribCount]
:outputs ["uint256" "uint256" "uint256" "uint256"]
:on-success (fn [[eth-amount tokens-count max-threshold attrib-count]]
(on-success :reward [eth-amount tokens-count max-threshold attrib-count])
(log/info "Reward data for" address "=" eth-amount tokens-count max-threshold attrib-count)
(dotimes [id tokens-count]
(json-rpc/eth-call
{:contract contract
:method "getReferralRewardTokens(address,bool,uint256)"
:params [address false id]
:outputs ["address" "uint256"]
:on-success (fn [token-data]
(log/info "Token data for" address "token id" id "=" token-data)
(on-success :token token-data))})))}))
(re-frame/reg-fx
::get-rewards
(fn [accounts]
(doseq [{:keys [contract address on-success]} accounts]
(get-reward contract address on-success))))
(fx/defn default-reward-success
{:events [::default-reward-success]}
[{:keys [db]} type data]
(case type
:reward
(let [[eth-amount tokens-count max-threshold attrib-count] data]
{:db (assoc-in db [:acquisition :referral-reward] {:eth-amount (money/wei->ether eth-amount)
:tokens-count tokens-count
:max-threshold max-threshold
:attrib-count attrib-count})})
:token
(let [[address amount] data]
{:db (assoc-in db [:acquisition :referral-reward :tokens address] (money/wei->ether amount))})
:attribution
{:db (assoc-in db [:acquisition :referral-reward :bonuses] data)}))
(fx/defn get-reward-success
{:events [::get-reward-success]}
[{:keys [db]} account type data]
(case type
:reward
(let [[eth-amount _ max-threshold attrib-count] data]
{:db (update-in db [:acquisition :accounts account] merge {:eth-amount (money/wei->ether eth-amount)
:max-threshold max-threshold
:attrib-count attrib-count})})
:token
(let [[address amount] data]
{:db (assoc-in db [:acquisition :accounts account :tokens address] (money/wei->ether amount))})
:attribution
{:db (assoc-in db [:acquisition :accounts account :bonuses] data)}))
;;TODO this one rerender whole root many times FIX IT
(re-frame/reg-sub-raw
::default-reward
(fn [db]
(get-reward (get-in @db [:acquisition :contract])
(ethereum/default-address @db)
(fn [type data]
(re-frame/dispatch [::default-reward-success type data])))
(make-reaction
(fn []
(get-in @db [:acquisition :referral-reward])))))
;; Starter pack
(fx/defn get-starter-pack-amount
{:events [::starter-pack-amount]}
[{:keys [db]} [_ eth-amount tokens tokens-amount sticker-packs]]
{:db (assoc-in db [:acquisition :starter-pack :pack]
{:eth-amount (money/wei->ether eth-amount)
:tokens (zipmap tokens
(map money/wei->ether tokens-amount))
:sticker-packs sticker-packs})})
(re-frame/reg-sub-raw
::starter-pack
(fn [db]
(let [contract (get-in @db [:acquisition :contract])]
(json-rpc/eth-call
{:contract contract
:method "getDefaultPack()"
:outputs ["address" "uint256" "address[]" "uint256[]" "uint256[]"]
:on-success #(re-frame/dispatch [::starter-pack-amount (vec %)])})
(make-reaction
(fn []
(get-in @db [:acquisition :starter-pack :pack]))))))
(re-frame/reg-sub
::enabled
(fn [db]
(and config/referrals-invite-enabled?
(get-in db [:acquisition :contract]))))
@@ -0,0 +1,77 @@
(ns status-im.ui.components.invite.modal
(:require [re-frame.core :as re-frame]
[quo.react-native :as rn]
[quo.core :as quo]
[status-im.i18n.i18n :as i18n]
[status-im.ui.components.invite.style :as styles]
[status-im.ui.components.invite.events :as invite]
[status-im.acquisition.gateway :as gateway]
[status-im.ui.components.invite.utils :as utils]))
(defn perk [{name :name
{source :source} :icon} value]
[rn/view {:style {:flex-direction :row
:align-items :center
:padding-vertical 4}}
[rn/view {:style {:flex-direction :row}}
[rn/image {:source (if (fn? source) (source) source)
:style {:width 20
:height 20
:margin-right 8}}]
[quo/text {:size :small
:weight :medium}
(str value " ")]
[quo/text {:size :small
:weight :medium}
name]]])
(defn popover [{:keys [on-accept has-reward on-decline accept-label title description]}]
(fn []
(let [pack (when has-reward @(re-frame/subscribe [::invite/starter-pack]))
loading (#{(get gateway/network-statuses :initiated)
(get gateway/network-statuses :in-flight)}
@(re-frame/subscribe [::gateway/network-status]))
tokens (when has-reward (utils/transform-tokens pack))]
[rn/view {:style {:align-items :center
:padding-vertical 16
:padding-horizontal 16}}
(when has-reward
[rn/view {:style (styles/modal-tokens-icons-style (count tokens))}
(for [[{name :name
{source :source} :icon} _ i] tokens]
^{:key name}
[rn/view {:style (styles/modal-token-icon-style i)}
[rn/image {:source (if (fn? source) (source) source)
:style {:width 40
:height 40}}]])])
[rn/view {:style {:padding 8}}
(when title
[quo/text {:style {:margin-bottom 8}
:align :center
:size :x-large}
title])
[quo/text {:align :center}
description]]
(when has-reward
[rn/view {:style (styles/modal-perks-container)}
(for [[k v] tokens]
^{:key (:name k)}
[perk k v])])
[rn/view {:style {:margin-vertical 8}}
[quo/button {:on-press on-accept
:loading loading}
accept-label]]
[rn/view {:style {:opacity (if loading 0 1)}}
[quo/button {:type :secondary
:on-press on-decline}
(i18n/label :t/advertiser-starter-pack-decline)]]
[rn/view {:padding-vertical 8}
[quo/text {:color :secondary
:align :center
:size :small}
(i18n/label :t/invite-privacy-policy1)]
[quo/text {:color :link
:align :center
:size :small
:on-press #(re-frame/dispatch [::invite/terms-and-conditions])}
(i18n/label :t/invite-privacy-policy2)]]])))
@@ -0,0 +1,104 @@
(ns status-im.ui.components.invite.style
(:require [quo.design-system.spacing :as spacing]
[quo.design-system.colors :as colors]))
(def reward-item-title (merge (:base spacing/padding-horizontal)
{:padding-top 12
:padding-bottom 4}))
(defn reward-item-content []
(merge (:base spacing/padding-horizontal)
(:base spacing/padding-vertical)
{:background-color (:interactive-02 @colors/theme)
:flex-direction :row
:border-bottom-width 1
:border-top-width 1
:border-color (:border-02 @colors/theme)}))
(defn reward-token-icon [idx]
{:align-items :center
:shadow-radius 16
:shadow-opacity 1
:shadow-color (:shadow-01 @colors/theme)
:shadow-offset {:width 0 :height 4}
:width 40
:height 40
:border-radius 20
:position :absolute
:top (* idx 20)})
(def reward-description {:flex 1})
(defn reward-tokens-icons [c]
{:margin-right 16
:width 40
:height (- (* 40 c) (* 20 (dec c)))})
(defn home-token-icon-style [idx]
{:align-items :center
:shadow-radius 16
:shadow-opacity 1
:shadow-color (:shadow-01 @colors/theme)
:shadow-offset {:width 0 :height 4}
:width 20
:height 20
:border-radius 20
:position :absolute
:top 0
:left (* idx 10)})
(defn home-tokens-icons [c]
{:height 20
:margin-horizontal 6
:width (- (* 20 c) (* 10 (dec c)))})
(defn invite-instructions []
{:border-top-width 1
:border-top-color (:ui-01 @colors/theme)
:border-bottom-width 1
:border-bottom-color (:ui-01 @colors/theme)
:padding-top (:small spacing/spacing)})
(defn invite-instructions-title []
(merge
(:tiny spacing/padding-vertical)
(:base spacing/padding-horizontal)))
(defn invite-instructions-content []
(merge (:tiny spacing/padding-vertical)
(:base spacing/padding-horizontal)))
(defn invite-warning []
(merge
(:tiny spacing/padding-vertical)
(:base spacing/padding-horizontal)
{:background-color (:warning-02 @colors/theme)
:border-top-width 1
:border-top-color (:warning-01 @colors/theme)
:border-bottom-width 1
:border-bottom-color (:warning-01 @colors/theme)}))
(defn modal-token-icon-style [idx]
{:align-items :center
:shadow-radius 16
:shadow-opacity 1
:shadow-color (:shadow-01 @colors/theme)
:shadow-offset {:width 0 :height 4}
:width 40
:height 40
:border-radius 20
:position :absolute
:top 0
:left (* idx 20)})
(defn modal-tokens-icons-style [c]
{:height 40
:width (- (* 40 c) (* 20 (dec c)))})
(defn modal-perks-container []
{:border-radius 8
:border-width 1
:border-color (:ui-02 @colors/theme)
:width "100%"
:margin-vertical 8
:padding-vertical 8
:padding-horizontal 12})
@@ -0,0 +1,15 @@
(ns status-im.ui.components.invite.utils
(:require [status-im.ethereum.tokens :as tokens]
[re-frame.core :as re-frame]))
;;TODO: this is not cool, because this should be separate subscription
(defn transform-tokens [{:keys [tokens eth-amount]}]
(let [all-tokens @(re-frame/subscribe [:wallet/all-tokens])
chain @(re-frame/subscribe [:ethereum/chain-keyword])]
(cond-> (mapv (fn [[k v] i]
[(tokens/address->token all-tokens k) v i])
tokens
(range))
(pos? eth-amount)
(conj [(get tokens/all-native-currencies chain) eth-amount (count tokens)]))))
+278 -13
View File
@@ -1,24 +1,289 @@
(ns status-im.ui.components.invite.views
(:require [quo.core :as quo]
[reagent.core :as reagent]
[re-frame.core :as re-frame]
[status-im.ui.components.chat-icon.screen :as chat-icon]
[status-im.ui.components.toolbar :as toolbar]
[status-im.utils.utils :as utils]
[status-im.i18n.i18n :as i18n]
[quo.design-system.spacing :as spacing]
[quo.design-system.colors :as colors]
[status-im.ui.components.invite.style :as styles]
[status-im.ui.components.invite.events :as invite.events]
[status-im.i18n.i18n :as i18n]))
[status-im.ui.components.invite.utils :refer [transform-tokens]]
[quo.react-native :as rn]
[clojure.string :as cstr]))
(defn- threshold-badge [max-threshold attrib-count]
(when (pos? max-threshold)
[rn/view {:flex-direction :row}
[rn/view {:padding-horizontal 8
:padding-vertical 2
:border-radius 11
:background-color (:interactive-01 @colors/theme)}
[quo/text {:weight :medium
:size :small
:color :inverse}
(i18n/label :t/attribution-received {:max max-threshold
:attrib attrib-count})]]]))
;; Select account sheet
(defn- render-account [current-account change-account]
(fn [account]
(let [{:keys [max-threshold attrib-count bonuses]
:or {bonuses 0}}
@(re-frame/subscribe [:invite/account-reward (:address account)])]
[:<>
[quo/list-item
{:theme :accent
:active (= (:address current-account) (:address account))
:disabled (and max-threshold attrib-count
(< max-threshold (inc attrib-count)))
:accessory :radio
:icon [chat-icon/custom-icon-view-list (:name account) (:color account)]
:title (:name account)
:subtitle [:<>
[quo/text {:monospace true
:color :secondary}
(utils/get-shortened-checksum-address (:address account))]
[threshold-badge max-threshold attrib-count]]
:on-press #(change-account account)}]
[quo/list-item
{:theme :accent
:disabled (not (pos? bonuses))
:icon :main-icons/arrow-down
:title (i18n/label :t/redeem-now)
:subtitle (i18n/label :t/redeem-amount {:quantity bonuses})
:on-press #(re-frame/dispatch [::invite.events/redeem-bonus account])}]
[quo/separator {:style {:margin-vertical 10}}]])))
(defn- accounts-list [accounts current-account change-account]
[rn/view {:flex 1}
[rn/view {:style (merge (:base spacing/padding-horizontal)
(:tiny spacing/padding-vertical))}
[quo/text {:align :center}
(i18n/label :t/invite-select-account)]]
[rn/flat-list {:data accounts
:key-fn :address
:render-fn (render-account current-account change-account)}]])
;; Invite sheet
(defn- step [{:keys [number description]}]
[rn/view {:style (merge
(:small spacing/padding-vertical)
{:flex-direction :row
:flex 1
:align-items :center})}
[rn/view {:style {:width 40
:height 40
:border-radius 20
:border-width 1
:justify-content :center
:align-items :center
:border-color (:ui-01 @colors/theme)}}
[quo/text {:weight :bold
:size :large}
number]]
[rn/view {:padding-left (:base spacing/spacing)
:flex 1}
[quo/text (i18n/label description)]]])
(def steps-values [{:number 1
:description :t/invite-instruction-first}
{:number 2
:description :t/invite-instruction-second}
{:number 3
:description :t/invite-instruction-third}
{:number 4
:description :t/invite-instruction-fourth}
{:number 5
:description :t/invite-instruction-fifth}])
(defn- referral-steps []
[rn/view {:style (styles/invite-instructions)}
[rn/view {:style (styles/invite-instructions-title)}
[quo/text {:color :secondary}
(i18n/label :t/how-it-works)]]
[rn/view {:style (styles/invite-warning)}
[quo/text (i18n/label :t/invite-warning)]]
[rn/view {:style (styles/invite-instructions-content)}
(for [s steps-values]
^{:key (str (:number s))}
[step s])]])
(defn bottom-sheet-content [accounts account change-account]
(fn []
[accounts-list accounts account (fn [a]
(re-frame/dispatch [:bottom-sheet/hide])
(change-account a))]))
(defn- referral-account [{:keys [account accounts change-account]}]
(let [{:keys [max-threshold bonuses attrib-count]
:or {bonuses 0}}
@(re-frame/subscribe [:invite/account-reward (:address account)])]
[rn/view {:style (:tiny spacing/padding-vertical)}
[rn/view {:style (merge (:base spacing/padding-horizontal)
(:x-tiny spacing/padding-vertical))}
[quo/text {:color :secondary}
(i18n/label :t/invite-receive-account)]]
[quo/list-item
{:icon [chat-icon/custom-icon-view-list (:name account) (:color account)]
:title (:name account)
:subtitle [:<>
[quo/text {:monospace true
:color :secondary}
(utils/get-shortened-checksum-address (:address account))]
[threshold-badge max-threshold attrib-count]]
:on-press #(re-frame/dispatch
[:bottom-sheet/show-sheet
{:content (bottom-sheet-content accounts account change-account)}])}]
[quo/list-item
{:theme :accent
:disabled (not (pos? bonuses))
:icon :main-icons/arrow-down
:title (i18n/label :t/redeem-now)
:subtitle (i18n/label :t/redeem-amount {:quantity bonuses})
:on-press #(re-frame/dispatch [::invite.events/redeem-bonus account])}]]))
(defn reward-item [data description]
(let [tokens (transform-tokens data)
reward-text (->> tokens
(map (fn [[{:keys [symbol]} value _]]
(str value " " (name symbol))))
(cstr/join ", "))]
[rn/view {}
[rn/view {:style styles/reward-item-title}
[quo/text {:weight :medium}
[quo/text {:color :link
:weight :inherit}
(i18n/label :t/invite-reward-you)]
(i18n/label :t/invite-reward-you-name)]]
[rn/view {:style (styles/reward-item-content)}
[rn/view {:style (styles/reward-tokens-icons (count tokens))}
(doall
(for [[{name :name
{source :source} :icon} _ idx] tokens]
^{:key name}
[rn/view {:style (styles/reward-token-icon idx)}
[rn/image {:source (if (fn? source) (source) source)
:style {:width 40
:height 40}}]]))]
[rn/view {:style styles/reward-description}
[quo/text {}
(i18n/label description {:reward reward-text})]]]]))
(defn friend-reward-item [starter-pack-amount description]
(let [tokens (transform-tokens starter-pack-amount)
reward-text (->> tokens
(map (comp :symbol first))
(filter (comp not nil?))
(map name)
(cstr/join ", "))]
[rn/view {}
[rn/view {:style styles/reward-item-title}
[quo/text {:weight :medium}
[quo/text {:color :link
:weight :inherit}
(i18n/label :t/invite-reward-friend)]
(i18n/label :t/invite-reward-friend-name)]]
[rn/view {:style (styles/reward-item-content)}
[rn/view {:style (styles/reward-tokens-icons (count tokens))}
(doall
(for [[{name :name
{source :source} :icon} _ idx] tokens]
^{:key name}
[rn/view {:style (styles/reward-token-icon idx)}
[rn/image {:source (if (fn? source) (source) source)
:style {:width 40
:height 40}}]]))]
[rn/view {:style styles/reward-description}
[quo/text {}
(i18n/label description {:reward reward-text})]]]]))
(defn referral-invite []
(let [account* (reagent/atom nil)]
(fn []
(let [accounts @(re-frame/subscribe [:accounts-without-watch-only])
default-account @(re-frame/subscribe [:multiaccount/default-account])
account (or @account* default-account)
reward @(re-frame/subscribe [::invite.events/default-reward])
starter-pack @(re-frame/subscribe [::invite.events/starter-pack])]
[:<>
[rn/scroll-view {:flex 1}
[reward-item reward :t/invite-reward-you-description]
[friend-reward-item starter-pack :t/invite-reward-friend-description]
[referral-account {:account account
:change-account #(reset! account* %)
:accounts accounts}]
[referral-steps]
[rn/view {:padding-vertical 10
:padding-horizontal 16}
[quo/text {}
(i18n/label :t/invite-privacy-policy1)
" "
[quo/text {:color :link
:on-press #(re-frame/dispatch [::invite.events/terms-and-conditions])}
(i18n/label :t/invite-privacy-policy2)]]]]
[toolbar/toolbar
{:show-border? true
:center
[quo/button {:type :secondary
:on-press #(re-frame/dispatch [::invite.events/generate-invite
{:address (get account :address)}])}
(i18n/label :t/invite-button)]}]]))))
(defn button []
[quo/button {:on-press #(re-frame/dispatch [::invite.events/share-link nil])
:accessibility-label :invite-friends-button}
(i18n/label :t/invite-friends)])
(if-not @(re-frame/subscribe [::invite.events/enabled])
[quo/button {:on-press #(re-frame/dispatch [::invite.events/share-link nil])
:accessibility-label :invite-friends-button}
(i18n/label :t/invite-friends)]
(let [pack @(re-frame/subscribe [::invite.events/default-reward])
tokens (transform-tokens pack)]
[rn/view {:style {:align-items :center
:padding-horizontal 8
:padding-vertical 8}}
[rn/view {:style (:tiny spacing/padding-vertical)}
[quo/button {:on-press #(re-frame/dispatch [::invite.events/open-invite])
:accessibility-label :invite-friends-button}
(i18n/label :t/invite-friends)]]
[rn/view {:style (merge (:tiny spacing/padding-vertical)
(:base spacing/padding-horizontal))}
(when (seq tokens)
[rn/view {:style {:flex-direction :row
:justify-content :center}}
[rn/view {:style (styles/home-tokens-icons (count tokens))}
(doall
(for [[{name :name
{source :source} :icon} _ i] tokens]
^{:key name}
[rn/view {:style (styles/home-token-icon-style i)}
[rn/image {:source (if (fn? source) (source) source)
:style {:width 20
:height 20}}]]))]
[quo/text {:align :center}
(i18n/label :t/invite-reward)]])]])))
(defn list-item [{:keys [accessibility-label]}]
[quo/list-item
{:theme :accent
:title (i18n/label :t/invite-friends)
:icon :main-icons/share
:accessibility-label accessibility-label
:on-press (fn []
(re-frame/dispatch [:bottom-sheet/hide])
(js/setTimeout
#(re-frame/dispatch [::invite.events/share-link nil]) 250))}])
(if-not @(re-frame/subscribe [::invite.events/enabled])
[quo/list-item
{:theme :accent
:title (i18n/label :t/invite-friends)
:icon :main-icons/share
:accessibility-label accessibility-label
:on-press (fn []
(re-frame/dispatch [:bottom-sheet/hide])
(js/setTimeout
#(re-frame/dispatch [::invite.events/share-link nil]) 250))}]
[quo/list-item
{:theme :accent
:title (i18n/label :t/invite-friends)
:subtitle (i18n/label :t/invite-reward)
:icon :main-icons/share
:accessibility-label accessibility-label
:on-press #(do
(re-frame/dispatch [:bottom-sheet/hide])
(re-frame/dispatch [::invite.events/open-invite]))}]))
@@ -16,14 +16,14 @@
[reagent.core :as reagent]
[quo.react-native :as rn]
[clojure.string :as string]
[status-im.ui.components.invite.views :as invite]
[status-im.ethereum.ens :as ens]
[quo.platform :as platform]
[status-im.utils.identicon :as identicon]
[status-im.ui.components.keyboard-avoid-presentation :as kb-presentation]
[status-im.ui.components.animation :as animation]
[status-im.ui.screens.chat.photos :as photos]
[status-im.utils.db :as utils.db]
[status-im.ui.components.invite.views :as invite])
[status-im.utils.db :as utils.db])
(:require-macros [status-im.utils.views :as views]))
(defn- render-row [row]
@@ -14,8 +14,7 @@
wakuv2-flag
current-fleet
webview-debug
wallet-connect-enabled?
new-ui-enabled?]}]
wallet-connect-enabled?]}]
(keep
identity
[{:size :small
@@ -70,6 +69,13 @@
:on-press
#(re-frame/dispatch [:navigate-to :rpc-usage-info])
:chevron true}
(when-not config/google-free
{:size :small
:title (i18n/label :t/notification-settings)
:accessibility-label :advanced-notification-settings
:on-press
#(re-frame/dispatch [:navigate-to :notifications-advanced-settings])
:chevron true})
;; If it's enabled in the config, we don't show the option
(when (not config/communities-enabled?)
{:size :small
@@ -116,15 +122,7 @@
#(re-frame/dispatch
[:multiaccounts.ui/switch-wallet-connect-enabled (not wallet-connect-enabled?)])
:accessory :switch
:active wallet-connect-enabled?}
(when config/quo-preview-enabled?
{:size :small
:title (i18n/label :t/new-ui)
:accessibility-label :new-ui-toggle
:container-margin-bottom 8
:on-press #(re-frame/dispatch [:toggle-new-ui])
:accessory :switch
:active new-ui-enabled?})]))
:active wallet-connect-enabled?}]))
(defn- flat-list-data [options]
(normal-mode-settings-data options))
@@ -155,7 +153,6 @@
:wakuv2-flag wakuv2-flag
:waku-bloom-filter-mode waku-bloom-filter-mode
:webview-debug webview-debug
:wallet-connect-enabled? wallet-connect-enabled?
:new-ui-enabled? @config/new-ui-enabled?})
:wallet-connect-enabled? wallet-connect-enabled?})
:key-fn (fn [_ i] (str i))
:render-fn render-item}]))
@@ -0,0 +1,301 @@
(ns status-im.ui.screens.anonymous-metrics-settings.views
(:require-macros [status-im.utils.views :refer [defview letsubs]])
(:require [re-frame.core :as re-frame]
[status-im.ui.components.animation :as animation]
[status-im.react-native.resources :as resources]
[status-im.anon-metrics.core :as anon-metrics]
[status-im.ui.components.accordion :as accordion]
[status-im.ui.components.react :as react]
[quo.design-system.colors :as colors]
[status-im.ui.components.icons.icons :as icons]
[status-im.i18n.i18n :as i18n]
[status-im.constants :refer [metrics-github-link]]
[quo.design-system.spacing :as spacing]
[status-im.ui.components.topbar :as topbar]
[quo.core :as quo]))
(defn graphic-and-desc [{:keys [show-title?]}]
[:<>
[react/view {:align-items :center
:margin-vertical 25}
[react/image {:source (resources/get-image :graph)}]]
(when show-title?
[quo/text {:size :x-large
:weight :bold
:align :center
:style {:margin-bottom 16}}
(i18n/label :t/help-improve-status)])
[react/touchable-highlight
{:on-press #(re-frame/dispatch [:navigate-to :anon-metrics-learn-more])
:accessibility-label :learn-more-anchor}
[react/nested-text
{:style (merge {:color colors/gray
:text-align :center}
(:large spacing/padding-horizontal))}
(i18n/label :t/anonymous-usage-data-subtitle)
[{:style {:color colors/blue
;; :font-weight key doesn't work
:fontWeight :bold}}
(str " " (i18n/label :t/learn-more))]]]])
(defn setting-switch [enabled? on-press]
[quo/list-item {:title (i18n/label :t/share-anonymous-usage-data)
:active enabled?
:accessibility-label :opt-in-switch
:accessory :switch
:subtitle-max-lines 2
:on-press on-press}])
(defn icon-list-item
([icon label]
(icon-list-item icon {} label))
([icon icon-opts label]
[react/view {:flex-direction :row
:margin-horizontal (:base spacing/spacing)
:margin-vertical (:tiny spacing/spacing)}
[icons/icon icon (into icon-opts
{:container-style {:margin-top 1.2
:margin-right (:tiny spacing/spacing)}})]
[react/view {:style {:padding-right (:xx-large spacing/spacing)}}
(if (string? label)
[react/text label]
label)]]))
(defn what-is-shared []
[:<>
[quo/list-header (i18n/label :t/what-is-shared)]
(for [label [(i18n/label :t/anon-metrics-your-interactions)
(i18n/label :t/anon-metrics-bg-activity)
(i18n/label :t/anon-metrics-settings-and-prefs)]]
^{:key label}
[icon-list-item :main-icons/info {:color colors/blue} label])])
(defn event-item [event]
[accordion/section
{:title [react/view {:flex 1
:flex-direction :row
:margin-bottom (:base spacing/spacing)}
[react/view {:style {:padding-right (:base spacing/spacing)}}
(for [label ["event" "time" "os"]]
^{:key label}
[react/text {:style {:color colors/gray}}
label])]
[react/view
[react/text (:event event)]
[react/text (:created_at event)]
[react/text (:os event)]]]
:content [react/view {:style {:background-color colors/gray-lighter
:padding (:small spacing/spacing)
:border-radius 14}}
[react/text (:value event)]]}])
(defn data-sheet-header-and-desc []
[:<>
[quo/text {:size :x-large
:weight :bold
:align :center
:style {:margin-vertical 16}}
(i18n/label :t/data-collected)]
[react/touchable-highlight
{:on-press #(.openURL ^js react/linking metrics-github-link)}
[react/nested-text
{:style (:base spacing/padding-horizontal)}
(i18n/label :t/data-collected-subtitle)
[{:style {:color colors/blue}}
(str " " (i18n/label :t/view-rules))]]]])
(defview view-data []
(letsubs [events [:anon-metrics/events]
total [:anon-metrics/total-count]
fetching? [:anon-metrics/fetching?]]
{:component-did-mount #(re-frame/dispatch [::anon-metrics/fetch-local-metrics
{:clear-existing? true
:limit 10
:offset 0}])}
[:<>
[topbar/topbar {:modal? true
:border-bottom false}]
[react/scroll-view
[data-sheet-header-and-desc]
[quo/list-header (i18n/label :t/count-metrics-collected {:count total})]
(when (pos? total)
[react/view
{:style (merge
{:border-width 1
:border-radius 8
:border-color colors/gray-lighter
:padding-top 16
:padding-bottom 20
:margin 16}
(:base spacing/padding-horizontal))}
(doall
(map-indexed
(fn [index event]
^{:key index}
[event-item event])
events))
(if fetching?
[react/activity-indicator {:size :large
:animating true}]
[quo/button {:type :primary
:disabled (= (count events) total)
:accessibility-label :show-more-button
:on-press #(re-frame/dispatch [::anon-metrics/fetch-local-metrics
{:clear-existing? false
:limit 10
:offset (count events)}])}
(i18n/label :t/show-more)])])]]))
(defn view-data-button []
[react/view {:flex 1
:align-items :center
:style {:margin-top (:x-large spacing/spacing)}}
[quo/button {:type :primary
:theme :main
:accessibility-label :view-data-button
:on-press #(re-frame/dispatch [:navigate-to :anon-metrics-view-data])}
(i18n/label :t/view-data)]])
(defn desc-point-with-link [desc link-text link-href accessibility-label]
[react/touchable-highlight {:on-press #(.openURL ^js react/linking link-href)
:accessibility-label accessibility-label}
[react/view
[react/text desc]
[react/view {:flex-direction :row}
[react/text {:style {:text-align :center
:color colors/blue}}
link-text]
[icons/tiny-icon :tiny-icons/tiny-external
{:color colors/blue
:container-style {:margin-left 4
:margin-top 4}}]]]])
(defn learn-more []
[:<>
[topbar/topbar {:modal? true
:border-bottom false}]
[react/scroll-view
[quo/text {:size :x-large
:weight :bold
:align :center
:style {:margin-top 16}}
(i18n/label :t/about-sharing-data)]
[react/text {:style (merge
(:base spacing/padding-horizontal)
(:small spacing/padding-vertical))}
(i18n/label :t/about-sharing-data-subtitle)]
[what-is-shared]
[view-data-button]
[quo/separator {:style {:margin-vertical (:base spacing/spacing)}}]
[quo/list-header (i18n/label :t/how-it-works)]
(for [label [[desc-point-with-link
(i18n/label :t/sharing-data-desc-1)
(i18n/label :t/view-rules)
metrics-github-link
:view-rules-anchor]
(i18n/label :t/sharing-data-desc-2)
(i18n/label :t/sharing-data-desc-3)
(i18n/label :t/sharing-data-desc-4)
;; TODO (shivekkhurana): Enable this link when the public
;; dashboard is live
;; [desc-point-with-link
;; (i18n/label :t/sharing-data-desc-5)
;; (i18n/label :t/view-public-dashboard)
;; "https://github.com/"
;; :view-dashboad-anchor]
(i18n/label :t/sharing-data-desc-6)]]
^{:key label}
[icon-list-item :main-icons/arrow-right {:color colors/blue} label])
[react/view {:style {:margin-bottom (:xx-large spacing/spacing)}}]]])
(defview settings []
(letsubs [{:keys [:anon-metrics/should-send?]} [:multiaccount]]
[:<>
[topbar/topbar {:title (i18n/label :t/anonymous-usage-data)}]
[react/scroll-view {:flex 1}
[graphic-and-desc]
[setting-switch
should-send?
#(re-frame/dispatch [:multiaccounts.ui/share-anonymous-usage-data-switched (not should-send?)])]
[quo/separator]
[what-is-shared]
[react/view {:padding-bottom 80}
[view-data-button]]]]))
(defn allow-or-not-actions []
[react/view {:align-items :center
:style {:padding-bottom 80}}
[quo/button {:type :primary
:theme :main
:accessibility-label :opt-in-button
:on-press #(re-frame/dispatch [::anon-metrics/opt-in true])}
(i18n/label :t/allow-and-send)]
[react/view {:style {:margin-top (:base spacing/spacing)}}]
[quo/button {:type :primary
:theme :main
:accessibility-label :opt-out-button
:on-press #(re-frame/dispatch [::anon-metrics/opt-in false])}
(i18n/label :t/no-thanks)]])
(defn thank-you-animation [overlay-opacity box-opacity]
(fn []
(animation/start
(animation/parallel
[(animation/spring
overlay-opacity
{:toValue 0.72
:useNativeDriver true})
(animation/spring
box-opacity
{:toValue 1
:useNativeDriver true})]))))
(defview floating-thank-you []
(letsubs [overlay-opacity (animation/create-value 1)
box-opacity (animation/create-value 0.2)]
{:component-did-mount (thank-you-animation overlay-opacity box-opacity)}
[:<>
[react/animated-view ; thank you container
{:style {:position :absolute
:opacity box-opacity
:z-index 2
:top "40%"
:padding (:x-large spacing/spacing)
:background-color colors/white
:align-items :center
:align-self :center}}
[react/text {:style {:font-size 32}} "\uD83C\uDF89"]
[quo/text {:size :x-large
:weight :bold}
(i18n/label :t/thank-you)]]
[react/animated-view ; translucent overlay
{:style {:position :absolute
:top 0
:bottom 0
:left 0
:right 0
:z-index 1
:background-color colors/white
:opacity overlay-opacity}}]]))
(defview new-account-opt-in []
(letsubs [show-thank-you? [:anon-metrics/show-thank-you?]]
[react/scroll-view {:flex 1
:padding-vertical (:large spacing/spacing)
:flex-direction :column}
(when show-thank-you? [floating-thank-you])
[graphic-and-desc {:show-title? true}]
[react/view {:style {:margin-bottom (:small spacing/spacing)
:margin-top (:large spacing/spacing)}}
[quo/separator]]
[what-is-shared]
[react/view {:style (:large spacing/padding-vertical)}
[quo/separator]]
[allow-or-not-actions]]))
(comment
(re-frame/dispatch [:navigate-back])
(re-frame/dispatch [:navigate-to :metrics-learn-more])
(re-frame/dispatch [:navigate-to :metrics-view-data])
(re-frame/dispatch [:navigate-to :anon-metrics-opt-in {}]))
@@ -24,7 +24,6 @@
[status-im.ui.screens.chat.message.link-preview :as link-preview]
[status-im.ui.screens.communities.icon :as communities.icon]
[status-im.ui.components.animation :as animation]
[status-im.chat.models.images :as images]
[status-im.chat.models.pin-message :as models.pin-message])
(:require-macros [status-im.utils.views :refer [defview letsubs]]))
@@ -587,11 +586,7 @@
:label (i18n/label :t/message-reply)}
{:on-press #(re-frame/dispatch [:chat.ui/save-image-to-gallery (:image content)])
:id :save
:label (i18n/label :t/save)}
{:on-press #(images/download-image-http
(get-in message [:content :image]) preview/share)
:id :share
:label (i18n/label :t/share)}]
:label (i18n/label :t/save)}]
(when (and outgoing config/delete-message-enabled?)
[{:on-press #(re-frame/dispatch [:chat.ui/soft-delete-message message])
:label (i18n/label :t/delete)
@@ -91,6 +91,5 @@
(on-close)
(js/setTimeout #(on-emoji-press emoji)
reaction-picker/animation-duration))}
[render message {:modal true
:on-long-press #()
:close-modal on-close}]]])]))))
[render message {:modal true
:close-modal on-close}]]])]))))
@@ -25,8 +25,6 @@
"unpin" :main-icons/pin
"copy" :main-icons/copy
"reply" :main-icons/reply
"save" :main-icons/download
"share" :main-icons/share-default
"delete" :main-icons/delete})
(defn picker [{:keys [outgoing actions own-reactions on-close send-emoji timeline]}]
+5 -2
View File
@@ -23,6 +23,7 @@
[status-im.ui.screens.chat.extensions.views :as extensions]
[status-im.ui.screens.chat.group :as chat.group]
[status-im.ui.screens.chat.message.gap :as gap]
[status-im.ui.components.invite.chat :as invite.chat]
[status-im.ui.screens.chat.components.accessory :as accessory]
[status-im.ui.screens.chat.components.input :as components]
[status-im.ui.screens.chat.message.datemark :as message-datemark]
@@ -225,7 +226,7 @@
(when panel
(js/setTimeout #(react/dismiss-keyboard!) 100))))
(defn list-footer [{:keys [chat-id] :as chat}]
(defn list-footer [{:keys [chat-id chat-type] :as chat}]
(let [loading-messages? @(re-frame/subscribe [:chats/loading-messages? chat-id])
no-messages? @(re-frame/subscribe [:chats/chat-no-messages? chat-id])
all-loaded? @(re-frame/subscribe [:chats/all-loaded? chat-id])]
@@ -233,7 +234,9 @@
(if (or loading-messages? (not chat-id) (not all-loaded?))
[react/view {:height 324 :align-items :center :justify-content :center}
[react/activity-indicator {:animating true}]]
[chat-intro-header-container chat no-messages?])]))
[chat-intro-header-container chat no-messages?])
(when (= chat-type constants/one-to-one-chat-type)
[invite.chat/reward-messages])]))
(defn list-header [{:keys [chat-id chat-type invitation-admin]}]
(when (= chat-type constants/private-group-chat-type)
+5 -7
View File
@@ -10,21 +10,20 @@
[status-im.ui.screens.home.styles :as styles]
[status-im.ui.screens.communities.views :as communities.views]
[status-im.ui.screens.home.views.inner-item :as inner-item]
[status-im.ui.screens.referrals.home-item :as referral-item]
[quo.design-system.colors :as colors]
[quo.core :as quo]
[quo.platform :as platform]
[status-im.add-new.core :as new-chat]
[status-im.ui.components.search-input.view :as search-input]
[status-im.add-new.db :as db]
[status-im.utils.debounce :as debounce]
[status-im.utils.utils :as utils]
[status-im.ui.components.invite.views :as invite]
[status-im.ui.components.topbar :as topbar]
[status-im.ui.components.plus-button :as components.plus-button]
[status-im.ui.screens.chat.sheets :as sheets]
[status-im.ui.components.tabbar.core :as tabbar]
["react-native-navigation" :refer (Navigation)]
[status-im.ui.components.invite.views :as invite]
[status-im.utils.config :as config])
["react-native-navigation" :refer (Navigation)])
(:require-macros [status-im.utils.views :as views]))
(defn home-tooltip-view []
@@ -104,9 +103,7 @@
home-item
{:on-press (fn []
(re-frame/dispatch [:dismiss-keyboard])
(if (and @config/new-ui-enabled? platform/android?)
(re-frame/dispatch [:chat.ui/navigate-to-chat-nav2 chat-id])
(re-frame/dispatch [:chat.ui/navigate-to-chat chat-id]))
(re-frame/dispatch [:chat.ui/navigate-to-chat chat-id])
(re-frame/dispatch [:search/home-filter-changed nil])
(re-frame/dispatch [:accept-all-activity-center-notifications-from-chat chat-id]))
:on-long-press #(re-frame/dispatch [:bottom-sheet/show-sheet
@@ -138,6 +135,7 @@
:header [:<>
(when (or (seq items) @search-active? (seq search-filter))
[search-input-wrapper search-filter (empty? items)])
[referral-item/list-item]
(when (and (empty? items)
(or @search-active? (seq search-filter)))
[start-suggestion search-filter])]
@@ -5,6 +5,7 @@
[status-im.i18n.i18n :as i18n]
[quo.core :as quo]
[quo.platform :as platform]
[status-im.utils.config :as config]
[quo.design-system.colors :as quo-colors]
[status-im.notifications.core :as notifications]
[status-im.ui.components.react :as react]))
@@ -12,25 +13,48 @@
(defonce server (reagent/atom ""))
(defn local-notifications []
(let [{:keys [enabled]} @(re-frame/subscribe [:notifications/wallet-transactions])]
[:<>
[quo/separator {:color (:ui-02 @quo-colors/theme)
:style {:margin-vertical 8}}]
[quo/list-header (i18n/label :t/local-notifications)]
[quo/list-item
{:size :small
:title (i18n/label :t/notifications-transactions)
:accessibility-label :notifications-button
:active enabled
:on-press #(re-frame/dispatch
[::notifications/switch-transaction-notifications enabled])
:accessory :switch}]]))
(let [{:keys [enabled]} @(re-frame/subscribe [:notifications/wallet-transactions])
{:keys [notifications-enabled?]} @(re-frame/subscribe [:multiaccount])
enabled (and enabled (or platform/ios? notifications-enabled?))]
[quo/list-item
{:size :small
:title (i18n/label :t/notifications-transactions)
:accessibility-label :notifications-button
:active enabled
:disabled (not (or platform/ios? notifications-enabled?))
:on-press #(re-frame/dispatch
[::notifications/switch-transaction-notifications enabled])
:accessory :switch}]))
(defn notifications-settings-ios []
(defn remote-notifications []
(let [{:keys [remote-push-notifications-enabled?
push-notifications-block-mentions?
push-notifications-from-contacts-only?]}
@(re-frame/subscribe [:multiaccount])]
[:<>
[quo/list-item
{:size :small
:title (i18n/label :t/notifications-non-contacts)
:accessibility-label :notifications-button
:active (and remote-push-notifications-enabled?
(not push-notifications-from-contacts-only?))
:disabled (not remote-push-notifications-enabled?)
:on-press #(re-frame/dispatch
[::notifications/switch-non-contacts (not push-notifications-from-contacts-only?)])
:accessory :switch}]
[quo/list-item
{:size :small
:title (i18n/label :t/allow-mention-notifications)
:accessibility-label :notifications-button
:active (and remote-push-notifications-enabled?
(not push-notifications-block-mentions?))
:disabled (not remote-push-notifications-enabled?)
:on-press #(re-frame/dispatch
[::notifications/switch-block-mentions (not push-notifications-block-mentions?)])
:accessory :switch}]]))
(defn notifications-settings-ios []
(let [{:keys [remote-push-notifications-enabled?]} @(re-frame/subscribe [:multiaccount])]
[:<>
[quo/list-item
{:size :small
@@ -42,28 +66,12 @@
[quo/separator {:color (:ui-02 @quo-colors/theme)
:style {:margin-vertical 8}}]
[quo/list-header (i18n/label :t/notifications-preferences)]
[quo/list-item
{:size :small
:title (i18n/label :t/notifications-non-contacts)
:accessibility-label :notifications-button
:active (and remote-push-notifications-enabled?
(not push-notifications-from-contacts-only?))
:on-press #(re-frame/dispatch
[::notifications/switch-non-contacts (not push-notifications-from-contacts-only?)])
:accessory :switch}]
[quo/list-item
{:size :small
:title (i18n/label :t/allow-mention-notifications)
:accessibility-label :notifications-button
:active (and remote-push-notifications-enabled?
(not push-notifications-block-mentions?))
:on-press #(re-frame/dispatch
[::notifications/switch-block-mentions (not push-notifications-block-mentions?)])
:accessory :switch}]
[local-notifications]]))
[local-notifications]
[remote-notifications]]))
(defn notifications-settings-android []
(let [{:keys [notifications-enabled?]} @(re-frame/subscribe [:multiaccount])]
(let [{:keys [notifications-enabled? remote-push-notifications-enabled?]}
@(re-frame/subscribe [:multiaccount])]
[:<>
[quo/list-item
{:title (i18n/label :t/local-notifications)
@@ -73,7 +81,22 @@
:on-press #(re-frame/dispatch
[::notifications/switch (not notifications-enabled?) false])
:accessory :switch}]
[local-notifications]]))
(when (and platform/android? (not config/google-free))
[quo/list-item
{:title (i18n/label :t/remote-notifications)
:accessibility-label :remote-notifications-settings-button
:subtitle (i18n/label :t/remote-notifications-subtitle)
:active remote-push-notifications-enabled?
:on-press #(re-frame/dispatch
[::notifications/switch
(not remote-push-notifications-enabled?) true])
:accessory :switch}])
[quo/separator {:color (:ui-02 @quo-colors/theme)
:style {:margin-vertical 8}}]
[quo/list-header (i18n/label :t/notifications-preferences)]
[local-notifications]
(when (and platform/android? (not config/google-free))
[remote-notifications])]))
(defn notifications-settings []
[react/scroll-view {:style {:flex 1}

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