Compare commits
77
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ba74308139 | ||
|
|
a8fd6fdd60 | ||
|
|
fe9dd7c549 | ||
|
|
be79a8e54c | ||
|
|
36d96c6264 | ||
|
|
340213ece5 | ||
|
|
032a8786ff | ||
|
|
15d671275f | ||
|
|
f3533c5f99 | ||
|
|
b18d7b6a2a | ||
|
|
2c23ab4c5d | ||
|
|
646add59b8 | ||
|
|
71651601ad | ||
|
|
cd111aeeec | ||
|
|
81b60ce86c | ||
|
|
356dd89147 | ||
|
|
a6102c1133 | ||
|
|
7dfa93f2a2 | ||
|
|
c6271557b1 | ||
|
|
d1f3a33194 | ||
|
|
c6371bf3b3 | ||
|
|
59bc7af00c | ||
|
|
a5737856c0 | ||
|
|
7d0944cfd1 | ||
|
|
099bcf8a17 | ||
|
|
4504f07a2a | ||
|
|
b5d8a641c6 | ||
|
|
11d3bf094a | ||
|
|
32c0f9719c | ||
|
|
b587a8f85e | ||
|
|
53d7d719f0 | ||
|
|
46c023920c | ||
|
|
816f15f976 | ||
|
|
853af40167 | ||
|
|
153204ecb1 | ||
|
|
62162c0f2a | ||
|
|
c7e66fb1aa | ||
|
|
89d42b9ef4 | ||
|
|
d0f76c5412 | ||
|
|
3dc943c89e | ||
|
|
f5589c368c | ||
|
|
469e082de1 | ||
|
|
a0430607d3 | ||
|
|
751b30688d | ||
|
|
b4b39e5088 | ||
|
|
ae26024890 | ||
|
|
8b055cd3c3 | ||
|
|
c9c8263c9e | ||
|
|
4000abfd0a | ||
|
|
995a647a34 | ||
|
|
fdadee6cef | ||
|
|
27f1feeaf6 | ||
|
|
debf3df61c | ||
|
|
ebf2ad206e | ||
|
|
b919df6d6b | ||
|
|
437d58f827 | ||
|
|
d0d9960f8d | ||
|
|
db9d1a1251 | ||
|
|
c16b0860ec | ||
|
|
f448f014f6 | ||
|
|
43da5a60fe | ||
|
|
41496d5ce3 | ||
|
|
4349f2659e | ||
|
|
e125164273 | ||
|
|
179f1d26ae | ||
|
|
bdfb7e296b | ||
|
|
a573ae70e5 | ||
|
|
345ae29ddb | ||
|
|
7359c52af1 | ||
|
|
2c8276f353 | ||
|
|
3ccdee2b9d | ||
|
|
97a106a025 | ||
|
|
7754f0b6a5 | ||
|
|
e16f7161c3 | ||
|
|
9b5cbf8258 | ||
|
|
51bebf1483 | ||
|
|
b758b70733 |
@@ -31,3 +31,4 @@ DATABASE_MANAGEMENT_ENABLED=1
|
||||
METRICS_ENABLED=0
|
||||
DELETE_MESSAGE_ENABLED=1
|
||||
COLLECTIBLES_ENABLED=1
|
||||
COMMANDS_ENABLED=1
|
||||
|
||||
@@ -68,7 +68,7 @@ Upgrade (e2e):
|
||||
- [ ] 3. Upload builds for DO store, https://dev.status.im/ (Jakub)
|
||||
|
||||
#### 5) At time of publishing
|
||||
- [ ] 1. Notify marketing to push comms and blog post (Jonny)
|
||||
- [ ] 1. Notify marketing to push comms and blog post (Jonny + get review on blog from QA team)
|
||||
- [ ] 2. Publish release to app store and playstore
|
||||
- [ ] 3. Final push to update prod site https://status.im/, [instructions](https://github.com/status-im/infra-docs/blob/master/articles/status_release_upload.md) (Jakub - requires credentials to upload)
|
||||
- [ ] 4. Add the link to the post about the release and publish the release: https://github.com/status-im/status-react/releases (Jakub)
|
||||
|
||||
@@ -42,7 +42,7 @@ export NIX_CONF_DIR = $(PWD)/nix
|
||||
# Location of symlinks to derivations that should not be garbage collected
|
||||
export _NIX_GCROOTS = /nix/var/nix/gcroots/per-user/$(USER)/status-react
|
||||
# Defines which variables will be kept for Nix pure shell, use semicolon as divider
|
||||
export _NIX_KEEP ?= TMPDIR,BUILD_ENV,STATUS_GO_SRC_OVERRIDE,NIMBUS_SRC_OVERRIDE
|
||||
export _NIX_KEEP ?= TMPDIR,BUILD_ENV,STATUS_GO_SRC_OVERRIDE
|
||||
|
||||
# Useful for Andoird release builds
|
||||
TMP_BUILD_NUMBER := $(shell ./scripts/version/gen_build_no.sh | cut -c1-10)
|
||||
@@ -57,13 +57,10 @@ endif
|
||||
# Nix targets
|
||||
#----------------
|
||||
|
||||
# WARNING: This has to be located right before the targets
|
||||
ifdef IN_NIX_SHELL
|
||||
SHELL := env bash
|
||||
else
|
||||
# WARNING: This has to be located right before all the targets.
|
||||
SHELL := ./nix/scripts/shell.sh
|
||||
endif
|
||||
|
||||
shell: export TARGET ?= default
|
||||
shell: ##@prepare Enter into a pre-configured shell
|
||||
ifndef IN_NIX_SHELL
|
||||
@ENTER_NIX_SHELL
|
||||
|
||||
+35
@@ -1,3 +1,38 @@
|
||||
## 1.18.0 Release notes :package:
|
||||
|
||||
### Features
|
||||
* 🚦Online status indicator <https://github.com/status-im/status-react/issues/12547>
|
||||
* 👛 Add possibility to select wallet for ENS names <https://github.com/status-im/status-react/pull/12761>
|
||||
* 🐞 Bug reporting and logs sharing improvements <https://github.com/status-im/status-react/pull/12773>
|
||||
* 🍳 Simplify Keycard onboarding by using defaults for pairing password <https://github.com/status-im/status-react/issues/12685>
|
||||
* 💾 Backup contacts via Waku <https://github.com/status-im/status-react/issues/12550>
|
||||
* 🪙 Added ENS token <https://github.com/status-im/status-react/issues/12807>
|
||||
* 🌠 Using react-native-fast-image for stickers <https://github.com/status-im/status-react/pull/12769>
|
||||
#### Message reliability improvements
|
||||
* 𝌗 Show loading until all messages are processed <https://github.com/status-im/status-react/pull/12834>
|
||||
* 💪🏼 More robust message confirmations handling <https://github.com/status-im/status-react/pull/12824>
|
||||
* 📶 Allow sending messages when offline <https://github.com/status-im/status-react/issues/11889>
|
||||
#### Improvements on device pairing
|
||||
* 🔔💻 Notification in activity centre now sync across devices <https://github.com/status-im/status-react/issues/12571>
|
||||
* ✅💻 Sync read messages across devices <https://github.com/status-im/status-react/pull/12698>
|
||||
#### Network settings improvements
|
||||
* ✨ Add Binance Smart chain <https://github.com/status-im/status-react/pull/12809>
|
||||
* ♏︎ Added custom network symbol <https://github.com/status-im/status-react/commit/c16b0860ec921a61c119857de27c6f29e301e4f6>
|
||||
* 💰 Network fee on xDai chain <https://github.com/status-im/status-react/pull/12845>
|
||||
* 📇 Support tx history (in a way) when on BSC chains <https://github.com/status-im/status-react/pull/12843>
|
||||
* 🙅🏻 Remove POA network from the list <https://github.com/status-im/status-react/pull/12887>
|
||||
|
||||
### Bug Fixes
|
||||
* Fix activity center community invite preview <https://github.com/status-im/status-react/pull/12803>
|
||||
* Missing notifications for some contacts <https://github.com/status-im/status-react/issues/12776>
|
||||
* Fixes scrolling issues on the 'Max priority fee' bottom sheet <https://github.com/status-im/status-react/issues/12530>
|
||||
* Handle Keycard timeout on iOS 15 <https://github.com/status-im/status-react/pull/12826>
|
||||
* Allow user to be reinvited to the same group after leaving <https://github.com/status-im/status-react/pull/12814>
|
||||
* Fix for "TypeError: Network request failed" when switching to Goerli network <https://github.com/status-im/status-react/issues/11964>
|
||||
* Fix for Spin of death on adding custom NFT token contract <https://github.com/status-im/status-react/issues/12365>
|
||||
* Changing screen orientation results in breaking images / layout <https://github.com/status-im/status-react/issues/12858>
|
||||
|
||||
|
||||
## 1.17
|
||||
|
||||
### For iOS and Android
|
||||
|
||||
Vendored
+12
@@ -64,3 +64,15 @@
|
||||
-dontwarn java.nio.file.*
|
||||
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
|
||||
-dontwarn okio.**
|
||||
|
||||
# fast-image
|
||||
|
||||
-keep public class com.dylanvann.fastimage.* {*;}
|
||||
-keep public class com.dylanvann.fastimage.** {*;}
|
||||
-keep public class * implements com.bumptech.glide.module.GlideModule
|
||||
-keep public class com.bumptech.glide.annotation.GlideModule
|
||||
-keep public class * extends com.bumptech.glide.module.AppGlideModule
|
||||
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
|
||||
**[] $VALUES;
|
||||
public *;
|
||||
}
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
library 'status-jenkins-lib@v1.3.3'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos-xcode-12.5' }
|
||||
agent { label 'macos && x86_64 && xcode-12.5' }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
|
||||
@@ -29,7 +29,7 @@ pipeline {
|
||||
name: 'HOST_LABEL',
|
||||
description: 'Label of host to run on',
|
||||
/* Using startTimeInMillis to randomize which host gets the update. */
|
||||
defaultValue: "macos-0${(currentBuild.startTimeInMillis % 3) + 1}",
|
||||
defaultValue: "maci7-0${(currentBuild.startTimeInMillis % 3) + 1}",
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+82
-70
@@ -1,62 +1,76 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.3)
|
||||
addressable (2.7.0)
|
||||
CFPropertyList (3.0.4)
|
||||
rexml
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
artifactory (3.0.15)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.1.1)
|
||||
aws-partitions (1.442.0)
|
||||
aws-sdk-core (3.113.1)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.525.0)
|
||||
aws-sdk-core (3.122.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-partitions (~> 1, >= 1.525.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.43.0)
|
||||
aws-sdk-core (~> 3, >= 3.112.0)
|
||||
aws-sdk-kms (1.51.0)
|
||||
aws-sdk-core (~> 3, >= 3.122.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.93.0)
|
||||
aws-sdk-core (~> 3, >= 3.112.0)
|
||||
aws-sdk-s3 (1.105.1)
|
||||
aws-sdk-core (~> 3, >= 3.122.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sigv4 (1.2.3)
|
||||
aws-sigv4 (~> 1.4)
|
||||
aws-sigv4 (1.4.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
claide (1.0.3)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
commander-fastlane (4.4.6)
|
||||
highline (~> 1.7.2)
|
||||
commander (4.6.0)
|
||||
highline (~> 2.0.0)
|
||||
declarative (0.0.20)
|
||||
declarative-option (0.1.0)
|
||||
digest-crc (0.6.3)
|
||||
digest-crc (0.6.4)
|
||||
rake (>= 12.0.0, < 14.0.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
dotenv (2.7.6)
|
||||
emoji_regex (3.2.2)
|
||||
excon (0.79.0)
|
||||
faraday (1.3.0)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.88.0)
|
||||
faraday (1.8.0)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
faraday-httpclient (~> 1.0.1)
|
||||
faraday-net_http (~> 1.0)
|
||||
faraday-net_http_persistent (~> 1.1)
|
||||
faraday-patron (~> 1.0)
|
||||
faraday-rack (~> 1.0)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
ruby2_keywords
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-cookie_jar (0.0.7)
|
||||
faraday (>= 0.8.0)
|
||||
http-cookie (~> 1.0.0)
|
||||
faraday-em_http (1.0.0)
|
||||
faraday-em_synchrony (1.0.0)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday_middleware (1.0.0)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.3)
|
||||
fastlane (2.179.0)
|
||||
fastimage (2.2.5)
|
||||
fastlane (2.197.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.3, < 3.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
aws-sdk-s3 (~> 1.0)
|
||||
babosa (>= 1.0.3, < 2.0.0)
|
||||
bundler (>= 1.12.0, < 3.0.0)
|
||||
colored
|
||||
commander-fastlane (>= 4.4.6, < 5.0.0)
|
||||
commander (~> 4.6)
|
||||
dotenv (>= 2.1.1, < 3.0.0)
|
||||
emoji_regex (>= 0.1, < 4.0)
|
||||
excon (>= 0.71.0, < 1.0.0)
|
||||
@@ -65,19 +79,20 @@ GEM
|
||||
faraday_middleware (~> 1.0)
|
||||
fastimage (>= 2.1.0, < 3.0.0)
|
||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||
google-api-client (>= 0.37.0, < 0.39.0)
|
||||
google-cloud-storage (>= 1.15.0, < 2.0.0)
|
||||
highline (>= 1.7.2, < 2.0.0)
|
||||
google-apis-androidpublisher_v3 (~> 0.3)
|
||||
google-apis-playcustomapp_v1 (~> 0.1)
|
||||
google-cloud-storage (~> 1.31)
|
||||
highline (~> 2.0)
|
||||
json (< 3.0.0)
|
||||
jwt (>= 2.1.0, < 3)
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multipart-post (~> 2.0.0)
|
||||
naturally (~> 2.2)
|
||||
optparse (~> 0.1.1)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
rubyzip (>= 2.0.0, < 3.0.0)
|
||||
security (= 0.1.3)
|
||||
simctl (~> 1.6.3)
|
||||
slack-notifier (>= 2.0.0, < 3.0.0)
|
||||
terminal-notifier (>= 2.0.0, < 3.0.0)
|
||||
terminal-table (>= 1.4.5, < 2.0.0)
|
||||
tty-screen (>= 0.6.3, < 1.0.0)
|
||||
@@ -90,75 +105,71 @@ GEM
|
||||
fastlane-plugin-diawi (2.1.0)
|
||||
rest-client (>= 2.0.0)
|
||||
gh_inspector (1.1.3)
|
||||
google-api-client (0.38.0)
|
||||
google-apis-androidpublisher_v3 (0.13.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-core (0.4.1)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (~> 0.9)
|
||||
httpclient (>= 2.8.1, < 3.0)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
mini_mime (~> 1.0)
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.0)
|
||||
signet (~> 0.12)
|
||||
google-apis-core (0.3.0)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (~> 0.14)
|
||||
httpclient (>= 2.8.1, < 3.0)
|
||||
mini_mime (~> 1.0)
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.0)
|
||||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
signet (~> 0.14)
|
||||
webrick
|
||||
google-apis-iamcredentials_v1 (0.3.0)
|
||||
google-apis-core (~> 0.1)
|
||||
google-apis-storage_v1 (0.3.0)
|
||||
google-apis-core (~> 0.1)
|
||||
google-apis-iamcredentials_v1 (0.8.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.6.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-storage_v1 (0.9.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.5.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
google-cloud-errors (1.1.0)
|
||||
google-cloud-storage (1.31.0)
|
||||
google-cloud-errors (1.2.0)
|
||||
google-cloud-storage (1.34.1)
|
||||
addressable (~> 2.5)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.1)
|
||||
google-cloud-core (~> 1.2)
|
||||
googleauth (~> 0.9)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (0.16.1)
|
||||
googleauth (1.1.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
multi_json (~> 1.11)
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (~> 0.14)
|
||||
highline (1.7.10)
|
||||
signet (>= 0.16, < 2.a)
|
||||
highline (2.0.3)
|
||||
http-accept (1.7.0)
|
||||
http-cookie (1.0.3)
|
||||
http-cookie (1.0.4)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.4.0)
|
||||
json (2.5.1)
|
||||
jwt (2.2.2)
|
||||
json (2.6.1)
|
||||
jwt (2.3.0)
|
||||
memoist (0.16.2)
|
||||
mime-types (3.3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2021.0225)
|
||||
mime-types-data (3.2021.0901)
|
||||
mini_magick (4.11.0)
|
||||
mini_mime (1.1.0)
|
||||
mini_mime (1.1.2)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.0.0)
|
||||
nanaimo (0.3.0)
|
||||
naturally (2.2.1)
|
||||
netrc (0.11.0)
|
||||
os (1.1.1)
|
||||
optparse (0.1.1)
|
||||
os (1.1.4)
|
||||
plist (3.6.0)
|
||||
public_suffix (4.0.6)
|
||||
rake (13.0.3)
|
||||
representable (3.0.4)
|
||||
rake (13.0.6)
|
||||
representable (3.1.1)
|
||||
declarative (< 0.1.0)
|
||||
declarative-option (< 0.2.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
rest-client (2.1.0)
|
||||
http-accept (>= 1.7.0, < 2.0)
|
||||
@@ -168,21 +179,21 @@ GEM
|
||||
retriable (3.1.2)
|
||||
rexml (3.2.5)
|
||||
rouge (2.0.7)
|
||||
ruby2_keywords (0.0.4)
|
||||
rubyzip (2.3.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
security (0.1.3)
|
||||
signet (0.15.0)
|
||||
addressable (~> 2.3)
|
||||
signet (0.16.0)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.5, < 3.0)
|
||||
multi_json (~> 1.10)
|
||||
simctl (1.6.8)
|
||||
CFPropertyList
|
||||
naturally
|
||||
slack-notifier (2.3.2)
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (1.8.0)
|
||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||
trailblazer-option (0.1.2)
|
||||
tty-cursor (0.7.1)
|
||||
tty-screen (0.8.1)
|
||||
tty-spinner (0.9.3)
|
||||
@@ -190,16 +201,17 @@ GEM
|
||||
uber (0.1.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.7.7)
|
||||
unicode-display_width (1.7.0)
|
||||
unf_ext (0.0.8)
|
||||
unicode-display_width (1.8.0)
|
||||
webrick (1.7.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.19.0)
|
||||
xcodeproj (1.21.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.3.0)
|
||||
rexml (~> 3.2.4)
|
||||
xcpretty (0.3.0)
|
||||
rouge (~> 2.0.7)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
|
||||
+186
-104
@@ -5,10 +5,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1fvchp2rhp2rmigx7qglf69xvjqvzq7x0g49naliw29r2bz656sy";
|
||||
sha256 = "022r3m9wdxljpbya69y2i3h9g3dhhfaqzidf95m6qjzms792jvgp";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.7.0";
|
||||
version = "2.8.0";
|
||||
};
|
||||
artifactory = {
|
||||
groups = ["default"];
|
||||
@@ -35,20 +35,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0jfki5ikfr8ln5cdgv4iv1643kax0bjpp29jh78chzy713274jh3";
|
||||
sha256 = "1pyis1nvnbjxk12a43xvgj2gv0mvp4cnkc1gzw0v1018r61399gz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.1";
|
||||
version = "1.2.0";
|
||||
};
|
||||
aws-partitions = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0lm08fmahg3m87vbsfv73iswgvicdwcxfmkzr6v9qshlkg36lafd";
|
||||
sha256 = "181a2xf9zs0hz77jkpmxidvkjzs65vsyqv1a31fcali7f0kvh4h9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.442.0";
|
||||
version = "1.525.0";
|
||||
};
|
||||
aws-sdk-core = {
|
||||
dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"];
|
||||
@@ -56,10 +56,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0i3x8p9gymc9977dcdkz5ca6mrmh7ym6p2mrscbh49nfd9gi5zg0";
|
||||
sha256 = "0krx8cfajc72gv6mpyb67vnhd2m2iya19846jgipgfris194gjm2";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.113.1";
|
||||
version = "3.122.0";
|
||||
};
|
||||
aws-sdk-kms = {
|
||||
dependencies = ["aws-sdk-core" "aws-sigv4"];
|
||||
@@ -67,10 +67,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "01pd0f4srsa65zl4zq4014p9j5yrr2yy9h9ab17g3w9d0qqm2vsh";
|
||||
sha256 = "0qac9dd6qriz6ldghkr8ga74zz28jl109kmvhvag74a3qf7k9dwj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.43.0";
|
||||
version = "1.51.0";
|
||||
};
|
||||
aws-sdk-s3 = {
|
||||
dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"];
|
||||
@@ -78,10 +78,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0iy2f9z43pc6fgwmga2cz8nf9gy2pwcw4jib141vp8z8dhylqj94";
|
||||
sha256 = "12j7i6l52b6hsnj59grn0m1s9pn6l38zmra6ad8i12vdsvd185w7";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.93.0";
|
||||
version = "1.105.1";
|
||||
};
|
||||
aws-sigv4 = {
|
||||
dependencies = ["aws-eventstream"];
|
||||
@@ -89,10 +89,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1d9zhmi3mpfzkkpg7yw7s9r1dwk157kh9875j3c7gh6cy95lmmaw";
|
||||
sha256 = "1wh1y79v0s4zgby2m79bnifk65hwf5pvk2yyrxzn2jkjjq8f8fqa";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.3";
|
||||
version = "1.4.0";
|
||||
};
|
||||
babosa = {
|
||||
groups = ["default"];
|
||||
@@ -105,14 +105,15 @@
|
||||
version = "1.0.4";
|
||||
};
|
||||
CFPropertyList = {
|
||||
dependencies = ["rexml"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0ia09r8bj3bjhcfiyr3vlk9zx7vahfypbs2lyrxix9x1jx3lfzq4";
|
||||
sha256 = "00s388z1akvj2j77ylr1mgp02zxp4ybcgc4ds3bz4647dfk0cwxk";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.3";
|
||||
version = "3.0.4";
|
||||
};
|
||||
claide = {
|
||||
groups = ["default"];
|
||||
@@ -144,16 +145,16 @@
|
||||
};
|
||||
version = "3.1.2";
|
||||
};
|
||||
commander-fastlane = {
|
||||
commander = {
|
||||
dependencies = ["highline"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0y8d3ac9qwm1cg6rnpf8rcdsy1yxacrd2g2kl809xsp2vi973g65";
|
||||
sha256 = "1n8k547hqq9hvbyqbx2qi08g0bky20bbjca1df8cqq5frhzxq7bx";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.4.6";
|
||||
version = "4.6.0";
|
||||
};
|
||||
declarative = {
|
||||
groups = ["default"];
|
||||
@@ -165,26 +166,16 @@
|
||||
};
|
||||
version = "0.0.20";
|
||||
};
|
||||
declarative-option = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1g4ibxq566f1frnhdymzi9hxxcm4g2gw4n21mpjk2mhwym4q6l0p";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.1.0";
|
||||
};
|
||||
digest-crc = {
|
||||
dependencies = ["rake"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "118d5p02kdw6a5pi8af12dxma7q3b77zz5q5xjjf5kgp8qh1930a";
|
||||
sha256 = "1czaak53w8n13y1fr0q23gp0fhklvxjac5n562qj3xk6sh5ad0x2";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.6.3";
|
||||
version = "0.6.4";
|
||||
};
|
||||
domain_name = {
|
||||
dependencies = ["unf"];
|
||||
@@ -212,31 +203,31 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15xqimc9dr9yyrf09dy8g60s65bvgg6xyyr7q74352r9vhwyg357";
|
||||
sha256 = "0jsnrkfy345v66jlm2xrz8znivfnamg3mfzkddn414bndf2vxn7c";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2.2";
|
||||
version = "3.2.3";
|
||||
};
|
||||
excon = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1759s0rz6qgsw86dds1z4jzb3fvizqsk11j5q6z7lc5n404w6i23";
|
||||
sha256 = "15yrwawhvkjvfg0dsf8z81876ddj6161q0wh5s7pw4sim8z8pspr";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.79.0";
|
||||
version = "0.88.0";
|
||||
};
|
||||
faraday = {
|
||||
dependencies = ["faraday-net_http" "multipart-post" "ruby2_keywords"];
|
||||
dependencies = ["faraday-em_http" "faraday-em_synchrony" "faraday-excon" "faraday-httpclient" "faraday-net_http" "faraday-net_http_persistent" "faraday-patron" "faraday-rack" "multipart-post" "ruby2_keywords"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1hmssd8pj4n7yq4kz834ylkla8ryyvhaap6q9nzymp93m1xq21kz";
|
||||
sha256 = "0afhlqgby2cizcwgh7h2sq5f77q01axjbdl25bsvfwsry9n7gyyi";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.3.0";
|
||||
version = "1.8.0";
|
||||
};
|
||||
faraday-cookie_jar = {
|
||||
dependencies = ["faraday" "http-cookie"];
|
||||
@@ -249,6 +240,46 @@
|
||||
};
|
||||
version = "0.0.7";
|
||||
};
|
||||
faraday-em_http = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "12cnqpbak4vhikrh2cdn94assh3yxza8rq2p9w2j34bqg5q4qgbs";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-em_synchrony = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1vgrbhkp83sngv6k4mii9f2s9v5lmp693hylfxp2ssfc60fas3a6";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-excon = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
};
|
||||
faraday-httpclient = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0fyk0jd3ks7fdn8nv3spnwjpzx2lmxmg2gh4inz3by1zjzqg33sc";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
};
|
||||
faraday-net_http = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -259,37 +290,67 @@
|
||||
};
|
||||
version = "1.0.1";
|
||||
};
|
||||
faraday-net_http_persistent = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0dc36ih95qw3rlccffcb0vgxjhmipsvxhn6cw71l7ffs0f7vq30b";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.0";
|
||||
};
|
||||
faraday-patron = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "19wgsgfq0xkski1g7m96snv39la3zxz6x7nbdgiwhg5v82rxfb6w";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-rack = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1h184g4vqql5jv9s9im6igy00jp6mrah2h14py6mpf9bkabfqq7g";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday_middleware = {
|
||||
dependencies = ["faraday"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0jik2kgfinwnfi6fpp512vlvs0mlggign3gkbpkg5fw1jr9his0r";
|
||||
sha256 = "1bw8mfh4yin2xk7138rg3fhb2p5g2dlmdma88k82psah9mbmvlfy";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
version = "1.2.0";
|
||||
};
|
||||
fastimage = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0lgr0vs9kg5622qaf2l3f37b238dncs037fisiygvkbq8sg11i68";
|
||||
sha256 = "05i1fgqy4l40niwm9y56d04f876sm0cvc7q3w2rpddf8gya4lcs9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.3";
|
||||
version = "2.2.5";
|
||||
};
|
||||
fastlane = {
|
||||
dependencies = ["CFPropertyList" "addressable" "artifactory" "aws-sdk-s3" "babosa" "colored" "commander-fastlane" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-api-client" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multipart-post" "naturally" "plist" "rubyzip" "security" "simctl" "slack-notifier" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
|
||||
dependencies = ["CFPropertyList" "addressable" "artifactory" "aws-sdk-s3" "babosa" "colored" "commander" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-apis-androidpublisher_v3" "google-apis-playcustomapp_v1" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multipart-post" "naturally" "optparse" "plist" "rubyzip" "security" "simctl" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1wspwgc1q31049a20k2gnzmizdvq4jdmzyd2fnz7r4g68fygj3sj";
|
||||
sha256 = "1qlvg0sca8j1ryzxpvnmpjnh3fwmv6sk8l7mr9mv34z8rdy1iv3x";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.179.0";
|
||||
version = "2.197.0";
|
||||
};
|
||||
fastlane-plugin-clean_testflight_testers = {
|
||||
groups = ["default"];
|
||||
@@ -322,27 +383,27 @@
|
||||
};
|
||||
version = "1.1.3";
|
||||
};
|
||||
google-api-client = {
|
||||
dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "signet"];
|
||||
google-apis-androidpublisher_v3 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1jybks8i00rxrxx9mkx90dbdk6pczh2w757wchlavmrkrk0dp9s1";
|
||||
sha256 = "1nxgda00y080xdavxs6nv5h2grwamds33b25nkjb4mij7385brs1";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.38.0";
|
||||
version = "0.13.0";
|
||||
};
|
||||
google-apis-core = {
|
||||
dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "rexml" "signet" "webrick"];
|
||||
dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "rexml" "webrick"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1jx4jiyfjxd8pxlpi94f07cb5yvljb5rv7i8xzjq2xrrlvdf212a";
|
||||
sha256 = "1nzzj66clgr9ldmbjqkzgpvqmd6bjjmbw6khpgq80mp3gks4ycqy";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.3.0";
|
||||
version = "0.4.1";
|
||||
};
|
||||
google-apis-iamcredentials_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
@@ -350,10 +411,21 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1gqpxcc0cjv4838q38g3mx9pgk7681w6irr6zwcygvnvbsvbbpsh";
|
||||
sha256 = "0slpmdjsxbjdqs7qwkyfk3sdnfy5wliwf89jy8hq7l87a31r7lvk";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.3.0";
|
||||
version = "0.8.0";
|
||||
};
|
||||
google-apis-playcustomapp_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0v9y6avlnwxwv4vahhygrsmrpmric4zg8sxjd26vhhlxw6g8955b";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.6.0";
|
||||
};
|
||||
google-apis-storage_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
@@ -361,10 +433,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0q6d5grhrkyfxmzlv0y39i6wzq5ayq1lkp33vfcg9pm8jyzcz7b2";
|
||||
sha256 = "0y6gyqj2cwsbdxk7wsrjzp9jz2hn2bk1zi1jjm5k311c3jlnj0r1";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.3.0";
|
||||
version = "0.9.0";
|
||||
};
|
||||
google-cloud-core = {
|
||||
dependencies = ["google-cloud-env" "google-cloud-errors"];
|
||||
@@ -393,10 +465,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0q3h996b6vl2ryfbm9jwczjcbnwhkpqs6hingxp22rhzk7qxi9z0";
|
||||
sha256 = "0nakfswnck6grjpyhckzl40qccyys3sy999h5axk0rldx96fnivd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
version = "1.2.0";
|
||||
};
|
||||
google-cloud-storage = {
|
||||
dependencies = ["addressable" "digest-crc" "google-apis-iamcredentials_v1" "google-apis-storage_v1" "google-cloud-core" "googleauth" "mini_mime"];
|
||||
@@ -404,10 +476,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1bjkwnsii4svw2g09xjqpkq3mck820kj9nhx3vlv7rjmlh3bg68s";
|
||||
sha256 = "1pvcpqx64cxm05dzr9q7zxrymjq4jk46ifd1p4b6c9v3v0c9ipb5";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.31.0";
|
||||
version = "1.34.1";
|
||||
};
|
||||
googleauth = {
|
||||
dependencies = ["faraday" "jwt" "memoist" "multi_json" "os" "signet"];
|
||||
@@ -415,20 +487,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1438alhx4n4rdgf6q7ni8qj1b10y8lr9z9spphhjyhacby1ifsjn";
|
||||
sha256 = "12zm6r7jxqv8k1a4iyijq2gcywk2d62nizbnabwsnhnzxwxwxc3s";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.16.1";
|
||||
version = "1.1.0";
|
||||
};
|
||||
highline = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "01ib7jp85xjc4gh4jg0wyzllm46hwv8p0w1m4c75pbgi41fps50y";
|
||||
sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.7.10";
|
||||
version = "2.0.3";
|
||||
};
|
||||
http-accept = {
|
||||
groups = ["default"];
|
||||
@@ -446,10 +518,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g";
|
||||
sha256 = "19370bc97gsy2j4hanij246hv1ddc85hw0xjb6sj7n1ykqdlx9l9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.3";
|
||||
version = "1.0.4";
|
||||
};
|
||||
httpclient = {
|
||||
groups = ["default"];
|
||||
@@ -476,20 +548,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0lrirj0gw420kw71bjjlqkqhqbrplla61gbv1jzgsz6bv90qr3ci";
|
||||
sha256 = "1z9grvjyfz16ag55hg522d3q4dh07hf391sf9s96npc0vfi85xkz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.5.1";
|
||||
version = "2.6.1";
|
||||
};
|
||||
jwt = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "14ynyq1q483spj20ffl4xayfqx1a8qr761mqjfxczf8lwlap392n";
|
||||
sha256 = "0bg8pjx0mpvl10k6d8a6gc8dzlv2z5jkqcjbjcirnk032iriq838";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.2";
|
||||
version = "2.3.0";
|
||||
};
|
||||
memoist = {
|
||||
groups = ["default"];
|
||||
@@ -517,10 +589,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1phcq7z0zpipwd7y4fbqmlaqghv07fjjgrx99mwq3z3n0yvy7fmi";
|
||||
sha256 = "1z5wvk6qi4ws1kjh7xn1rfirqw5m72bwvqacck1fjpbh33pcrwxv";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2021.0225";
|
||||
version = "3.2021.0901";
|
||||
};
|
||||
mini_magick = {
|
||||
groups = ["default"];
|
||||
@@ -537,10 +609,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0kb7jq3wjgckmkzna799y5qmvn6vg52878bkgw35qay6lflcrwih";
|
||||
sha256 = "0lbim375gw2dk6383qirz13hgdmxlan0vc5da2l072j3qw6fqjm5";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
version = "1.1.2";
|
||||
};
|
||||
multi_json = {
|
||||
groups = ["default"];
|
||||
@@ -592,15 +664,25 @@
|
||||
};
|
||||
version = "0.11.0";
|
||||
};
|
||||
optparse = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0j9l5a1zszvrlggp1ldx82i4kkqx34g4g3amwp488s499w5l1cvj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.1.1";
|
||||
};
|
||||
os = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "12fli64wz5j9868gpzv5wqsingk1jk457qyqksv9ksmq9b0zpc9x";
|
||||
sha256 = "0gwd20smyhxbm687vdikfh1gpi96h8qb1x28s2pdcysf6dm6v0ap";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.1";
|
||||
version = "1.1.4";
|
||||
};
|
||||
plist = {
|
||||
groups = ["default"];
|
||||
@@ -627,21 +709,21 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1iik52mf9ky4cgs38fp2m8r6skdkq1yz23vh18lk95fhbcxb6a67";
|
||||
sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w";
|
||||
type = "gem";
|
||||
};
|
||||
version = "13.0.3";
|
||||
version = "13.0.6";
|
||||
};
|
||||
representable = {
|
||||
dependencies = ["declarative" "declarative-option" "uber"];
|
||||
dependencies = ["declarative" "trailblazer-option" "uber"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0qm9rgi1j5a6nv726ka4mmixivlxfsg91h8rpp72wwd4vqbkkm07";
|
||||
sha256 = "09xwzz94ryp57wyjrqysiz1sslnxd4r4m9wayy63jb7f8qfx1kys";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.4";
|
||||
version = "3.1.1";
|
||||
};
|
||||
rest-client = {
|
||||
dependencies = ["http-accept" "http-cookie" "mime-types" "netrc"];
|
||||
@@ -689,20 +771,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15wfcqxyfgka05v2a7kpg64x57gl1y4xzvnc9lh60bqx5sf1iqrs";
|
||||
sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.4";
|
||||
version = "0.0.5";
|
||||
};
|
||||
rubyzip = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0590m2pr9i209pp5z4mx0nb1961ishdiqb28995hw1nln1d1b5ji";
|
||||
sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.3.0";
|
||||
version = "2.3.2";
|
||||
};
|
||||
security = {
|
||||
groups = ["default"];
|
||||
@@ -720,10 +802,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1vvxmfm9khxp35xs8qxc82i7hakylxbn7kx4apinvxaid6rlq60g";
|
||||
sha256 = "0cgmadrpgkpcklvvm2cga9mnrfqwqlydwpask1wx617h5ha6954k";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.15.0";
|
||||
version = "0.16.0";
|
||||
};
|
||||
simctl = {
|
||||
dependencies = ["CFPropertyList" "naturally"];
|
||||
@@ -736,16 +818,6 @@
|
||||
};
|
||||
version = "1.6.8";
|
||||
};
|
||||
slack-notifier = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1pkfn99dhy5s526r6k8d87fwwb6j287ga9s7lxqmh60z28xqh3bv";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.3.2";
|
||||
};
|
||||
terminal-notifier = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -767,6 +839,16 @@
|
||||
};
|
||||
version = "1.8.0";
|
||||
};
|
||||
trailblazer-option = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "18s48fndi2kfvrfzmq6rxvjfwad347548yby0341ixz1lhpg3r10";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.1.2";
|
||||
};
|
||||
tty-cursor = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -824,20 +906,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0wc47r23h063l8ysws8sy24gzh74mks81cak3lkzlrw4qkqb3sg4";
|
||||
sha256 = "0jmbimpnpjdzz8hlrppgl9spm99qh3qzbx0b81k3gkgwba8nk3yd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.7.7";
|
||||
version = "0.0.8";
|
||||
};
|
||||
unicode-display_width = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "06i3id27s60141x6fdnjn5rar1cywdwy64ilc59cz937303q3mna";
|
||||
sha256 = "1204c1jx2g89pc25qk5150mk7j5k90692i7ihgfzqnad6qni74h2";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.7.0";
|
||||
version = "1.8.0";
|
||||
};
|
||||
webrick = {
|
||||
groups = ["default"];
|
||||
@@ -860,15 +942,15 @@
|
||||
version = "1.0.0";
|
||||
};
|
||||
xcodeproj = {
|
||||
dependencies = ["CFPropertyList" "atomos" "claide" "colored2" "nanaimo"];
|
||||
dependencies = ["CFPropertyList" "atomos" "claide" "colored2" "nanaimo" "rexml"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1411j6sfnz0cx4fiw52f0yqx4bgcn8cmpgi3i5rwmmahayyjz2fn";
|
||||
sha256 = "0xmzb1mdsnkpf7v07whz0n2wc8kg6785sc7i5zyawd8dl8517rp4";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.19.0";
|
||||
version = "1.21.0";
|
||||
};
|
||||
xcpretty = {
|
||||
dependencies = ["rouge"];
|
||||
|
||||
+32
-3
@@ -25,6 +25,15 @@ PODS:
|
||||
- Keycard (3.0.4):
|
||||
- CryptoSwift
|
||||
- secp256k1
|
||||
- libwebp (1.2.1):
|
||||
- libwebp/demux (= 1.2.1)
|
||||
- libwebp/mux (= 1.2.1)
|
||||
- libwebp/webp (= 1.2.1)
|
||||
- libwebp/demux (1.2.1):
|
||||
- libwebp/webp
|
||||
- libwebp/mux (1.2.1):
|
||||
- libwebp/demux
|
||||
- libwebp/webp (1.2.1)
|
||||
- Permission-Camera (2.1.5):
|
||||
- RNPermissions
|
||||
- Permission-Microphone (2.1.5):
|
||||
@@ -221,7 +230,7 @@ PODS:
|
||||
- React
|
||||
- react-native-status (1.0.0):
|
||||
- React
|
||||
- react-native-status-keycard (2.5.35):
|
||||
- react-native-status-keycard (2.5.36):
|
||||
- Keycard
|
||||
- React
|
||||
- react-native-webview (11.3.0):
|
||||
@@ -309,6 +318,10 @@ PODS:
|
||||
- React
|
||||
- RNDeviceInfo (7.4.0):
|
||||
- React-Core
|
||||
- RNFastImage (8.5.11):
|
||||
- React-Core
|
||||
- SDWebImage (~> 5.11.1)
|
||||
- SDWebImageWebPCoder (~> 0.8.4)
|
||||
- RNFS (2.16.6):
|
||||
- React
|
||||
- RNGestureHandler (1.8.0):
|
||||
@@ -363,6 +376,12 @@ PODS:
|
||||
- React-Core
|
||||
- RNSVG (9.13.6):
|
||||
- React
|
||||
- SDWebImage (5.11.1):
|
||||
- SDWebImage/Core (= 5.11.1)
|
||||
- SDWebImage/Core (5.11.1)
|
||||
- SDWebImageWebPCoder (0.8.4):
|
||||
- libwebp (~> 1.0)
|
||||
- SDWebImage/Core (~> 5.10)
|
||||
- secp256k1 (0.1.6)
|
||||
- SQLCipher (3.4.2):
|
||||
- SQLCipher/standard (= 3.4.2)
|
||||
@@ -429,6 +448,7 @@ DEPENDENCIES:
|
||||
- "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`)
|
||||
- RNImageCropPicker (from `../node_modules/react-native-image-crop-picker`)
|
||||
@@ -449,6 +469,9 @@ SPEC REPOS:
|
||||
trunk:
|
||||
- boost-for-react-native
|
||||
- CryptoSwift
|
||||
- libwebp
|
||||
- SDWebImage
|
||||
- SDWebImageWebPCoder
|
||||
- SQLCipher
|
||||
- SSZipArchive
|
||||
- TOCropViewController
|
||||
@@ -556,6 +579,8 @@ EXTERNAL SOURCES:
|
||||
: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:
|
||||
:path: "../node_modules/react-native-fs"
|
||||
RNGestureHandler:
|
||||
@@ -586,7 +611,7 @@ EXTERNAL SOURCES:
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
Keycard:
|
||||
:commit: abf2be41c70846ab6f11c8bd445faf81b0befc1f
|
||||
:commit: d5bb5d68dbac19a34945918b51873fbba2c18310
|
||||
:git: https://github.com/status-im/Keycard.swift.git
|
||||
secp256k1:
|
||||
:commit: 46a1fa30d9b8babeae85ff519050f42394ab5fcc
|
||||
@@ -603,6 +628,7 @@ SPEC CHECKSUMS:
|
||||
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
|
||||
glog: 5bc68409594b19a3e5c5cbced7b1ecf61053b709
|
||||
Keycard: dd96182888da0aacf4de821b641103143bbb26cc
|
||||
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
|
||||
Permission-Camera: afad27bf90337684d4a86f3825112d648c8c4d3b
|
||||
Permission-Microphone: 0ffabc3fe1c75cfb260525ee3f529383c9f4368c
|
||||
RCTRequired: 082f10cd3f905d6c124597fd1c14f6f2655ff65e
|
||||
@@ -627,7 +653,7 @@ SPEC CHECKSUMS:
|
||||
react-native-slider: 12bd76d3d568c9c5500825db54123d44b48e4ad4
|
||||
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
|
||||
react-native-status: 45dbf1302ce3c258b459dfab137cd1c2c68c295d
|
||||
react-native-status-keycard: de55c01648d24ff7c17a77f3aa29a0421f44143c
|
||||
react-native-status-keycard: eb84554a23315510948613a9467e7e3481be340c
|
||||
react-native-webview: af9990b21a9aeafa8e8347746eb4116c0de086af
|
||||
React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336
|
||||
React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b
|
||||
@@ -647,6 +673,7 @@ SPEC CHECKSUMS:
|
||||
RNCMaskedView: 71fc32d971f03b7f03d6ab6b86b730c4ee64f5b6
|
||||
RNCPushNotificationIOS: c145c6253ea016e5efeff604f2720736b4a596f7
|
||||
RNDeviceInfo: 9538a884f862fe4aa0d7cead9f34e292d41ba8f6
|
||||
RNFastImage: 1f2cab428712a4baaf78d6169eaec7f622556dd7
|
||||
RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df
|
||||
RNGestureHandler: 7a5833d0f788dbd107fbb913e09aa0c1ff333c39
|
||||
RNImageCropPicker: 35a3ceb837446fa11547704709bb22b5fac6d584
|
||||
@@ -657,6 +684,8 @@ SPEC CHECKSUMS:
|
||||
RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c
|
||||
RNShare: 2dc2fcac3f7321cfd6b60a23ed4bf4d549f86f5f
|
||||
RNSVG: 8ba35cbeb385a52fd960fd28db9d7d18b4c2974f
|
||||
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
|
||||
SDWebImageWebPCoder: f93010f3f6c031e2f8fb3081ca4ee6966c539815
|
||||
secp256k1: f61d67e6fdcb85fd727acf1bf35ace6036db540c
|
||||
SQLCipher: f9fcf29b2e59ced7defc2a2bdd0ebe79b40d4990
|
||||
SSZipArchive: e7b4f3d9e780c2acc1764cd88fbf2de28f26e5b2
|
||||
|
||||
@@ -460,6 +460,7 @@ RCT_EXPORT_METHOD(saveAccountAndLogin:(NSString *)multiaccountData
|
||||
#if DEBUG
|
||||
NSLog(@"SaveAccountAndLogin() method called");
|
||||
#endif
|
||||
[self getExportDbFilePath];
|
||||
NSString *keyUID = [self getKeyUID:multiaccountData];
|
||||
NSString *finalConfig = [self prepareDirAndUpdateConfig:config
|
||||
withKeyUID:keyUID];
|
||||
@@ -477,6 +478,7 @@ RCT_EXPORT_METHOD(saveAccountAndLoginWithKeycard:(NSString *)multiaccountData
|
||||
#if DEBUG
|
||||
NSLog(@"SaveAccountAndLoginWithKeycard() method called");
|
||||
#endif
|
||||
[self getExportDbFilePath];
|
||||
NSString *keyUID = [self getKeyUID:multiaccountData];
|
||||
NSString *finalConfig = [self prepareDirAndUpdateConfig:config
|
||||
withKeyUID:keyUID];
|
||||
@@ -484,6 +486,17 @@ RCT_EXPORT_METHOD(saveAccountAndLoginWithKeycard:(NSString *)multiaccountData
|
||||
NSLog(@"%@", result);
|
||||
}
|
||||
|
||||
- (NSString *) getExportDbFilePath {
|
||||
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"export.db"];
|
||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||
|
||||
if ([fileManager fileExistsAtPath:filePath]) {
|
||||
[fileManager removeItemAtPath:filePath error:nil];
|
||||
}
|
||||
|
||||
return filePath;
|
||||
}
|
||||
|
||||
- (NSURL *) getKeyStoreDir:(NSString *)keyUID {
|
||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||
NSURL *rootUrl =[[fileManager
|
||||
@@ -523,6 +536,7 @@ RCT_EXPORT_METHOD(login:(NSString *)accountData
|
||||
#if DEBUG
|
||||
NSLog(@"Login() method called");
|
||||
#endif
|
||||
[self getExportDbFilePath];
|
||||
[self migrateKeystore:accountData password:password];
|
||||
NSString *result = StatusgoLogin(accountData, password);
|
||||
NSLog(@"%@", result);
|
||||
@@ -535,6 +549,7 @@ RCT_EXPORT_METHOD(loginWithKeycard:(NSString *)accountData
|
||||
#if DEBUG
|
||||
NSLog(@"LoginWithKeycard() method called");
|
||||
#endif
|
||||
[self getExportDbFilePath];
|
||||
[self migrateKeystore:accountData password:password];
|
||||
|
||||
NSString *result = StatusgoLoginWithKeycard(accountData, password, chatKey);
|
||||
@@ -858,8 +873,8 @@ RCT_EXPORT_METHOD(exportUnencryptedDatabase:(NSString *)accountData
|
||||
#if DEBUG
|
||||
NSLog(@"exportUnencryptedDatabase() method called");
|
||||
#endif
|
||||
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"export.db"];
|
||||
|
||||
NSString *filePath = [self getExportDbFilePath];
|
||||
StatusgoExportUnencryptedDatabase(accountData, password, filePath);
|
||||
|
||||
callback(@[filePath]);
|
||||
|
||||
+2
-2
@@ -47,9 +47,9 @@ It pulls in all the `pkgs`, `targets` and `shells` defined in [`nix/default.nix`
|
||||
|
||||
# Shells
|
||||
|
||||
Normally shells are started using `make shell TARGET=android`, but that is essentially the same as calling:
|
||||
Normally shells are started using `make shell TARGET=default`, but that is essentially the same as calling:
|
||||
```bash
|
||||
nix-shell -A shells.android default.nix
|
||||
nix-shell -A shells.default default.nix
|
||||
```
|
||||
The [`nix/scripts/shell.sh`](./scripts/shell.sh) script is essentially a wrapper around that command to make it usable as shell for the `Makefile`.
|
||||
|
||||
|
||||
@@ -47,6 +47,8 @@ This way your shell and all other nix commands should run in a setup that is tai
|
||||
|
||||
For valid values you can check the [`nix/shells.nix`](/nix/shells.nix) file.
|
||||
|
||||
:warning: __WARNING__: To have Nix pick up all changes a new `nix-shell` needs to be spawned.
|
||||
|
||||
## Using a local status-go repository
|
||||
|
||||
If you need to use a locally checked-out status-go repository, you can achieve that by defining the `STATUS_GO_SRC_OVERRIDE`
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
abi-include = "armeabi-v7a;arm64-v8a;x86"; # Android architectures to build for
|
||||
};
|
||||
|
||||
nimbus = { src-override = null; };
|
||||
status-go = { src-override = null; };
|
||||
};
|
||||
|
||||
|
||||
+162
-26
@@ -601,6 +601,20 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "androidx/exifinterface/exifinterface/1.2.0/exifinterface-1.2.0",
|
||||
"host": "https://dl.google.com/dl/android/maven2",
|
||||
"type": "aar",
|
||||
"pom": {
|
||||
"sha1": "34832395bc9a4fe2aafdd73605ddf9da9f842e7a",
|
||||
"sha256": "1qi9p1nmdw8d0wpy0nmakvnpj4hgb0xf3aicd8qzn0nclszr2zkg"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "e8a2f661f33bbfa8e9d226aa5dacae90aedf2fc9",
|
||||
"sha256": "19xf8zwzxlvq2l4qfwfijasjpv3jlz5ylmh5cykpbr4m618qxrma"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "androidx/fragment/fragment/1.0.0/fragment-1.0.0",
|
||||
"host": "https://dl.google.com/dl/android/maven2",
|
||||
@@ -5473,6 +5487,90 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/bumptech/glide/annotations/4.12.0/annotations-4.12.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "94d5a495b107bd421804a296c9073439402c0996",
|
||||
"sha256": "0r1f6n03hrh7m0br3wzx81bz8addxk2pgc0cnfw2bx1n46d469z4"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "298d793db124809d74ad9a90de5eddc408898c84",
|
||||
"sha256": "13nyz9h7ibplz14nybkcmk464kgg8iasp5c1qf4ws7wkiyzhqhzs"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/bumptech/glide/compiler/4.12.0/compiler-4.12.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "4a090fcf1fe6ec3782581efc517a8f621e85a804",
|
||||
"sha256": "121xrlvir16f38k7qif0c311l2ccivxaqsq6sr4csdd1jgs25agc"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "75cf5e43fd6e6c6e769e060014feb985284cfae7",
|
||||
"sha256": "16n94cf2d7sba5r6kzh8sqvvaikl5ph9an6lz4pdabd579rrf0h3"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/bumptech/glide/disklrucache/4.12.0/disklrucache-4.12.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "0c90a83f7490992222d8bf7227b35e6bc0e4f552",
|
||||
"sha256": "1m0a7yiafry9g84vgqmaznxqhs0sg008vya13i2ckhbcky2nblk4"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "6d44c9103551e3ff51f00ac26077c143a8fb74f9",
|
||||
"sha256": "0yb38pnjbsb8qc5c4hffp40a4gihj0g65gwdwwp5ib26jq3cj33g"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/bumptech/glide/gifdecoder/4.12.0/gifdecoder-4.12.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "aar",
|
||||
"pom": {
|
||||
"sha1": "9105e854c39f7d5dbcfd04f644a243f31e48033d",
|
||||
"sha256": "1s9qsf8awvnrr3a5ia7ppcj2vx51pnqwd8mvdmqjdl5y0w3vv4w1"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "a00cc6741d9f7cf025dd93293c724a688c47631e",
|
||||
"sha256": "0158p9w1w80m8fmnzff23n89n8lkw9s3kh9hn81almb8nzaiqyhr"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/bumptech/glide/glide/4.12.0/glide-4.12.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "aar",
|
||||
"pom": {
|
||||
"sha1": "74ef469a4966c69ec7346df8b3895ac11474f8be",
|
||||
"sha256": "1h5qbi06valf58madv01zlapny64368r17x21lck54wy2dr4hvgx"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "3f57db6cc954212739bb0d693ec48ecbc8ab73c4",
|
||||
"sha256": "11432hpyjc74rhf494xn50c6qcmx49mgii227zjpz5v2vd599qka"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/bumptech/glide/okhttp3-integration/4.12.0/okhttp3-integration-4.12.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "aar",
|
||||
"pom": {
|
||||
"sha1": "86bab5a64ff1b3492ca0a416b59de2ed89d46608",
|
||||
"sha256": "0x30kznlw383w6yvz7vynk7mwbhscx4j1lyjl9aa0419byiyw7ng"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "8235c8ea4484c142ac058b736e807f9c56346e59",
|
||||
"sha256": "086nrnk2i6jgfi6iv2s3gfqhywzzm79isd87x84ks7wpvbs2wwhd"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/github/clans/fab/1.6.4/fab-1.6.4",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
@@ -5848,16 +5946,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/google/errorprone/error_prone_annotations/2.9.0/error_prone_annotations-2.9.0",
|
||||
"path": "com/google/errorprone/error_prone_annotations/2.10.0/error_prone_annotations-2.10.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "ffe29062ff5242287b65c16ec45e6a65bb946231",
|
||||
"sha256": "1kh82i3xl6wdr9pnbhiwx6szgfc2i7gjjw5q45p88xglr5ay13m4"
|
||||
"sha1": "972fdb73175fce135e78555269ede8c8d3b36f74",
|
||||
"sha256": "1k6021km41hzmh68yzzj9hhsfs5i1qjw7cljv7facxwaaygxr06n"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "74fe3b8b4f3fc84dc940d0ca4c4b270dbc902764",
|
||||
"sha256": "151n2rp4849dp0za82q1s1xpji0r3v1fd6a7li56nyp27b1vsizr"
|
||||
"sha1": "9bc20b94d3ac42489cf6ce1e42509c86f6f861a1",
|
||||
"sha256": "18940w3fbh9z4d9xrazfkw69y640ymfk7z42dhgd91pvbp9d8jd2"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -5902,12 +6000,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/google/errorprone/error_prone_parent/2.9.0/error_prone_parent-2.9.0",
|
||||
"path": "com/google/errorprone/error_prone_parent/2.10.0/error_prone_parent-2.10.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "pom",
|
||||
"pom": {
|
||||
"sha1": "a4f56c023d5284d3161dac51af134af6856e1fe9",
|
||||
"sha256": "1d73xa8z8dyxg327zkk7i22nz2b3c864012dwdivaxar10yi42sj"
|
||||
"sha1": "0d70888ba27b15543d639b0be077b1d0d6d38c40",
|
||||
"sha256": "1yl9y1rcgq47cdk11y3xi8f0fvnbq5gfkglp430h1ychqj3im287"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -6439,6 +6537,20 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okhttp3/okhttp/3.9.1/okhttp-3.9.1",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "7a34bfe0899e4b1a4b84f4e9e79c221bd37e9808",
|
||||
"sha256": "1vjwzaf5y4qfc5pvbsa79m11zjvzhn1b3rszvv6xxky1rpha3hdw"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "84b4b7d1c4a238e7899972b7446c250691e65f1f",
|
||||
"sha256": "0pkqnz1dmfrhvr17qbv1dr5nylvfnf5l8vgw0zjjdfiblhbi1l50"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okhttp3/okhttp/3.12.1/okhttp-3.12.1",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
@@ -6481,6 +6593,16 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okhttp3/parent/3.9.1/parent-3.9.1",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "pom",
|
||||
"pom": {
|
||||
"sha1": "e55ee2b70a7a64431236eac139096e369db69bb6",
|
||||
"sha256": "0lqm0gpbxfkw7n530hfr2jxr7r4cgiia2ahd0m1kb6kwdfzf05gm"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okhttp3/parent/3.12.1/parent-3.12.1",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
@@ -6540,16 +6662,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "com/squareup/okio/okio/3.0.0-alpha.10/okio-3.0.0-alpha.10",
|
||||
"path": "com/squareup/okio/okio/3.0.0/okio-3.0.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "5e8792b318a95e32e3898534e34aa4c78a3fbde3",
|
||||
"sha256": "0g0lz46v6whx4v8qr2kn07gjm6zgwdrxs8jz8cwlfr0ywfxjy177"
|
||||
"sha1": "b2fec062f421241a455a83d82790f442fef0ea7c",
|
||||
"sha256": "0kqm1maql7kmk7lsnbm1619ghfn1jl0kv0fv8raizijy4csxa2ln"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "41c0ed007ec61ced75fc7bc44c33b6071a638f36",
|
||||
"sha256": "0ivsw7wf6a4wp6h5n49d3f0fbhnp0v6arlymrcwwshcs7qzwcgm5"
|
||||
"sha1": "ed092ec73ae87b0295689e5e04e025361da01761",
|
||||
"sha256": "17lpfiavx20hvv32irzmpy05jq77w9ihhslybqr0rjdj8gnn7gnw"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -7508,12 +7630,12 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/antlr/antlr4-master/4.9.2/antlr4-master-4.9.2",
|
||||
"path": "org/antlr/antlr4-master/4.9.3/antlr4-master-4.9.3",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "pom",
|
||||
"pom": {
|
||||
"sha1": "e5187c4f54155f23d4871af1ed3d4d60f7ab9a03",
|
||||
"sha256": "0k4hh1i6np6961q26lhryvxgplsasyrw7dyxvzf4cqbf6290bpn6"
|
||||
"sha1": "036b2162383e22b5a6c8c254e485921b5d77ad0c",
|
||||
"sha256": "1f9m37864g54qh5ckpgx15kjv2i627ixl5q71b551pxssdac0p2n"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -7532,16 +7654,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/antlr/antlr4-runtime/4.9.2/antlr4-runtime-4.9.2",
|
||||
"path": "org/antlr/antlr4-runtime/4.9.3/antlr4-runtime-4.9.3",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "726d2331b5f8ada7a0dbde7579c0968d391f324b",
|
||||
"sha256": "0v8qsyil9k0mpv602dcsjx422kk1w1m53xfv801v5bm597wh2697"
|
||||
"sha1": "7ed961275fcdee7e2b69a66bf1ae6c4f9f5a1ab8",
|
||||
"sha256": "193skn41436jxppf34gpjm782a7vp7z1c4cvflxgla86xbj48zjg"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "ece33ec76e002dfde574cf7b57451a91a99185c5",
|
||||
"sha256": "1xkm036832k3rwvjsafkbxdgm7ajfb69wsxcnwyd966mimi5600j"
|
||||
"sha1": "81befc16ebedb8b8aea3e4c0835dd5ca7e8523a8",
|
||||
"sha256": "198ys0lhpimjj5vzhpk82aiqqdqfphrjmsjjsqhz7i4vjsa6a6hk"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -8398,16 +8520,16 @@
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/checkerframework/checker-qual/3.18.1/checker-qual-3.18.1",
|
||||
"path": "org/checkerframework/checker-qual/3.19.0/checker-qual-3.19.0",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "df76ae5043087138988c9505701833069f8edf27",
|
||||
"sha256": "148xyyy76kd5s11anyxi3l2385mmy9y5nnq1058j646x5akq4i8i"
|
||||
"sha1": "7afbf123d32e21bee825bb85dc0be42ca6466fed",
|
||||
"sha256": "0wd3i9zrk3zbsxgpfjcsy68ba9sq5xhyvi13v05p0jx9w5f9rfi9"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "a7de82e0fbd3247a71d57cbd21bfe4728415ba4f",
|
||||
"sha256": "0md8sl75nvmn86k3nmhly57qjvain01x4d4ydhwnznwgqqix3xp3"
|
||||
"sha1": "838b42bb6f7f73315167b359d24649845cef1c48",
|
||||
"sha256": "0s5a93bln2b109brsys40wak9jw66rks9817glkk59pkhf8w89x8"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -9663,6 +9785,20 @@
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib-common/1.5.31/kotlin-stdlib-common-1.5.31",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
"type": "jar",
|
||||
"pom": {
|
||||
"sha1": "6f778763702ed6371c2cab78b3424ff2188a7283",
|
||||
"sha256": "1hl32bjj7bwhcwl5viilbyzq7kvysnbxmv2jjslvxln3p13fj5dn"
|
||||
},
|
||||
"jar": {
|
||||
"sha1": "043331609c7de811fed085e0dfd150874b157c32",
|
||||
"sha256": "1b929r0199idbrdc4jbhmcvzfrpiysdik3cnw673ha5h4s7a38nz"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.2.71/kotlin-stdlib-jdk7-1.2.71",
|
||||
"host": "https://repo.maven.apache.org/maven2",
|
||||
|
||||
@@ -34,6 +34,7 @@ androidx.documentfile:documentfile:1.0.0
|
||||
androidx.drawerlayout:drawerlayout:1.0.0
|
||||
androidx.exifinterface:exifinterface:1.1.0-beta01
|
||||
androidx.exifinterface:exifinterface:1.1.0-rc01
|
||||
androidx.exifinterface:exifinterface:1.2.0
|
||||
androidx.fragment:fragment:1.0.0
|
||||
androidx.fragment:fragment:1.1.0
|
||||
androidx.interpolator:interpolator:1.0.0
|
||||
@@ -333,6 +334,12 @@ com.facebook.soloader:annotation:0.9.0
|
||||
com.facebook.soloader:nativeloader:0.9.0
|
||||
com.facebook.soloader:soloader:0.9.0
|
||||
com.facebook.yoga:proguard-annotations:1.14.1
|
||||
com.github.bumptech.glide:annotations:4.12.0
|
||||
com.github.bumptech.glide:compiler:4.12.0
|
||||
com.github.bumptech.glide:disklrucache:4.12.0
|
||||
com.github.bumptech.glide:gifdecoder:4.12.0
|
||||
com.github.bumptech.glide:glide:4.12.0
|
||||
com.github.bumptech.glide:okhttp3-integration:4.12.0
|
||||
com.github.clans:fab:1.6.4
|
||||
com.github.gundy:semver4j:0.16.4
|
||||
com.github.status-im.status-keycard-java:android:3.0.4
|
||||
|
||||
@@ -41,6 +41,7 @@ https://dl.google.com/dl/android/maven2/androidx/documentfile/documentfile/1.0.0
|
||||
https://dl.google.com/dl/android/maven2/androidx/drawerlayout/drawerlayout/1.0.0/drawerlayout-1.0.0.pom
|
||||
https://dl.google.com/dl/android/maven2/androidx/exifinterface/exifinterface/1.1.0-beta01/exifinterface-1.1.0-beta01.pom
|
||||
https://dl.google.com/dl/android/maven2/androidx/exifinterface/exifinterface/1.1.0-rc01/exifinterface-1.1.0-rc01.pom
|
||||
https://dl.google.com/dl/android/maven2/androidx/exifinterface/exifinterface/1.2.0/exifinterface-1.2.0.pom
|
||||
https://dl.google.com/dl/android/maven2/androidx/fragment/fragment/1.0.0/fragment-1.0.0.pom
|
||||
https://dl.google.com/dl/android/maven2/androidx/fragment/fragment/1.1.0/fragment-1.1.0.pom
|
||||
https://dl.google.com/dl/android/maven2/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.pom
|
||||
@@ -389,6 +390,12 @@ https://repo.maven.apache.org/maven2/com/facebook/soloader/soloader/0.6.0/soload
|
||||
https://repo.maven.apache.org/maven2/com/facebook/soloader/soloader/0.8.2/soloader-0.8.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/facebook/soloader/soloader/0.9.0/soloader-0.9.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/facebook/stetho/stetho/1.3.1/stetho-1.3.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/github/bumptech/glide/annotations/4.12.0/annotations-4.12.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/github/bumptech/glide/compiler/4.12.0/compiler-4.12.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/github/bumptech/glide/disklrucache/4.12.0/disklrucache-4.12.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/github/bumptech/glide/gifdecoder/4.12.0/gifdecoder-4.12.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/github/bumptech/glide/glide/4.12.0/glide-4.12.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/github/bumptech/glide/okhttp3-integration/4.12.0/okhttp3-integration-4.12.0.pom
|
||||
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
|
||||
@@ -418,12 +425,12 @@ https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotatio
|
||||
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
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.3.1/error_prone_annotations-2.3.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.9.0/error_prone_annotations-2.9.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.10.0/error_prone_annotations-2.10.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.0.18/error_prone_parent-2.0.18.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.1.2/error_prone_parent-2.1.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.2.0/error_prone_parent-2.2.0.pom
|
||||
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.9.0/error_prone_parent-2.9.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.10.0/error_prone_parent-2.10.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/google/google/1/google-1.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
|
||||
@@ -466,15 +473,17 @@ https://repo.maven.apache.org/maven2/com/squareup/assertj/assertj-android/1.1.1/
|
||||
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-urlconnection/3.12.12/okhttp-urlconnection-3.12.12.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/3.9.1/okhttp-3.9.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/3.12.1/okhttp-3.12.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/3.12.12/okhttp-3.12.12.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/okhttp/5.0.0-alpha.2/okhttp-5.0.0-alpha.2.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.9.1/parent-3.9.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.12.1/parent-3.12.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okhttp3/parent/3.12.12/parent-3.12.12.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio-parent/1.15.0/okio-parent-1.15.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/1.15.0/okio-1.15.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/2.9.0/okio-2.9.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/3.0.0-alpha.10/okio-3.0.0-alpha.10.pom
|
||||
https://repo.maven.apache.org/maven2/com/squareup/okio/okio/3.0.0/okio-3.0.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/sun/activation/all/1.2.0/all-1.2.0.pom
|
||||
https://repo.maven.apache.org/maven2/com/sun/activation/all/2.0.1/all-2.0.1.pom
|
||||
https://repo.maven.apache.org/maven2/com/sun/activation/jakarta.activation/2.0.1/jakarta.activation-2.0.1.pom
|
||||
@@ -552,9 +561,9 @@ https://repo.maven.apache.org/maven2/org/antlr/ST4/4.0.8/ST4-4.0.8.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/ST4/4.3.1/ST4-4.3.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.5.2-1/antlr4-master-4.5.2-1.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.5.3/antlr4-master-4.5.3.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.9.2/antlr4-master-4.9.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.9.3/antlr4-master-4.9.3.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr4-runtime/4.5.2-1/antlr4-runtime-4.5.2-1.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr4-runtime/4.9.2/antlr4-runtime-4.9.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr4-runtime/4.9.3/antlr4-runtime-4.9.3.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr-master/3.5.2/antlr-master-3.5.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.pom
|
||||
@@ -627,7 +636,7 @@ https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov
|
||||
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.65/bcprov-jdk15on-1.65.pom
|
||||
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/2.5.2/checker-qual-2.5.2.pom
|
||||
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.18.1/checker-qual-3.18.1.pom
|
||||
https://repo.maven.apache.org/maven2/org/checkerframework/checker-qual/3.19.0/checker-qual-3.19.0.pom
|
||||
https://repo.maven.apache.org/maven2/org/codehaus/codehaus-parent/4/codehaus-parent-4.pom
|
||||
https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-all/2.4.15/groovy-all-2.4.15.pom
|
||||
https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.pom
|
||||
@@ -722,6 +731,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.4.21/kotlin-stdlib-common-1.4.21.pom
|
||||
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.4.30/kotlin-stdlib-common-1.4.30.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.31/kotlin-stdlib-common-1.5.31.pom
|
||||
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
|
||||
|
||||
@@ -12,6 +12,7 @@ react-native-config
|
||||
react-native-dark-mode
|
||||
react-native-device-info
|
||||
react-native-dialogs
|
||||
react-native-fast-image
|
||||
react-native-fs
|
||||
react-native-gesture-handler
|
||||
react-native-haptic-feedback
|
||||
|
||||
+17
-20
@@ -55,26 +55,6 @@ fi
|
||||
# Get the relative path without full URL
|
||||
OBJ_REL_NAME="${OBJ_REL_URL#${REPO_URL}/}"
|
||||
|
||||
OBJ_NIX_FETCH_OUT=$(nix_fetch "${OBJ_REL_URL}.jar")
|
||||
# Dependency might be a JAR or an AAR
|
||||
if [[ ${?} -eq 0 ]]; then
|
||||
# Some deps have only a POM, nor JAR or AAR
|
||||
OBJ_TYPE="jar"
|
||||
OBJ_PATH=$(get_nix_path "${OBJ_NIX_FETCH_OUT}")
|
||||
OBJ_SHA256=$(get_nix_sha "${OBJ_NIX_FETCH_OUT}")
|
||||
OBJ_SHA1=$(get_sha1 "${OBJ_PATH}")
|
||||
else
|
||||
OBJ_NIX_FETCH_OUT=$(nix_fetch "${OBJ_REL_URL}.aar")
|
||||
if [[ ${?} -eq 0 ]]; then
|
||||
OBJ_TYPE="aar"
|
||||
OBJ_PATH=$(get_nix_path "${OBJ_NIX_FETCH_OUT}")
|
||||
OBJ_SHA256=$(get_nix_sha "${OBJ_NIX_FETCH_OUT}")
|
||||
OBJ_SHA1=$(get_sha1 "${OBJ_PATH}")
|
||||
else
|
||||
OBJ_TYPE="pom"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Both JARs and AARs have a POM
|
||||
POM_NIX_FETCH_OUT=$(nix_fetch "${OBJ_REL_URL}.pom")
|
||||
POM_PATH=$(get_nix_path "${POM_NIX_FETCH_OUT}")
|
||||
@@ -85,6 +65,23 @@ fi
|
||||
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=$(grep -oP '<packaging>\K[^<]+' "${POM_PATH}")
|
||||
# Bundle is a JAR made using maven-bundle-plugin.
|
||||
case "${OBJ_TYPE}" in
|
||||
''|'bundle') OBJ_TYPE=jar;;
|
||||
'aar.asc') OBJ_TYPE=aar;;
|
||||
esac
|
||||
# Some dependencies have only a POM file.
|
||||
if [[ "${OBJ_TYPE}" != "pom" ]]; then
|
||||
OBJ_NIX_FETCH_OUT=$(nix_fetch "${OBJ_REL_URL}.${OBJ_TYPE}")
|
||||
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}")
|
||||
fi
|
||||
fi
|
||||
|
||||
# Format into a Nix attrset entry
|
||||
echo -ne "
|
||||
{
|
||||
|
||||
@@ -75,7 +75,7 @@ in stdenv.mkDerivation rec {
|
||||
BUILD_ENV = buildEnv;
|
||||
|
||||
# custom env variables derived from config
|
||||
STATUS_GO_SRC_OVERRIDE = getConfig "nimbus.src-override" null;
|
||||
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;
|
||||
|
||||
@@ -42,6 +42,8 @@ in {
|
||||
allowHigher = true;
|
||||
};
|
||||
gomobile = super.gomobile.override {
|
||||
# FIXME: No Android SDK packages for aarch64-darwin.
|
||||
withAndroidPkgs = stdenv.system != "aarch64-darwin";
|
||||
androidPkgs = self.androidEnvCustom.compose;
|
||||
};
|
||||
|
||||
|
||||
+3
-3
@@ -11,10 +11,10 @@ let
|
||||
# We follow the master branch of official nixpkgs.
|
||||
nixpkgsSrc = fetchFromGitHub {
|
||||
name = "nixpkgs-source";
|
||||
owner = "NixOS";
|
||||
owner = "status-im";
|
||||
repo = "nixpkgs";
|
||||
rev = "65135081f63ca2f5eaa9b7b54bfc7bf31502cfd6";
|
||||
sha256 = "074lyh19x8xs8xqf4wwwl64870rpml96g7dhx1y09i81w5k29aga";
|
||||
rev = "15111f8a9ad423d300886b537647691c2faa28cd";
|
||||
sha256 = "05ny644x3dpxigljnb4rmams5vrs5gkbcyqjfamvlqm8rdmsi0kn";
|
||||
# To get the compressed Nix sha256, use:
|
||||
# nix-prefetch-url --unpack https://github.com/${ORG}/nixpkgs/archive/${REV}.tar.gz
|
||||
};
|
||||
|
||||
+27
-19
@@ -15,46 +15,53 @@ source "${GIT_ROOT}/nix/scripts/source.sh"
|
||||
export TERM=xterm # fix for colors
|
||||
shift # we remove the first -c from arguments
|
||||
|
||||
nixArgs=(
|
||||
"--show-trace"
|
||||
)
|
||||
|
||||
if [[ -z "${TARGET}" ]]; then
|
||||
TARGET="default"
|
||||
export TARGET="default"
|
||||
echo -e "${YLW}Missing TARGET, assuming default target.${RST} See nix/README.md for more details." 1>&2
|
||||
fi
|
||||
|
||||
# Minimal shell with just Nix sourced, useful for `make nix-gc`.
|
||||
if [[ "${TARGET}" == "nix" ]]; then
|
||||
eval $@
|
||||
exit
|
||||
exit 0
|
||||
fi
|
||||
if [[ -n "${IN_NIX_SHELL}" ]] && [[ -n "${NIX_SHELL_TARGET}" ]]; then
|
||||
if [[ "${NIX_SHELL_TARGET}" == "${TARGET}" ]]; then
|
||||
echo -e "${YLW}Nix shell for TARGET=${TARGET} is already active.${RST}" >&2
|
||||
exit 0
|
||||
else
|
||||
# Nesting nix shells does not work due to how we detect already present shell.
|
||||
echo -e "${RED}Cannot nest Nix shells with different targets!${RST}" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
entryPoint="default.nix"
|
||||
nixArgs+=("--attr shells.${TARGET}")
|
||||
nixArgs=(
|
||||
"--show-trace"
|
||||
"--attr shells.${TARGET}"
|
||||
)
|
||||
|
||||
config=''
|
||||
if [ -n "${STATUS_GO_SRC_OVERRIDE}" ]; then
|
||||
config+="status-im.status-go.src-override=\"${STATUS_GO_SRC_OVERRIDE}\";"
|
||||
fi
|
||||
if [ -n "${NIMBUS_SRC_OVERRIDE}" ]; then
|
||||
config+="status-im.nimbus.src-override=\"${NIMBUS_SRC_OVERRIDE}\";"
|
||||
if [[ -n "${STATUS_GO_SRC_OVERRIDE}" ]]; then
|
||||
config+="status-im.status-go.src-override=\"${STATUS_GO_SRC_OVERRIDE}\";"
|
||||
fi
|
||||
config+="status-im.build-type=\"${BUILD_TYPE}\";"
|
||||
|
||||
if [ -n "$config" ]; then
|
||||
nixArgs+=("--arg config {$config}")
|
||||
if [[ -n "$config" ]]; then
|
||||
nixArgs+=("--arg config {$config}")
|
||||
fi
|
||||
|
||||
# This variable allows specifying which env vars to keep for Nix pure shell
|
||||
# The separator is a colon
|
||||
if [[ -n "${_NIX_KEEP}" ]]; then
|
||||
nixArgs+=("--keep ${_NIX_KEEP//,/ --keep }")
|
||||
nixArgs+=("--keep ${_NIX_KEEP//,/ --keep }")
|
||||
fi
|
||||
|
||||
# Not all builds are ready to be run in a pure environment
|
||||
if [[ -n "${_NIX_PURE}" ]]; then
|
||||
nixArgs+=("--pure")
|
||||
pureDesc='pure '
|
||||
nixArgs+=("--pure")
|
||||
pureDesc='pure '
|
||||
fi
|
||||
|
||||
echo -e "${GRN}Configuring ${pureDesc}Nix shell for target '${TARGET}'...${RST}" 1>&2
|
||||
@@ -65,7 +72,8 @@ ${GIT_ROOT}/nix/scripts/gcroots.sh "shells.${TARGET}"
|
||||
# ENTER_NIX_SHELL is the fake command used when `make shell` is run.
|
||||
# It is just a special string, not a variable, and a marker to not use `--run`.
|
||||
if [[ "${@}" == "ENTER_NIX_SHELL" ]]; then
|
||||
exec nix-shell ${nixArgs[@]} ${entryPoint}
|
||||
export NIX_SHELL_TARGET="${TARGET}"
|
||||
exec nix-shell ${nixArgs[@]} --keep NIX_SHELL_TARGET ${entryPoint}
|
||||
else
|
||||
exec nix-shell ${nixArgs[@]} --run "$@" ${entryPoint}
|
||||
exec nix-shell ${nixArgs[@]} --run "$@" ${entryPoint}
|
||||
fi
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
#
|
||||
# This fetches nimbus source from local folder or GitHub and
|
||||
# loads the derivation defined in the `nix/default.nix` in the repo.
|
||||
#
|
||||
|
||||
{ config, lib, stdenv, callPackage, fetchFromGitHub }:
|
||||
|
||||
let
|
||||
inherit (lib) getConfig attrByPath strings traceValFn;
|
||||
|
||||
repo = "nimbus";
|
||||
|
||||
localPath = getConfig "nimbus.src-override" "";
|
||||
localSrc =
|
||||
# We use builtins.path so that we can name the resulting derivation.
|
||||
# Name would be taken from the checkout directory, and wouldn't be deterministic.
|
||||
builtins.path rec {
|
||||
path = traceValFn (path: ''
|
||||
Using local ${repo} sources from ${path}
|
||||
'') localPath;
|
||||
name = "${repo}-source-local";
|
||||
filter =
|
||||
# Keep this filter as restrictive as possible in order to
|
||||
# avoid unnecessary rebuilds and limit closure size
|
||||
lib.mkFilter {
|
||||
root = path;
|
||||
include = [
|
||||
"nix.*" "wrappers.*" "vendor.*"
|
||||
"Makefile" "nim.cfg" "nimbus.nimble" "default.nix"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
ghSrc = fetchFromGitHub rec {
|
||||
inherit repo;
|
||||
name = "${repo}-source-${strings.substring 0 7 rev}";
|
||||
rev = "73278f20d0bf27fb7c6c331b515abb765814f1cc";
|
||||
owner = "status-im";
|
||||
sha256 = "0myq234zqnpmqsc2452xygnyc6sjs8x1blyrpa4bi9v2cwbyap5c";
|
||||
fetchSubmodules = true;
|
||||
};
|
||||
|
||||
src = if localPath != "" then localSrc else ghSrc;
|
||||
|
||||
nimbusDeriv = import "${src}/nix/default.nix";
|
||||
|
||||
in nimbusDeriv
|
||||
@@ -1,9 +1,9 @@
|
||||
{ config, utils, lib, callPackage, fetchFromGitHub }:
|
||||
|
||||
let
|
||||
inherit (lib) strings traceValFn attrByPath importJSON;
|
||||
inherit (lib) strings traceValFn attrByPath importJSON getConfig;
|
||||
|
||||
srcOverride = attrByPath [ "status-im" "status-go" "src-override" ] null config;
|
||||
srcOverride = getConfig "status-go.src-override" null;
|
||||
# Warning message about using local sources
|
||||
localSrcWarn = (path: "Using local status-go sources from ${path}");
|
||||
|
||||
@@ -27,7 +27,7 @@ let
|
||||
include = [ ".*" ];
|
||||
exclude = [
|
||||
".*/[.]git.*" ".*[.]md" ".*[.]yml" ".*/.*_test.go$"
|
||||
"_assets/.*" "build/.*"
|
||||
"VERSION" "_assets/.*" "build/.*"
|
||||
".*/.*LICENSE.*" ".*/CONTRIB.*" ".*/AUTHOR.*"
|
||||
];
|
||||
};
|
||||
|
||||
+2
-1
@@ -39,6 +39,7 @@
|
||||
"react-native-dark-mode": "^0.2.2",
|
||||
"react-native-device-info": "^7.4.0",
|
||||
"react-native-dialogs": "^1.0.4",
|
||||
"react-native-fast-image": "8.5.11",
|
||||
"react-native-fetch-polyfill": "^1.1.2",
|
||||
"react-native-fs": "^2.14.1",
|
||||
"react-native-gesture-handler": "^1.8.0",
|
||||
@@ -58,7 +59,7 @@
|
||||
"react-native-shake": "^3.3.1",
|
||||
"react-native-share": "^7.0.1",
|
||||
"react-native-splash-screen": "^3.2.0",
|
||||
"react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#v2.5.35",
|
||||
"react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#v2.5.37",
|
||||
"react-native-svg": "^9.8.4",
|
||||
"react-native-touch-id": "^4.4.1",
|
||||
"react-native-webview": "git+https://github.com/status-im/react-native-webview.git#v11.3.0-status",
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
@@ -138,7 +138,7 @@
|
||||
} else if (payload.method == "net_version"){
|
||||
return web3Response(payload, window.statusAppNetworkId)
|
||||
} else if (payload.method == "eth_chainId"){
|
||||
return web3Response(payload, "0x" + window.statusAppNetworkId.toString(16))
|
||||
return web3Response(payload, "0x" + Number(window.statusAppNetworkId).toString(16))
|
||||
} else if (payload.method == "eth_uninstallFilter"){
|
||||
return web3Response(payload, true);
|
||||
} else {
|
||||
@@ -159,7 +159,7 @@
|
||||
EthereumProvider.prototype.isConnected = function () { return true; };
|
||||
// Set legacy metamask fields https://docs.metamask.io/guide/ethereum-provider.html#legacy-api
|
||||
EthereumProvider.prototype.networkVersion = window.statusAppNetworkId;
|
||||
EthereumProvider.prototype.chainId = "0x" + window.statusAppNetworkId.toString(16);
|
||||
EthereumProvider.prototype.chainId = "0x" + Number(window.statusAppNetworkId).toString(16);
|
||||
|
||||
EthereumProvider.prototype._events = {};
|
||||
|
||||
@@ -222,6 +222,7 @@
|
||||
var syncResponse = getSyncResponse({method: method});
|
||||
if (syncResponse){
|
||||
return new Promise(function (resolve, reject) {
|
||||
if (window.statusAppDebug) { console.log("resolve sync: " + resolve + " " + JSON.stringify(syncResponse.result)); }
|
||||
resolve(syncResponse.result);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -26,9 +26,6 @@ config=''
|
||||
if [[ -n "${STATUS_GO_SRC_OVERRIDE}" ]]; then
|
||||
config+="status-im.status-go.src-override=\"${STATUS_GO_SRC_OVERRIDE}\";"
|
||||
fi
|
||||
if [[ -n "${NIMBUS_SRC_OVERRIDE}" ]]; then
|
||||
config+="status-im.nimbus.src-override=\"${NIMBUS_SRC_OVERRIDE}\";"
|
||||
fi
|
||||
if [[ "${ANDROID_APK_SIGNED}" == "true" ]]; then
|
||||
config+="status-im.android.keystore-path=\"$(must_get_env KEYSTORE_PATH)\";"
|
||||
fi
|
||||
|
||||
@@ -19,20 +19,11 @@
|
||||
:restSpeedThreshold 0.1
|
||||
:restDisplacementThreshold 0.1})
|
||||
|
||||
;; NOTE(Ferossgp): RNGH does not work in modal react native
|
||||
(defn modal [{:keys [visible] :as props} & children]
|
||||
(if platform/android?
|
||||
(into [rn/view {:style styles/container
|
||||
:pointer-events (if visible :box-none :none)}]
|
||||
(when visible children))
|
||||
(into [rn/modal props] children)))
|
||||
|
||||
(defn bottom-sheet-hooks [props]
|
||||
(let [{on-cancel :onCancel
|
||||
disable-drag? :disableDrag?
|
||||
show-handle? :showHandle?
|
||||
visible? :visible?
|
||||
transparent :transparent
|
||||
backdrop-dismiss? :backdropDismiss?
|
||||
back-button-cancel :backButtonCancel
|
||||
children :children
|
||||
@@ -50,7 +41,7 @@
|
||||
keyboard-height-android-delta (if (and platform/android? keyboard-shown) (+ keyboard-height 20) 0)
|
||||
safe-area (safe-area/use-safe-area)
|
||||
window-height (- window-height (if platform/android?
|
||||
(+ 50 keyboard-height-android-delta)
|
||||
(+ 50 keyboard-height-android-delta) ;; TODO : remove 50 when react-native-navigation v8 will be implemented https://github.com/wix/react-native-navigation/issues/7225
|
||||
0))
|
||||
min-height (+ (* styles/vertical-padding 2) (:bottom safe-area))
|
||||
max-height (- window-height (:top safe-area) styles/margin-top)
|
||||
@@ -186,48 +177,42 @@
|
||||
(close-sheet)))
|
||||
[visible?])
|
||||
(reagent/as-element
|
||||
[modal {:visible @visible
|
||||
:transparent true
|
||||
:presentation-style :overFullScreen
|
||||
:hardware-accelerated true
|
||||
:on-request-close (fn []
|
||||
(when back-button-cancel
|
||||
(close-sheet)))}
|
||||
[rn/view {:style styles/container
|
||||
:opacity (if transparent 0 1)
|
||||
:pointer-events :box-none}
|
||||
[gesture-handler/tap-gesture-handler (merge {:enabled backdrop-dismiss?}
|
||||
tap-gesture-handler)
|
||||
[animated/view {:style (merge (styles/backdrop)
|
||||
(when platform/ios?
|
||||
{:opacity opacity
|
||||
:background-color (:backdrop @colors/theme)}))}]]
|
||||
[animated/view {:style (merge (styles/content-container window-height)
|
||||
{:transform [{:translateY (animated/add translate-y keyboard-height-android-delta)}
|
||||
{:translateY (* window-height 2)}]})}
|
||||
[gesture-handler/pan-gesture-handler (merge on-master-event
|
||||
{:ref master-ref
|
||||
:wait-for body-ref
|
||||
:enabled (not disable-drag?)})
|
||||
[animated/view {:style styles/content-header}
|
||||
(when show-handle?
|
||||
[rn/view {:style styles/handle}])]]
|
||||
[gesture-handler/pan-gesture-handler (merge on-body-event
|
||||
{:ref body-ref
|
||||
:wait-for master-ref
|
||||
:enabled (and (not disable-drag?)
|
||||
(not= sheet-height max-height))})
|
||||
[animated/view {:height sheet-height}
|
||||
[animated/scroll-view {:bounces false
|
||||
:flex 1
|
||||
:scroll-enabled (= sheet-height max-height)}
|
||||
[animated/view {:style {:padding-top styles/vertical-padding
|
||||
:padding-bottom (+ styles/vertical-padding
|
||||
(if (and platform/ios? keyboard-shown)
|
||||
keyboard-height
|
||||
(:bottom safe-area)))}
|
||||
:on-layout #(reset! height (.-nativeEvent.layout.height ^js %))}
|
||||
(into [:<>]
|
||||
(react/get-children children))]]]]]]])))
|
||||
[rn/view {:style styles/container
|
||||
:pointer-events :box-none}
|
||||
[gesture-handler/tap-gesture-handler (merge {:enabled backdrop-dismiss?}
|
||||
tap-gesture-handler)
|
||||
[animated/view {:style (merge (styles/backdrop)
|
||||
(when platform/ios?
|
||||
{:opacity opacity
|
||||
:background-color (:backdrop @colors/theme)}))}]]
|
||||
[animated/view {:style (merge (styles/content-container window-height)
|
||||
{:transform [{:translateY (if (= sheet-height max-height)
|
||||
(animated/add translate-y keyboard-height-android-delta)
|
||||
translate-y)}
|
||||
{:translateY (* window-height 2)}]})}
|
||||
[gesture-handler/pan-gesture-handler (merge on-master-event
|
||||
{:ref master-ref
|
||||
:wait-for body-ref
|
||||
:enabled (not disable-drag?)})
|
||||
[animated/view {:style styles/content-header}
|
||||
(when show-handle?
|
||||
[rn/view {:style styles/handle}])]]
|
||||
[gesture-handler/pan-gesture-handler (merge on-body-event
|
||||
{:ref body-ref
|
||||
:wait-for master-ref
|
||||
:enabled (and (not disable-drag?)
|
||||
(not= sheet-height max-height))})
|
||||
[animated/view {:height sheet-height}
|
||||
[animated/scroll-view {:bounces false
|
||||
:flex 1
|
||||
:scroll-enabled (= sheet-height max-height)}
|
||||
[animated/view {:style {:padding-top styles/vertical-padding
|
||||
:padding-bottom (+ styles/vertical-padding
|
||||
(if (and platform/ios? keyboard-shown)
|
||||
keyboard-height
|
||||
(:bottom safe-area)))}
|
||||
:on-layout #(reset! height (.-nativeEvent.layout.height ^js %))}
|
||||
(into [:<>]
|
||||
(react/get-children children))]]]]]])))
|
||||
|
||||
(def bottom-sheet (reagent/adapt-react-class (react/memo bottom-sheet-hooks)))
|
||||
(def bottom-sheet (reagent/adapt-react-class (react/memo bottom-sheet-hooks)))
|
||||
@@ -49,15 +49,15 @@
|
||||
:hold hold
|
||||
:disabled disabled}]]]))))
|
||||
|
||||
(defn switch-view [{:keys [transition hold disabled]}]
|
||||
(defn switch-view [{:keys [transition hold disabled value]}]
|
||||
[animated/view {:style (styles/switch-style transition disabled)
|
||||
:accessibility-label :switch
|
||||
:accessibility-label (str "switch-" (if value "on" "off"))
|
||||
:accessibility-role :switch}
|
||||
[animated/view {:style (styles/switch-bullet-style transition hold)}]])
|
||||
|
||||
(defn radio-view [{:keys [transition hold disabled]}]
|
||||
(defn radio-view [{:keys [transition hold disabled value]}]
|
||||
[animated/view {:style (styles/radio-style transition disabled)
|
||||
:accessibility-label :radio
|
||||
:accessibility-label (str "radio-" (if value "on" "off"))
|
||||
:accessibility-role :radio}
|
||||
[animated/view {:style (styles/radio-bullet-style transition hold)}]])
|
||||
|
||||
@@ -67,15 +67,15 @@
|
||||
[rn/touchable-without-feedback
|
||||
{:on-press (when (and onChange (not disabled)) onChange)}
|
||||
[rn/view {:style (styles/checkbox-style value disabled)
|
||||
:accessibility-label :checkbox
|
||||
:accessibility-label (str "checkbox-" (if value "on" "off"))
|
||||
:accessibility-role :checkbox}
|
||||
[rn/view {:style (styles/check-icon-style value)}
|
||||
[icons/tiny-icon :tiny-icons/tiny-check {:color colors/white}]]]])))
|
||||
|
||||
(defn animated-checkbox-view [{:keys [transition hold disabled]}]
|
||||
(defn animated-checkbox-view [{:keys [transition hold disabled value]}]
|
||||
[animated/view
|
||||
{:style (styles/animated-checkbox-style transition disabled)
|
||||
:accessibility-label :checkbox
|
||||
:accessibility-label (str "checkbox-" (if value "on" "off"))
|
||||
:accessibility-role :checkbox}
|
||||
[animated/view {:style (styles/animated-check-icon-style transition hold)}
|
||||
[icons/tiny-icon :tiny-icons/tiny-check {:color colors/white}]]])
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
[cofx {:keys [key id]} public]
|
||||
(fx/merge cofx
|
||||
{::persistence/chat-initalized! true}
|
||||
(chat/start-chat key)))
|
||||
(chat/start-chat key nil)))
|
||||
|
||||
(fx/defn start-public-chat
|
||||
{:events [::start-public-chat]}
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
(fx/defn join-public-chat
|
||||
[cofx chat-name]
|
||||
(chat/start-public-chat cofx chat-name {:navigation-reset? true}))
|
||||
(chat/start-public-chat cofx chat-name nil))
|
||||
|
||||
(fx/defn accept-pack
|
||||
{:events [::accept-pack]}
|
||||
|
||||
@@ -78,9 +78,9 @@
|
||||
(if-not validation-result
|
||||
(if new-contact?
|
||||
(fx/merge cofx
|
||||
(contact/add-contact chat-key nil)
|
||||
(contact/add-contact chat-key nil nil)
|
||||
(navigation/navigate-to-cofx :contacts-list {}))
|
||||
(chat/start-chat cofx chat-key))
|
||||
(chat/start-chat cofx chat-key nil))
|
||||
{:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
|
||||
:content (case validation-result
|
||||
:invalid
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
(def key->string str)
|
||||
|
||||
(defn- set-item! [key value]
|
||||
(defn set-item! [key value]
|
||||
(-> ^js async-storage
|
||||
(.setItem (key->string key)
|
||||
(clj->transit value))
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
(ns status-im.backup.core
|
||||
(:require [re-frame.core :as re-frame]
|
||||
[taoensso.timbre :as log]
|
||||
[status-im.ethereum.json-rpc :as json-rpc]
|
||||
[status-im.utils.fx :as fx]))
|
||||
|
||||
(fx/defn handle-backup-failed
|
||||
{:events [::backup-failed]}
|
||||
[{:keys [db]}]
|
||||
{:db (dissoc db :backup/performing-backup)})
|
||||
|
||||
(fx/defn handle-backup-perfomed
|
||||
{:events [::backup-performed]}
|
||||
[{:keys [db]}]
|
||||
{:db (dissoc db :backup/performing-backup)})
|
||||
|
||||
(fx/defn handle-perform-backup-pressed
|
||||
{:events [:multiaccounts.ui/perform-backup-pressed]}
|
||||
[{:keys [db]}]
|
||||
{:db (assoc db :backup/performing-backup true)
|
||||
::json-rpc/call [{:method (json-rpc/call-ext-method "backupData")
|
||||
:params []
|
||||
:on-error #(do
|
||||
(log/error "failed to perfom backup" %)
|
||||
(re-frame/dispatch [::backup-failed %]))
|
||||
:on-success #(re-frame/dispatch [::backup-performed %])}]})
|
||||
@@ -4,6 +4,7 @@
|
||||
[status-im.multiaccounts.model :as multiaccounts.model]
|
||||
[status-im.chat.models.message-list :as message-list]
|
||||
[status-im.data-store.chats :as chats-store]
|
||||
[status-im.data-store.contacts :as contacts-store]
|
||||
[status-im.ethereum.json-rpc :as json-rpc]
|
||||
[status-im.i18n.i18n :as i18n]
|
||||
[quo.design-system.colors :as colors]
|
||||
@@ -128,11 +129,13 @@
|
||||
(map (map-chats cofx) chats))]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (-> db
|
||||
(update :chats merge all-chats)
|
||||
(update :chats-home-list set/union chats-home-list)
|
||||
(update :chats #(apply dissoc % removed-chats))
|
||||
(update :chats-home-list set/difference removed-chats))}
|
||||
(merge {:db (-> db
|
||||
(update :chats merge all-chats)
|
||||
(update :chats-home-list set/union chats-home-list)
|
||||
(update :chats #(apply dissoc % removed-chats))
|
||||
(update :chats-home-list set/difference removed-chats))}
|
||||
(when (not-empty removed-chats)
|
||||
{:clear-multiple-message-notifications removed-chats}))
|
||||
leave-removed-chat)))
|
||||
|
||||
(fx/defn clear-history
|
||||
@@ -196,15 +199,23 @@
|
||||
|
||||
(fx/defn close-chat
|
||||
{:events [:close-chat]}
|
||||
[{:keys [db] :as cofx} target-chat-id]
|
||||
(let [chat-id (:current-chat-id db)]
|
||||
(if (:ignore-close-chat db)
|
||||
{:db (dissoc db :ignore-close-chat)}
|
||||
(when (= target-chat-id chat-id)
|
||||
(chat.state/reset-visible-item)
|
||||
(fx/merge cofx
|
||||
{:db (dissoc db :current-chat-id)}
|
||||
(offload-messages chat-id))))))
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [chat-id (:current-chat-id db)
|
||||
navigate-after-home-to-chat (:navigate-after-home-to-chat db)]
|
||||
(chat.state/reset-visible-item)
|
||||
(if navigate-after-home-to-chat
|
||||
{:db (dissoc db :navigate-after-home-to-chat)}
|
||||
(fx/merge cofx
|
||||
{:db (dissoc db :current-chat-id)}
|
||||
(offload-messages chat-id)))))
|
||||
|
||||
(fx/defn force-close-chat
|
||||
[{:keys [db] :as cofx} chat-id]
|
||||
(do
|
||||
(chat.state/reset-visible-item)
|
||||
(fx/merge cofx
|
||||
{:db (dissoc db :current-chat-id)}
|
||||
(offload-messages chat-id))))
|
||||
|
||||
(fx/defn remove-chat
|
||||
"Removes chat completely from app, producing all necessary effects for that"
|
||||
@@ -231,19 +242,21 @@
|
||||
(fx/defn navigate-to-chat
|
||||
"Takes coeffects map and chat-id, returns effects necessary for navigation and preloading data"
|
||||
{:events [:chat.ui/navigate-to-chat]}
|
||||
[{db :db :as cofx} chat-id dont-reset?]
|
||||
(fx/merge cofx
|
||||
(close-chat (:current-chat-id db))
|
||||
(fn [{:keys [db]}]
|
||||
{:db (assoc db :current-chat-id chat-id :ignore-close-chat true)})
|
||||
(preload-chat-data chat-id)
|
||||
#(when (group-chat? cofx chat-id)
|
||||
(loading/load-chat % chat-id))
|
||||
#(when-not dont-reset?
|
||||
(navigation/change-tab % :chat))
|
||||
#(when-not dont-reset?
|
||||
(navigation/pop-to-root-tab % :chat-stack))
|
||||
(navigation/navigate-to-cofx :chat nil)))
|
||||
[{db :db :as cofx} chat-id]
|
||||
(let [home-view? (= (get db :view-id) :home)]
|
||||
(fx/merge cofx
|
||||
(close-chat)
|
||||
(force-close-chat chat-id)
|
||||
(fn [{:keys [db]}]
|
||||
{:db (assoc db :current-chat-id chat-id :navigate-after-home-to-chat (not home-view?))})
|
||||
(preload-chat-data chat-id)
|
||||
#(when (group-chat? cofx chat-id)
|
||||
(loading/load-chat % chat-id))
|
||||
#(when-not home-view?
|
||||
(navigation/change-tab % :chat))
|
||||
#(when-not home-view?
|
||||
(navigation/pop-to-root-tab % :chat-stack))
|
||||
(navigation/navigate-to-cofx :chat nil))))
|
||||
|
||||
(fx/defn handle-clear-history-response
|
||||
{:events [::history-cleared]}
|
||||
@@ -254,10 +267,16 @@
|
||||
(fx/defn handle-one-to-one-chat-created
|
||||
{:events [::one-to-one-chat-created]}
|
||||
[{:keys [db]} chat-id response]
|
||||
(let [chat (chats-store/<-rpc (first (:chats response)))]
|
||||
{:db (-> db
|
||||
(assoc-in [:chats chat-id] chat)
|
||||
(update :chats-home-list conj chat-id))
|
||||
(let [chat (chats-store/<-rpc (first (:chats response)))
|
||||
contact-rpc (first (:contacts response))
|
||||
contact (when contact-rpc (contacts-store/<-rpc contact-rpc))]
|
||||
{:db (cond-> db
|
||||
contact
|
||||
(assoc-in [:contacts/contacts chat-id] contact)
|
||||
:always
|
||||
(assoc-in [:chats chat-id] chat)
|
||||
:always
|
||||
(update :chats-home-list conj chat-id))
|
||||
:dispatch [:chat.ui/navigate-to-chat chat-id]}))
|
||||
|
||||
(fx/defn navigate-to-user-pinned-messages
|
||||
@@ -269,11 +288,11 @@
|
||||
(fx/defn start-chat
|
||||
"Start a chat, making sure it exists"
|
||||
{:events [:chat.ui/start-chat]}
|
||||
[{:keys [db] :as cofx} chat-id]
|
||||
[{:keys [db] :as cofx} chat-id ens-name]
|
||||
;; don't allow to open chat with yourself
|
||||
(when (not= (multiaccounts.model/current-public-key cofx) chat-id)
|
||||
{::json-rpc/call [{:method "wakuext_createOneToOneChat"
|
||||
:params [{:id chat-id}]
|
||||
:params [{:id chat-id :ensName ens-name}]
|
||||
:on-success #(re-frame/dispatch [::one-to-one-chat-created chat-id %])
|
||||
:on-error #(log/error "failed to create one-to-on chat" chat-id %)}]}))
|
||||
|
||||
@@ -285,14 +304,11 @@
|
||||
|
||||
(fx/defn handle-public-chat-created
|
||||
{:events [::public-chat-created]}
|
||||
[{:keys [db]} chat-id {:keys [dont-navigate?]} response]
|
||||
(let [chat (chats-store/<-rpc (first (:chats response)))
|
||||
db-with-chat {:db (-> db
|
||||
(assoc-in [:chats chat-id] chat)
|
||||
(update :chats-home-list conj chat-id))}]
|
||||
(if dont-navigate?
|
||||
db-with-chat
|
||||
(assoc db-with-chat :dispatch [:chat.ui/navigate-to-chat chat-id]))))
|
||||
[{:keys [db]} chat-id _ response]
|
||||
{:db (-> db
|
||||
(assoc-in [:chats chat-id] (chats-store/<-rpc (first (:chats response))))
|
||||
(update :chats-home-list conj chat-id))
|
||||
:dispatch [:chat.ui/navigate-to-chat chat-id]})
|
||||
|
||||
(fx/defn create-public-chat-go [_ chat-id opts]
|
||||
{::json-rpc/call [{:method "wakuext_createPublicChat"
|
||||
@@ -303,11 +319,10 @@
|
||||
(fx/defn start-public-chat
|
||||
"Starts a new public chat"
|
||||
{:events [:chat.ui/start-public-chat]}
|
||||
[cofx topic {:keys [dont-navigate? profile-public-key] :as opts}]
|
||||
[cofx topic {:keys [profile-public-key] :as opts}]
|
||||
(if (or (new-public-chat.db/valid-topic? topic) profile-public-key)
|
||||
(if (active-chat? cofx topic)
|
||||
(when-not dont-navigate?
|
||||
(navigate-to-chat cofx topic false))
|
||||
(navigate-to-chat cofx topic)
|
||||
(create-public-chat-go
|
||||
cofx
|
||||
topic
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
[quo.design-system.colors :as colors]
|
||||
[status-im.navigation :as navigation]
|
||||
[status-im.utils.handlers :refer [>evt]]
|
||||
[status-im.ui.components.emoji-thumbnail.styles :as emoji-thumbnail-styles]))
|
||||
[status-im.ui.components.emoji-thumbnail.styles :as emoji-thumbnail-styles]
|
||||
[status-im.notifications-center.core :as notification-center]))
|
||||
|
||||
(def crop-size 1000)
|
||||
|
||||
@@ -287,7 +288,8 @@
|
||||
(fx/defn edit-channel
|
||||
{:events [::edit-channel-confirmation-pressed]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [{:keys [name description color community-id emoji edit-channel-id]} (get db :communities/create-channel)]
|
||||
(let [{:keys [name description color community-id emoji edit-channel-id category-id]}
|
||||
(get db :communities/create-channel)]
|
||||
{::json-rpc/call [{:method "wakuext_editCommunityChat"
|
||||
:params [community-id
|
||||
edit-channel-id
|
||||
@@ -295,6 +297,7 @@
|
||||
:description description
|
||||
:color color
|
||||
:emoji emoji}
|
||||
:category_id category-id
|
||||
:permissions {:access constants/community-channel-access-no-membership}}]
|
||||
:js-response true
|
||||
:on-success #(re-frame/dispatch [::community-channel-edited %])
|
||||
@@ -342,7 +345,7 @@
|
||||
|
||||
(fx/defn edit-channel-pressed
|
||||
{:events [::edit-channel-pressed]}
|
||||
[{:keys [db] :as cofx} community-id chat-name description color emoji chat-id]
|
||||
[{:keys [db] :as cofx} community-id chat-name description color emoji chat-id category-id]
|
||||
(let [{:keys [color emoji]} (if (string/blank? emoji)
|
||||
(rand-nth emoji-thumbnail-styles/emoji-picker-default-thumbnails)
|
||||
{:color color :emoji emoji})]
|
||||
@@ -352,7 +355,8 @@
|
||||
:color color
|
||||
:community-id community-id
|
||||
:emoji emoji
|
||||
:edit-channel-id chat-id})}
|
||||
:edit-channel-id chat-id
|
||||
:category-id category-id})}
|
||||
(navigation/open-modal :edit-community-channel nil))))
|
||||
|
||||
(fx/defn community-created
|
||||
@@ -444,7 +448,8 @@
|
||||
[cofx response-js]
|
||||
(fx/merge cofx
|
||||
(bottom-sheet/hide-bottom-sheet)
|
||||
(handle-response response-js)))
|
||||
(handle-response response-js)
|
||||
(notification-center/get-activity-center-notifications-count)))
|
||||
|
||||
(fx/defn member-ban
|
||||
{:events [::member-ban]}
|
||||
@@ -586,3 +591,56 @@
|
||||
(fx/merge cofx
|
||||
(navigation/navigate-back)
|
||||
(remove-chat-from-category community-id id categoryID))))
|
||||
|
||||
(fx/defn reorder-category
|
||||
{:events [::reorder-community-category]}
|
||||
[_ community-id category-id new-position]
|
||||
{::json-rpc/call [{:method "wakuext_reorderCommunityCategories"
|
||||
:params [{:communityId community-id
|
||||
:categoryId category-id
|
||||
:position new-position}]
|
||||
:js-response true
|
||||
:on-success #(re-frame/dispatch [:sanitize-messages-and-process-response %])
|
||||
:on-error #(log/error "failed to reorder community category" %)}]})
|
||||
|
||||
(defn category-hash [public-key community-id category-id]
|
||||
(hash (str public-key community-id category-id)))
|
||||
|
||||
(fx/defn store-category-state
|
||||
{:events [::store-category-state]}
|
||||
[{:keys [db]} community-id category-id state-open?]
|
||||
(let [public-key (get-in db [:multiaccount :public-key])
|
||||
hash (category-hash public-key community-id category-id)]
|
||||
{::async-storage/set! {hash state-open?}}))
|
||||
|
||||
(fx/defn update-category-states-in-db
|
||||
{:events [::category-states-loaded]}
|
||||
[{:keys [db]} community-id hashes states]
|
||||
(let [public-key (get-in db [:multiaccount :public-key])
|
||||
categories-old (get-in db [:communities community-id :categories])
|
||||
categories (reduce (fn [acc [category-id category]]
|
||||
(let [hash (get hashes category-id)
|
||||
state (get states hash)
|
||||
category-updated (assoc category :state state)]
|
||||
(assoc acc category-id category-updated)))
|
||||
{} categories-old)]
|
||||
{:db (update-in db [:communities community-id :categories] merge categories)}))
|
||||
|
||||
(fx/defn load-category-states
|
||||
{:events [::load-category-states]}
|
||||
[{:keys [db]} community-id]
|
||||
(let [public-key (get-in db [:multiaccount :public-key])
|
||||
categories (get-in db [:communities community-id :categories])
|
||||
{:keys [keys hashes]} (reduce (fn [acc category]
|
||||
(let [category-id (get category 0)
|
||||
hash (category-hash
|
||||
public-key
|
||||
community-id
|
||||
category-id)]
|
||||
(-> acc
|
||||
(assoc-in [:hashes category-id] hash)
|
||||
(update :keys #(conj % hash)))))
|
||||
{} categories)]
|
||||
{::async-storage/get {:keys keys
|
||||
:cb #(re-frame/dispatch
|
||||
[::category-states-loaded community-id hashes %])}}))
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
[status-im.data-store.chats :as chats-store]
|
||||
[status-im.data-store.contacts :as contacts-store]
|
||||
[status-im.navigation :as navigation]
|
||||
[status-im.utils.types :as types]
|
||||
[status-im.notifications-center.core :as notification-center]
|
||||
[status-im.utils.fx :as fx]))
|
||||
|
||||
(fx/defn clean-up-chat
|
||||
@@ -34,23 +36,25 @@
|
||||
(fx/defn contact-blocked
|
||||
{:events [::contact-blocked]}
|
||||
[{:keys [db] :as cofx} {:keys [public-key]} chats]
|
||||
(let [fxs (map #(clean-up-chat public-key %) chats)]
|
||||
(let [fxs (when chats
|
||||
(map #(->> (chats-store/<-rpc %)
|
||||
(clean-up-chat public-key)) (types/js->clj chats)))]
|
||||
(apply fx/merge
|
||||
cofx
|
||||
{:db (-> db
|
||||
(update :chats dissoc public-key)
|
||||
(update :chats-home-list disj public-key)
|
||||
(assoc-in [:contacts/contacts public-key :added] false))}
|
||||
(notification-center/get-activity-center-notifications-count)
|
||||
fxs)))
|
||||
|
||||
(fx/defn block-contact
|
||||
{:events [:contact.ui/block-contact-confirmed]}
|
||||
[{:keys [db now] :as cofx} public-key]
|
||||
[{:keys [db] :as cofx} public-key]
|
||||
(let [contact (-> (contact.db/public-key->contact
|
||||
(:contacts/contacts db)
|
||||
public-key)
|
||||
(assoc :last-updated now
|
||||
:blocked true
|
||||
(assoc :blocked true
|
||||
:added false))
|
||||
from-one-to-one-chat? (not (get-in db [:chats (:current-chat-id db) :group-chat]))]
|
||||
(fx/merge cofx
|
||||
@@ -59,20 +63,28 @@
|
||||
(update :contacts/blocked (fnil conj #{}) public-key)
|
||||
;; update the contact in contacts list
|
||||
(assoc-in [:contacts/contacts public-key] contact))}
|
||||
(contacts-store/block contact #(do (re-frame/dispatch [::contact-blocked contact (map chats-store/<-rpc %)])
|
||||
(re-frame/dispatch [:hide-popover])))
|
||||
(contacts-store/block
|
||||
public-key #(do (re-frame/dispatch [::contact-blocked contact (.-chats %)])
|
||||
(re-frame/dispatch [:sanitize-messages-and-process-response %])
|
||||
(re-frame/dispatch [:hide-popover])))
|
||||
;; reset navigation to avoid going back to non existing one to one chat
|
||||
(if from-one-to-one-chat?
|
||||
(navigation/pop-to-root-tab :chat-stack)
|
||||
(navigation/navigate-back)))))
|
||||
|
||||
(fx/defn contact-unblocked
|
||||
{:events [::contact-unblocked]}
|
||||
[{:keys [db]} contact-id]
|
||||
(let [contact (-> (get-in db [:contacts/contacts contact-id])
|
||||
(assoc :blocked false))]
|
||||
{:db (-> db
|
||||
(update :contacts/blocked disj contact-id)
|
||||
(assoc-in [:contacts/contacts contact-id] contact))}))
|
||||
|
||||
(fx/defn unblock-contact
|
||||
{:events [:contact.ui/unblock-contact-pressed ::contact-unblocked]}
|
||||
[{:keys [db now] :as cofx} public-key]
|
||||
(let [contact (-> (get-in db [:contacts/contacts public-key])
|
||||
(assoc :last-updated now :blocked false))]
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(update :contacts/blocked disj public-key)
|
||||
(assoc-in [:contacts/contacts public-key] contact))}
|
||||
(contacts-store/save-contact contact nil))))
|
||||
{:events [:contact.ui/unblock-contact-pressed]}
|
||||
[cofx contact-id]
|
||||
(contacts-store/unblock
|
||||
cofx
|
||||
contact-id
|
||||
#(re-frame/dispatch [::contact-unblocked contact-id])))
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
[status-im.navigation :as navigation]
|
||||
[status-im.utils.fx :as fx]
|
||||
[status-im.chat.models :as chat]
|
||||
[status-im.contact.core :as contact]))
|
||||
[status-im.contact.core :as contact]
|
||||
[status-im.notifications-center.core :as notification-center]))
|
||||
|
||||
(fx/defn send-message-pressed
|
||||
{:events [:contact.ui/send-message-pressed]
|
||||
@@ -11,6 +12,7 @@
|
||||
[cofx {:keys [public-key]}]
|
||||
(fx/merge cofx
|
||||
{:dispatch-later [{:ms 1000 :dispatch [:chat.ui/start-chat public-key]}]}
|
||||
(notification-center/accept-all-activity-center-notifications-from-chat public-key)
|
||||
(navigation/pop-to-root-tab :chat-stack)))
|
||||
|
||||
(fx/defn contact-code-submitted
|
||||
@@ -20,12 +22,10 @@
|
||||
(let [{:keys [public-key ens-name]} new-identity]
|
||||
(fx/merge cofx
|
||||
#(if new-contact?
|
||||
(contact/add-contact % public-key nickname)
|
||||
(chat/start-chat % public-key))
|
||||
(contact/add-contact % public-key nickname ens-name)
|
||||
(chat/start-chat % public-key ens-name))
|
||||
#(when new-contact?
|
||||
(navigation/navigate-back %))
|
||||
#(when ens-name
|
||||
(contact/name-verified % public-key ens-name)))))
|
||||
(navigation/navigate-back %)))))
|
||||
|
||||
(fx/defn pinned-messages-pressed
|
||||
{:events [:contact.ui/pinned-messages-pressed]}
|
||||
|
||||
@@ -3,11 +3,9 @@
|
||||
[status-im.contact.db :as contact.db]
|
||||
[status-im.data-store.contacts :as contacts-store]
|
||||
[status-im.ethereum.json-rpc :as json-rpc]
|
||||
[status-im.mailserver.core :as mailserver]
|
||||
[status-im.navigation :as navigation]
|
||||
[status-im.utils.fx :as fx]
|
||||
[taoensso.timbre :as log]
|
||||
[clojure.string :as string]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contact.block :as contact.block]))
|
||||
|
||||
@@ -54,10 +52,7 @@
|
||||
(conj nil)
|
||||
|
||||
(and blocked (not was-blocked))
|
||||
(conj [::contact.block/contact-blocked contact chats])
|
||||
|
||||
(and was-blocked (not blocked))
|
||||
(conj [::contact.block/contact-unblocked public-key]))))
|
||||
(conj [::contact.block/contact-blocked contact chats]))))
|
||||
[[:offload-messages constants/timeline-chat-id]]
|
||||
contacts)]
|
||||
(merge
|
||||
@@ -71,17 +66,6 @@
|
||||
(when (> (count events) 1)
|
||||
{:dispatch-n events}))))
|
||||
|
||||
(fx/defn upsert-contact
|
||||
[{:keys [db] :as cofx}
|
||||
{:keys [public-key] :as contact}]
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(update-in [:contacts/contacts public-key] merge contact))}
|
||||
(fn [cf]
|
||||
(contacts-store/save-contact cf
|
||||
(get-in cf [:db :contacts/contacts public-key])
|
||||
#(re-frame/dispatch [::send-contact-request public-key])))))
|
||||
|
||||
(fx/defn send-contact-request
|
||||
{:events [::send-contact-request]}
|
||||
[{:keys [db] :as cofx} public-key]
|
||||
@@ -92,22 +76,17 @@
|
||||
|
||||
(fx/defn add-contact
|
||||
"Add a contact and set pending to false"
|
||||
{:events [:contact.ui/add-to-contact-pressed]
|
||||
:interceptors [(re-frame/inject-cofx :random-id-generator)]}
|
||||
[{:keys [db] :as cofx} public-key nickname]
|
||||
{:events [:contact.ui/add-to-contact-pressed]}
|
||||
[{:keys [db] :as cofx} public-key nickname ens-name]
|
||||
(when (not= (get-in db [:multiaccount :public-key]) public-key)
|
||||
(let [contact (cond-> (get-in db [:contacts/contacts public-key]
|
||||
(build-contact cofx public-key))
|
||||
(and nickname (not (string/blank? nickname)))
|
||||
(assoc :nickname nickname)
|
||||
:else
|
||||
(assoc :added true))]
|
||||
(fx/merge cofx
|
||||
{:db (dissoc db :contacts/new-identity)
|
||||
:dispatch-n [[:start-profile-chat public-key]
|
||||
[:offload-messages constants/timeline-chat-id]]}
|
||||
(upsert-contact contact)
|
||||
(mailserver/process-next-messages-request)))))
|
||||
(contacts-store/add
|
||||
cofx
|
||||
public-key
|
||||
nickname
|
||||
ens-name
|
||||
#(do
|
||||
(re-frame/dispatch [:sanitize-messages-and-process-response %])
|
||||
(re-frame/dispatch [:offload-messages constants/timeline-chat-id])))))
|
||||
|
||||
(fx/defn remove-contact
|
||||
"Remove a contact from current account's contact list"
|
||||
@@ -119,16 +98,6 @@
|
||||
:on-success #(log/debug "contact removed successfully")}]
|
||||
:dispatch [:offload-messages constants/timeline-chat-id]})
|
||||
|
||||
(fx/defn create-contact
|
||||
"Create entry in contacts"
|
||||
[{:keys [db] :as cofx} public-key]
|
||||
(when (not= (get-in db [:multiaccount :public-key]) public-key)
|
||||
(let [contact (build-contact cofx public-key)]
|
||||
(log/info "create contact" contact)
|
||||
(fx/merge cofx
|
||||
{:db (dissoc db :contacts/new-identity)}
|
||||
(upsert-contact contact)))))
|
||||
|
||||
(fx/defn initialize-contacts [cofx]
|
||||
(contacts-store/fetch-contacts-rpc cofx #(re-frame/dispatch [::contacts-loaded %])))
|
||||
|
||||
@@ -141,29 +110,12 @@
|
||||
:new-chat-name "")}
|
||||
(navigation/navigate-to-cofx :contact-toggle-list nil)))
|
||||
|
||||
(fx/defn name-verified
|
||||
{:events [:contacts/ens-name-verified]}
|
||||
[{:keys [db now] :as cofx} public-key ens-name]
|
||||
(let [contact (-> (or (get-in db [:contacts/contacts public-key])
|
||||
(build-contact cofx public-key))
|
||||
(assoc :name ens-name
|
||||
:ens-verified true))]
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(update-in [:contacts/contacts public-key] merge contact))
|
||||
::json-rpc/call [{:method "wakuext_ensVerified"
|
||||
:params [public-key ens-name]
|
||||
:on-success #(log/debug "ens name verified successuful")}]})))
|
||||
|
||||
(fx/defn update-nickname
|
||||
{:events [:contacts/update-nickname]}
|
||||
[{:keys [db] :as cofx} public-key nickname]
|
||||
(let [contact (-> (build-contact cofx public-key)
|
||||
(merge (get-in db [:contacts/contacts public-key])))]
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:contacts/contacts public-key]
|
||||
(if (string/blank? nickname)
|
||||
(dissoc contact :nickname)
|
||||
(assoc contact :nickname nickname)))}
|
||||
(upsert-contact {:public-key public-key})
|
||||
(navigation/navigate-back))))
|
||||
(fx/merge cofx
|
||||
(contacts-store/set-nickname
|
||||
public-key
|
||||
nickname
|
||||
#(re-frame/dispatch [:sanitize-messages-and-process-response %]))
|
||||
(navigation/navigate-back)))
|
||||
|
||||
@@ -28,7 +28,10 @@
|
||||
:chat-type constants/one-to-one-chat-type
|
||||
:chat-name name
|
||||
:public? false
|
||||
:group-chat false)))
|
||||
:group-chat false)
|
||||
|
||||
:else
|
||||
chat))
|
||||
|
||||
(defn <-rpc [item]
|
||||
(-> item
|
||||
|
||||
@@ -13,15 +13,6 @@
|
||||
:lastUpdated :last-updated
|
||||
:localNickname :nickname}))
|
||||
|
||||
(defn ->rpc [contact]
|
||||
(clojure.set/rename-keys contact {:public-key :id
|
||||
:ens-verified :ensVerified
|
||||
:ens-verified-at :ensVerifiedAt
|
||||
:last-ens-clock-value :lastENSClockValue
|
||||
:ens-verification-retries :ensVerificationRetries
|
||||
:last-updated :lastUpdated
|
||||
:nickname :localNickname}))
|
||||
|
||||
(fx/defn fetch-contacts-rpc
|
||||
[_ on-success]
|
||||
{::json-rpc/call [{:method (json-rpc/call-ext-method "contacts")
|
||||
@@ -29,18 +20,38 @@
|
||||
:on-success #(on-success (map <-rpc %))
|
||||
:on-failure #(log/error "failed to fetch contacts" %)}]})
|
||||
|
||||
(fx/defn save-contact
|
||||
[_ {:keys [public-key] :as contact} on-success]
|
||||
{::json-rpc/call [{:method (json-rpc/call-ext-method "saveContact")
|
||||
:params [(->rpc contact)]
|
||||
(fx/defn add
|
||||
[_ public-key nickname ens-name on-success]
|
||||
{::json-rpc/call [{:method (json-rpc/call-ext-method "addContact")
|
||||
:params [{:id public-key :nickname nickname :ensName ens-name}]
|
||||
:js-response true
|
||||
:on-success #(do
|
||||
(log/debug "saved contact" public-key "successfuly")
|
||||
(log/info "saved contact" public-key "successfuly")
|
||||
(when on-success
|
||||
(on-success)))
|
||||
:on-failure #(log/error "failed to save contact" public-key %)}]})
|
||||
(on-success %)))
|
||||
:on-failure #(log/error "failed to add contact" public-key %)}]})
|
||||
|
||||
(fx/defn block [_ contact on-success]
|
||||
(fx/defn set-nickname
|
||||
[_ public-key nickname on-success]
|
||||
{::json-rpc/call [{:method (json-rpc/call-ext-method "setContactLocalNickname")
|
||||
:params [{:id public-key :nickname nickname}]
|
||||
:js-response true
|
||||
:on-success #(do
|
||||
(log/debug "set contact nickname" public-key "successfuly" nickname)
|
||||
(when on-success
|
||||
(on-success %)))
|
||||
:on-failure #(log/error "failed to set contact nickname " public-key nickname %)}]})
|
||||
|
||||
(fx/defn block [_ contact-id on-success]
|
||||
{::json-rpc/call [{:method (json-rpc/call-ext-method "blockContact")
|
||||
:params [(->rpc contact)]
|
||||
:params [contact-id]
|
||||
:js-response true
|
||||
:on-success on-success
|
||||
:on-failure #(log/error "failed to block contact" % contact)}]})
|
||||
:on-failure #(log/error "failed to block contact" % contact-id)}]})
|
||||
|
||||
(fx/defn unblock [_ contact-id on-success]
|
||||
{::json-rpc/call [{:method (json-rpc/call-ext-method "unblockContact")
|
||||
:params [contact-id]
|
||||
:on-success on-success
|
||||
:js-response true
|
||||
:on-failure #(log/error "failed to unblock contact" % contact-id)}]})
|
||||
|
||||
@@ -2,21 +2,6 @@
|
||||
(:require [cljs.test :refer-macros [deftest is testing]]
|
||||
[status-im.data-store.contacts :as c]))
|
||||
|
||||
(deftest contact->rpc
|
||||
(let [contact {:public-key "pk"
|
||||
:address "address"
|
||||
:name "name"
|
||||
:identicon "identicon"
|
||||
:last-updated 1}
|
||||
expected-contact {:id "pk"
|
||||
:address "address"
|
||||
:name "name"
|
||||
:identicon "identicon"
|
||||
|
||||
:lastUpdated 1}]
|
||||
(testing "->rpc"
|
||||
(is (= expected-contact (c/->rpc contact))))))
|
||||
|
||||
(deftest contact<-rpc
|
||||
(let [contact {:id "pk"
|
||||
:address "address"
|
||||
|
||||
@@ -17,15 +17,20 @@
|
||||
(.hexToUtf8 utils s)
|
||||
(catch :default _ nil)))
|
||||
|
||||
;; IDs standardized in https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids
|
||||
(def BSC-mainnet-chain-id 56)
|
||||
(def BSC-testnet-chain-id 97)
|
||||
|
||||
;; IDs standardized in https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids
|
||||
(def chains
|
||||
{:mainnet {:id 1 :name "Mainnet"}
|
||||
:testnet {:id 3 :name "Ropsten"}
|
||||
:rinkeby {:id 4 :name "Rinkeby"}
|
||||
:xdai {:id 100 :name "xDai"}
|
||||
:poa {:id 99 :name "POA"}
|
||||
:goerli {:id 5 :name "Goerli"}})
|
||||
{:mainnet {:id 1 :name "Mainnet"}
|
||||
:testnet {:id 3 :name "Ropsten"}
|
||||
:rinkeby {:id 4 :name "Rinkeby"}
|
||||
:xdai {:id 100 :name "xDai"}
|
||||
:goerli {:id 5 :name "Goerli"}
|
||||
:bsc {:id BSC-mainnet-chain-id
|
||||
:name "BSC"}
|
||||
:bsc-testnet {:id BSC-testnet-chain-id
|
||||
:name "BSC tetnet"}})
|
||||
|
||||
(defn chain-id->chain-keyword [i]
|
||||
(or (some #(when (= i (:id (val %))) (key %)) chains)
|
||||
@@ -46,11 +51,12 @@
|
||||
(defn testnet? [id]
|
||||
(contains? #{(chain-keyword->chain-id :testnet)
|
||||
(chain-keyword->chain-id :rinkeby)
|
||||
(chain-keyword->chain-id :goerli)} id))
|
||||
(chain-keyword->chain-id :goerli)
|
||||
(chain-keyword->chain-id :bsc-testnet)} id))
|
||||
|
||||
(defn sidechain? [id]
|
||||
(contains? #{(chain-keyword->chain-id :xdai)
|
||||
(chain-keyword->chain-id :poa)} id))
|
||||
(chain-keyword->chain-id :bsc)} id))
|
||||
|
||||
(defn network-with-upstream-rpc? [network]
|
||||
(get-in network [:config :UpstreamConfig :Enabled]))
|
||||
@@ -107,6 +113,16 @@
|
||||
network-id (get db :networks/current-network)]
|
||||
(get networks network-id)))
|
||||
|
||||
(defn binance-chain-id? [chain-id]
|
||||
(or (= BSC-mainnet-chain-id chain-id)
|
||||
(= BSC-testnet-chain-id chain-id)))
|
||||
|
||||
(defn binance-chain? [db]
|
||||
(-> db
|
||||
current-network
|
||||
network->chain-id
|
||||
binance-chain-id?))
|
||||
|
||||
(def custom-rpc-node-id-len 45)
|
||||
|
||||
(defn custom-rpc-node? [{:keys [id]}]
|
||||
@@ -120,13 +136,17 @@
|
||||
network->chain-keyword
|
||||
name))
|
||||
|
||||
(defn chain-keyword
|
||||
(defn get-current-network
|
||||
[{:networks/keys [current-network networks]}]
|
||||
(network->chain-keyword (get networks current-network)))
|
||||
(get networks current-network))
|
||||
|
||||
(defn chain-keyword
|
||||
[db]
|
||||
(network->chain-keyword (get-current-network db)))
|
||||
|
||||
(defn chain-id
|
||||
[{:networks/keys [current-network networks]}]
|
||||
(network->chain-id (get networks current-network)))
|
||||
[db]
|
||||
(network->chain-id (get-current-network db)))
|
||||
|
||||
(defn snt-symbol [db]
|
||||
(chain-keyword->snt-symbol (chain-keyword db)))
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
"wakuext_disableInstallation" {}
|
||||
"wakuext_sendChatMessage" {}
|
||||
"wakuext_sendChatMessages" {}
|
||||
"wakuext_backupData" {}
|
||||
"wakuext_confirmJoiningGroup" {}
|
||||
"wakuext_addAdminsToGroupChat" {}
|
||||
"wakuext_addMembersToGroupChat" {}
|
||||
@@ -90,9 +91,12 @@
|
||||
"wakuext_unmuteChat" {}
|
||||
"wakuext_contacts" {}
|
||||
"wakuext_removeContact" {}
|
||||
"wakuext_setContactLocalNickname" {}
|
||||
"wakuext_clearHistory" {}
|
||||
"wakuext_prepareContent" {}
|
||||
"wakuext_blockContact" {}
|
||||
"wakuext_unblockContact" {}
|
||||
"wakuext_addContact" {}
|
||||
"wakuext_updateMailservers" {}
|
||||
"wakuext_sendEmojiReaction" {}
|
||||
"wakuext_sendEmojiReactionRetraction" {}
|
||||
@@ -190,6 +194,7 @@
|
||||
"wallet_getCryptoOnRamps" {}
|
||||
"wallet_getOpenseaCollectionsByOwner" {}
|
||||
"wallet_getOpenseaAssetsByOwnerAndCollection" {}
|
||||
"wallet_loadTransferByHash" {}
|
||||
"browsers_getBrowsers" {}
|
||||
"browsers_addBrowser" {}
|
||||
"browsers_deleteBrowser" {}
|
||||
|
||||
@@ -34,19 +34,20 @@
|
||||
tokens))
|
||||
|
||||
(defn network->icon [network]
|
||||
(let [s (str "../resources/images/tokens/" (name network) "/0-native.png")
|
||||
(let [s (str "./resources/images/tokens/" (name network) "/0-native.png")
|
||||
s-js (str "." s)
|
||||
image (gensym)]
|
||||
(if (.exists (io/file s))
|
||||
`(let [~image (atom nil)]
|
||||
(fn []
|
||||
(or @~image
|
||||
(reset! ~image (js/require ~s)))))
|
||||
(reset! ~image (js/require ~s-js)))))
|
||||
`(let [~image (atom nil)]
|
||||
(fn []
|
||||
(or
|
||||
@~image
|
||||
(reset! ~image
|
||||
(js/require "../resources/images/tokens/default-native.png"))))))))
|
||||
(js/require "../resources/images/tokens/default-token.png"))))))))
|
||||
|
||||
(defmacro resolve-native-currency-icons
|
||||
"In react-native arguments to require must be static strings.
|
||||
|
||||
@@ -1,46 +1,53 @@
|
||||
(ns status-im.ethereum.tokens
|
||||
(:require [clojure.string :as string])
|
||||
(:require [clojure.string :as string]
|
||||
[status-im.ethereum.core :as ethereum])
|
||||
(:require-macros
|
||||
[status-im.ethereum.macros :as ethereum.macros :refer [resolve-icons]]))
|
||||
|
||||
(def default-native-currency
|
||||
(memoize
|
||||
(fn []
|
||||
{:name "Native"
|
||||
:symbol :ETH
|
||||
:decimals 18
|
||||
:icon {:source (js/require "../resources/images/tokens/default-native.png")}})))
|
||||
(fn [symbol]
|
||||
{:name "Native"
|
||||
:symbol :ETH
|
||||
:symbol-display symbol
|
||||
:decimals 18
|
||||
:icon {:source (js/require "../resources/images/tokens/default-token.png")}})))
|
||||
|
||||
(def snt-icon-source (js/require "../resources/images/tokens/mainnet/SNT.png"))
|
||||
|
||||
(def all-native-currencies
|
||||
(ethereum.macros/resolve-native-currency-icons
|
||||
{:mainnet {:name "Ether"
|
||||
:symbol :ETH
|
||||
:decimals 18}
|
||||
:testnet {:name "Ropsten Ether"
|
||||
:symbol :ETH
|
||||
:symbol-display :ETHro
|
||||
:decimals 18}
|
||||
:rinkeby {:name "Rinkeby Ether"
|
||||
:symbol :ETH
|
||||
:symbol-display :ETHri
|
||||
:decimals 18}
|
||||
:poa {:name "POA"
|
||||
:symbol :ETH
|
||||
:symbol-display :POA
|
||||
:decimals 18}
|
||||
:xdai {:name "xDAI"
|
||||
:symbol :ETH
|
||||
:symbol-display :xDAI
|
||||
:symbol-exchange :DAI
|
||||
:decimals 18}}))
|
||||
{:mainnet {:name "Ether"
|
||||
:symbol :ETH
|
||||
:decimals 18}
|
||||
:testnet {:name "Ropsten Ether"
|
||||
:symbol :ETH
|
||||
:symbol-display :ETHro
|
||||
:decimals 18}
|
||||
:rinkeby {:name "Rinkeby Ether"
|
||||
:symbol :ETH
|
||||
:symbol-display :ETHri
|
||||
:decimals 18}
|
||||
:xdai {:name "xDAI"
|
||||
:symbol :ETH
|
||||
:symbol-display :xDAI
|
||||
:symbol-exchange :DAI
|
||||
:decimals 18}
|
||||
:bsc {:name "BSC"
|
||||
:symbol :ETH
|
||||
:symbol-display :BNB
|
||||
:decimals 18}
|
||||
:bsc-testnet {:name "BSC test"
|
||||
:symbol :ETH
|
||||
:symbol-display :BNBtest
|
||||
:decimals 18}}))
|
||||
|
||||
(def native-currency-symbols
|
||||
(set (map #(-> % val :symbol) all-native-currencies)))
|
||||
|
||||
(defn native-currency [chain]
|
||||
(-> (get all-native-currencies chain (default-native-currency))))
|
||||
(defn native-currency [{:keys [symbol] :as current-network}]
|
||||
(let [chain (ethereum/network->chain-keyword current-network)]
|
||||
(get all-native-currencies chain (default-native-currency symbol))))
|
||||
|
||||
(defn ethereum? [symbol]
|
||||
(native-currency-symbols symbol))
|
||||
@@ -767,6 +774,10 @@
|
||||
{:address "0xba5BDe662c17e2aDFF1075610382B9B691296350"
|
||||
:symbol :RARE
|
||||
:name "SuperRare"
|
||||
:decimals 18}
|
||||
{:address "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72"
|
||||
:symbol :ENS
|
||||
:name "Ethereum Name Service"
|
||||
:decimals 18}])
|
||||
:testnet
|
||||
(resolve-icons :testnet
|
||||
@@ -851,8 +862,8 @@
|
||||
(defn address->token [all-tokens address]
|
||||
(get all-tokens (string/lower-case address)))
|
||||
|
||||
(defn asset-for [all-tokens chain symbol]
|
||||
(let [native-coin (native-currency chain)]
|
||||
(defn asset-for [all-tokens current-network symbol]
|
||||
(let [native-coin (native-currency current-network)]
|
||||
(if (or (= (:symbol-display native-coin) symbol)
|
||||
(= (:symbol native-coin) symbol))
|
||||
native-coin
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
(:require [cljs.spec.alpha :as spec]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.ens.core :as ens]
|
||||
[status-im.ethereum.core :as ethereum]
|
||||
[status-im.ethereum.decode :as decode]
|
||||
[status-im.ethereum.eip55 :as eip55]
|
||||
[status-im.ethereum.encode :as encode]
|
||||
@@ -13,16 +14,31 @@
|
||||
|
||||
(def confirmations-count-threshold 12)
|
||||
|
||||
(def etherscan-supported? #{:testnet :mainnet :rinkeby})
|
||||
(def etherscan-supported?
|
||||
#{(ethereum/chain-keyword->chain-id :mainnet)
|
||||
(ethereum/chain-keyword->chain-id :testnet)
|
||||
(ethereum/chain-keyword->chain-id :rinkeby)})
|
||||
|
||||
(let [network->subdomain {:testnet "ropsten" :rinkeby "rinkeby"}]
|
||||
(defn get-transaction-details-url [chain hash]
|
||||
{:pre [(keyword? chain) (string? hash)]
|
||||
:post [(or (nil? %) (string? %))]}
|
||||
(when (etherscan-supported? chain)
|
||||
(let [network-subdomain (when-let [subdomain (network->subdomain chain)]
|
||||
(str subdomain "."))]
|
||||
(str "https://" network-subdomain "etherscan.io/tx/" hash)))))
|
||||
(def binance-mainnet-chain-id (ethereum/chain-keyword->chain-id :bsc))
|
||||
(def binance-testnet-chain-id (ethereum/chain-keyword->chain-id :bsc-testnet))
|
||||
|
||||
(def network->subdomain {3 "ropsten"
|
||||
4 "rinkeby"})
|
||||
|
||||
(defn get-transaction-details-url [chain-id hash]
|
||||
{:pre [(number? chain-id) (string? hash)]
|
||||
:post [(or (nil? %) (string? %))]}
|
||||
(cond
|
||||
(etherscan-supported? chain-id)
|
||||
(let [network-subdomain (when-let [subdomain (network->subdomain chain-id)]
|
||||
(str subdomain "."))]
|
||||
(str "https://" network-subdomain "etherscan.io/tx/" hash))
|
||||
|
||||
(= chain-id binance-mainnet-chain-id)
|
||||
(str "https://bscscan.com/tx/" hash)
|
||||
|
||||
(= chain-id binance-testnet-chain-id)
|
||||
(str "https://testnet.bscscan.com/tx/" hash)))
|
||||
|
||||
(def default-erc20-token
|
||||
{:symbol :ERC20
|
||||
@@ -358,6 +374,7 @@
|
||||
(tx-fetching-in-progress [address]))))
|
||||
|
||||
(fx/defn get-fetched-transfers
|
||||
{:events [:transaction/get-fetched-transfers]}
|
||||
[{:keys [db]}]
|
||||
{:transactions/get-transfers
|
||||
{:chain-tokens (:wallet/all-tokens db)
|
||||
|
||||
+68
-52
@@ -1,64 +1,64 @@
|
||||
(ns status-im.events
|
||||
(:require [re-frame.core :as re-frame]
|
||||
[status-im.chat.models :as chat]
|
||||
[status-im.i18n.i18n :as i18n]
|
||||
[status-im.mailserver.core :as mailserver]
|
||||
[status-im.multiaccounts.core :as multiaccounts]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.utils.fx :as fx]
|
||||
status-im.utils.logging.core
|
||||
[status-im.wallet.core :as wallet]
|
||||
[status-im.keycard.core :as keycard]
|
||||
[status-im.utils.dimensions :as dimensions]
|
||||
[status-im.multiaccounts.biometric.core :as biometric]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.native-module.core :as status]
|
||||
[status-im.ui.components.permissions :as permissions]
|
||||
[status-im.utils.utils :as utils]
|
||||
[status-im.ethereum.json-rpc :as json-rpc]
|
||||
[status-im.anon-metrics.core :as anon-metrics]
|
||||
[status-im.utils.universal-links.core :as universal-links]
|
||||
clojure.set
|
||||
status-im.currency.core
|
||||
status-im.navigation
|
||||
status-im.utils.universal-links.core
|
||||
status-im.wallet.custom-tokens.core
|
||||
status-im.waku.core
|
||||
status-im.wallet.choose-recipient.core
|
||||
status-im.wallet.accounts.core
|
||||
status-im.popover.core
|
||||
status-im.visibility-status-popover.core
|
||||
status-im.visibility-status-updates.core
|
||||
status-im.bottom-sheet.core
|
||||
(:require clojure.set
|
||||
[re-frame.core :as re-frame]
|
||||
status-im.add-new.core
|
||||
status-im.search.core
|
||||
status-im.http.core
|
||||
status-im.profile.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
|
||||
status-im.bottom-sheet.core
|
||||
status-im.browser.core
|
||||
status-im.browser.permissions
|
||||
[status-im.chat.models :as chat]
|
||||
status-im.chat.models.images
|
||||
status-im.ui.screens.privacy-and-security-settings.events
|
||||
status-im.chat.models.input
|
||||
status-im.chat.models.loading
|
||||
status-im.chat.models.transport
|
||||
[status-im.constants :as constants]
|
||||
status-im.contact.block
|
||||
status-im.contact.chat
|
||||
status-im.contact.core
|
||||
status-im.currency.core
|
||||
[status-im.ethereum.json-rpc :as json-rpc]
|
||||
status-im.ethereum.subscriptions
|
||||
status-im.fleet.core
|
||||
status-im.http.core
|
||||
[status-im.i18n.i18n :as i18n]
|
||||
status-im.init.core
|
||||
[status-im.keycard.core :as keycard]
|
||||
status-im.log-level.core
|
||||
status-im.mailserver.constants
|
||||
[status-im.mailserver.core :as mailserver]
|
||||
[status-im.multiaccounts.biometric.core :as biometric]
|
||||
[status-im.multiaccounts.core :as multiaccounts]
|
||||
status-im.multiaccounts.login.core
|
||||
status-im.multiaccounts.logout.core
|
||||
status-im.multiaccounts.update.core
|
||||
[status-im.native-module.core :as status]
|
||||
[status-im.navigation :as navigation]
|
||||
status-im.notifications-center.core
|
||||
status-im.pairing.core
|
||||
status-im.popover.core
|
||||
status-im.profile.core
|
||||
status-im.search.core
|
||||
status-im.signals.core
|
||||
status-im.stickers.core
|
||||
status-im.transport.core
|
||||
status-im.init.core
|
||||
status-im.log-level.core
|
||||
status-im.mailserver.constants
|
||||
status-im.ethereum.subscriptions
|
||||
status-im.fleet.core
|
||||
status-im.contact.block
|
||||
status-im.contact.core
|
||||
status-im.contact.chat
|
||||
status-im.chat.models.input
|
||||
status-im.chat.models.loading
|
||||
status-im.bootnodes.core
|
||||
status-im.browser.core
|
||||
status-im.browser.permissions
|
||||
status-im.chat.models.transport
|
||||
status-im.notifications-center.core
|
||||
[status-im.navigation :as navigation]))
|
||||
[status-im.ui.components.permissions :as permissions]
|
||||
[status-im.ui.components.react :as react]
|
||||
status-im.ui.screens.privacy-and-security-settings.events
|
||||
[status-im.utils.dimensions :as dimensions]
|
||||
[status-im.utils.fx :as fx]
|
||||
status-im.utils.logging.core
|
||||
[status-im.utils.universal-links.core :as universal-links]
|
||||
[status-im.utils.utils :as utils]
|
||||
status-im.visibility-status-popover.core
|
||||
status-im.visibility-status-updates.core
|
||||
status-im.waku.core
|
||||
status-im.wallet.accounts.core
|
||||
status-im.wallet.choose-recipient.core
|
||||
[status-im.wallet.core :as wallet]
|
||||
status-im.wallet.custom-tokens.core))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:dismiss-keyboard
|
||||
@@ -192,8 +192,24 @@
|
||||
(fx/defn on-will-focus
|
||||
{:events [:screens/on-will-focus]
|
||||
:interceptors [anon-metrics/interceptor]}
|
||||
[cofx view-id]
|
||||
[{:keys [db] :as cofx} view-id]
|
||||
(fx/merge cofx
|
||||
(cond
|
||||
(= :chat view-id)
|
||||
{::async-storage/set! {:chat-id (get-in cofx [:db :current-chat-id])
|
||||
:key-uid (get-in cofx [:db :multiaccount :key-uid])}
|
||||
:db (assoc db :screens/was-focused-once? true)}
|
||||
|
||||
(= :login view-id)
|
||||
{}
|
||||
|
||||
(not (get db :screens/was-focused-once?))
|
||||
{:db (assoc db :screens/was-focused-once? true)}
|
||||
|
||||
:else
|
||||
{::async-storage/set! {:chat-id nil
|
||||
:key-uid nil}
|
||||
:db (assoc db :screens/was-focused-once? true)})
|
||||
#(case view-id
|
||||
:keycard-settings (keycard/settings-screen-did-load %)
|
||||
:reset-card (keycard/reset-card-screen-did-load %)
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
[cofx {:keys [chat-id invitation-admin chat-name]}]
|
||||
(if (get-in cofx [:db :chats chat-id])
|
||||
{:dispatch-n [[:accept-all-activity-center-notifications-from-chat chat-id]
|
||||
[:chat.ui/navigate-to-chat chat-id false]]}
|
||||
[:chat.ui/navigate-to-chat chat-id]]}
|
||||
{::json-rpc/call [{:method (json-rpc/call-ext-method "createGroupChatFromInvitation")
|
||||
:params [chat-name chat-id invitation-admin]
|
||||
:js-response true
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
[status-im.utils.keychain.core :as keychain]
|
||||
[status-im.utils.types :as types]
|
||||
[taoensso.timbre :as log]
|
||||
[status-im.utils.datetime :as utils.datetime]
|
||||
[status-im.bottom-sheet.core :as bottom-sheet]
|
||||
[status-im.utils.platform :as platform]
|
||||
[status-im.popover.core :as popover]))
|
||||
@@ -416,6 +417,14 @@
|
||||
|
||||
;; Get application info
|
||||
|
||||
(fx/defn update-pairings
|
||||
[{:keys [db]} instance-uid pairing]
|
||||
(let [paired-on (utils.datetime/timestamp)
|
||||
pairings (-> (get-in db [:keycard :pairings])
|
||||
(assoc instance-uid {:pairing pairing :paired-on paired-on}))]
|
||||
{:keycard/persist-pairings pairings
|
||||
:db (assoc-in db [:keycard :pairings] pairings)}))
|
||||
|
||||
(fx/defn get-application-info
|
||||
{:events [:keycard/get-application-info]}
|
||||
[{:keys [db]} on-card-read]
|
||||
@@ -425,9 +434,8 @@
|
||||
(fx/defn on-get-application-info-success
|
||||
{:events [:keycard.callback/on-get-application-info-success]}
|
||||
[{:keys [db] :as cofx} info on-success]
|
||||
(let [{:keys [pin-retry-counter puk-retry-counter]} info
|
||||
(let [{:keys [pin-retry-counter puk-retry-counter instance-uid new-pairing]} info
|
||||
view-id (:view-id db)
|
||||
|
||||
{:keys [on-card-read]} (:keycard db)
|
||||
on-success' (or on-success on-card-read)
|
||||
enter-step (get-in db [:keycard :pin :enter-step])]
|
||||
@@ -443,6 +451,8 @@
|
||||
(assoc-in [:keycard :application-info :applet-installed?] true)
|
||||
(assoc-in [:keycard :application-info-error] nil))}
|
||||
(stash-on-card-read)
|
||||
(when new-pairing
|
||||
(update-pairings instance-uid new-pairing))
|
||||
(when (and (zero? pin-retry-counter)
|
||||
(pos? puk-retry-counter)
|
||||
(not= enter-step :puk))
|
||||
@@ -452,6 +462,7 @@
|
||||
(blocked-keycard-popup cofx)
|
||||
(when on-success'
|
||||
(dispatch-event cofx on-success')))))))
|
||||
|
||||
(fx/defn on-get-application-info-error
|
||||
{:events [:keycard.callback/on-get-application-info-error]}
|
||||
[{:keys [db] :as cofx} error]
|
||||
|
||||
@@ -70,7 +70,9 @@
|
||||
(mnemonic/set-mnemonic))
|
||||
(when (= flow :recovery)
|
||||
(onboarding/proceed-with-generating-key)))
|
||||
(recovery/load-pair-screen cofx))))
|
||||
(if (get-in db [:keycard :secrets :password])
|
||||
(onboarding/load-pairing-screen cofx)
|
||||
(recovery/load-pair-screen cofx)))))
|
||||
|
||||
(fx/defn navigate-to-keycard-settings
|
||||
{:events [:profile.ui/keycard-settings-button-pressed]}
|
||||
@@ -523,14 +525,14 @@
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:keycard :card-state] card-state)}
|
||||
(set-setup-step card-state)
|
||||
(common/hide-connection-sheet)
|
||||
|
||||
(when paired?
|
||||
(load-pairing))
|
||||
|
||||
(when (and flow
|
||||
(= card-state :init))
|
||||
(proceed-setup-with-initialized-card flow instance-uid paired?))
|
||||
(if (and flow
|
||||
(= card-state :init))
|
||||
(proceed-setup-with-initialized-card flow instance-uid paired?)
|
||||
(common/hide-connection-sheet))
|
||||
|
||||
(when (= card-state :pre-init)
|
||||
(if (= flow :import)
|
||||
@@ -583,7 +585,7 @@
|
||||
{:db (-> db
|
||||
(assoc-in [:keycard :nfc-running?] false)
|
||||
(assoc-in [:keycard :card-connected?] false))
|
||||
:keycard/start-nfc nil})
|
||||
:dispatch-later [{:ms 500 :dispatch [:keycard.ui/start-nfc]}]})
|
||||
|
||||
(fx/defn on-register-card-events
|
||||
{:events [:keycard.callback/on-register-card-events]}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
(assoc-in [:keycard :setup-step] :recovery-phrase)
|
||||
(assoc-in [:keycard :secrets :mnemonic] mnemonic))}
|
||||
(common/clear-on-card-connected)
|
||||
(common/hide-connection-sheet)
|
||||
(navigation/navigate-replace :keycard-onboarding-recovery-phrase nil))))
|
||||
|
||||
(fx/defn load-loading-keys-screen
|
||||
|
||||
@@ -232,12 +232,14 @@
|
||||
[{:keys [db] :as cofx} secrets]
|
||||
(let [secrets' (js->clj secrets :keywordize-keys true)]
|
||||
(fx/merge cofx
|
||||
{:keycard/get-application-info nil
|
||||
:db (-> db
|
||||
(assoc-in [:keycard :card-state] :init)
|
||||
(assoc-in [:keycard :setup-step] :secret-keys)
|
||||
(update-in [:keycard :secrets] merge secrets'))}
|
||||
(load-pairing-screen))))
|
||||
{:db (-> db
|
||||
(assoc-in [:keycard :card-state] :init)
|
||||
(assoc-in [:keycard :setup-step] :secret-keys)
|
||||
(update-in [:keycard :secrets] merge secrets'))}
|
||||
(common/show-connection-sheet
|
||||
{:on-card-connected :keycard/get-application-info
|
||||
:on-card-read :keycard/check-card-state
|
||||
:handler (common/get-application-info :keycard/check-card-state)}))))
|
||||
|
||||
(fx/defn on-install-applet-and-init-card-error
|
||||
{:events [:keycard.callback/on-install-applet-and-init-card-error
|
||||
|
||||
@@ -184,8 +184,9 @@
|
||||
|
||||
(fx/defn handle-successful-request
|
||||
{:events [::request-success]}
|
||||
[{:keys [db]} response-js]
|
||||
{:db (dissoc db :mailserver/current-request)})
|
||||
[{:keys [db] :as cofx} response-js]
|
||||
{:db (dissoc db :mailserver/current-request)
|
||||
:dispatch [:sanitize-messages-and-process-response response-js]})
|
||||
|
||||
(fx/defn process-next-messages-request
|
||||
{:events [::request-messages]}
|
||||
|
||||
@@ -191,6 +191,7 @@
|
||||
:latest-derived-path 0
|
||||
:signing-phrase signing-phrase
|
||||
:send-push-notifications? true
|
||||
:backup-enabled? true
|
||||
:installation-id (random-guid-generator)
|
||||
;; default mailserver (history node) setting
|
||||
:use-mailservers? true
|
||||
|
||||
@@ -122,8 +122,11 @@
|
||||
(wallet/get-cached-balances scan-all-tokens?))
|
||||
(when-not (get db :wallet/new-account)
|
||||
(wallet/restart-wallet-service nil))
|
||||
(when-not (utils.mobile-sync/syncing-allowed? cofx)
|
||||
(when (or (not (utils.mobile-sync/syncing-allowed? cofx))
|
||||
(ethereum/binance-chain? db))
|
||||
(transactions/get-fetched-transfers))
|
||||
(when (ethereum/binance-chain? db)
|
||||
(wallet/request-current-block-update))
|
||||
(prices/update-prices)))
|
||||
|
||||
(fx/defn login
|
||||
@@ -300,17 +303,20 @@
|
||||
(let [{:networks/keys [current-network networks]
|
||||
:as settings}
|
||||
(data-store.settings/rpc->settings settings)
|
||||
multiaccount (dissoc settings :networks/current-network :networks/networks)]
|
||||
multiaccount (dissoc settings :networks/current-network :networks/networks)
|
||||
;;for some reason we save default networks in db, in case when we want to modify default-networks for
|
||||
;; existing accounts we have to merge them again into networks
|
||||
merged-networks (merge networks config/default-networks-by-id)]
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(dissoc :multiaccounts/login)
|
||||
(assoc :networks/current-network current-network
|
||||
:networks/networks networks
|
||||
:networks/networks merged-networks
|
||||
:multiaccount multiaccount))}
|
||||
(data-store.chats/fetch-chats-rpc
|
||||
{:on-success
|
||||
#(do (re-frame/dispatch [:chats-list/load-success %])
|
||||
(re-frame/dispatch [::get-chats-callback settings]))})
|
||||
(re-frame/dispatch [::get-chats-callback]))})
|
||||
(acquisition/login)
|
||||
(initialize-appearance)
|
||||
(initialize-communities-enabled)
|
||||
@@ -319,11 +325,24 @@
|
||||
(logging/set-log-level (:log-level multiaccount))
|
||||
(notifications-center/get-activity-center-notifications-count))))
|
||||
|
||||
(re-frame/reg-fx
|
||||
::open-last-chat
|
||||
(fn [key-uid]
|
||||
(async-storage/get-item
|
||||
:chat-id
|
||||
(fn [chat-id]
|
||||
(when chat-id
|
||||
(async-storage/get-item
|
||||
:key-uid
|
||||
(fn [stored-key-uid]
|
||||
(when (= stored-key-uid key-uid)
|
||||
(re-frame/dispatch [:chat.ui/navigate-to-chat chat-id])))))))))
|
||||
|
||||
(fx/defn get-chats-callback
|
||||
{:events [::get-chats-callback]}
|
||||
[{:keys [db] :as cofx} settings]
|
||||
(let [{:keys [notifications-enabled?]
|
||||
:networks/keys [current-network networks]} settings
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [{:networks/keys [current-network networks]} db
|
||||
notifications-enabled? (get-in db [:multiaccount :notifications-enabled?])
|
||||
network-id (str (get-in networks [current-network :config :NetworkId]))]
|
||||
(fx/merge cofx
|
||||
(cond-> {::eip1559/check-eip1559-activation
|
||||
@@ -333,7 +352,8 @@
|
||||
::initialize-wallet
|
||||
(fn [accounts custom-tokens favourites]
|
||||
(re-frame/dispatch [::initialize-wallet
|
||||
accounts custom-tokens favourites]))}
|
||||
accounts custom-tokens favourites]))
|
||||
::open-last-chat (get-in db [:multiaccount :key-uid])}
|
||||
notifications-enabled?
|
||||
(assoc ::notifications/enable nil))
|
||||
(transport/start-messenger)
|
||||
@@ -375,7 +395,7 @@
|
||||
config/metrics-enabled?)
|
||||
(navigation/navigate-to :anon-metrics-opt-in {})
|
||||
|
||||
:else (re-frame/dispatch [:init-root :chat-stack]))))
|
||||
:else (re-frame/dispatch [:init-root :chat-stack]))))
|
||||
|
||||
(fx/defn login-only-events
|
||||
[{:keys [db] :as cofx} key-uid password save-password?]
|
||||
|
||||
@@ -89,8 +89,7 @@
|
||||
:mainnet #{:SNT}
|
||||
:rinkeby #{:MOKSHA
|
||||
:KDO}
|
||||
:xdai #{}
|
||||
:poa #{}}
|
||||
:xdai #{}}
|
||||
:preview-privacy? true
|
||||
:fleet :eth.prod
|
||||
:identicon "data:image/png;base64iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAADAFBMVEX////YsYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPGFwxAAABAHRSTlP//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmfXxgAABnNJREFUeNoBaAaX+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAQEBAQAAAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAABAQEBAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAAAAAEBAQEAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAAAAAAEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEAAAAAAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQAAAAABAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAAAAAAEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAloYA4a9rBHIAAAAASUVORK5CYII="
|
||||
|
||||
@@ -47,6 +47,11 @@
|
||||
(assoc-in db [:multiaccount setting] setting-value)
|
||||
(update db :multiaccount dissoc setting))}))
|
||||
|
||||
(fx/defn toggle-backup-enabled
|
||||
{:events [:multiaccounts.ui/switch-backup-enabled]}
|
||||
[cofx enabled?]
|
||||
(multiaccount-update cofx :backup-enabled? enabled? {}))
|
||||
|
||||
(fx/defn toggle-opensea-nfts-visibility
|
||||
{:events [::toggle-opensea-nfts-visiblity]}
|
||||
[cofx visible?]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
(ns status-im.navigation
|
||||
(:require [status-im.utils.fx :as fx]
|
||||
[status-im.anon-metrics.core :as anon-metrics]))
|
||||
(: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
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
(ns status-im.navigation.core
|
||||
(:require
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.ui.screens.views :as views]
|
||||
[status-im.utils.platform :as platform]
|
||||
[status-im.navigation.roots :as roots]
|
||||
[status-im.ui.components.react :as react]
|
||||
[quo.components.text-input :as quo.text-input]
|
||||
[status-im.ui.components.icons.icons :as icons]
|
||||
[quo.design-system.colors :as quo.colors]
|
||||
[status-im.utils.fx :as fx]
|
||||
["react-native-navigation" :refer (Navigation)]
|
||||
["react-native" :as rn]
|
||||
["react-native-gesture-handler" :refer (gestureHandlerRootHOC)]
|
||||
["react-native" :as rn]))
|
||||
["react-native-navigation" :refer (Navigation)]
|
||||
[quo.components.text-input :as quo.text-input]
|
||||
[quo.design-system.colors :as quo.colors]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.navigation.roots :as roots]
|
||||
[status-im.ui.components.icons.icons :as icons]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.ui.screens.views :as views]
|
||||
[status-im.utils.fx :as fx]
|
||||
[status-im.utils.platform :as platform]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
(def debug? ^boolean js/goog.DEBUG)
|
||||
|
||||
@@ -26,6 +27,7 @@
|
||||
|
||||
;; REGISTER COMPONENT (LAZY)
|
||||
(defn reg-comp [key]
|
||||
(log/debug "reg-comp" key)
|
||||
(if-let [comp (get views/components (keyword key))]
|
||||
(.registerComponent Navigation key (fn [] (views/component comp)))
|
||||
(let [screen (views/screen key)]
|
||||
@@ -35,6 +37,7 @@
|
||||
(.setLazyComponentRegistrator Navigation reg-comp))
|
||||
|
||||
(defn dismiss-all-modals []
|
||||
(log/debug "dissmiss-all-modals")
|
||||
(when @curr-modal
|
||||
(reset! curr-modal false)
|
||||
(reset! dissmissing true)
|
||||
@@ -44,6 +47,7 @@
|
||||
|
||||
;; PUSH SCREEN
|
||||
(defn navigate [comp]
|
||||
(log/debug "NAVIGATE" comp)
|
||||
(let [{:keys [options]} (get views/screens comp)]
|
||||
(.push Navigation
|
||||
(name @root-comp-id)
|
||||
@@ -57,6 +61,7 @@
|
||||
|
||||
;; OPEN MODAL
|
||||
(defn update-modal-topbar-options [options]
|
||||
(log/debug "update-modal-topbar-options" options)
|
||||
(merge options
|
||||
(roots/merge-top-bar {:elevation 0
|
||||
:noBorder true
|
||||
@@ -68,6 +73,7 @@
|
||||
options)))
|
||||
|
||||
(defn open-modal [comp]
|
||||
(log/debug "open-modal" comp)
|
||||
(let [{:keys [options]} (get views/screens comp)]
|
||||
(if @dissmissing
|
||||
(reset! dissmissing comp)
|
||||
@@ -88,6 +94,7 @@
|
||||
|
||||
;; DISSMISS MODAL
|
||||
(defn dissmissModal []
|
||||
(log/debug "dissmissModal")
|
||||
(reset! dissmissing true)
|
||||
(.dismissModal Navigation (name (last @modals))))
|
||||
|
||||
@@ -105,6 +112,7 @@
|
||||
(handler)))))))
|
||||
|
||||
(defn set-view-id [view-id]
|
||||
(log/debug "set-view-id" view-id)
|
||||
(when-let [{:keys [on-focus]} (get views/screens view-id)]
|
||||
(re-frame/dispatch [:set :view-id view-id])
|
||||
(re-frame/dispatch [:screens/on-will-focus view-id])
|
||||
@@ -135,6 +143,7 @@
|
||||
(.events Navigation)
|
||||
(fn [^js evn]
|
||||
(let [view-id (keyword (.-componentName evn))]
|
||||
(log/debug "screen-appear-reg" view-id)
|
||||
(when (get views/screens view-id)
|
||||
(when (and (not= view-id :bottom-sheet)
|
||||
(not= view-id :popover)
|
||||
@@ -159,6 +168,7 @@
|
||||
(re-frame/reg-fx
|
||||
:init-root-fx
|
||||
(fn [new-root-id]
|
||||
(log/debug :init-root-fx new-root-id)
|
||||
(reset! root-comp-id new-root-id)
|
||||
(reset! root-id @root-comp-id)
|
||||
(.setRoot Navigation (clj->js (get (roots/roots) new-root-id)))))
|
||||
@@ -166,6 +176,7 @@
|
||||
(re-frame/reg-fx
|
||||
:init-root-with-component-fx
|
||||
(fn [[new-root-id new-root-comp-id]]
|
||||
(log/debug :init-root-with-component-fx new-root-id new-root-comp-id)
|
||||
(reset! root-comp-id new-root-comp-id)
|
||||
(reset! root-id @root-comp-id)
|
||||
(.setRoot Navigation (clj->js (get (roots/roots) new-root-id)))))
|
||||
@@ -173,6 +184,7 @@
|
||||
(fx/defn set-multiaccount-root
|
||||
{:events [::set-multiaccount-root]}
|
||||
[{:keys [db]}]
|
||||
(log/debug :set-multiaccounts-root)
|
||||
(let [key-uid (get-in db [:multiaccounts/login :key-uid])
|
||||
keycard-account? (boolean (get-in db [:multiaccounts/multiaccounts
|
||||
key-uid
|
||||
@@ -192,6 +204,7 @@
|
||||
(.hide ^js splash-screen))))
|
||||
|
||||
(defn get-screen-component [comp]
|
||||
(log/debug :get-screen-component comp)
|
||||
(let [{:keys [options]} (get views/screens comp)]
|
||||
{:component {:id comp
|
||||
:name comp
|
||||
@@ -203,6 +216,7 @@
|
||||
(re-frame/reg-fx
|
||||
:set-stack-root-fx
|
||||
(fn [[stack comp]]
|
||||
(log/debug :set-stack-root-fx stack comp)
|
||||
(.setStackRoot Navigation
|
||||
(name stack)
|
||||
(clj->js (if (vector? comp)
|
||||
@@ -225,6 +239,7 @@
|
||||
(re-frame/reg-fx
|
||||
:change-tab-fx
|
||||
(fn [tab]
|
||||
(log/debug :change-tab-fx)
|
||||
(reset! root-comp-id (get tab-root-ids (get tab-key-idx tab)))
|
||||
(.mergeOptions Navigation "tabs-stack" (clj->js {:bottomTabs {:currentTabIndex (get tab-key-idx tab)}}))
|
||||
;;when we change tab we want to dismiss all modals
|
||||
@@ -234,6 +249,7 @@
|
||||
(re-frame/reg-fx
|
||||
:change-tab-count-fx
|
||||
(fn [[tab cnt]]
|
||||
(log/debug :change-tab-count-fx tab cnt)
|
||||
(.mergeOptions Navigation
|
||||
(name (get tab-root-ids (get tab-key-idx tab)))
|
||||
(clj->js {:bottomTab (cond
|
||||
@@ -253,6 +269,7 @@
|
||||
(re-frame/reg-fx
|
||||
:pop-to-root-tab-fx
|
||||
(fn [comp]
|
||||
(log/debug :pop-to-root-tab-fx comp)
|
||||
(dismiss-all-modals)
|
||||
(.popToRoot Navigation (name comp))))
|
||||
|
||||
@@ -343,11 +360,13 @@
|
||||
(re-frame/reg-fx
|
||||
:navigate-to-fx
|
||||
(fn [key]
|
||||
(log/debug :navigate-to-fx key)
|
||||
(navigate key)))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:navigate-back-fx
|
||||
(fn []
|
||||
(log/debug :navigate-back-fx)
|
||||
(if @curr-modal
|
||||
(dissmissModal)
|
||||
(.pop Navigation (name @root-comp-id)))))
|
||||
@@ -355,5 +374,6 @@
|
||||
(re-frame/reg-fx
|
||||
:navigate-replace-fx
|
||||
(fn [view-id]
|
||||
(log/debug :navigate-replace-fx view-id)
|
||||
(.pop Navigation (name @root-comp-id))
|
||||
(navigate view-id)))
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
(defn default-root []
|
||||
{:layout {:componentBackgroundColor colors/white
|
||||
:orientation "portrait"
|
||||
:backgroundColor colors/white}})
|
||||
|
||||
(defn merge-top-bar [root-options options]
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
(def default-manage
|
||||
{:name {:value ""}
|
||||
:url {:value ""}
|
||||
:symbol {:value ""}
|
||||
:chain {:value :mainnet}})
|
||||
|
||||
(defn validate-string [{:keys [value]}]
|
||||
@@ -38,6 +39,7 @@
|
||||
(-> manage
|
||||
(update :url validate-url)
|
||||
(update :name validate-string)
|
||||
(update :symbol validate-string)
|
||||
(update :chain validate-string)
|
||||
(update :network-id validate-network-id)))
|
||||
|
||||
@@ -151,7 +153,7 @@
|
||||
:on-success #(re-frame/dispatch [:navigate-back])}]}))
|
||||
|
||||
(defn new-network
|
||||
[random-id network-name upstream-url chain-type chain-id]
|
||||
[random-id network-name symbol upstream-url chain-type chain-id]
|
||||
(let [data-dir (str "/ethereum/" (name chain-type) "_rpc")
|
||||
config {:NetworkId (or (when chain-id (int chain-id))
|
||||
(ethereum/chain-keyword->chain-id chain-type))
|
||||
@@ -160,6 +162,7 @@
|
||||
:URL upstream-url}}]
|
||||
{:id random-id
|
||||
:name network-name
|
||||
:symbol symbol
|
||||
:config config}))
|
||||
|
||||
(fx/defn save
|
||||
@@ -169,10 +172,11 @@
|
||||
random-id-generator :random-id-generator :as cofx}]
|
||||
(if (valid-manage? manage)
|
||||
;; rename network-id from UI to chain-id
|
||||
(let [{:keys [name url chain network-id]} manage
|
||||
(let [{:keys [name url chain network-id symbol]} manage
|
||||
random-id (string/replace (random-id-generator) "-" "")
|
||||
network (new-network random-id
|
||||
(:value name)
|
||||
(:value symbol)
|
||||
(:value url)
|
||||
(:value chain)
|
||||
(:value network-id))
|
||||
|
||||
@@ -34,11 +34,13 @@
|
||||
(deftest new-network-test
|
||||
(let [actual (network.core/new-network "randomid"
|
||||
"network-name"
|
||||
"network-symbol"
|
||||
"upstream-url"
|
||||
:mainnet
|
||||
nil)]
|
||||
(is (= {:id "randomid"
|
||||
:name "network-name"
|
||||
:symbol "network-symbol"
|
||||
:config {:NetworkId 1
|
||||
:DataDir "/ethereum/mainnet_rpc"
|
||||
:UpstreamConfig {:Enabled true
|
||||
@@ -48,11 +50,13 @@
|
||||
(deftest new-network-id-test
|
||||
(let [actual (network.core/new-network "randomid"
|
||||
"network-name"
|
||||
"network-symbol"
|
||||
"upstream-url"
|
||||
:mainnet
|
||||
"5777")]
|
||||
(is (= {:id "randomid"
|
||||
:name "network-name"
|
||||
:symbol "network-symbol"
|
||||
:config {:NetworkId 5777
|
||||
:DataDir "/ethereum/mainnet_rpc"
|
||||
:UpstreamConfig {:Enabled true
|
||||
@@ -63,21 +67,31 @@
|
||||
(testing "a valid manage"
|
||||
(is (network.core/valid-manage? {:url {:value "http://valid.com"}
|
||||
:name {:value "valid"}
|
||||
:symbol {:value "valid"}
|
||||
:chain {:value "valid"}})))
|
||||
(testing "invalid url"
|
||||
(is (not (network.core/valid-manage? {:url {:value "invalid"}
|
||||
:name {:value "valid"}
|
||||
:symbol {:value "valid"}
|
||||
:chain {:value "valid"}}))))
|
||||
|
||||
(testing "invalid name"
|
||||
(is (not (network.core/valid-manage? {:url {:value "http://valid.com"}
|
||||
:name {:value ""}
|
||||
:symbol {:value "valid"}
|
||||
:chain {:value "valid"}}))))
|
||||
|
||||
(testing "invalid chain"
|
||||
(is (not (network.core/valid-manage? {:url {:value "http://valid.com"}
|
||||
:name {:value "valid"}
|
||||
:chain {:value ""}})))))
|
||||
:symbol {:value "valid"}
|
||||
:chain {:value ""}}))))
|
||||
|
||||
(testing "invalid symbol"
|
||||
(is (not (network.core/valid-manage? {:url {:value "http://valid.com"}
|
||||
:name {:value "valid"}
|
||||
:symbol {:value ""}
|
||||
:chain {:value "valid"}})))))
|
||||
|
||||
(deftest set-input-test
|
||||
(testing "it updates and validate a field"
|
||||
@@ -85,6 +99,8 @@
|
||||
:error false}
|
||||
:name {:value ""
|
||||
:error true}
|
||||
:symbol {:value "symbol"
|
||||
:error false}
|
||||
:chain {:value "mainnet"
|
||||
:error false}
|
||||
:network-id {:value nil
|
||||
@@ -93,6 +109,8 @@
|
||||
:error true}
|
||||
:name {:value ""
|
||||
:error false}
|
||||
:symbol {:value "symbol"
|
||||
:error false}
|
||||
:chain {:value "mainnet"
|
||||
:error false}}}}
|
||||
:url "http://valid.com")))))
|
||||
@@ -110,11 +128,13 @@
|
||||
(let [fx (network.core/save {:random-id-generator (constantly "random-id")
|
||||
:db {:networks/manage {:url {:value "http://valid.com"}
|
||||
:chain {:value :mainnet}
|
||||
:symbol {:value "symbol"}
|
||||
:name {:value "valid"}}
|
||||
:multiaccount {}
|
||||
:networks/networks {"random2"
|
||||
{:id "random2"
|
||||
:name "network-name"
|
||||
:symbol "symbol"
|
||||
:config {:NetworkId 1
|
||||
:DataDir "/ethereum/mainnet_rpc"
|
||||
:UpstreamConfig {:Enabled true
|
||||
@@ -147,11 +167,13 @@
|
||||
:db {:networks/manage {:url {:value "http://valid.com"}
|
||||
:chain {:value :mainnet}
|
||||
:name {:value "valid"}
|
||||
:symbol {:value "symbol"}
|
||||
:network-id {:value 5}}
|
||||
:multiaccount {}
|
||||
:networks/networks {"randomid"
|
||||
{:id "randomid"
|
||||
:name "network-name"
|
||||
:symbol "symbol"
|
||||
:config {:NetworkId 3
|
||||
:DataDir "/ethereum/mainnet_rpc"
|
||||
:UpstreamConfig {:Enabled true
|
||||
|
||||
@@ -92,6 +92,13 @@
|
||||
(when platform/android?
|
||||
(pn-android/clear-message-notifications chat-id))))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:clear-multiple-message-notifications
|
||||
(fn [chat-ids]
|
||||
(when platform/android?
|
||||
(doseq [chat-id chat-ids]
|
||||
(pn-android/clear-message-notifications chat-id)))))
|
||||
|
||||
(fx/defn handle-enable-notifications-event
|
||||
{:events [::registered-for-push-notifications]}
|
||||
[cofx token]
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
(ns status-im.notifications.local
|
||||
(:require [status-im.utils.fx :as fx]
|
||||
(:require [status-im.async-storage.core :as async-storage]
|
||||
[status-im.utils.fx :as fx]
|
||||
[status-im.ethereum.decode :as decode]
|
||||
["@react-native-community/push-notification-ios" :default pn-ios]
|
||||
[status-im.notifications.android :as pn-android]
|
||||
@@ -40,6 +41,7 @@
|
||||
|
||||
(defn handle-notification-press [{{deep-link :deepLink} :userInfo
|
||||
interaction :userInteraction}]
|
||||
(async-storage/set-item! (str :chat-id) nil)
|
||||
(when (and deep-link
|
||||
(or platform/ios?
|
||||
(and platform/android? interaction)))
|
||||
@@ -66,7 +68,7 @@
|
||||
(get-in tokens/all-tokens-normalized
|
||||
[(keyword chain) (clojure.string/lower-case contract)]
|
||||
default-erc20-token)
|
||||
(tokens/native-currency (keyword chain)))
|
||||
(tokens/native-currency network))
|
||||
amount (money/wei->ether (decode/uint value))
|
||||
to (or (:name toAccount) (utils/get-shortened-address to))
|
||||
from (or (:name fromAccount) (utils/get-shortened-address from))
|
||||
|
||||
@@ -6,15 +6,28 @@
|
||||
[status-im.data-store.activities :as data-store.activities]))
|
||||
|
||||
(fx/defn handle-activities [{:keys [db]} activities]
|
||||
{:db (-> db
|
||||
(update-in [:activity.center/notifications :notifications] #(concat activities %))
|
||||
(update :activity.center/notifications-count + (count activities)))
|
||||
:dispatch (cond
|
||||
(= (:view-id db) :notifications-center)
|
||||
[:mark-all-activity-center-notifications-as-read]
|
||||
(let [{:keys [unread-count notifications]}
|
||||
(reduce (fn [acc {:keys [read dismissed accepted] :as notification}]
|
||||
(as-> acc a
|
||||
(if read
|
||||
(update a :unread-count dec)
|
||||
(update a :unread-count inc))
|
||||
|
||||
(= (:view-id db) :chat)
|
||||
[:accept-all-activity-center-notifications-from-chat (:current-chat-id db)])})
|
||||
(if (or dismissed accepted)
|
||||
(update a :notifications (fn [items] (remove #(= (:id notification) (:id %)) items)))
|
||||
(update a :notifications conj notification))))
|
||||
{:unread-count (get db :activity.center/notifications-count 0)
|
||||
:notifications (get-in db [:activity.center/notifications :notifications])}
|
||||
activities)]
|
||||
{:db (-> db
|
||||
(assoc-in [:activity.center/notifications :notifications] notifications)
|
||||
(assoc :activity.center/notifications-count (max 0 unread-count)))
|
||||
:dispatch (cond
|
||||
(= (:view-id db) :notifications-center)
|
||||
[:mark-all-activity-center-notifications-as-read]
|
||||
|
||||
(= (:view-id db) :chat)
|
||||
[:accept-all-activity-center-notifications-from-chat (:current-chat-id db)])}))
|
||||
|
||||
(fx/defn get-activity-center-notifications-count
|
||||
{:events [:get-activity-center-notifications-count]}
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
(fx/defn handle-private-chat [{:keys [db] :as cofx} {:keys [chat-id]}]
|
||||
(if-not (new-chat.db/own-public-key? db chat-id)
|
||||
(chat/start-chat cofx chat-id)
|
||||
(chat/start-chat cofx chat-id nil)
|
||||
{:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
|
||||
:content (i18n/label :t/can-not-add-yourself)}}))
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
(fx/defn process
|
||||
{:events [:signals/signal-received]}
|
||||
[cofx event-str]
|
||||
[{:keys [db] :as cofx} event-str]
|
||||
;; We only convert to clojure when strictly necessary or we know it
|
||||
;; won't impact performance, as it is a fairly costly operation on large-ish
|
||||
;; data structures
|
||||
@@ -62,6 +62,7 @@
|
||||
type (.-type data)]
|
||||
(case type
|
||||
"node.login" (status-node-started cofx (js->clj event-js :keywordize-keys true))
|
||||
"backup.performed" {:db (assoc-in db [:multiaccount :last-backup] (.-lastBackup event-js))}
|
||||
"envelope.sent" (transport.message/update-envelopes-status cofx (:ids (js->clj event-js :keywordize-keys true)) :sent)
|
||||
"envelope.expired" (transport.message/update-envelopes-status cofx (:ids (js->clj event-js :keywordize-keys true)) :not-sent)
|
||||
"message.delivered" (let [{:keys [chatID messageID]} (js->clj event-js :keywordize-keys true)]
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
:symbol :ETH
|
||||
:value value
|
||||
:amount (str eth-amount)
|
||||
:token (tokens/asset-for (:wallet/all-tokens db) (ethereum/chain-keyword db) :ETH)}
|
||||
:token (tokens/asset-for (:wallet/all-tokens db) (ethereum/get-current-network db) :ETH)}
|
||||
(not (nil? token))
|
||||
token
|
||||
:else
|
||||
@@ -234,7 +234,7 @@
|
||||
:keycard-step (when pinless? :connect)})
|
||||
:show-signing-sheet nil}
|
||||
#(when-not wallet-set-up-passed?
|
||||
{:dispatch-n [[:show-popover {:view :signing-phrase}]]})
|
||||
{:dispatch-later [{:dispatch [:show-popover {:view :signing-phrase}] :ms 200}]})
|
||||
(when pinless?
|
||||
(keycard.card/start-nfc {:on-success #(re-frame/dispatch [:keycard.callback/start-nfc-success])
|
||||
:on-failure #(re-frame/dispatch [:keycard.callback/start-nfc-failure])})
|
||||
@@ -249,7 +249,7 @@
|
||||
:show-signing-sheet nil
|
||||
:dismiss-keyboard nil}
|
||||
#(when-not wallet-set-up-passed?
|
||||
{:dispatch-n [[:show-popover {:view :signing-phrase}]]})
|
||||
{:dispatch-later [{:dispatch [:show-popover {:view :signing-phrase}] :ms 200}]})
|
||||
(prices/update-prices)
|
||||
#(when-not gas
|
||||
{:db (assoc-in (:db %) [:signing/edit-fee :gas-loading?] true)
|
||||
@@ -304,13 +304,13 @@
|
||||
|
||||
(fx/defn transaction-result
|
||||
[{:keys [db] :as cofx} result tx-obj]
|
||||
(let [{:keys [on-result symbol amount]} (get db :signing/tx)]
|
||||
(let [{:keys [on-result symbol amount from]} (get db :signing/tx)]
|
||||
(fx/merge cofx
|
||||
{:db (dissoc db :signing/tx :signing/sign)
|
||||
:signing/show-transaction-result nil}
|
||||
(prepare-unconfirmed-transaction result tx-obj symbol amount)
|
||||
(check-queue)
|
||||
(wallet/watch-tx result)
|
||||
(wallet/watch-tx (get from :address) result)
|
||||
#(when on-result
|
||||
{:dispatch (conj on-result result)}))))
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (dissoc db :signing/tx :signing/sign)}
|
||||
(wallet/watch-tx transaction-hash)
|
||||
(wallet/watch-tx (get from :address) transaction-hash)
|
||||
(if (keycard.common/keycard-multiaccount? db)
|
||||
(signing.keycard/hash-message
|
||||
{:data data
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
[status-im.utils.money :as money]
|
||||
[status-im.signing.eip1559 :as eip1559]
|
||||
[taoensso.timbre :as log]
|
||||
[status-im.popover.core :as popover]))
|
||||
[status-im.popover.core :as popover]
|
||||
[clojure.string :as string]))
|
||||
|
||||
(def min-gas-price-wei ^js (money/bignumber 1))
|
||||
|
||||
@@ -211,9 +212,7 @@
|
||||
[{db :db} price]
|
||||
(if (eip1559/sync-enabled?)
|
||||
(let [{:keys [normal-base-fee max-priority-fee]} price
|
||||
max-priority-fee-bn (money/with-precision
|
||||
(get-suggested-tip max-priority-fee)
|
||||
0)]
|
||||
max-priority-fee-bn (money/with-precision (get-suggested-tip max-priority-fee) 0)]
|
||||
{:db (-> db
|
||||
(assoc-in [:signing/tx :maxFeePerGas]
|
||||
(money/to-hex (money/add max-priority-fee-bn
|
||||
@@ -279,7 +278,7 @@
|
||||
{:events [:signing.nonce/submit]}
|
||||
[{db :db :as cofx} nonce]
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:signing/tx :nonce] nonce)}
|
||||
{:db (assoc-in db [:signing/tx :nonce] (if (string/blank? nonce) nil nonce))}
|
||||
(bottom-sheet/hide-bottom-sheet)))
|
||||
|
||||
(re-frame/reg-fx
|
||||
@@ -290,7 +289,9 @@
|
||||
(fn []
|
||||
(json-rpc/call
|
||||
{:method "eth_feeHistory"
|
||||
:params [101 "latest" nil]
|
||||
;; NOTE(rasom): We don't need `reward` atm but if the last parameter is
|
||||
;; `nil` request fails on some chains (particularly on xDai).
|
||||
:params [101 "latest" [100]]
|
||||
:on-success #(re-frame/dispatch [::header-fetched
|
||||
(assoc params :fee-history %)])}))
|
||||
(fn []
|
||||
@@ -342,31 +343,44 @@
|
||||
|
||||
(defn check-base-fee [{:keys [baseFeePerGas]}]
|
||||
(let [all-base-fees (mapv money/bignumber baseFeePerGas)
|
||||
current-base-fee (last all-base-fees)
|
||||
next-base-fee (peek all-base-fees)
|
||||
previous-fees (subvec all-base-fees 0 101)
|
||||
current-base-fee (peek previous-fees)
|
||||
percentiles (calc-percentiles previous-fees [10 20 80])]
|
||||
{:normal-base-fee (money/to-hex
|
||||
(recommended-base-fee
|
||||
current-base-fee
|
||||
next-base-fee
|
||||
(get percentiles 20)
|
||||
(get percentiles 80)))
|
||||
:slow-base-fee (money/to-hex
|
||||
(slow-base-fee
|
||||
current-base-fee
|
||||
next-base-fee
|
||||
(get percentiles 10)))
|
||||
:fast-base-fee (money/to-hex
|
||||
(fast-base-fee
|
||||
current-base-fee
|
||||
next-base-fee
|
||||
(get percentiles 80)))
|
||||
:current-base-fee (money/to-hex current-base-fee)}))
|
||||
|
||||
(defn max-priority-fee-hex [gas-price base-fee]
|
||||
(money/to-hex
|
||||
(money/sub (money/bignumber gas-price)
|
||||
(money/bignumber base-fee))))
|
||||
|
||||
(fx/defn header-fetched
|
||||
{:events [::header-fetched]}
|
||||
[_ {:keys [error-callback success-callback fee-history] :as params}]
|
||||
{::json-rpc/call
|
||||
[{:method "eth_maxPriorityFeePerGas"
|
||||
:on-success #(success-callback (merge {:max-priority-fee %}
|
||||
(check-base-fee fee-history)))
|
||||
[;; NOTE(rasom): eth_maxPriorityFeePerGas is not supported by some networks
|
||||
;; so it is more reliable to calculate maxPriorityFeePerGas using the value
|
||||
;; returned by eth_gasPrice and current base fee.
|
||||
{:method "eth_gasPrice"
|
||||
:on-success #(success-callback
|
||||
(let [{:keys [current-base-fee] :as base-fees}
|
||||
(check-base-fee fee-history)]
|
||||
(merge {:max-priority-fee
|
||||
(max-priority-fee-hex % current-base-fee)}
|
||||
base-fees)))
|
||||
:on-error (if error-callback
|
||||
#(error-callback %)
|
||||
#(log/error "Can't fetch header" %))}]})
|
||||
|
||||
+57
-41
@@ -257,6 +257,11 @@
|
||||
(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)
|
||||
|
||||
(reg-root-key-sub :backup/performing-backup :backup/performing-backup)
|
||||
|
||||
(re-frame/reg-sub
|
||||
:communities
|
||||
:<- [:raw-communities]
|
||||
@@ -504,6 +509,12 @@
|
||||
(fn [chain-id]
|
||||
(= 1 chain-id)))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:ethereum-network?
|
||||
:<- [:chain-id]
|
||||
(fn [chain-id]
|
||||
(< chain-id 6)))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:network-name
|
||||
:<- [:current-network]
|
||||
@@ -649,9 +660,9 @@
|
||||
|
||||
(re-frame/reg-sub
|
||||
:ethereum/native-currency
|
||||
:<- [:ethereum/chain-keyword]
|
||||
(fn [chain-keyword]
|
||||
(tokens/native-currency chain-keyword)))
|
||||
:<- [:current-network]
|
||||
(fn [network]
|
||||
(tokens/native-currency network)))
|
||||
|
||||
;;MULTIACCOUNT ==============================================================================================================
|
||||
|
||||
@@ -887,6 +898,13 @@
|
||||
(fn [[{:keys [categories]}] _]
|
||||
categories))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:communities/sorted-categories
|
||||
:<- [:communities]
|
||||
(fn [communities [_ id]]
|
||||
(->> (get-in communities [id :categories])
|
||||
(sort-by #(:position (get % 1))))))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chats/current-chat-ui-props
|
||||
:<- [::chat-ui-props]
|
||||
@@ -1179,19 +1197,6 @@
|
||||
(hydrate-messages messages))))))
|
||||
|
||||
;;we want to keep data unchanged so react doesn't change component when we leave screen
|
||||
(def memo-chat-messages-stream (atom nil))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chats/chat-messages-stream
|
||||
(fn [[_ chat-id] _]
|
||||
[(re-frame/subscribe [:chats/raw-chat-messages-stream chat-id])
|
||||
(re-frame/subscribe [:chats/chat-no-messages? chat-id])
|
||||
(re-frame/subscribe [:view-id])])
|
||||
(fn [[messages empty view-id]]
|
||||
(when (or (= view-id :chat) empty)
|
||||
(reset! memo-chat-messages-stream messages))
|
||||
@memo-chat-messages-stream))
|
||||
|
||||
(def memo-profile-messages-stream (atom nil))
|
||||
|
||||
(re-frame/reg-sub
|
||||
@@ -1287,7 +1292,6 @@
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chats/chat-toolbar
|
||||
:<- [:disconnected?]
|
||||
:<- [:multiaccounts/login]
|
||||
:<- [:chats/sending-image]
|
||||
:<- [:mainnet?]
|
||||
@@ -1295,9 +1299,9 @@
|
||||
:<- [:current-chat/metadata]
|
||||
:<- [:chats/reply-message]
|
||||
:<- [:chats/edit-message]
|
||||
(fn [[disconnected? {:keys [processing]} sending-image mainnet? one-to-one-chat? {:keys [public?]} reply edit]]
|
||||
(fn [[{:keys [processing]} sending-image mainnet? one-to-one-chat? {:keys [public?]} reply edit]]
|
||||
(let [sending-image (seq sending-image)]
|
||||
{:send (not (or processing disconnected?))
|
||||
{:send (not processing)
|
||||
:stickers (and mainnet?
|
||||
(not sending-image)
|
||||
(not reply))
|
||||
@@ -1421,20 +1425,26 @@
|
||||
:<- [:chats/mentionable-contacts]
|
||||
:<- [:contacts/blocked-set]
|
||||
:<- [:multiaccount]
|
||||
(fn [[{:keys [chat-id users chat-type]} contacts blocked {:keys [name preferred-name public-key]}]]
|
||||
(let [contacts-with-one-to-one (if (= chat-type constants/one-to-one-chat-type)
|
||||
(assoc contacts chat-id (get contacts chat-id (-> chat-id
|
||||
contact.db/public-key->new-contact
|
||||
contact.db/enrich-contact)))
|
||||
contacts)]
|
||||
(fn [[{:keys [chat-id users contacts community-id chat-type] :as chat} mentionable-contacts blocked {:keys [name preferred-name public-key]}]]
|
||||
(let [community-members @(re-frame/subscribe [:communities/community-members
|
||||
community-id])
|
||||
contacts-with-one-to-one (if (= chat-type constants/one-to-one-chat-type)
|
||||
(assoc mentionable-contacts chat-id (get mentionable-contacts chat-id (-> chat-id
|
||||
contact.db/public-key->new-contact
|
||||
contact.db/enrich-contact)))
|
||||
mentionable-contacts)
|
||||
members-left (into #{} (filter #(group-chat/member-removed? chat %) (keys users)))
|
||||
filtered-contacts (select-keys contacts-with-one-to-one (if (nil? community-id)
|
||||
(distinct (concat (seq contacts) (keys users) [chat-id]))
|
||||
(keys community-members)))]
|
||||
(apply dissoc
|
||||
(-> users
|
||||
(merge contacts-with-one-to-one)
|
||||
(merge filtered-contacts)
|
||||
(assoc public-key (mentions/add-searchable-phrases
|
||||
{:alias name
|
||||
:name (or preferred-name name)
|
||||
:public-key public-key})))
|
||||
(conj blocked public-key)))))
|
||||
(conj (concat blocked members-left) public-key)))))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:chat/mention-suggestions
|
||||
@@ -1759,11 +1769,11 @@
|
||||
(get-in wallet [:fetching address :all-fetched?])))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:wallet/etherscan-link
|
||||
:wallet/chain-explorer-link
|
||||
(fn [db [_ address]]
|
||||
(let [network (:networks/current-network db)
|
||||
link (get-in config/default-networks-by-id
|
||||
[network :etherscan-link])]
|
||||
[network :chain-explorer-link])]
|
||||
(when link
|
||||
(str link address)))))
|
||||
|
||||
@@ -1783,12 +1793,12 @@
|
||||
|
||||
(re-frame/reg-sub
|
||||
:wallet/visible-assets
|
||||
:<- [:ethereum/chain-keyword]
|
||||
:<- [:current-network]
|
||||
:<- [:wallet/visible-tokens-symbols]
|
||||
:<- [:wallet/sorted-tokens]
|
||||
(fn [[chain visible-tokens-symbols all-tokens-sorted]]
|
||||
(fn [[network visible-tokens-symbols all-tokens-sorted]]
|
||||
(conj (filter #(contains? visible-tokens-symbols (:symbol %)) all-tokens-sorted)
|
||||
(tokens/native-currency chain))))
|
||||
(tokens/native-currency network))))
|
||||
|
||||
(re-frame/reg-sub
|
||||
:wallet/visible-assets-with-amount
|
||||
@@ -2091,8 +2101,8 @@
|
||||
(fn [[_ _ address] _]
|
||||
[(re-frame/subscribe [:wallet.transactions/transactions address])
|
||||
(re-frame/subscribe [:ethereum/native-currency])
|
||||
(re-frame/subscribe [:ethereum/chain-keyword])])
|
||||
(fn [[transactions native-currency chain-keyword] [_ hash _]]
|
||||
(re-frame/subscribe [:chain-id])])
|
||||
(fn [[transactions native-currency chain-id] [_ hash _]]
|
||||
(let [{:keys [gas-used gas-price fee-cap tip-cap hash timestamp type]
|
||||
:as transaction}
|
||||
(get transactions hash)
|
||||
@@ -2130,7 +2140,7 @@
|
||||
(money/fee-value gas-used gas-price)
|
||||
native-currency-text))
|
||||
:url (transactions/get-transaction-details-url
|
||||
chain-keyword
|
||||
chain-id
|
||||
hash)}))))))
|
||||
|
||||
(re-frame/reg-sub
|
||||
@@ -2179,6 +2189,12 @@
|
||||
:<- [:wallet]
|
||||
:request-transaction)
|
||||
|
||||
(re-frame/reg-sub
|
||||
:wallet/binance-chain?
|
||||
:<- [:current-network]
|
||||
(fn [network]
|
||||
(ethereum/binance-chain-id? (get-in network [:config :NetworkId]))))
|
||||
|
||||
;;UI ==============================================================================================================
|
||||
|
||||
(re-frame/reg-sub
|
||||
@@ -2785,11 +2801,11 @@
|
||||
:<- [:wallet]
|
||||
:<- [:offline?]
|
||||
:<- [:wallet/all-tokens]
|
||||
:<- [:ethereum/chain-keyword]
|
||||
:<- [:current-network]
|
||||
(fn [[{:keys [symbol from to amount-text] :as transaction}
|
||||
wallet offline? all-tokens chain]]
|
||||
wallet offline? all-tokens current-network]]
|
||||
(let [balance (get-in wallet [:accounts (:address from) :balance])
|
||||
{:keys [decimals] :as token} (tokens/asset-for all-tokens chain symbol)
|
||||
{:keys [decimals] :as token} (tokens/asset-for all-tokens current-network symbol)
|
||||
{:keys [value error]} (wallet.db/parse-amount amount-text decimals)
|
||||
amount (money/formatted->internal value symbol decimals)
|
||||
{:keys [amount-error] :as transaction-new}
|
||||
@@ -2812,11 +2828,11 @@
|
||||
:<- [:wallet]
|
||||
:<- [:offline?]
|
||||
:<- [:wallet/all-tokens]
|
||||
:<- [:ethereum/chain-keyword]
|
||||
:<- [:current-network]
|
||||
(fn [[{:keys [symbol from to amount-text] :as transaction}
|
||||
wallet offline? all-tokens chain]]
|
||||
wallet offline? all-tokens current-network]]
|
||||
(let [balance (get-in wallet [:accounts (:address from) :balance])
|
||||
{:keys [decimals] :as token} (tokens/asset-for all-tokens chain symbol)
|
||||
{:keys [decimals] :as token} (tokens/asset-for all-tokens current-network symbol)
|
||||
{:keys [value error]} (wallet.db/parse-amount amount-text decimals)
|
||||
amount (money/formatted->internal value symbol decimals)
|
||||
{:keys [amount-error] :as transaction-new}
|
||||
|
||||
@@ -81,9 +81,7 @@
|
||||
(fx/merge cofx
|
||||
(process-next response-js sync-handler)
|
||||
(models.contact/ensure-contacts
|
||||
(map data-store.contacts/<-rpc contacts-clj)
|
||||
(when chats
|
||||
(map data-store.chats/<-rpc (types/js->clj chats))))))
|
||||
(map data-store.contacts/<-rpc contacts-clj) chats)))
|
||||
|
||||
(seq communities)
|
||||
(let [communities-clj (types/js->clj communities)]
|
||||
@@ -216,7 +214,7 @@
|
||||
[{:ms 100 :dispatch [:process-statuses statuses]}])
|
||||
(when (seq transactions)
|
||||
(for [transaction-hash transactions]
|
||||
{:ms 100 :dispatch [:watch-tx transaction-hash]})))}
|
||||
{:ms 100 :dispatch [:watch-tx nil transaction-hash]})))}
|
||||
(process-response response-js process-async)))))
|
||||
|
||||
(fx/defn remove-hash
|
||||
@@ -257,7 +255,9 @@
|
||||
|
||||
(fx/defn update-envelopes-status
|
||||
[{:keys [db] :as cofx} message-id status]
|
||||
(apply fx/merge cofx (map #(update-envelope-status % status) message-id)))
|
||||
(when (or (not= status :not-sent)
|
||||
(= :online (:network db)))
|
||||
(apply fx/merge cofx (map #(update-envelope-status % status) message-id))))
|
||||
|
||||
(fx/defn set-message-envelope-hash
|
||||
"message-type is used for tracking"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
(defn section
|
||||
"Render collapsible section"
|
||||
[_props]
|
||||
(let [opened? (reagent/atom false)]
|
||||
(let [opened? (reagent/atom (get _props :default))]
|
||||
(fn [{:keys [title content icon opened disabled
|
||||
padding-vertical dropdown-margin-left
|
||||
open-container-style
|
||||
|
||||
@@ -46,21 +46,22 @@
|
||||
|
||||
(defn profile-photo-plus-dot-view
|
||||
[{:keys [public-key photo-container photo-path community?]}]
|
||||
(let [photo-path (if (nil? photo-path)
|
||||
@(re-frame.core/subscribe [:chats/photo-path public-key])
|
||||
photo-path)
|
||||
photo-container (if (nil? photo-container)
|
||||
styles/container-chat-list photo-container)
|
||||
size (:width photo-container)
|
||||
identicon? (when photo-path (profile.db/base64-png? photo-path))
|
||||
dot-styles (visibility-status-utils/icon-visibility-status-dot
|
||||
public-key size identicon?)]
|
||||
(let [photo-path (if (nil? photo-path)
|
||||
@(re-frame.core/subscribe [:chats/photo-path public-key])
|
||||
photo-path)
|
||||
photo-container (if (nil? photo-container)
|
||||
styles/container-chat-list photo-container)
|
||||
size (:width photo-container)
|
||||
identicon? (when photo-path (profile.db/base64-png? photo-path))
|
||||
dot-styles (visibility-status-utils/icon-visibility-status-dot
|
||||
public-key size identicon?)
|
||||
dot-accessibility-label (:accessibility-label dot-styles)]
|
||||
[react/view {:style photo-container
|
||||
:accessibility-label :profile-photo}
|
||||
[photos/photo photo-path {:size size}]
|
||||
(when-not community?
|
||||
[react/view {:style dot-styles
|
||||
:accessibility-label :profile-photo-dot}])]))
|
||||
:accessibility-label dot-accessibility-label}])]))
|
||||
|
||||
(defn emoji-chat-icon-view
|
||||
[chat-id group-chat name emoji styles]
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
(merge {:style (merge
|
||||
styles/wrapper
|
||||
style)
|
||||
:accessibility-label accessibility-label}
|
||||
:accessibility-label (str accessibility-label
|
||||
"-"
|
||||
(if checked? "on" "off"))}
|
||||
(when on-value-change
|
||||
{:on-press #(on-value-change (not checked?))}))
|
||||
(if checked?
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
:refer (SafeAreaProvider SafeAreaInsetsContext)]
|
||||
["@react-native-community/clipboard" :default Clipboard]
|
||||
["react-native-linear-gradient" :default LinearGradient]
|
||||
["react-native-navigation" :refer (Navigation)])
|
||||
["react-native-navigation" :refer (Navigation)]
|
||||
["react-native-fast-image" :as FastImage])
|
||||
(:require-macros [status-im.utils.views :as views]))
|
||||
|
||||
(def native-modules (.-NativeModules react-native))
|
||||
@@ -31,6 +32,8 @@
|
||||
|
||||
(def image-class (reagent/adapt-react-class (reactjs/memo (.-Image react-native))))
|
||||
|
||||
(def fast-image (reagent/adapt-react-class FastImage))
|
||||
|
||||
(defn image-get-size [uri callback] (.getSize (.-Image react-native) uri callback))
|
||||
(defn resolve-asset-source [uri] (js->clj (.resolveAssetSource (.-Image react-native) uri) :keywordize-keys true))
|
||||
|
||||
|
||||
@@ -103,4 +103,5 @@
|
||||
(conj chats lang-topic)
|
||||
chats)]
|
||||
(for [chat chats]
|
||||
(render-topic chat)))]])]]))
|
||||
^{:key chat}
|
||||
[render-topic chat]))]])]]))
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
(ns status-im.ui.screens.backup-settings.view
|
||||
(:require-macros [status-im.utils.views :as views])
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[quo.design-system.colors :as colors]
|
||||
[status-im.utils.datetime :as datetime]
|
||||
[status-im.i18n.i18n :as i18n]
|
||||
[quo.core :as quo]
|
||||
[re-frame.core :as re-frame]))
|
||||
|
||||
(defn perform-backup! []
|
||||
(re-frame/dispatch [:multiaccounts.ui/perform-backup-pressed]))
|
||||
|
||||
(defn footer [performing-backup?]
|
||||
[react/touchable-highlight {:on-press (when-not performing-backup?
|
||||
perform-backup!)
|
||||
:style {:height 52}}
|
||||
[react/view
|
||||
{:style {:justify-content :center
|
||||
:flex 1
|
||||
:align-items :center}}
|
||||
[react/text
|
||||
{:color colors/blue
|
||||
:text-align :center}
|
||||
(if performing-backup?
|
||||
(i18n/label :t/backing-up)
|
||||
(i18n/label :t/perform-backup))]]])
|
||||
|
||||
(views/defview backup-settings []
|
||||
(views/letsubs
|
||||
[{:keys [last-backup backup-enabled?]}
|
||||
[:multiaccount]
|
||||
performing-backup? [:backup/performing-backup]]
|
||||
[:<>
|
||||
[react/scroll-view
|
||||
[quo/list-item
|
||||
{:size :small
|
||||
:title (i18n/label :t/backup-through-waku)
|
||||
:accessibility-label :backup-enabled
|
||||
:container-margin-bottom 8
|
||||
:on-press
|
||||
#(re-frame/dispatch
|
||||
[:multiaccounts.ui/switch-backup-enabled (not backup-enabled?)])
|
||||
:accessory :switch
|
||||
:active backup-enabled?}]
|
||||
[quo/list-item
|
||||
{:size :small
|
||||
:title (i18n/label :t/last-backup-performed)
|
||||
:accessory :text
|
||||
:subtitle (if (pos? last-backup)
|
||||
(datetime/time-ago-long (datetime/to-date last-backup))
|
||||
(i18n/label :t/never))}]]
|
||||
[footer performing-backup?]]))
|
||||
@@ -0,0 +1,49 @@
|
||||
(ns status-im.ui.screens.bug-report
|
||||
(:require [quo.core :as quo]
|
||||
[quo.react-native :as react-native]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.i18n.i18n :as i18n]
|
||||
[status-im.ui.components.topbar :as topbar]))
|
||||
|
||||
(defn bug-report []
|
||||
(let [{:keys [description steps]} @(re-frame/subscribe [:bug-report/details])]
|
||||
[react-native/view {:style {:flex 1}}
|
||||
[topbar/topbar
|
||||
{:title (i18n/label :t/bug-report)
|
||||
:modal? true}]
|
||||
[react-native/view {:style {:flex 1
|
||||
:padding-top 8
|
||||
:padding-horizontal 16}}
|
||||
[quo/text-input
|
||||
{:label (i18n/label :t/bug-report-description)
|
||||
:default-value description
|
||||
:placeholder (i18n/label :t/bug-report-description-placeholder)
|
||||
:style {:margin-bottom 8}
|
||||
:multiline true
|
||||
:error @(re-frame/subscribe [:bug-report/description-error])
|
||||
:accessibility-label :bug-report-description
|
||||
:on-change-text #(re-frame/dispatch [:logging/report-details :description %])}]
|
||||
[quo/text-input
|
||||
{:label (i18n/label :t/bug-report-steps)
|
||||
:default-value steps
|
||||
:placeholder (i18n/label :t/bug-report-steps-placeholder)
|
||||
:style {:margin-bottom 16}
|
||||
:multiline true
|
||||
:accessibility-label :bug-report-steps
|
||||
:on-change-text #(re-frame/dispatch [:logging/report-details :steps %])}]
|
||||
[quo/button
|
||||
{:type :primary
|
||||
:accessibility-label :bug-report-submit
|
||||
:theme :accent
|
||||
:on-press #(re-frame/dispatch [:logging/submit-report])}
|
||||
(i18n/label :t/bug-report-submit-email)]
|
||||
[react-native/view
|
||||
{:style {:margin-vertical 16
|
||||
:align-items :center}}
|
||||
[quo/text (i18n/label :t/or)]]
|
||||
[quo/button
|
||||
{:type :primary
|
||||
:accessibility-label :bug-report-submit-gh-issue
|
||||
:theme :accent
|
||||
:on-press #(re-frame/dispatch [:logging/submit-gh-issue])}
|
||||
(i18n/label :t/bug-report-submit-gh-issue)]]]))
|
||||
@@ -181,7 +181,7 @@
|
||||
:message-id @current-player-message-id}))
|
||||
nil)
|
||||
|
||||
(defview message-content [{:keys [audio audio-duration-ms message-id outgoing]} timestamp-view]
|
||||
(defview message-content [{:keys [audio audio-duration-ms message-id outgoing]}]
|
||||
(letsubs [state (reagent/atom nil)
|
||||
progress (reagent/atom 0)
|
||||
progress-anim (anim/create-value 0)
|
||||
@@ -223,5 +223,4 @@
|
||||
(#{:playing :paused :seeking} (:general @state)) @progress
|
||||
:else (:duration @state))
|
||||
s (quot time 1000)]
|
||||
(gstring/format "%02d:%02d" (quot s 60) (mod s 60)))]
|
||||
timestamp-view]]))))
|
||||
(gstring/format "%02d:%02d" (quot s 60) (mod s 60)))]]]))))
|
||||
|
||||
@@ -149,12 +149,13 @@
|
||||
|
||||
(defn- command-transaction-info
|
||||
[contract value]
|
||||
(let [{:keys [symbol icon decimals color] :as token}
|
||||
(let [{:keys [symbol symbol-display icon decimals color] :as token}
|
||||
(if (seq contract)
|
||||
(get @(re-frame/subscribe [:wallet/all-tokens])
|
||||
contract
|
||||
transactions/default-erc20-token)
|
||||
@(re-frame/subscribe [:ethereum/native-currency]))
|
||||
symbol (or symbol-display symbol)
|
||||
amount (money/internal->formatted value symbol decimals)
|
||||
{:keys [code]}
|
||||
@(re-frame/subscribe [:wallet/currency])
|
||||
|
||||
@@ -24,42 +24,64 @@
|
||||
[status-im.ui.screens.chat.components.reply :as components.reply]
|
||||
[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.pin-message :as models.pin-message])
|
||||
(:require-macros [status-im.utils.views :refer [defview letsubs]]))
|
||||
|
||||
(defn message-timestamp-anim
|
||||
[anim-opacity show-timestamp?]
|
||||
(animation/start
|
||||
(animation/anim-sequence
|
||||
[(animation/timing
|
||||
anim-opacity
|
||||
{:toValue 1
|
||||
:duration 100
|
||||
:easing (.-ease ^js animation/easing)
|
||||
:useNativeDriver true})
|
||||
(animation/timing
|
||||
anim-opacity
|
||||
{:toValue 0
|
||||
:delay 2000
|
||||
:duration 100
|
||||
:easing (.-ease ^js animation/easing)
|
||||
:useNativeDriver true})]) #(reset! show-timestamp? false)))
|
||||
|
||||
(defview mention-element [from]
|
||||
(letsubs [contact-name [:contacts/contact-name-by-identity from]]
|
||||
contact-name))
|
||||
|
||||
(def edited-at-text (str " ⌫ " (i18n/label :t/edited)))
|
||||
|
||||
(defn message-status [{:keys [outgoing content outgoing-status pinned edited-at in-popover?]}]
|
||||
(when-not in-popover? ;; We keep track if showing this message in a list in pin-limit-popover
|
||||
[react/view
|
||||
{:align-self :flex-end
|
||||
:position :absolute
|
||||
:bottom 9 ; 6 Bubble bottom, 3 message baseline
|
||||
(if (:rtl? content) :left :right) 0
|
||||
:flex-direction :row
|
||||
:align-items :flex-end}
|
||||
(when outgoing
|
||||
[icons/icon (case outgoing-status
|
||||
:sending :tiny-icons/tiny-pending
|
||||
:sent :tiny-icons/tiny-sent
|
||||
:not-sent :tiny-icons/tiny-warning
|
||||
:delivered :tiny-icons/tiny-delivered
|
||||
:tiny-icons/tiny-pending)
|
||||
{:width 16
|
||||
:height 12
|
||||
:color (if pinned colors/gray colors/white)
|
||||
:accessibility-label (name outgoing-status)}])
|
||||
(when edited-at [react/text {:style (style/message-status-text (and outgoing (not pinned)))} edited-at-text])]))
|
||||
|
||||
(defn message-timestamp
|
||||
([message]
|
||||
[message-timestamp message false])
|
||||
([{:keys [timestamp-str outgoing content outgoing-status pinned edited-at in-popover?]} justify-timestamp?]
|
||||
(when-not in-popover? ;; We keep track if showing this message in a list in pin-limit-popover
|
||||
[react/view (when justify-timestamp?
|
||||
{:align-self :flex-end
|
||||
:position :absolute
|
||||
:bottom 9 ; 6 Bubble bottom, 3 message baseline
|
||||
(if (:rtl? content) :left :right) 0
|
||||
:flex-direction :row
|
||||
:align-items :flex-end})
|
||||
(when (and outgoing justify-timestamp?)
|
||||
[icons/icon (case outgoing-status
|
||||
:sending :tiny-icons/tiny-pending
|
||||
:sent :tiny-icons/tiny-sent
|
||||
:not-sent :tiny-icons/tiny-warning
|
||||
:delivered :tiny-icons/tiny-delivered
|
||||
:tiny-icons/tiny-pending)
|
||||
{:width 16
|
||||
:height 12
|
||||
:color (if pinned colors/gray colors/white)
|
||||
:accessibility-label (name outgoing-status)}])
|
||||
[react/text {:style (style/message-timestamp-text (and outgoing (not pinned)))}
|
||||
(str
|
||||
timestamp-str
|
||||
(when edited-at edited-at-text))]])))
|
||||
[{:keys [timestamp-str in-popover?] :as message} show-timestamp?]
|
||||
(when-not in-popover? ;; We keep track if showing this message in a list in pin-limit-popover
|
||||
(let [anim-opacity (animation/create-value 0)]
|
||||
[react/animated-view {:style (style/message-timestamp-wrapper message) :opacity anim-opacity}
|
||||
(when @show-timestamp? (message-timestamp-anim anim-opacity show-timestamp?))
|
||||
[react/text {:style (style/message-timestamp-text)}
|
||||
timestamp-str]])))
|
||||
|
||||
(defview quoted-message
|
||||
[_ {:keys [from parsed-text image]} outgoing current-public-key public? pinned]
|
||||
@@ -168,19 +190,19 @@
|
||||
(defn render-parsed-text [message tree]
|
||||
(reduce (fn [acc e] (render-block message acc e)) [:<>] tree))
|
||||
|
||||
(defn render-parsed-text-with-timestamp [{:keys [timestamp-str outgoing edited-at in-popover?] :as message} tree]
|
||||
(defn render-parsed-text-with-message-status [{:keys [outgoing edited-at in-popover?] :as message} tree]
|
||||
(let [elements (render-parsed-text message tree)
|
||||
timestamp [react/text {:style (style/message-timestamp-placeholder)}
|
||||
(str (if (and outgoing (not in-popover?)) " " " ") (when-not in-popover? (str timestamp-str (when edited-at edited-at-text))))]
|
||||
message-status [react/text {:style (style/message-status-placeholder)}
|
||||
(str (if (and outgoing (not in-popover?)) " " " ") (when (and (not in-popover?) edited-at) edited-at-text))]
|
||||
last-element (peek elements)]
|
||||
;; Using `nth` here as slightly faster than `first`, roughly 30%
|
||||
;; It's worth considering pure js structures for this code path as
|
||||
;; it's perfomance critical
|
||||
(if (= react/text-class (nth last-element 0))
|
||||
;; Append timestamp to last text
|
||||
(conj (pop elements) (conj last-element timestamp))
|
||||
;; Append timestamp to new block
|
||||
(conj elements timestamp))))
|
||||
;; Append message status to last text
|
||||
(conj (pop elements) (conj last-element message-status))
|
||||
;; Append message status to new block
|
||||
(conj elements message-status))))
|
||||
|
||||
(defn unknown-content-type
|
||||
[{:keys [outgoing content-type content] :as message}]
|
||||
@@ -409,7 +431,8 @@
|
||||
|
||||
(defn collapsible-text-message [{:keys [mentioned]} _]
|
||||
(let [collapsed? (reagent/atom false)
|
||||
collapsible? (reagent/atom false)]
|
||||
collapsible? (reagent/atom false)
|
||||
show-timestamp? (reagent/atom false)]
|
||||
(fn [{:keys [content outgoing current-public-key public? pinned in-popover?] :as message} on-long-press modal]
|
||||
(let [max-height (when-not (or outgoing modal)
|
||||
(if @collapsible?
|
||||
@@ -418,7 +441,8 @@
|
||||
[react/touchable-highlight
|
||||
(when-not modal
|
||||
{:on-press (fn [_]
|
||||
(react/dismiss-keyboard!))
|
||||
(react/dismiss-keyboard!)
|
||||
(reset! show-timestamp? true))
|
||||
:delay-long-press 100
|
||||
:on-long-press (fn []
|
||||
(if @collapsed?
|
||||
@@ -426,40 +450,41 @@
|
||||
(js/setTimeout #(on-long-press-fn on-long-press message content) 200))
|
||||
(on-long-press-fn on-long-press message content)))
|
||||
:disabled in-popover?})
|
||||
[react/view {:style (style/message-view message)}
|
||||
[react/view {:style (style/message-view-content)
|
||||
:max-height max-height}
|
||||
(let [response-to (:response-to content)]
|
||||
[react/view {:on-layout
|
||||
#(when (and (> (.-nativeEvent.layout.height ^js %) max-message-height-px)
|
||||
(not @collapsible?)
|
||||
(not outgoing)
|
||||
(not modal))
|
||||
(reset! collapsed? true)
|
||||
(reset! collapsible? true))}
|
||||
(when (and (seq response-to) (:quoted-message message))
|
||||
[quoted-message response-to (:quoted-message message) outgoing current-public-key public? pinned])
|
||||
[render-parsed-text-with-timestamp message (:parsed-text content)]])
|
||||
(when-not @collapsed?
|
||||
[message-timestamp message true])
|
||||
(when (and @collapsible? (not modal))
|
||||
(if @collapsed?
|
||||
(let [color (if pinned colors/pin-background (if mentioned colors/mentioned-background colors/blue-light))]
|
||||
[react/touchable-highlight
|
||||
{:on-press #(swap! collapsed? not)
|
||||
:style {:position :absolute :bottom 0 :left 0 :right 0 :height 72}}
|
||||
[react/linear-gradient {:colors [(str color "00") color]
|
||||
:start {:x 0 :y 0} :end {:x 0 :y 0.9}}
|
||||
[react/view {:height 72 :align-self :center :justify-content :flex-end
|
||||
:padding-bottom 10}
|
||||
[react/view (style/collapse-button)
|
||||
[icons/icon :main-icons/dropdown
|
||||
{:color colors/white}]]]]])
|
||||
[react/touchable-highlight {:on-press #(swap! collapsed? not)
|
||||
:style {:align-self :center :margin 5}}
|
||||
[react/view (style/collapse-button)
|
||||
[icons/icon :main-icons/dropdown-up
|
||||
{:color colors/white}]]]))]]]))))
|
||||
[react/view (style/message-view-wrapper outgoing)
|
||||
[message-timestamp message show-timestamp?]
|
||||
[react/view {:style (style/message-view message)}
|
||||
[react/view {:style (style/message-view-content)
|
||||
:max-height max-height}
|
||||
(let [response-to (:response-to content)]
|
||||
[react/view {:on-layout
|
||||
#(when (and (> (.-nativeEvent.layout.height ^js %) max-message-height-px)
|
||||
(not @collapsible?)
|
||||
(not outgoing)
|
||||
(not modal))
|
||||
(reset! collapsed? true)
|
||||
(reset! collapsible? true))}
|
||||
(when (and (seq response-to) (:quoted-message message))
|
||||
[quoted-message response-to (:quoted-message message) outgoing current-public-key public? pinned])
|
||||
[render-parsed-text-with-message-status message (:parsed-text content)]])
|
||||
(when-not @collapsible? [message-status message])
|
||||
(when (and @collapsible? (not modal))
|
||||
(if @collapsed?
|
||||
(let [color (if pinned colors/pin-background (if mentioned colors/mentioned-background colors/blue-light))]
|
||||
[react/touchable-highlight
|
||||
{:on-press #(swap! collapsed? not)
|
||||
:style {:position :absolute :bottom 0 :left 0 :right 0 :height 72}}
|
||||
[react/linear-gradient {:colors [(str color "00") color]
|
||||
:start {:x 0 :y 0} :end {:x 0 :y 0.9}}
|
||||
[react/view {:height 72 :align-self :center :justify-content :flex-end
|
||||
:padding-bottom 10}
|
||||
[react/view (style/collapse-button)
|
||||
[icons/icon :main-icons/dropdown
|
||||
{:color colors/white}]]]]])
|
||||
[react/touchable-highlight {:on-press #(swap! collapsed? not)
|
||||
:style {:align-self :center :margin 5}}
|
||||
[react/view (style/collapse-button)
|
||||
[icons/icon :main-icons/dropdown-up
|
||||
{:color colors/white}]]]))]]]]))))
|
||||
|
||||
(defmethod ->message constants/content-type-text
|
||||
[message {:keys [on-long-press modal] :as reaction-picker}]
|
||||
@@ -484,33 +509,37 @@
|
||||
(defmethod ->message constants/content-type-emoji
|
||||
[{:keys [content current-public-key outgoing public? pinned in-popover? message-pin-enabled] :as message} {:keys [on-long-press modal]
|
||||
:as reaction-picker}]
|
||||
(let [response-to (:response-to content)]
|
||||
[message-content-wrapper message
|
||||
[react/touchable-highlight (when-not modal
|
||||
{:disabled in-popover?
|
||||
:on-press (fn []
|
||||
(react/dismiss-keyboard!))
|
||||
:delay-long-press 100
|
||||
:on-long-press (fn []
|
||||
(on-long-press
|
||||
(concat
|
||||
[{:on-press #(re-frame/dispatch [:chat.ui/reply-to-message message])
|
||||
:id :reply
|
||||
:label (i18n/label :t/message-reply)}
|
||||
{:on-press #(react/copy-to-clipboard (get content :text))
|
||||
:id :copy
|
||||
:label (i18n/label :t/sharing-copy-to-clipboard)}]
|
||||
(when message-pin-enabled [{:on-press #(pin-message message)
|
||||
:label (if pinned (i18n/label :t/unpin) (i18n/label :t/pin))}]))))})
|
||||
[react/view (style/message-view message)
|
||||
[react/view {:style (style/message-view-content)}
|
||||
[react/view {:style (style/style-message-text outgoing)}
|
||||
(when (and (seq response-to) (:quoted-message message))
|
||||
[quoted-message response-to (:quoted-message message) outgoing current-public-key public? pinned])
|
||||
[react/text {:style (style/emoji-message message)}
|
||||
(:text content)]]
|
||||
[message-timestamp message]]]]
|
||||
reaction-picker]))
|
||||
(let [response-to (:response-to content)
|
||||
show-timestamp? (reagent/atom false)]
|
||||
(fn [] [message-content-wrapper message
|
||||
[react/touchable-highlight (when-not modal
|
||||
{:disabled in-popover?
|
||||
:on-press (fn []
|
||||
(react/dismiss-keyboard!)
|
||||
(reset! show-timestamp? true))
|
||||
:delay-long-press 100
|
||||
:on-long-press (fn []
|
||||
(on-long-press
|
||||
(concat
|
||||
[{:on-press #(re-frame/dispatch [:chat.ui/reply-to-message message])
|
||||
:id :reply
|
||||
:label (i18n/label :t/message-reply)}
|
||||
{:on-press #(react/copy-to-clipboard (get content :text))
|
||||
:id :copy
|
||||
:label (i18n/label :t/sharing-copy-to-clipboard)}]
|
||||
(when message-pin-enabled [{:on-press #(pin-message message)
|
||||
:label (if pinned (i18n/label :t/unpin) (i18n/label :t/pin))}]))))})
|
||||
[react/view (style/message-view-wrapper outgoing)
|
||||
[message-timestamp message show-timestamp?]
|
||||
[react/view (style/message-view message)
|
||||
[react/view {:style (style/message-view-content)}
|
||||
[react/view {:style (style/style-message-text outgoing)}
|
||||
(when (and (seq response-to) (:quoted-message message))
|
||||
[quoted-message response-to (:quoted-message message) outgoing current-public-key public? pinned])
|
||||
[react/text {:style (style/emoji-message message)}
|
||||
(:text content)]]
|
||||
[message-status message]]]]]
|
||||
reaction-picker])))
|
||||
|
||||
(defmethod ->message constants/content-type-sticker
|
||||
[{:keys [content from outgoing in-popover?]
|
||||
@@ -533,9 +562,9 @@
|
||||
[{:on-press #(when pack
|
||||
(re-frame/dispatch [:chat.ui/show-profile from]))
|
||||
:label (i18n/label :t/view-details)}])))})
|
||||
[react/image {:style {:margin 10 :width 140 :height 140}
|
||||
;;TODO (perf) move to event
|
||||
:source {:uri (contenthash/url (-> content :sticker :hash))}}]]
|
||||
[react/fast-image {:style {:margin 10 :width 140 :height 140}
|
||||
;;TODO (perf) move to event
|
||||
:source {:uri (contenthash/url (-> content :sticker :hash))}}]]
|
||||
reaction-picker]))
|
||||
|
||||
(defmethod ->message constants/content-type-image [{:keys [content in-popover?] :as message} {:keys [on-long-press modal]
|
||||
@@ -556,14 +585,19 @@
|
||||
|
||||
(defmethod ->message constants/content-type-audio [message {:keys [on-long-press modal]
|
||||
:as reaction-picker}]
|
||||
[message-content-wrapper message
|
||||
[react/touchable-highlight (when-not modal
|
||||
{:on-long-press
|
||||
(fn [] (on-long-press []))})
|
||||
[react/view {:style (style/message-view message) :accessibility-label :audio-message}
|
||||
[react/view {:style (style/message-view-content)}
|
||||
[message.audio/message-content message [message-timestamp message false]]]]]
|
||||
reaction-picker])
|
||||
(let [show-timestamp? (reagent/atom false)]
|
||||
(fn [] [message-content-wrapper message
|
||||
[react/touchable-highlight (when-not modal
|
||||
{:on-long-press
|
||||
(fn [] (on-long-press []))
|
||||
:on-press (fn []
|
||||
(reset! show-timestamp? true))})
|
||||
[react/view (style/message-view-wrapper (:outgoing message))
|
||||
[message-timestamp message show-timestamp?]
|
||||
[react/view {:style (style/message-view message) :accessibility-label :audio-message}
|
||||
[react/view {:style (style/message-view-content)}
|
||||
[message.audio/message-content message] [message-status message]]]]]
|
||||
reaction-picker])))
|
||||
|
||||
(defmethod ->message :default [message]
|
||||
[message-content-wrapper message
|
||||
|
||||
@@ -39,9 +39,9 @@
|
||||
^{:key (str hash)}
|
||||
[react/touchable-highlight {:style {:height 75 :width 75 :margin 5}
|
||||
:on-press #(debounce/dispatch-and-chill [:chat/send-sticker sticker] 1000)}
|
||||
[react/image {:style {:resize-mode :cover :width "100%" :height "100%"}
|
||||
:accessibility-label :sticker-icon
|
||||
:source {:uri (contenthash/url (str "0x" hash))}}]])]]])
|
||||
[react/fast-image {:style {:width "100%" :height "100%"}
|
||||
:accessibility-label :sticker-icon
|
||||
:source {:uri (contenthash/url (str "0x" hash))}}]])]]])
|
||||
|
||||
(defview recent-stickers-panel [window-width]
|
||||
(letsubs [stickers [:stickers/recent]]
|
||||
@@ -143,6 +143,6 @@
|
||||
^{:key id}
|
||||
[pack-icon {:id id
|
||||
:background-color colors/white}
|
||||
[react/image {:style {:width icon-size :height icon-size :border-radius (/ icon-size 2)}
|
||||
:source {:uri (contenthash/url thumbnail)}}]])]
|
||||
[react/fast-image {:style {:width icon-size :height icon-size :border-radius (/ icon-size 2)}
|
||||
:source {:uri (contenthash/url thumbnail)}}]])]
|
||||
[scroll-indicator]]]]]))
|
||||
|
||||
@@ -43,5 +43,5 @@
|
||||
:justify-content :space-between})
|
||||
|
||||
(defn timestamp [outgoing]
|
||||
(merge (message.style/message-timestamp-text outgoing)
|
||||
(merge (message.style/audio-message-timestamp-text outgoing)
|
||||
{:margin-left 40}))
|
||||
@@ -29,11 +29,33 @@
|
||||
(def message-timestamp
|
||||
{:font-size 10})
|
||||
|
||||
(defn message-timestamp-placeholder
|
||||
(defn message-status-placeholder
|
||||
[]
|
||||
(merge message-timestamp {:opacity 0 :color "rgba(0,0,0,0)"}))
|
||||
|
||||
(defn message-timestamp-text
|
||||
(defn message-timestamp-wrapper [{:keys [last-in-group? outgoing group-chat]}]
|
||||
{:justify-content :center
|
||||
(if outgoing :margin-right :margin-left) 12 ;; horizontal margin is only required at the adjust side of the message.
|
||||
:margin-top (if (and last-in-group?
|
||||
(or outgoing
|
||||
(not group-chat)))
|
||||
16
|
||||
0) ;; Add gap between message groups
|
||||
:opacity 0})
|
||||
|
||||
(defn message-timestamp-text []
|
||||
(merge message-timestamp
|
||||
{:color colors/gray
|
||||
:text-align :center}))
|
||||
|
||||
(defn message-status-text [outgoing]
|
||||
{:font-size 10
|
||||
:line-height 10
|
||||
:color (if outgoing
|
||||
colors/white-transparent-70-persist
|
||||
colors/gray)})
|
||||
|
||||
(defn audio-message-timestamp-text
|
||||
[outgoing]
|
||||
(merge message-timestamp
|
||||
{:line-height 10
|
||||
@@ -44,7 +66,7 @@
|
||||
(defn message-wrapper [{:keys [outgoing in-popover?]}]
|
||||
(if (and outgoing (not in-popover?))
|
||||
{:margin-left 96}
|
||||
{:margin-right 52}))
|
||||
{:margin-right 96}))
|
||||
|
||||
(defn message-author-wrapper
|
||||
[outgoing display-photo? in-popover?]
|
||||
@@ -156,10 +178,10 @@
|
||||
:padding-left 3})
|
||||
|
||||
(defn emoji-message
|
||||
[{:keys [incoming-group]}]
|
||||
[{:keys [incoming-group outgoing]}]
|
||||
{:font-size 28
|
||||
:line-height 34 ;TODO: Smaller crops the icon on the top
|
||||
:margin-right 12
|
||||
:margin-right (if outgoing 18 0) ;; Margin to display outgoing message status
|
||||
:margin-top (if incoming-group 4 0)})
|
||||
|
||||
(defn collapse-button []
|
||||
@@ -171,6 +193,10 @@
|
||||
:shadow-color (:shadow-01 @colors/theme)
|
||||
:shadow-offset {:width 0 :height 4}})
|
||||
|
||||
(defn message-view-wrapper [outgoing]
|
||||
{:align-self :flex-end
|
||||
:flex-direction (if outgoing :row :row-reverse)})
|
||||
|
||||
(defn message-view
|
||||
[{:keys [content-type outgoing group-chat last-in-group? mentioned pinned]}]
|
||||
(merge
|
||||
|
||||
@@ -295,7 +295,7 @@
|
||||
|
||||
(defn messages-view [{:keys [chat bottom-space pan-responder space-keeper show-input?]}]
|
||||
(let [{:keys [group-chat chat-id public? community-id admins]} chat
|
||||
messages @(re-frame/subscribe [:chats/chat-messages-stream chat-id])]
|
||||
messages @(re-frame/subscribe [:chats/raw-chat-messages-stream chat-id])]
|
||||
;;do not use anonymous functions for handlers
|
||||
[list/flat-list
|
||||
(merge
|
||||
@@ -343,8 +343,7 @@
|
||||
[toolbar-content/toolbar-content-view-inner chat-info]]))
|
||||
|
||||
(defn chat []
|
||||
(let [curr-chat-id (:chat-id @(re-frame/subscribe [:chats/current-chat-chat-view]))
|
||||
bottom-space (reagent/atom 0)
|
||||
(let [bottom-space (reagent/atom 0)
|
||||
panel-space (reagent/atom 52)
|
||||
active-panel (reagent/atom nil)
|
||||
position-y (animated/value 0)
|
||||
@@ -355,48 +354,44 @@
|
||||
space-keeper (get-space-keeper-ios bottom-space panel-space active-panel text-input-ref)
|
||||
set-active-panel (get-set-active-panel active-panel)
|
||||
on-close #(set-active-panel nil)]
|
||||
(reagent/create-class
|
||||
{:component-will-unmount #(re-frame/dispatch-sync [:close-chat curr-chat-id])
|
||||
:component-did-mount (fn [] (js/setTimeout #(re-frame/dispatch [:set :ignore-close-chat false]) 500))
|
||||
:reagent-render
|
||||
(fn []
|
||||
(let [{:keys [chat-id show-input? group-chat admins invitation-admin] :as chat}
|
||||
;;we want to react only on these fields, do not use full chat map here
|
||||
@(re-frame/subscribe [:chats/current-chat-chat-view])
|
||||
max-bottom-space (max @bottom-space @panel-space)]
|
||||
[:<>
|
||||
[connectivity/loading-indicator]
|
||||
(when chat-id
|
||||
(if group-chat
|
||||
[invitation-requests chat-id admins]
|
||||
[add-contact-bar chat-id]))
|
||||
;;MESSAGES LIST
|
||||
[messages-view {:chat chat
|
||||
:bottom-space max-bottom-space
|
||||
:pan-responder pan-responder
|
||||
:space-keeper space-keeper
|
||||
:show-input? show-input?}]
|
||||
(when (and group-chat invitation-admin)
|
||||
[accessory/view {:y position-y
|
||||
:on-update-inset on-update}
|
||||
[invitation-bar chat-id]])
|
||||
[components/autocomplete-mentions text-input-ref max-bottom-space]
|
||||
(when show-input?
|
||||
;; NOTE: this only accepts two children
|
||||
[accessory/view {:y position-y
|
||||
:pan-state pan-state
|
||||
:has-panel (boolean @active-panel)
|
||||
:on-close on-close
|
||||
:on-update-inset on-update}
|
||||
[react/view
|
||||
[edit/edit-message-auto-focus-wrapper text-input-ref]
|
||||
[reply/reply-message-auto-focus-wrapper text-input-ref]
|
||||
;; We set the key so we can force a re-render as
|
||||
;; it does not rely on ratom but just atoms
|
||||
^{:key (str @components/chat-input-key "chat-input")}
|
||||
[components/chat-toolbar
|
||||
{:chat-id chat-id
|
||||
:active-panel @active-panel
|
||||
:set-active-panel set-active-panel
|
||||
:text-input-ref text-input-ref}]]
|
||||
[bottom-sheet @active-panel]])]))})))
|
||||
(fn []
|
||||
(let [{:keys [chat-id show-input? group-chat admins invitation-admin] :as chat}
|
||||
;;we want to react only on these fields, do not use full chat map here
|
||||
@(re-frame/subscribe [:chats/current-chat-chat-view])
|
||||
max-bottom-space (max @bottom-space @panel-space)]
|
||||
[:<>
|
||||
[connectivity/loading-indicator]
|
||||
(when chat-id
|
||||
(if group-chat
|
||||
[invitation-requests chat-id admins]
|
||||
[add-contact-bar chat-id]))
|
||||
;;MESSAGES LIST
|
||||
[messages-view {:chat chat
|
||||
:bottom-space max-bottom-space
|
||||
:pan-responder pan-responder
|
||||
:space-keeper space-keeper
|
||||
:show-input? show-input?}]
|
||||
(when (and group-chat invitation-admin)
|
||||
[accessory/view {:y position-y
|
||||
:on-update-inset on-update}
|
||||
[invitation-bar chat-id]])
|
||||
[components/autocomplete-mentions text-input-ref max-bottom-space]
|
||||
(when show-input?
|
||||
;; NOTE: this only accepts two children
|
||||
[accessory/view {:y position-y
|
||||
:pan-state pan-state
|
||||
:has-panel (boolean @active-panel)
|
||||
:on-close on-close
|
||||
:on-update-inset on-update}
|
||||
[react/view
|
||||
[edit/edit-message-auto-focus-wrapper text-input-ref]
|
||||
[reply/reply-message-auto-focus-wrapper text-input-ref]
|
||||
;; We set the key so we can force a re-render as
|
||||
;; it does not rely on ratom but just atoms
|
||||
^{:key (str @components/chat-input-key "chat-input")}
|
||||
[components/chat-toolbar
|
||||
{:chat-id chat-id
|
||||
:active-panel @active-panel
|
||||
:set-active-panel set-active-panel
|
||||
:text-input-ref text-input-ref}]]
|
||||
[bottom-sheet @active-panel]])]))))
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
description
|
||||
color
|
||||
emoji
|
||||
chat-id])}])
|
||||
chat-id
|
||||
(:id category)])}])
|
||||
:extended-header (profile-header/extended-header
|
||||
{:title chat-name
|
||||
:color color
|
||||
|
||||
@@ -139,7 +139,14 @@
|
||||
:title (i18n/label :t/edit-chats)
|
||||
:accessibility-label :community-edit-chats
|
||||
:icon :main-icons/edit
|
||||
:on-press #(hide-sheet-and-dispatch [:open-modal :community-edit-chats {:community-id id}])}]])]))
|
||||
:on-press #(hide-sheet-and-dispatch [:open-modal :community-edit-chats {:community-id id}])}]
|
||||
[quo/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/reorder-categories)
|
||||
:accessibility-label :community-reorder-categories
|
||||
:icon :main-icons/channel-category
|
||||
:on-press #(hide-sheet-and-dispatch
|
||||
[:open-modal :community-reorder-categories {:community-id id}])}]])]))
|
||||
|
||||
(defn blank-page [text]
|
||||
[rn/view {:style {:padding 16 :flex 1 :flex-direction :row :align-items :center :justify-content :center}}
|
||||
@@ -147,14 +154,14 @@
|
||||
:color :secondary}
|
||||
text]])
|
||||
|
||||
(defn community-chat-item [{:keys [chat-id] :as home-item} _ _ {:keys [from-chat]}]
|
||||
(defn community-chat-item [{:keys [chat-id] :as home-item} _ _ _]
|
||||
[inner-item/home-list-item
|
||||
;; We want communities to behave as public chats when it comes to
|
||||
;; unread indicator
|
||||
(assoc home-item :public? true)
|
||||
{:on-press (fn []
|
||||
(re-frame/dispatch [:dismiss-keyboard])
|
||||
(re-frame/dispatch [:chat.ui/navigate-to-chat chat-id (not from-chat)])
|
||||
(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
|
||||
@@ -163,11 +170,14 @@
|
||||
|
||||
(defn categories-accordion [community-id chats categories edit data]
|
||||
[:<>
|
||||
(for [{:keys [name id]} (vals categories)]
|
||||
(for [{:keys [name id state]} (vals categories)]
|
||||
^{:key (str "cat" name id)}
|
||||
[:<>
|
||||
[accordion/section
|
||||
{:opened edit
|
||||
{:on-open #(>evt [::communities/store-category-state community-id id true])
|
||||
:on-close #(>evt [::communities/store-category-state community-id id false])
|
||||
:default state
|
||||
:opened edit
|
||||
:disabled edit
|
||||
:title [rn/view styles/category-item
|
||||
(if edit
|
||||
@@ -195,7 +205,9 @@
|
||||
(defn community-chat-list [community-id categories edit from-chat]
|
||||
(let [chats (<sub [:chats/categories-by-community-id community-id])]
|
||||
(if (and (empty? categories) (empty? chats))
|
||||
[blank-page (i18n/label :t/welcome-community-blank-message)]
|
||||
(if edit
|
||||
[blank-page (i18n/label :t/welcome-community-blank-message-edit-chats)]
|
||||
[blank-page (i18n/label :t/welcome-community-blank-message)])
|
||||
[list/flat-list
|
||||
{:key-fn :chat-id
|
||||
:content-container-style {:padding-bottom 8}
|
||||
@@ -258,7 +270,8 @@
|
||||
(defn community-edit []
|
||||
(let [{:keys [community-id]} (<sub [:get-screen-params])]
|
||||
(fn []
|
||||
(let [{:keys [id name images members permissions color categories]} (<sub [:communities/community community-id])]
|
||||
(let [{:keys [id name images members permissions color]} (<sub [:communities/community community-id])
|
||||
categories (<sub [:communities/sorted-categories community-id])]
|
||||
[:<>
|
||||
[topbar/topbar
|
||||
{:modal? true
|
||||
@@ -274,9 +287,10 @@
|
||||
(defn community []
|
||||
(let [{:keys [community-id from-chat]} (<sub [:get-screen-params])]
|
||||
(fn []
|
||||
(let [{:keys [id chats name images members permissions color joined can-request-access?
|
||||
can-join? requested-to-join-at admin categories]
|
||||
:as community} (<sub [:communities/community community-id])]
|
||||
(let [{:keys [id chats name images members permissions color joined
|
||||
can-request-access? can-join? requested-to-join-at admin]
|
||||
:as community} (<sub [:communities/community community-id])
|
||||
categories (<sub [:communities/sorted-categories community-id])]
|
||||
(if community
|
||||
[rn/view {:style {:flex 1}}
|
||||
[topbar/topbar
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
(ns status-im.ui.screens.communities.reorder-categories
|
||||
(:require [quo.core :as quo]
|
||||
[quo.react-native :as rn]
|
||||
[clojure.set :as clojure.set]
|
||||
[status-im.i18n.i18n :as i18n]
|
||||
[status-im.constants :as constants]
|
||||
[quo.design-system.colors :as colors]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.topbar :as topbar]
|
||||
[status-im.communities.core :as communities]
|
||||
[status-im.utils.handlers :refer [>evt <sub]]
|
||||
[status-im.ui.components.icons.icons :as icons]
|
||||
[status-im.ui.screens.communities.styles :as styles]
|
||||
[status-im.ui.screens.communities.community :as community]))
|
||||
|
||||
(defn category-change-positon [community-id key up? position]
|
||||
(let [new-position (if up? (dec position) (inc position))]
|
||||
(>evt [::communities/reorder-community-category community-id key new-position])))
|
||||
|
||||
(defn category-item-button [community-id up? disabled? key position]
|
||||
(let [[margin-right icon] (if up?
|
||||
[10 :main-icons/dropdown-up]
|
||||
[25 :main-icons/dropdown])]
|
||||
[react/touchable-opacity {:disabled disabled?
|
||||
:on-press #(category-change-positon
|
||||
community-id key up? position)}
|
||||
[rn/view {:style (styles/reorder-categories-button margin-right)}
|
||||
[icons/icon icon {:color colors/black}]]]))
|
||||
|
||||
(defn category-item [community-id count {:keys [key name position]}]
|
||||
(let [up-disabled? (= position 0)
|
||||
down-disabled? (= position (dec count))]
|
||||
[:<>
|
||||
[rn/view {:style styles/reorder-categories-item}
|
||||
[icons/icon :main-icons/channel-category {:color colors/gray}]
|
||||
[rn/text {:style (styles/reorder-categories-text)} name]
|
||||
[category-item-button community-id true up-disabled? key position]
|
||||
[category-item-button community-id false down-disabled? key position]]
|
||||
[quo/separator]]))
|
||||
|
||||
(defn categories-view [community-id categories count]
|
||||
[rn/view {:accessibility-label :reorder-categories-list}
|
||||
(for [category-vector categories]
|
||||
(let [category (clojure.set/rename-keys (get category-vector 1) {:id :key})]
|
||||
[category-item community-id count category]))])
|
||||
|
||||
(defn view []
|
||||
(let [{:keys [community-id]} (<sub [:get-screen-params])
|
||||
{:keys [id name images members permissions color]}
|
||||
(<sub [:communities/community community-id])
|
||||
categories (<sub [:communities/sorted-categories community-id])]
|
||||
[:<>
|
||||
[topbar/topbar
|
||||
{:modal? true
|
||||
:content [community/toolbar-content id name color images
|
||||
(not= (:access permissions) constants/community-no-membership-access)
|
||||
(count members)]}]
|
||||
(if (empty? categories)
|
||||
[community/blank-page (i18n/label :t/welcome-community-blank-message-categories)]
|
||||
[categories-view community-id categories (count categories)])]))
|
||||
@@ -24,7 +24,7 @@
|
||||
(defn view []
|
||||
(let [{:keys [community-id chat]} (<sub [:get-screen-params])]
|
||||
(fn []
|
||||
(let [categories (<sub [:community/categories community-id])
|
||||
(let [categories (<sub [:communities/sorted-categories community-id])
|
||||
comm-chat (<sub [:chats/community-chat-by-id community-id (:chat-id chat)])
|
||||
_ (reset! selected-item (:categoryID comm-chat))]
|
||||
[:<>
|
||||
@@ -56,4 +56,4 @@
|
||||
@selected-item
|
||||
comm-chat]
|
||||
3000)}
|
||||
(i18n/label :t/done)]}]]))))
|
||||
(i18n/label :t/done)]}]]))))
|
||||
|
||||
@@ -1,8 +1,34 @@
|
||||
(ns status-im.ui.screens.communities.styles)
|
||||
(ns status-im.ui.screens.communities.styles
|
||||
(:require [quo.design-system.colors :as colors]))
|
||||
|
||||
(def category-item
|
||||
{:flex 1
|
||||
:flex-direction :row
|
||||
:align-items :center
|
||||
:height 52
|
||||
:margin-left 18})
|
||||
:margin-left 18})
|
||||
|
||||
(def reorder-categories-item
|
||||
{:accessibility-label :reorder-categories-item
|
||||
:flex-direction :row
|
||||
:height 60
|
||||
:align-items :center
|
||||
:margin-left 18})
|
||||
|
||||
(defn reorder-categories-text []
|
||||
{:font-size 17
|
||||
:margin-left 10
|
||||
:color (colors/get-color :text-01)
|
||||
:flex 1})
|
||||
|
||||
(defn reorder-categories-button [margin-right]
|
||||
{:accessibility-label :reorder-categories-button
|
||||
:width 30
|
||||
:height 30
|
||||
:border-radius 15
|
||||
:margin 10
|
||||
:margin-right margin-right
|
||||
:border-width 1
|
||||
:justify-content :center
|
||||
:align-items :center
|
||||
:border-color colors/black})
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
{:border-bottom-color (quo.colors/get-color :ui-01)
|
||||
:border-bottom-width 1}))
|
||||
:on-press (fn []
|
||||
(>evt [::communities/load-category-states id])
|
||||
(>evt [:dismiss-keyboard])
|
||||
(>evt [:navigate-to :community {:community-id id}]))
|
||||
:on-long-press #(>evt [:bottom-sheet/show-sheet
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
:title (i18n/label :t/submit-bug)
|
||||
:accessibility-label :submit-bug-button
|
||||
:on-press
|
||||
#(re-frame/dispatch [:logging.ui/send-logs-pressed])
|
||||
#(re-frame/dispatch [:open-modal :bug-report])
|
||||
:chevron true}
|
||||
{:size :small
|
||||
:title (i18n/label :t/request-feature)
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
[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])
|
||||
[status-im.ui.components.tabbar.core :as tabbar]
|
||||
["react-native-navigation" :refer (Navigation)])
|
||||
(:require-macros [status-im.utils.views :as views]))
|
||||
|
||||
(defn home-tooltip-view []
|
||||
@@ -199,13 +200,19 @@
|
||||
:accessibility-label :notifications-unread-badge}]])]))
|
||||
|
||||
(defn home []
|
||||
[react/keyboard-avoiding-view {:style {:flex 1}
|
||||
:ignore-offset true}
|
||||
[topbar/topbar {:title (i18n/label :t/chat)
|
||||
:navigation :none
|
||||
:right-component [react/view {:flex-direction :row :margin-right 16}
|
||||
[connectivity/connectivity-button]
|
||||
[notifications-button]]}]
|
||||
[chats-list]
|
||||
[plus-button]
|
||||
[tabbar/tabs-counts-subscriptions]])
|
||||
(reagent/create-class
|
||||
{:component-did-mount #(set! (.-navigationEventListener %) (.bindComponent (.events Navigation) % "home"))
|
||||
:componentWillAppear #(do (re-frame/dispatch-sync [:set :view-id :home])
|
||||
(re-frame/dispatch [:close-chat]))
|
||||
:reagent-render
|
||||
(fn []
|
||||
[react/keyboard-avoiding-view {:style {:flex 1}
|
||||
:ignore-offset true}
|
||||
[topbar/topbar {:title (i18n/label :t/chat)
|
||||
:navigation :none
|
||||
:right-component [react/view {:flex-direction :row :margin-right 16}
|
||||
[connectivity/connectivity-button]
|
||||
[notifications-button]]}]
|
||||
[chats-list]
|
||||
[plus-button]
|
||||
[tabbar/tabs-counts-subscriptions]])}))
|
||||
|
||||
@@ -34,6 +34,13 @@
|
||||
:default-value (get-in manage-network [:name :value])
|
||||
:on-change-text #(re-frame/dispatch [::network/input-changed :name %])
|
||||
:auto-focus true}]]
|
||||
[react/view {:padding-vertical 8}
|
||||
[quo/text-input
|
||||
{:label (i18n/label :t/symbol)
|
||||
:placeholder (i18n/label :t/specify-symbol)
|
||||
:default-value (get-in manage-network [:symbol :value])
|
||||
:on-change-text #(re-frame/dispatch [::network/input-changed :symbol %])
|
||||
:auto-focus true}]]
|
||||
[react/view {:padding-vertical 8}
|
||||
[quo/text-input
|
||||
{:label (i18n/label :t/rpc-url)
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
;;TODO (perf) move to event
|
||||
(home-item/memo-timestamp timestamp)]
|
||||
[react/view {:style styles/notification-message-container}
|
||||
[home-item/message-content-text (select-keys message [:content :content-type]) false]
|
||||
[home-item/message-content-text (select-keys message [:content :content-type :community-id]) false]
|
||||
(cond (= type constants/activity-center-notification-type-mention)
|
||||
[react/view {:style styles/group-info-container
|
||||
:accessibility-label :chat-name-container}
|
||||
@@ -89,4 +89,4 @@
|
||||
:width 18
|
||||
:height 18
|
||||
:container-style styles/reply-icon}]
|
||||
[home-item/message-content-text (select-keys reply-message [:content :content-type]) false]])]]]))
|
||||
[home-item/message-content-text (select-keys reply-message [:content :content-type :community-id]) false]])]]]))
|
||||
|
||||
@@ -82,11 +82,15 @@
|
||||
visibility-status-update (visibility-status-update public-key my-icon?)
|
||||
size (/ container-size 4)
|
||||
margin (if identicon? (/ size 6) (/ size 7))
|
||||
dot-color (dot-color visibility-status-update my-icon?)]
|
||||
dot-color (dot-color visibility-status-update my-icon?)
|
||||
accessibility-label (if (= dot-color colors/color-online)
|
||||
:online-profile-photo-dot
|
||||
:offline-profile-photo-dot)]
|
||||
(merge (styles/visibility-status-dot dot-color size)
|
||||
{:bottom margin
|
||||
:right margin
|
||||
:position :absolute})))
|
||||
{:bottom margin
|
||||
:right margin
|
||||
:position :absolute
|
||||
:accessibility-label accessibility-label})))
|
||||
|
||||
(defn visibility-status-order [public-key]
|
||||
(let [my-icon? (my-icon? public-key)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user