Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
166de36195 |
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
|
||||
@@ -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
@@ -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,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,4 +1,4 @@
|
||||
library 'status-jenkins-lib@v1.4.3'
|
||||
library 'status-jenkins-lib@v1.4.2'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
+1
-1
@@ -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,4 +1,4 @@
|
||||
library 'status-jenkins-lib@v1.4.3'
|
||||
library 'status-jenkins-lib@v1.4.2'
|
||||
|
||||
pipeline {
|
||||
agent { label params.AGENT_LABEL }
|
||||
|
||||
@@ -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,4 +1,4 @@
|
||||
library 'status-jenkins-lib@v1.4.3'
|
||||
library 'status-jenkins-lib@v1.4.2'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos' }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-jenkins-lib@v1.4.3'
|
||||
library 'status-jenkins-lib@v1.4.2'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
+15
-3
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -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; [
|
||||
|
||||
@@ -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}"
|
||||
'';
|
||||
}
|
||||
@@ -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 ]}";
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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 ];
|
||||
};
|
||||
|
||||
@@ -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
@@ -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}"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}"
|
||||
|
||||
Executable
+10
@@ -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
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))))
|
||||
@@ -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)))
|
||||
@@ -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))))
|
||||
@@ -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])))
|
||||
@@ -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))))
|
||||
@@ -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)))))
|
||||
@@ -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)))
|
||||
|
||||
@@ -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/")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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]}
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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?])]
|
||||
|
||||
@@ -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]}
|
||||
|
||||
@@ -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")))))
|
||||
@@ -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
@@ -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)})}}}})
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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 []
|
||||
[:<>
|
||||
|
||||
@@ -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}}}}]}}}})
|
||||
|
||||
@@ -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]))])
|
||||
@@ -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))))))
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)}]))
|
||||
|
||||
|
||||
@@ -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)]))))
|
||||
@@ -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]}]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user