Compare commits

...
34 Commits
Author SHA1 Message Date
Andrea Maria Piana a8408b4fff Add fetch messages behind a toggle & some advanced settings
This PR does a few things:

1) Add fetch messages implementation on any kind of chat. It's behind a
   toggle (on by default) as design is still unsure whether we want it,
   but it's very useful for debugging.
2) Allow setting light client from mobile

It also partially remove node config management from the clojure part,
as it's better if that's not explicitly managed by clients.
Some parts are still relying on it but they are not functional
(keycard), while others are still using it and will need to be updated
eventually (syncing), in order to get rid completely of node config.

https://github.com/status-im/status-go/compare/8a4c2d8d...5de4057a
2023-12-07 16:52:29 +00:00
Jamie Caprani 55a99da2f5 feat: enable biometrics for standard-auth (#17992) 2023-12-07 08:44:16 -08:00
Yevheniia Berdnyk 6093d56c90 e2e: increased wait time for PN and CR 2023-12-07 18:04:45 +02:00
Parvesh Monu 9cf4556b9d fix app is not opened on the last viewed chat after reopening (#18090) 2023-12-07 17:44:13 +05:30
flexsurfer 536ebf56cb remove obsolete code (#18094) 2023-12-07 11:40:23 +01:00
Siddarth Kumar 3ad345519b nix: bump clang to 15 & patch Glog for CC,CXX flag (#18108)
After upgrading MacOS to Sonoma and Xcode to 15, pod install stage would fail with clang errors.
Turns out that react-native's configure glog script sets 2 additional flags, CC and CXX which conflicts with flags already set in nix iOS shell.

In this commit we :

- bump clang from 10.0.0 to 15.0.7
- patch glog configure script to avoid setting those flags

This fixes the iOS builds.
2023-12-07 15:36:08 +05:30
Omar Basem dc587e493f Wallet: generate new keypair UI (#18045)
* feat: new keypair flow ui
2023-12-07 09:43:36 +04:00
Omar Basem f692ae2222 Wallet: ENS (#18000)
* wallet: ens
2023-12-07 08:00:56 +04:00
frank aa89ebdb93 fix: Marking AC notification as read does not affect correspondent message in chat (#18058) 2023-12-07 10:16:25 +08:00
Brian Sztamfater 198a4d74a5 feat: transaction confirmation page ui (#17812)
Signed-off-by: Brian Sztamfater <brian@status.im>
2023-12-06 20:16:08 -03:00
Yevheniia Berdnyk 3b5fe36717 e2e: added test for edit/delete message when offline 2023-12-06 23:19:17 +02:00
Icaro Motta 03444ae4ff Request to join screen - show modal title and community context tag (#18077) 2023-12-06 18:10:47 -03:00
Icaro Motta 390bbdb6ec Add missing clj-kondo linter for nubank/matcher-combinators (#18091) 2023-12-06 13:39:47 -03:00
Flavio Fraschetti 2bc7b62324 Communities - Display community rules at request to join (#18082)
This update introduces a feature that displays community rules to users as they join.
2023-12-06 13:21:17 -03:00
Yevheniia Berdnyk 4376ee8908 e2e: disabled checks because of issues with restored contacts and channel links 2023-12-06 16:57:31 +02:00
Roman Volosovskyi 195f0cfa40 Mark mnemonic as shown on revealing it to the user 2023-12-06 13:51:38 +01:00
Omar Basem ab61d8d5c0 Wallet: Set color and emoji (#17906)
* wallet: set color and emoji
2023-12-06 16:02:53 +04:00
mmilad75 aaf0b8e423 Implement transaction progress component (#17933)
* copy codes

* refactor preview

* refactor deprecated codes in view

* change condition structure in view-internal

* comment unused codes

* refactor title

* fix title style

* fix icon style

* fix context tag

* fix icon and row

* refactor icon-internal

* rename network-state and network-type

* fix progress-container style

* fix progress-box-container style

* fix progress container naming and style

* change progress-bar component

* fix progress box component

* convert to functional component and bring back the animation

* fix progress box for arbitrum-optimism network

* fix text-steps

* fix status-row

* refactor code style

* refactor get-network-text

* resolve comment

* add translations

* remove btn-title prop

* fix dark mode border color

* fix dark mode icon color

* move interval to preview

* add tests ns

* add tests

* fix lint issues

* fix rendering issue

* fix lint issue

* add arbitrum and optimism as separate networks

* create const for progress percentage

* fix progress bar component and preview

* refactor text-steps

* refactor names

* fix lint issues

* rename arbitrum-progress-percentage and optimism-progress-percentage

* update tests

* convert hard-coded color to customization-color

* fix progress_bar tests

* separate state for each network

* add progress percentage for each network and refactor params of functions

* separate epoch number for  each network

* update tests

* fix lint issues

* refactor codes

* fix lint issues

* resolve comments

* add confirmation progress

* use confirmation-progress component in transaction-progress

* fix preview

* add tests

* fix lint issue

* resolve comment

* refactor networks

* change sending state style

* update tests

* fix lint issues

* remove unused code

* add helper for calculate counter step

* add assoc-props to view-networks

* change text-internal props order

* fix colors/resolve-color usage

* refactor view codes

* add get-networks to preview

* add max-value to progress bar style

* remove threading macros in the previews

* remove inline functional components in the previews

* remove optimism-arbitrum checks in the view

* fix lint issues

* add max-progress and min-progress to confirmation-progress

* refactor text-steps

* fix counter structure in transaction-progress

* fix counter structure in confirmation-progress

* fix resolve-color usage

* fix lint issue

* fix tests

* resolve comments

* fix color issue

* fix margins

* fix lint issue
2023-12-06 14:09:52 +03:30
BalogunofAfrica 7e14846f0b fix: use custom color for confirm select (#18068) 2023-12-06 05:10:08 +01:00
frank 5ebd133c63 group ens names with chain-id (#18001) 2023-12-06 10:04:39 +08:00
Icaro Motta 563f1c588d Improve test failure readability (#18049)
Problem: failed equality checks as in "(is (= expected actual))" will give a
single, long line of output that for anything but the simplest data structures
is unreadable by humans, and the output doesn't give a useful diff.

Solution: use library https://github.com/nubank/matcher-combinators and its test
directive "match?" which will pinpoint where two data structures differ. Then,
instead of "(is (= ...", use "(is (match? expected actual)". It works
beautifully.

The library offers other nice matchers, but the majority of the time match? is
sufficient.

Can we use another test runner like Kaocha? kaocha-cljs2
(https://github.com/lambdaisland/kaocha-cljs2) would be able to print better
test errors out of the box, among other features, but I have no clue if it would
work well or at all in our stack (in theory yes, but it's a larger piece of
work).
2023-12-05 17:20:54 -03:00
Yevheniia Berdnyk 6b612588c4 e2e: skipped checks with bugs 2023-12-05 20:54:09 +02:00
Parvesh Monu 6ef113e821 fix messages are marked as read automatically in 1-1/group chats after opening a link (#18066) 2023-12-05 22:27:03 +05:30
Jamie Caprani c25f44c2a0 chore: make new wallet UI default, move set currency to legacy settings, remove add eth network on wallet init (#18027) 2023-12-05 06:35:27 -08:00
frank d039864dca fix: Duplicate 'Contact Added' Notifications When Pair-Device User Accepts Request (#17975)
https://github.com/status-im/status-go/compare/4cc53630...d7e7792b
2023-12-05 19:12:31 +08:00
Alexander a4f1f23d3c Style fixes for pinned messages (#18061)
* Style fixes for pinned messages

* Small code style update
2023-12-05 11:31:45 +01:00
flexsurfer fe20fa4e99 move transport (#18062) 2023-12-05 09:35:17 +01:00
Omar Basem 5c30fd847a Wallet: account real data (#17821)
* wallet: account real data
2023-12-05 10:56:37 +04:00
John Ngei 64de325678 update scan qr code page
* update scan qr code page

* update scan qr code page

* fixed: populate the search input with new identity

* dismiss keyboard when scan qr page is activated
2023-12-05 02:56:27 +03:00
Volodymyr Kozieiev 489557c1a3 Match the changes in collectibles api in status-go (#18033) 2023-12-04 16:44:56 +00:00
Icaro Motta 439fdfa12c Rename effects to :effects.*/* and move them to separate namespaces (#18047) 2023-12-04 12:55:57 -03:00
Mohsen f695dbf115 [#17909] fix: unhandled error when app launched in offline mode (#17973) 2023-12-04 17:48:45 +03:00
flexsurfer 7c45b1e075 update deps (#18056) 2023-12-04 14:49:51 +01:00
flexsurfer 64453716b0 rename onboarding 2 (#18060) 2023-12-04 14:49:05 +01:00
198 changed files with 3563 additions and 2698 deletions
-1
View File
@@ -95,7 +95,6 @@ react-native.fs/unlink
react-native.fs/file-exists?
status-im.ui.components.colors/white
status-im.ui.components.colors/black
status-im.transport.core-test/messages
status-im.ui.components.core/animated-header
status-im.ui.components.core/safe-area-provider
status-im.ui.components.core/safe-area-consumer
@@ -0,0 +1,4 @@
{:linters
{:unresolved-symbol
{:exclude [(cljs.test/is [match? thrown-match?])
(clojure.test/is [match? thrown-match?])]}}}
+1
View File
@@ -32,6 +32,7 @@
"letsubs" :binding
"with-let" "let"
"reg-event-fx" :arg1-pair
"reg-fx" :arg1-pair
"testing" :arg1-body
"deftest-sub" :arg1-body
"wait-for" :arg1-body
@@ -27,18 +27,23 @@ class StatusOkHttpClientFactory implements OkHttpClientFactory {
X509Certificate cert = null;
HandshakeCertificates clientCertificates;
String certPem = "";
// Get TLS PEM certificate from status-go
try {
// induce half second sleep because sometimes a cert is not immediately available
// TODO : remove sleep if App no longer crashes on Android 10 devices with
// java.lang.RuntimeException: Could not invoke WebSocketModule.connect
Thread.sleep(500);
certPem = getCertificatePem();
} catch(Exception e) {
Log.e(TAG, "Could not getImageTLSCert",e);
}
// Get TLS PEM certificate from status-go
try {
// induce half second sleep because sometimes a cert is not immediately available
// TODO : remove sleep if App no longer crashes on Android 10 devices with
// java.lang.RuntimeException: Could not invoke WebSocketModule.connect
Thread.sleep(500);
certPem = StatusPackage.getImageTLSCert();
} catch(Exception e) {
Log.e(TAG, "Could not getImageTLSCert",e);
}
// Convert PEM certificate string to X509Certificate object
if (certPem.isEmpty()) {
Log.e(TAG, "Certificate is empty, cannot create OkHttpClient without a valid certificate");
return null;
}
// Convert PEM certificate string to X509Certificate object
try {
// induce half second sleep because sometimes a cert is not immediately available
// TODO : remove sleep if App no longer crashes on Android 10 devices
@@ -74,4 +79,17 @@ class StatusOkHttpClientFactory implements OkHttpClientFactory {
return null;
}
}
private String getCertificatePem() {
try {
String certPem = StatusPackage.getImageTLSCert();
if (certPem == null || certPem.trim().isEmpty()) {
Log.e(TAG, "Certificate PEM string is null or empty");
return "";
}
return certPem;
} catch (Exception e) {
Log.e(TAG, "Could not getImageTLSCert", e);
return "";
}
}
}
+20
View File
@@ -641,6 +641,26 @@ keywords and concatenating them into a single string.
```
### Tests
#### Prefer `match?` over `=` when comparing data structures
Prefer the `match?` directive over `=` when comparing data structures, otherwise
when the check fails the output can be too difficult to read. `match?` is
defined by library https://github.com/nubank/matcher-combinators.
```clojure
;; bad
(deftest some-test
(let [expected {...}
actual {...}]
(is (= expected actual))))
;; good
(deftest some-test
(let [expected {...}
actual {...}]
(is (match? expected actual))))
```
#### Subscription tests
Test [layer-3 subscriptions](https://day8.github.io/re-frame/subscriptions/) by
+18
View File
@@ -602,6 +602,15 @@
}
},
{
"path": "nubank/matcher-combinators/3.8.8/matcher-combinators-3.8.8",
"host": "https://repo.clojars.org",
"jar": {
"sha1": "4c94bd510f0c18a20191e46dd6becedebc640bbd",
"sha256": "0wpla2hx0s4mda58ndyd8938zmnz1gyhgfr6pzfphy27xfbvsssl"
}
},
{
"path": "org/apache/ant/ant/1.10.11/ant-1.10.11",
"host": "https://repo1.maven.org/maven2",
@@ -746,6 +755,15 @@
}
},
{
"path": "org/clojure/math.combinatorics/0.2.0/math.combinatorics-0.2.0",
"host": "https://repo1.maven.org/maven2",
"jar": {
"sha1": "aa95d25ea98bfe1152ea540f6e58a303c8cacc86",
"sha256": "0qvdsr5ryjmrpz622ivpyq5aayn42y4bk531vbasyj2yj7gcg35h"
}
},
{
"path": "org/clojure/spec.alpha/0.3.218/spec.alpha-0.3.218",
"host": "https://repo1.maven.org/maven2",
+2
View File
@@ -65,6 +65,7 @@ net/cgrand/macrovich/0.2.1/macrovich-0.2.1.jar
net/java/dev/jna/jna/5.12.1/jna-5.12.1.jar
nrepl/bencode/1.1.0/bencode-1.1.0.jar
nrepl/nrepl/1.0.0/nrepl-1.0.0.jar
nubank/matcher-combinators/3.8.8/matcher-combinators-3.8.8.jar
org/apache/ant/ant/1.10.11/ant-1.10.11.jar
org/apache/ant/ant-launcher/1.10.11/ant-launcher-1.10.11.jar
org/babashka/sci/0.7.38/sci-0.7.38.jar
@@ -81,6 +82,7 @@ org/clojure/data.json/2.4.0/data.json-2.4.0.jar
org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar
org/clojure/google-closure-library/0.0-20230227-c7c0a541/google-closure-library-0.0-20230227-c7c0a541.jar
org/clojure/google-closure-library-third-party/0.0-20230227-c7c0a541/google-closure-library-third-party-0.0-20230227-c7c0a541.jar
org/clojure/math.combinatorics/0.2.0/math.combinatorics-0.2.0.jar
org/clojure/spec.alpha/0.3.218/spec.alpha-0.3.218.jar
org/clojure/test.check/1.1.1/test.check-1.1.1.jar
org/clojure/tools.analyzer/1.1.0/tools.analyzer-1.1.0.jar
+9
View File
@@ -14,6 +14,7 @@ stdenv.mkDerivation {
"patchJavaPhase"
"patchReactNativePhase"
"patchPodPhase"
"patchGlogPhase"
"installPhase"
];
@@ -98,6 +99,14 @@ stdenv.mkDerivation {
'[RCTConvert UIColor:options.tintColor() ? @(*options.tintColor()) : nil];'
'';
# Fix pod issue after upgrading to MacOS Sonoma and Xcode 15
# https://github.com/status-im/status-mobile/issues/17682
patchGlogPhase = ''
substituteInPlace ./node_modules/react-native/scripts/ios-configure-glog.sh \
--replace 'export CC="' '#export CC="' \
--replace 'export CXX="' '#export CXX="'
'';
# The ELF types are incompatible with the host platform, so let's not even try
# TODO: Use Android NDK to strip binaries manually
dontPatchELF = true;
+1
View File
@@ -73,6 +73,7 @@ in {
allowHigher = true;
};
go = super.go_1_19;
clang = super.clang_15;
buildGoPackage = super.buildGo119Package;
buildGoModule = super.buildGo119Module;
gomobile = (super.gomobile.overrideAttrs (old: {
+1 -1
View File
@@ -94,7 +94,7 @@
"process": "0.11.10",
"react-test-renderer": "18.0.0",
"rn-snoopy": "git+https://github.com/status-im/rn-snoopy.git#refs/tags/v2.0.2-status",
"shadow-cljs": "2.25.0"
"shadow-cljs": "2.26.2"
},
"binary": {
"module_name": "status_nodejs_addon",
Binary file not shown.

After

Width:  |  Height:  |  Size: 851 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

+4 -2
View File
@@ -12,10 +12,12 @@
[metosin/malli "0.13.0"]
;; Dev dependencies
[refactor-nrepl "2.5.0"]
[cider/cider-nrepl "0.25.3"]
[refactor-nrepl "3.9.1"]
[cider/cider-nrepl "0.31.0"]
[cider/piggieback "0.4.1"]
[org.slf4j/slf4j-nop "2.0.9"]
[re-frisk-remote "1.6.0"]
[nubank/matcher-combinators "3.8.8"]
;; Use the same version specified in the Nix dependency.
[clj-kondo/clj-kondo "2023.09.07"]
-17
View File
@@ -40,23 +40,6 @@
config
#(callback (types/json->clj %))))
(defn save-account-and-login
"NOTE: beware, the password has to be sha3 hashed"
[key-uid multiaccount-data hashed-password settings config accounts-data]
(log/debug "[native-module] save-account-and-login"
"multiaccount-data"
multiaccount-data)
(clear-web-data)
(init-keystore
key-uid
#(.saveAccountAndLogin
^js (status)
multiaccount-data
hashed-password
settings
config
accounts-data)))
(defn save-multiaccount-and-login-with-keycard
"NOTE: chat-key is a whisper private key sent from keycard"
[key-uid multiaccount-data password settings config accounts-data chat-key]
@@ -61,14 +61,10 @@
value (reagent/atom "")
focused? (atom false)]
(fn [{:keys [scanned-value theme blur? on-change-text on-blur on-focus on-clear on-scan on-detect-ens
on-detect-address
ens-regex address-regex
valid-ens-or-address?]}]
on-detect-address address-regex valid-ens-or-address?]}]
(let [on-change (fn [text]
(when (not= @value text)
(let [ens? (when ens-regex
(boolean (re-matches ens-regex text)))
address? (when address-regex
(let [address? (when address-regex
(boolean (re-matches address-regex text)))]
(if (> (count text) 0)
(reset! status :typing)
@@ -76,9 +72,9 @@
(reset! value text)
(when on-change-text
(on-change-text text))
(when (and ens? on-detect-ens)
(when (and on-detect-ens (> (count text) 0))
(reset! status :loading)
(on-detect-ens text))
(on-detect-ens text #(reset! status :typing)))
(when (and address? on-detect-address)
(reset! status :loading)
(on-detect-address text)))))
@@ -0,0 +1,99 @@
(ns quo.components.wallet.confirmation-progress.component-spec
(:require [quo.core :as quo]
[reagent.core :as reagent]
[test-helpers.component :as h]))
(defn- get-test-data
[{:keys [state network]
:or {state :pending network :mainnet}}]
{:counter (reagent/atom 0)
:total-box 85
:progress-value "10"
:network network
:state state
:customization-color :blue})
(h/describe "Confirmation Progress"
(h/test "component renders when state is sending and network is optimism"
(h/render [quo/confirmation-propgress
(get-test-data {:state :sending
:network :optimism})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is confirmed and network is optimism"
(h/render [quo/confirmation-propgress
(get-test-data {:state :confirmed
:network :optimism})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is finalising and network is optimism"
(h/render [quo/confirmation-propgress
(get-test-data {:state :finalising
:network :optimism})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is finalized and network is optimism"
(h/render [quo/confirmation-propgress
(get-test-data {:state :finalized
:network :optimism})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is error and network is optimism"
(h/render [quo/confirmation-propgress
(get-test-data {:state :error
:network :optimism})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is sending and network is arbitrum"
(h/render [quo/confirmation-propgress
(get-test-data {:state :sending
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is confirmed and network is arbitrum"
(h/render [quo/confirmation-propgress
(get-test-data {:state :confirmed
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is finalising and network is arbitrum"
(h/render [quo/confirmation-propgress
(get-test-data {:state :finalising
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is finalized and network is arbitrum"
(h/render [quo/confirmation-propgress
(get-test-data {:state :finalized
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is error and network is arbitrum"
(h/render [quo/confirmation-propgress
(get-test-data {:state :error
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :progress-box)))
(h/test "component renders when state is pending and network is mainnet"
(h/render [quo/confirmation-propgress (get-test-data {})])
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
(h/test "component renders when state is sending and network is mainnet"
(h/render [quo/confirmation-propgress (get-test-data {:state :sending})])
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
(h/test "component renders when state is confirmed and network is mainnet"
(h/render [quo/confirmation-propgress (get-test-data {:state :confirmed})])
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
(h/test "component renders when state is finalising and network is mainnet"
(h/render [quo/confirmation-propgress (get-test-data {:state :finalising})])
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
(h/test "component renders when state is finalized and network is mainnet"
(h/render [quo/confirmation-propgress (get-test-data {:state :finalized})])
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
(h/test "component renders when state is error and network is mainnet"
(h/render [quo/confirmation-propgress (get-test-data {:state :error})])
(h/is-truthy (h/get-by-label-text :mainnet-progress-box))))
@@ -0,0 +1,9 @@
(ns quo.components.wallet.confirmation-progress.style)
(def progress-box-container
{:flex-direction :row
:align-items :center
:padding-horizontal 12
:padding-bottom 10
:padding-top 4
:flex-wrap :wrap})
@@ -0,0 +1,69 @@
(ns quo.components.wallet.confirmation-progress.view
(:require [quo.components.wallet.confirmation-progress.style :as style]
[quo.components.wallet.progress-bar.view :as progress-box]
[quo.theme :as quo.theme]
[react-native.core :as rn]))
(def ^:private max-progress 100)
(def ^:private min-progress 0)
(defn- calculate-box-state
[state counter index]
(cond
(and (= state :sending) (>= counter index) (< index 3)) :confirmed
(and (= state :confirmed) (>= counter index) (< index 5)) :confirmed
(and (= state :finalising) (>= counter index) (< index 5)) :confirmed
(and (= state :finalising) (>= counter index) (> index 4) (< index 20)) :finalized
(and (= state :finalized) (>= counter index) (< index 5)) :confirmed
(and (= state :finalized) (>= counter index) (> index 4)) :finalized
(and (= state :error) (>= counter index) (< index 2)) :error
:else :pending))
(defn- calculate-box-state-sidenet
[state]
(case state
:error :error
(:confirmed :finalising :finalized) :finalized
:pending))
(defn- calculate-progressed-value
[state progress-value]
(case state
:finalising progress-value
:finalized max-progress
min-progress))
(defn- progress-boxes-mainnet
[{:keys [state counter total-box]}]
[rn/view
{:accessibility-label :mainnet-progress-box
:style style/progress-box-container}
(let [numbers (range 1 total-box)]
(doall (for [n numbers]
[progress-box/view
{:state (calculate-box-state state counter n)
:customization-color :blue
:key n}])))])
(defn- progress-boxes-sidenet
[{:keys [state progress-value]}]
[rn/view
{:accessibility-label :progress-box
:style style/progress-box-container}
[progress-box/view
{:state (calculate-box-state-sidenet state)
:customization-color :success}]
[progress-box/view
{:state (calculate-box-state-sidenet state)
:full-width? true
:progressed-value (calculate-progressed-value state progress-value)
:customization-color :blue}]])
(defn- view-internal
[{:keys [network] :as props}]
(case network
:mainnet [progress-boxes-mainnet props]
(:arbitrum :optimism) [progress-boxes-sidenet props]
nil))
(def view (quo.theme/with-theme view-internal))
@@ -39,7 +39,7 @@
:width 8
:borderRadius 3
:borderColor colors/neutral-80-opa-5
:backgroundColor (colors/custom-color (:customization-color props) 50)})))
:backgroundColor (colors/resolve-color (:customization-color props) theme)})))
(h/test "finalized state with customtization-color blue in dark mode"
(let [theme :dark
@@ -51,7 +51,7 @@
:width 8
:borderRadius 3
:borderColor colors/neutral-80-opa-5
:backgroundColor (colors/custom-color (:customization-color props) 60)})))
:backgroundColor (colors/resolve-color (:customization-color props) theme)})))
(h/test "finalized state with customtization-color army in light mode"
(let [theme :light
@@ -63,7 +63,7 @@
:width 8
:borderRadius 3
:borderColor colors/neutral-80-opa-5
:backgroundColor (colors/custom-color (:customization-color props) 50)})))
:backgroundColor (colors/resolve-color (:customization-color props) theme)})))
(h/test "confirmed state in light mode"
(let [theme :light
@@ -75,7 +75,7 @@
:width 8
:borderRadius 3
:borderColor colors/neutral-80-opa-5
:backgroundColor colors/success-50})))
:backgroundColor (colors/resolve-color :success theme)})))
(h/test "confirmed state in dark mode"
(let [theme :dark
@@ -99,7 +99,7 @@
:width 8
:borderRadius 3
:borderColor colors/neutral-80-opa-5
:backgroundColor colors/danger-50})))
:backgroundColor (colors/resolve-color :danger theme)})))
(h/test "error state in dark mode"
(let [theme :dark
@@ -111,4 +111,4 @@
:width 8
:borderRadius 3
:borderColor colors/white-opa-5
:backgroundColor colors/danger-60}))))
:backgroundColor (colors/resolve-color :danger theme)}))))
@@ -3,31 +3,48 @@
[quo.foundations.colors :as colors]))
(defn- border-and-background-color
[customization-color]
[customization-color theme]
{:light {:pending {:border-color colors/neutral-80-opa-5
:background-color colors/neutral-5}
:confirmed {:border-color colors/neutral-80-opa-5
:background-color (colors/custom-color :success 50)}
:background-color (colors/resolve-color :success theme)}
:finalized {:border-color colors/neutral-80-opa-5
:background-color (colors/custom-color customization-color 50)}
:background-color (colors/resolve-color customization-color theme)}
:error {:border-color colors/neutral-80-opa-5
:background-color (colors/custom-color :danger 50)}}
:background-color (colors/resolve-color :danger theme)}}
:dark {:pending {:border-color colors/neutral-70
:background-color colors/neutral-80}
:confirmed {:border-color colors/white-opa-5
:background-color (colors/custom-color :success 60)}
:background-color (colors/resolve-color :success theme)}
:finalized {:border-color colors/neutral-80-opa-5
:background-color (colors/custom-color customization-color 60)}
:background-color (colors/resolve-color customization-color theme)}
:error {:border-color colors/white-opa-5
:background-color (colors/custom-color :danger 60)}}})
:background-color (colors/resolve-color :danger theme)}}})
(def max-value 100)
(defn root-container
[{:keys [customization-color state theme]}]
(let [{:keys [background-color border-color]} (get-in (border-and-background-color customization-color)
[theme state])]
[{:keys [customization-color state theme full-width?]}]
(let [{:keys [background-color border-color]} (get-in (border-and-background-color customization-color
theme)
[theme (if full-width? :pending state)])]
{:height 12
:flex (when full-width? 1)
:width (when (not full-width?) 8)
:border-radius 3
:border-width 1
:border-color border-color
:background-color background-color
:margin-horizontal 1
:margin-vertical 2}))
(defn progressed-bar
[{:keys [customization-color state theme progressed-value]}]
(let [{:keys [background-color]} (get-in (border-and-background-color customization-color theme)
[theme state])
progress (if (> progressed-value max-value) max-value progressed-value)]
{:height 12
:width 8
:margin-top -1
:width (str progress "%")
:border-radius 3
:border-width 1
:border-color border-color
:background-color background-color}))
@@ -5,9 +5,11 @@
[react-native.core :as rn]))
(defn- view-internal
[props]
[{:keys [full-width?] :as props}]
[rn/view
{:accessibility-label :progress-bar
:style (style/root-container props)}])
:style (style/root-container props)}
(when full-width?
[rn/view {:style (style/progressed-bar props)}])])
(def view (quo.theme/with-theme view-internal))
@@ -4,7 +4,7 @@
(defn container
[networks? theme]
{:width 335
{:width "100%"
:height (if networks? 90 56)
:border-radius 16
:border-width 1
@@ -0,0 +1,200 @@
(ns quo.components.wallet.transaction-progress.component-spec
(:require [quo.core :as quo]
[reagent.core :as reagent]
[test-helpers.component :as h]))
(defn- get-test-data
[{:keys [state network]
:or {state :pending network :mainnet}}]
{:title "Title"
:tag-name "Doodle"
:tag-number "120"
:network network
:customization-color :blue
:networks [{:network :mainnet
:state state
:counter (reagent/atom 0)
:total-box 85
:progress 30
:epoch-number "123"}
{:network :optimism
:state state
:progress "50"
:epoch-number "123"}
{:network :arbitrum
:state state
:progress "30"
:epoch-number "123"}]
:on-press (fn []
(js/alert "Transaction progress item pressed"))})
(h/describe "Transaction Progress"
(h/test "component renders without props"
(h/render [quo/transaction-progress])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is pending and network is mainnet"
(h/render [quo/transaction-progress (get-test-data {:network :optimism-arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is sending and network is optimism-arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :sending
:network :optimism-arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is confirmed and network is optimism-arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :confirmed
:network :optimism-arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is finalising and network is optimism-arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :finalising
:network :optimism-arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is finalized and network is optimism-arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :finalized
:network :optimism-arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is error and network is optimism-arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :error
:network :optimism-arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is sending and network is optimism"
(h/render [quo/transaction-progress
(get-test-data {:state :sending
:network :optimism})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is confirmed and network is optimism"
(h/render [quo/transaction-progress
(get-test-data {:state :confirmed
:network :optimism})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is finalising and network is optimism"
(h/render [quo/transaction-progress
(get-test-data {:state :finalising
:network :optimism})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is finalized and network is optimism"
(h/render [quo/transaction-progress
(get-test-data {:state :finalized
:network :optimism})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is error and network is optimism"
(h/render [quo/transaction-progress
(get-test-data {:state :error
:network :optimism})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is sending and network is arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :sending
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is confirmed and network is arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :confirmed
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is finalising and network is arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :finalising
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is finalized and network is arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :finalized
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is error and network is arbitrum"
(h/render [quo/transaction-progress
(get-test-data {:state :error
:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is pending and network is mainnet"
(h/render [quo/transaction-progress (get-test-data {})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is sending and network is mainnet"
(h/render [quo/transaction-progress (get-test-data {:state :sending})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is confirmed and network is mainnet"
(h/render [quo/transaction-progress (get-test-data {:state :confirmed})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is finalising and network is mainnet"
(h/render [quo/transaction-progress (get-test-data {:state :finalising})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is finalized and network is mainnet"
(h/render [quo/transaction-progress (get-test-data {:state :finalized})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "component renders when state is error and network is mainnet"
(h/render [quo/transaction-progress (get-test-data {:state :error})])
(h/is-truthy (h/get-by-label-text :transaction-progress)))
(h/test "mainnet progress box is visible network is mainnet"
(h/render [quo/transaction-progress (get-test-data {})])
(h/is-truthy (h/get-by-label-text :mainnet-progress-box)))
(h/test "arbitrum-optimism progress box is visible network is optimism-arbitrum"
(h/render [quo/transaction-progress (get-test-data {:network :optimism-arbitrum})])
(h/is-truthy (h/get-all-by-label-text :progress-box)))
(h/test "arbitrum progress box is visible network is arbitrum"
(h/render [quo/transaction-progress (get-test-data {:network :arbitrum})])
(h/is-truthy (h/get-all-by-label-text :progress-box)))
(h/test "optimism progress box is visible network is optimism"
(h/render [quo/transaction-progress (get-test-data {:network :optimism})])
(h/is-truthy (h/get-all-by-label-text :progress-box)))
(h/test "title is visible network is optimism-arbitrum"
(h/render [quo/transaction-progress (get-test-data {:network :optimism-arbitrum})])
(h/is-truthy (h/get-by-text "Title")))
(h/test "title is visible network is mainnet"
(h/render [quo/transaction-progress (get-test-data {})])
(h/is-truthy (h/get-by-text "Title")))
(h/test "title is visible network is optimism"
(h/render [quo/transaction-progress (get-test-data {:network :optimism})])
(h/is-truthy (h/get-by-text "Title")))
(h/test "title is visible network is arbitrum"
(h/render [quo/transaction-progress (get-test-data {:network :arbitrum})])
(h/is-truthy (h/get-by-text "Title")))
(h/test "context tag is visible network is optimism-arbitrum"
(h/render [quo/transaction-progress (get-test-data {:network :optimism-arbitrum})])
(h/is-truthy (h/get-by-label-text :context-tag)))
(h/test "context tag is visible network is mainnet"
(h/render [quo/transaction-progress (get-test-data {})])
(h/is-truthy (h/get-by-label-text :context-tag)))
(h/test "context tag is visible network is optimism"
(h/render [quo/transaction-progress (get-test-data {:network :optimism})])
(h/is-truthy (h/get-by-label-text :context-tag)))
(h/test "context tag is visible network is optimism"
(h/render [quo/transaction-progress (get-test-data {:network :arbitrum})])
(h/is-truthy (h/get-by-label-text :context-tag))))
@@ -0,0 +1,38 @@
(ns quo.components.wallet.transaction-progress.style
(:require [quo.foundations.colors :as colors]))
(def title-text-container
{:flex 1})
(def icon
{:margin-right 4})
(defn box-style
[theme]
{:border-radius 16
:border-width 1
:border-color (colors/theme-colors colors/neutral-10 colors/neutral-80 theme)})
(def title-container
{:align-items :center
:flex-direction :row
:padding-left 12
:padding-top 8
:padding-right 8
:padding-bottom 4})
(def status-row-container
{:flex-direction :row
:align-items :center
:flex 1
:padding-horizontal 12
:padding-top 8
:padding-bottom 4})
(defn context-tag-container
[theme]
{:padding-horizontal 12
:padding-bottom 8
:flex-direction :row
:border-bottom-width 1
:border-color (colors/theme-colors colors/neutral-10 colors/neutral-80 theme)})
@@ -0,0 +1,187 @@
(ns quo.components.wallet.transaction-progress.view
(:require [quo.components.buttons.button.view :as button]
[quo.components.icon :as icons]
[quo.components.markdown.text :as text]
[quo.components.tags.context-tag.view :as context-tag]
[quo.components.wallet.confirmation-progress.view :as confirmation-progress]
[quo.components.wallet.transaction-progress.style :as style]
[quo.foundations.colors :as colors]
[quo.theme :as quo.theme]
[react-native.core :as rn]
[utils.i18n :as i18n]))
(def ^:private max-mainnet-verifications 4)
(def ^:private max-sidenet-verifications 1)
(defn- icon-internal
([icon]
(icon-internal icon nil 20))
([icon color]
(icon-internal icon color 20))
([icon color size]
[rn/view {:style style/icon}
[icons/icon
icon
{:color color
:size size
:no-color (when (not color) true)}]]))
(defn- text-internal
[{:keys [weight size accessibility-label color]
:or {weight :semi-bold
size :paragraph-1}}
title]
[text/text
{:accessibility-label accessibility-label
:ellipsize-mode :tail
:number-of-lines 1
:weight weight
:size size
:style {:color color}}
title])
(defn- network-type-text
[state]
(case state
(:sending :pending) (i18n/label :t/pending-on)
(:confirmed :finalising) (i18n/label :t/confirmed-on)
:finalized (i18n/label :t/finalized-on)
:error (i18n/label :t/failed-on)
nil))
(defn- calculate-counter
[counter]
(if (< counter 4) counter max-mainnet-verifications))
(defn mainnet-label
[counter]
(str counter "/" max-mainnet-verifications))
(defn subnet-label
[counter]
(str counter "/" max-sidenet-verifications))
(defn- text-steps
[network state epoch-number counter]
(let [steps (case network
:mainnet
{:pending (mainnet-label 0)
:sending (mainnet-label (calculate-counter counter))
:confirmed (mainnet-label (calculate-counter counter))
:finalising (mainnet-label (calculate-counter counter))
:finalized (i18n/label :t/epoch-number {:number epoch-number})
:error (mainnet-label 0)}
(or :optimism :arbitrum)
{:pending (subnet-label 0)
:sending (subnet-label 0)
:confirmed (subnet-label 0)
:finalising (subnet-label 1)
:finalized (i18n/label :t/epoch-number {:number epoch-number})
:error (subnet-label 0)}
nil)]
(get steps state)))
(defn- get-status-icon
[theme state]
(case state
(:pending :sending) {:icon :i/pending-state
:color (colors/theme-colors colors/neutral-50
colors/neutral-40
theme)}
(:confirmed :finalising) {:icon :i/positive-state
:color (colors/resolve-color :success theme)}
:finalized {:icon :i/diamond}
:error {:icon :i/negative-state
:color (colors/resolve-color :danger theme)}
nil))
(defn- get-network
[networks network]
(some #(when (= (:network %) network) %)
networks))
(defn- calculate-error-state
[networks]
(some #(= (:state %) :error) networks))
(defn- title-internal
[{:keys [title theme networks]}]
[rn/view {:style style/title-container}
[icon-internal :i/placeholder (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)]
[rn/view {:style style/title-text-container}
[text-internal nil title]]
(when (calculate-error-state networks)
[button/button
{:size 24
:icon-left :i/refresh}
(i18n/label :t/retry)])])
(defn- tag-internal
[tag-photo tag-name tag-number theme]
[rn/view {:style (style/context-tag-container theme)}
[context-tag/view
{:size 24
:collectible tag-photo
:collectible-name tag-name
:collectible-number tag-number
:type :collectible}]])
(defn- get-network-text
[network]
(case network
:arbitrum (i18n/label :t/arbitrum)
:mainnet (i18n/label :t/mainnet)
:optimism (i18n/label :t/optimism)
nil))
(defn- status-row
[{:keys [theme state network epoch-number counter]}]
(let [{:keys [icon color]} (get-status-icon theme state)]
[rn/view {:style style/status-row-container}
[icon-internal icon color 16]
[rn/view {:style style/title-text-container}
[text-internal
{:weight :regular
:size :paragraph-2}
(str (network-type-text state) " " (get-network-text network))]]
[rn/view
[text-internal
{:weight :regular
:size :paragraph-2
:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)}
(text-steps network state epoch-number counter)]]]))
(defn- view-network
[{:keys [theme state epoch-number counter total-box progress network]}]
[:<>
[status-row
{:theme theme
:state state
:network network
:epoch-number epoch-number
:counter counter}]
[confirmation-progress/view
{:state state
:network network
:counter counter
:total-box total-box
:progress-value progress}]])
(defn- view-internal
[{:keys [title on-press accessibility-label theme tag-photo tag-name tag-number networks]
:or {accessibility-label :transaction-progress}}]
[rn/touchable-without-feedback
{:on-press on-press
:accessibility-label accessibility-label}
[rn/view {:style (style/box-style theme)}
[title-internal
{:title title
:theme theme
:networks networks}]
[tag-internal tag-photo tag-name tag-number theme]
(for [network networks]
^{:key (:network network)}
(let [assoc-props #(get-network networks %)]
[view-network (assoc-props (:network network))]))]])
(def view (quo.theme/with-theme view-internal))
+4
View File
@@ -146,6 +146,7 @@
quo.components.wallet.account-origin.view
quo.components.wallet.account-overview.view
quo.components.wallet.address-text.view
quo.components.wallet.confirmation-progress.view
quo.components.wallet.keypair.view
quo.components.wallet.network-amount.view
quo.components.wallet.network-bridge.view
@@ -154,6 +155,7 @@
quo.components.wallet.progress-bar.view
quo.components.wallet.summary-info.view
quo.components.wallet.token-input.view
quo.components.wallet.transaction-progress.view
quo.components.wallet.transaction-summary.view
quo.components.wallet.wallet-activity.view
quo.components.wallet.wallet-overview.view))
@@ -389,6 +391,7 @@
(def account-origin quo.components.wallet.account-origin.view/view)
(def account-overview quo.components.wallet.account-overview.view/view)
(def address-text quo.components.wallet.address-text.view/view)
(def confirmation-propgress quo.components.wallet.confirmation-progress.view/view)
(def keypair quo.components.wallet.keypair.view/view)
(def network-amount quo.components.wallet.network-amount.view/view)
(def network-bridge quo.components.wallet.network-bridge.view/view)
@@ -399,4 +402,5 @@
(def token-input quo.components.wallet.token-input.view/view)
(def wallet-overview quo.components.wallet.wallet-overview.view/view)
(def wallet-activity quo.components.wallet.wallet-activity.view/view)
(def transaction-progress quo.components.wallet.transaction-progress.view/view)
(def transaction-summary quo.components.wallet.transaction-summary.view/view)
+2
View File
@@ -80,6 +80,7 @@
[quo.components.wallet.account-card.component-spec]
[quo.components.wallet.account-origin.component-spec]
[quo.components.wallet.account-overview.component-spec]
[quo.components.wallet.confirmation-progress.component-spec]
[quo.components.wallet.keypair.component-spec]
[quo.components.wallet.network-amount.component-spec]
[quo.components.wallet.network-bridge.component-spec]
@@ -87,6 +88,7 @@
[quo.components.wallet.progress-bar.component-spec]
[quo.components.wallet.summary-info.component-spec]
[quo.components.wallet.token-input.component-spec]
[quo.components.wallet.transaction-progress.component-spec]
[quo.components.wallet.transaction-summary.component-spec]
[quo.components.wallet.wallet-activity.component-spec]
[quo.components.wallet.wallet-overview.component-spec]))
+18 -17
View File
@@ -5,11 +5,11 @@
[goog.object :as object]
[re-frame.core :as re-frame]
[status-im.chat.models.mentions :as mentions]
[status-im.chat.models.message :as chat.message]
[status-im.chat.models.message-content :as message-content]
[status-im.data-store.messages :as data-store-messages]
[status-im2.constants :as constants]
[status-im2.contexts.chat.composer.link-preview.events :as link-preview]
[status-im2.contexts.chat.messages.transport.events :as messages.transport]
[taoensso.timbre :as log]
[utils.i18n :as i18n]
[utils.re-frame :as rf]
@@ -205,7 +205,7 @@
(rf/merge cofx
(clean-input (:current-chat-id db))
(link-preview/reset-unfurled)
(chat.message/send-messages messages)))))
(messages.transport/send-chat-messages messages)))))
(rf/defn send-audio-message
[{:keys [db] :as cofx} audio-path duration current-chat-id]
@@ -214,25 +214,26 @@
(when-not (string/blank? audio-path)
(rf/merge
{:db (assoc-in db [:chat/inputs current-chat-id :metadata :responding-to-message] nil)}
(chat.message/send-message
(merge
{:chat-id current-chat-id
:content-type constants/content-type-audio
:audio-path audio-path
:audio-duration-ms duration
:text (i18n/label :t/update-to-listen-audio {"locale" "en"})}
(when message-id
{:response-to message-id})))))))
(messages.transport/send-chat-messages
[(merge
{:chat-id current-chat-id
:content-type constants/content-type-audio
:audio-path audio-path
:audio-duration-ms duration
:text (i18n/label :t/update-to-listen-audio {"locale" "en"})}
(when message-id
{:response-to message-id}))])))))
(rf/defn send-sticker-message
[cofx {:keys [hash packID pack]} current-chat-id]
(when-not (or (string/blank? hash) (and (string/blank? packID) (string/blank? pack)))
(chat.message/send-message cofx
{:chat-id current-chat-id
:content-type constants/content-type-sticker
:sticker {:hash hash
:pack (int (if (string/blank? packID) pack packID))}
:text (i18n/label :t/update-to-see-sticker {"locale" "en"})})))
(messages.transport/send-chat-messages
cofx
[{:chat-id current-chat-id
:content-type constants/content-type-sticker
:sticker {:hash hash
:pack (int (if (string/blank? packID) pack packID))}
:text (i18n/label :t/update-to-see-sticker {"locale" "en"})}])))
(rf/defn send-edited-message
[{:keys [db]
+1
View File
@@ -45,6 +45,7 @@
{:db (update-in db [:chats chat-id] merge chat)}))
(rf/defn load-chat
{:events [:chats-list/load-chat]}
[_ chat-id]
{:json-rpc/call [{:method "wakuext_chat"
:params [chat-id]
-15
View File
@@ -5,7 +5,6 @@
[react-native.platform :as platform]
[status-im.chat.models.loading :as chat.loading]
[status-im.data-store.messages :as data-store.messages]
[status-im.transport.message.protocol :as protocol]
[status-im.utils.deprecated-types :as types]
[status-im2.contexts.chat.messages.delete-message.events :as delete-message]
[status-im2.contexts.chat.messages.list.events :as message-list]
@@ -21,12 +20,6 @@
[db chat-id clock-value]
(>= (get-in db [:chats chat-id :deleted-at-clock-value]) clock-value))
(defn add-timeline-message
[acc chat-id message-id message]
(-> acc
(update-in [:db :messages chat-id] assoc message-id message)
(update-in [:db :message-lists chat-id] message-list/add message)))
(defn hide-message
"Hide chat message, rebuild message-list"
[{:keys [db]} chat-id message-id]
@@ -145,14 +138,6 @@
:on-error #(log/error "failed to re-send message" %)}]}
(update-message-status chat-id message-id :sending)))
(rf/defn send-message
[cofx message]
(protocol/send-chat-messages cofx [message]))
(rf/defn send-messages
[cofx messages]
(protocol/send-chat-messages cofx messages))
(rf/defn handle-removed-messages
{:events [::handle-removed-messages]}
[{:keys [db] :as cofx} removed-messages]
-18
View File
@@ -2,7 +2,6 @@
(:require
[re-frame.core :as re-frame]
[status-im.data-store.reactions :as data-store.reactions]
[status-im.transport.message.protocol :as message.protocol]
[status-im2.constants :as constants]
[taoensso.timbre :as log]
[utils.re-frame :as rf]
@@ -63,23 +62,6 @@
(let [reactions-w-chat-id (map #(assoc % :chat-id chat-id) reactions)]
{:db (update db :reactions (process-reactions (:chats db)) reactions-w-chat-id)})))
;; Send reactions
(rf/defn send-emoji-reaction
{:events [:models.reactions/send-emoji-reaction]}
[{{:keys [current-chat-id]} :db :as cofx} reaction]
(message.protocol/send-reaction cofx
(update reaction :chat-id #(or % current-chat-id))))
(rf/defn send-retract-emoji-reaction
{:events [:models.reactions/send-emoji-reaction-retraction]}
[{{:keys [current-chat-id]} :db :as cofx} reaction]
(message.protocol/send-retract-reaction cofx
(update reaction :chat-id #(or % current-chat-id))))
(defn message-reactions
[current-public-key reactions]
(reduce
-46
View File
@@ -1,46 +0,0 @@
(ns status-im.commands.core
(:require
[re-frame.core :as re-frame]
[status-im.wallet.utils :as wallet.utils]
[utils.re-frame :as rf]))
(rf/defn handle-prepare-accept-request-address-for-transaction
{:events [::prepare-accept-request-address-for-transaction]}
[{:keys [db]} message]
{:db (assoc db
:commands/select-account
{:message message
:from (wallet.utils/get-default-account (:profile/wallet-accounts
db))})
:show-select-acc-sheet nil})
(rf/defn set-selected-account
{:events [::set-selected-account]}
[{:keys [db]} _ account]
{:db (-> (assoc-in db [:commands/select-account :from] account)
(assoc :bottom-sheet/show? false))})
(rf/defn handle-accept-request-address-for-transaction
{:events [::accept-request-address-for-transaction]}
[{:keys [db]} message-id address]
{:db (dissoc db :commands/select-account)
:json-rpc/call [{:method "wakuext_acceptRequestAddressForTransaction"
:params [message-id address]
:js-response true
:on-success #(re-frame/dispatch [:transport/message-sent %])}]})
(rf/defn handle-decline-request-address-for-transaction
{:events [::decline-request-address-for-transaction]}
[_ message-id]
{:json-rpc/call [{:method "wakuext_declineRequestAddressForTransaction"
:params [message-id]
:js-response true
:on-success #(re-frame/dispatch [:transport/message-sent %])}]})
(rf/defn handle-decline-request-transaction
{:events [::decline-request-transaction]}
[cofx message-id]
{:json-rpc/call [{:method "wakuext_declineRequestTransaction"
:params [message-id]
:js-response true
:on-success #(re-frame/dispatch [:transport/message-sent %])}]})
+1
View File
@@ -74,6 +74,7 @@
:adminSettings :admin-settings
:tokenPermissions :token-permissions
:communityTokensMetadata :tokens-metadata
:introMessage :intro-message
:muteTill :muted-till})
(update :admin-settings
set/rename-keys
-18
View File
@@ -1,18 +0,0 @@
(ns status-im.contact.chat
(:require
[re-frame.core :as re-frame]
[status-im2.contexts.contacts.events :as contact]
[status-im2.navigation.events :as navigation]
[utils.re-frame :as rf]))
(rf/defn contact-code-submitted
{:events [:contact.ui/contact-code-submitted]
:interceptors [(re-frame/inject-cofx :random-id-generator)]}
[{{:contacts/keys [new-identity]} :db :as cofx} new-contact? nickname]
(let [{:keys [public-key ens-name]} new-identity]
(rf/merge cofx
#(if new-contact?
(contact/send-contact-request % public-key)
{:dispatch [:chat.ui/start-chat public-key ens-name]})
#(when new-contact?
(navigation/navigate-back %)))))
-13
View File
@@ -1,13 +0,0 @@
(ns status-im.contact.core
(:require
[status-im2.navigation.events :as navigation]
[utils.re-frame :as rf]))
(rf/defn open-contact-toggle-list
{:events [:contact.ui/start-group-chat-pressed]}
[{:keys [db] :as cofx}]
(rf/merge cofx
{:db (assoc db
:group/selected-contacts #{}
:new-chat-name "")}
(navigation/navigate-to :contact-toggle-list nil)))
-9
View File
@@ -85,12 +85,3 @@
(assoc acc public-key (enrich-contact contact profile-pictures-visibility own-public-key)))
{}
contacts))
(defn get-blocked-contacts
[contacts]
(reduce (fn [acc {:keys [public-key] :as contact}]
(if (:blocked? contact)
(conj acc public-key)
acc))
#{}
contacts))
+19 -14
View File
@@ -91,11 +91,11 @@
{:chainId :chain-id
:removed :removed?})
name-details)]
{:db (reduce (fn [db {:keys [username removed?] :as name-detail}]
{:db (reduce (fn [db {:keys [username removed? chain-id] :as name-detail}]
(if removed?
(update-in db [:ens/names] dissoc username)
(let [old (get-in db [:ens/names username])]
(assoc-in db [:ens/names username] (merge old name-detail)))))
(update-in db [:ens/names chain-id] dissoc username)
(let [old (get-in db [:ens/names chain-id username])]
(assoc-in db [:ens/names chain-id username] (merge old name-detail)))))
db
name-details)}))
@@ -103,8 +103,8 @@
{:events [:ens/save-username]}
[{:keys [db] :as cofx} custom-domain? username redirect-to-summary? connected?]
(let [name (fullname custom-domain? username)
names (get-in db [:ens/names] [])
chain-id (chain/chain-id db)]
chain-id (chain/chain-id db)
names (get-in db [:ens/names chain-id] [])]
(rf/merge cofx
(cond-> {:dispatch-n [[:ens/update-usernames [{:username name :chain-id chain-id}]]]}
connected? (assoc :json-rpc/call
@@ -240,7 +240,8 @@
{:events [::set-username-candidate]}
[{:keys [db]} username]
(let [{:keys [custom-domain?]} (:ens/registration db)
usernames (into #{} (keys (get-in db [:ens/names])))
chain-id (chain/chain-id db)
usernames (into #{} (keys (get-in db [:ens/names chain-id])))
state (state custom-domain? username usernames)]
(reset! resolve-last-id (random/id))
(merge
@@ -310,20 +311,23 @@
(rf/defn store-name-address
{:events [::address-resolved]}
[{:keys [db]} username address]
{:db (assoc-in db [:ens/names username :address] address)})
(let [chain-id (chain/chain-id db)]
{:db (assoc-in db [:ens/names chain-id username :address] address)}))
(rf/defn store-name-public-key
{:events [::public-key-resolved]}
[{:keys [db]} username public-key]
{:db (assoc-in db [:ens/names username :public-key] public-key)})
(let [chain-id (chain/chain-id db)]
{:db (assoc-in db [:ens/names chain-id username :public-key] public-key)}))
(rf/defn store-expiration-date
{:events [::get-expiration-time-success]}
[{:keys [now db]} username timestamp]
{:db (-> db
(assoc-in [:ens/names username :expiration-date]
(datetime/timestamp->year-month-day-date timestamp))
(assoc-in [:ens/names username :releasable?] (<= timestamp now)))})
(let [chain-id (chain/chain-id db)]
{:db (-> db
(assoc-in [:ens/names chain-id username :expiration-date]
(datetime/timestamp->year-month-day-date timestamp))
(assoc-in [:ens/names chain-id username :releasable?] (<= timestamp now)))}))
(rf/defn navigate-to-name
{:events [::navigate-to-name]}
@@ -352,7 +356,8 @@
(rf/defn remove-username
{:events [::remove-username]}
[{:keys [db] :as cofx} name]
(let [names (get-in db [:ens/names] [])
(let [chain-id (chain/chain-id db)
names (get-in db [:ens/names chain-id] [])
preferred-name (get-in db [:profile/profile :preferred-name])
new-names (remove #(= name %) (keys names))
{:keys [chain-id username]} (get-in names [name])]
+5 -9
View File
@@ -15,8 +15,6 @@
status-im.chat.models.input
status-im.chat.models.loading
status-im.contact.block
status-im.contact.chat
status-im.contact.core
status-im.currency.core
status-im.ethereum.subscriptions
status-im.fleet.core
@@ -32,9 +30,7 @@
status-im.pairing.core
status-im.profile.core
status-im.search.core
status-im.signals.core
status-im.stickers.core
status-im.transport.core
status-im.ui.components.invite.events
[status-im.ui.components.react :as react]
status-im.ui.screens.notifications-settings.events
@@ -45,12 +41,12 @@
status-im.visibility-status-popover.core
status-im.visibility-status-updates.core
status-im.waku.core
status-im.wallet-connect.core
status-im.wallet.accounts.core
status-im.wallet.choose-recipient.core
[status-im.wallet.core :as wallet]
status-im.wallet.custom-tokens.core
[status-im2.common.biometric.events :as biometric]
status-im2.common.standard-authentication.events
[status-im2.common.theme.core :as theme]
[status-im2.common.universal-links :as universal-links]
[status-im2.constants :as constants]
@@ -136,7 +132,7 @@
(rf/defn on-return-from-background
[{:keys [db now] :as cofx}]
(let [new-account? (get db :onboarding-2/new-account?)
(let [new-account? (get db :onboarding/new-account?)
app-in-background-since (get db :app-in-background-since)
signed-up? (get-in db [:profile/profile :signed-up?])
requires-bio-auth (and
@@ -194,9 +190,9 @@
(rf/merge cofx
(cond
(= :chat view-id)
{:async-storage-set {:chat-id (get-in cofx [:db :current-chat-id])
:key-uid (get-in cofx [:db :profile/profile :key-uid])}
:db (assoc db :screens/was-focused-once? true)}
{:effects.async-storage/set {:chat-id (get-in cofx [:db :current-chat-id])
:key-uid (get-in cofx [:db :profile/profile :key-uid])}
:db (assoc db :screens/was-focused-once? true)}
(not (get db :screens/was-focused-once?))
{:db (assoc db :screens/was-focused-once? true)})
+5 -7
View File
@@ -3,7 +3,6 @@
[re-frame.core :as re-frame]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.node.core :as node]
[status-im2.config :as config]
[status-im2.constants :as constants]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
@@ -78,10 +77,9 @@
[{:keys [db now] :as cofx} fleet]
(let [old-fleet (get-in db [:profile/profile :fleet])]
(when (not= fleet old-fleet)
(rf/merge
(multiaccounts.update/multiaccount-update
cofx
(multiaccounts.update/multiaccount-update :fleet fleet {})
(node/prepare-new-config
{:on-success
#(re-frame/dispatch
[:multiaccounts.update.callback/save-settings-success])})))))
:fleet
fleet
{:on-success
#(re-frame/dispatch [:logout])}))))
+23 -23
View File
@@ -141,14 +141,14 @@
(let [pin (get-in db [:keycard :pin :original])
puk-restore? (get-in db [:keycard :pin :puk-restore?])]
(rf/merge cofx
{:db (assoc-in db
[:keycard :pin]
{:status nil
:login pin
:confirmation []
:error-label nil})
:utils/show-popup {:title ""
:content (i18n/label :t/pin-changed)}}
{:db (assoc-in db
[:keycard :pin]
{:status nil
:login pin
:confirmation []
:error-label nil})
:effects.utils/show-popup {:title ""
:content (i18n/label :t/pin-changed)}}
(common/hide-connection-sheet)
(if puk-restore?
(navigation/navigate-to :multiaccounts nil)
@@ -160,14 +160,14 @@
{:events [:keycard.callback/on-change-puk-success]}
[{:keys [db] :as cofx}]
(rf/merge cofx
{:db (assoc-in db
[:keycard :pin]
{:status nil
:puk-original []
:puk-confirmation []
:error-label nil})
:utils/show-popup {:title ""
:content (i18n/label :t/puk-changed)}}
{:db (assoc-in db
[:keycard :pin]
{:status nil
:puk-original []
:puk-confirmation []
:error-label nil})
:effects.utils/show-popup {:title ""
:content (i18n/label :t/puk-changed)}}
(common/hide-connection-sheet)
(navigation/set-stack-root :profile-stack [:my-profile :keycard-settings])))
@@ -175,13 +175,13 @@
{:events [:keycard.callback/on-change-pairing-success]}
[{:keys [db] :as cofx}]
(rf/merge cofx
{:db (assoc-in db
[:keycard :pin]
{:status nil
:pairing-code nil
:error-label nil})
:utils/show-popup {:title ""
:content (i18n/label :t/pairing-changed)}}
{:db (assoc-in db
[:keycard :pin]
{:status nil
:pairing-code nil
:error-label nil})
:effects.utils/show-popup {:title ""
:content (i18n/label :t/pairing-changed)}}
(common/hide-connection-sheet)
(navigation/set-stack-root :profile-stack [:my-profile :keycard-settings])))
+4 -4
View File
@@ -293,14 +293,14 @@
(rf/defn show-wrong-keycard-alert
[_]
(log/debug "show-wrong-keycard-alert")
{:utils/show-popup {:title (i18n/label :t/wrong-card)
:content (i18n/label :t/wrong-card-text)}})
{:effects.utils/show-popup {:title (i18n/label :t/wrong-card)
:content (i18n/label :t/wrong-card-text)}})
(rf/defn unauthorized-operation
[cofx]
(rf/merge cofx
{:utils/show-popup {:title ""
:content (i18n/label :t/keycard-unauthorized-operation)}}
{:effects.utils/show-popup {:title ""
:content (i18n/label :t/keycard-unauthorized-operation)}}
(clear-on-card-connected)
(navigation/set-stack-root :profile-stack [:my-profile :keycard-settings])))
+11 -10
View File
@@ -24,12 +24,12 @@
(rf/defn show-keycard-has-multiaccount-alert
[{:keys [db] :as cofx}]
(rf/merge cofx
{:db (assoc-in db [:keycard :setup-step] nil)
:utils/show-confirmation {:title nil
:content (i18n/label
:t/keycard-has-multiaccount-on-it)
:cancel-button-text ""
:confirm-button-text :t/okay}}))
{:db (assoc-in db [:keycard :setup-step] nil)
:effects.utils/show-confirmation {:title nil
:content (i18n/label
:t/keycard-has-multiaccount-on-it)
:cancel-button-text ""
:confirm-button-text :t/okay}}))
(rf/defn load-pin-screen
[{:keys [db] :as cofx}]
@@ -548,10 +548,11 @@
(rf/defn show-no-keycard-applet-alert
[_]
{:utils/show-confirmation {:title (i18n/label :t/no-keycard-applet-on-card)
:content (i18n/label :t/keycard-applet-install-instructions)
:cancel-button-text ""
:confirm-button-text :t/okay}})
{:effects.utils/show-confirmation {:title (i18n/label :t/no-keycard-applet-on-card)
:content (i18n/label
:t/keycard-applet-install-instructions)
:cancel-button-text ""
:confirm-button-text :t/okay}})
;; NOTE: Maybe replaced by multiple events based on on flow to make it easier to maintain.
;; Because there are many execution paths it is harder to follow all possible states.
+2 -2
View File
@@ -35,8 +35,8 @@
(do
(log/debug (str "Cannot start keycard installation from state: " card-state))
(rf/merge cofx
{:utils/show-popup {:title (i18n/label :t/error)
:content (i18n/label :t/something-went-wrong)}}
{:effects.utils/show-popup {:title (i18n/label :t/error)
:content (i18n/label :t/something-went-wrong)}}
(navigation/navigate-to :keycard-authentication-method nil))))))
(rf/defn load-preparing-screen
+29 -30
View File
@@ -11,13 +11,11 @@
[status-im.multiaccounts.model :as multiaccounts.model]
[status-im.popover.core :as popover]
[status-im.utils.deprecated-types :as types]
[status-im.utils.keychain.core :as keychain]
[status-im2.constants :as constants]
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]
[utils.address :as address]
[utils.datetime :as datetime]
[utils.ethereum.eip.eip55 :as eip55]
[utils.i18n :as i18n]
[utils.re-frame :as rf]
[utils.security.core :as security]))
@@ -183,26 +181,28 @@
{:db (-> db
(assoc-in [:keycard :setup-step] nil)
(dissoc :intro-wizard))}
(multiaccounts.create/on-multiaccount-created
{:recovered (or recovered (get-in db [:intro-wizard :recovering?]))
:derived {constants/path-wallet-root-keyword
{:public-key wallet-root-public-key
:address (eip55/address->checksum wallet-root-address)}
constants/path-whisper-keyword
{:public-key whisper-public-key
:address (eip55/address->checksum whisper-address)}
constants/path-default-wallet-keyword
{:public-key wallet-public-key
:address (eip55/address->checksum wallet-address)}}
:address address
:public-key public-key
:keycard-instance-uid instance-uid
:key-uid (address/normalized-hex key-uid)
:keycard-pairing pairing
:keycard-paired-on paired-on
:chat-key whisper-private-key}
encryption-public-key
{}))))
;; NOTE: Disabling as keycard not functional and this needs to be moved to
;; status-go
#_(multiaccounts.create/on-multiaccount-created
{:recovered (or recovered (get-in db [:intro-wizard :recovering?]))
:derived {constants/path-wallet-root-keyword
{:public-key wallet-root-public-key
:address (eip55/address->checksum wallet-root-address)}
constants/path-whisper-keyword
{:public-key whisper-public-key
:address (eip55/address->checksum whisper-address)}
constants/path-default-wallet-keyword
{:public-key wallet-public-key
:address (eip55/address->checksum wallet-address)}}
:address address
:public-key public-key
:keycard-instance-uid instance-uid
:key-uid (address/normalized-hex key-uid)
:keycard-pairing pairing
:keycard-paired-on paired-on
:chat-key whisper-private-key}
encryption-public-key
{}))))
(rf/defn return-to-keycard-login
[{:keys [db] :as cofx}]
@@ -221,12 +221,12 @@
(rf/defn on-backup-success
[{:keys [db] :as cofx} backup-type]
(rf/merge cofx
{:utils/show-popup {:title (i18n/label (if (= backup-type :recovery-card)
:t/keycard-access-reset
:t/keycard-backup-success-title))
:content (i18n/label (if (= backup-type :recovery-card)
:t/keycard-can-use-with-new-passcode
:t/keycard-backup-success-body))}}
{:effects.utils/show-popup {:title (i18n/label (if (= backup-type :recovery-card)
:t/keycard-access-reset
:t/keycard-backup-success-title))
:content (i18n/label (if (= backup-type :recovery-card)
:t/keycard-can-use-with-new-passcode
:t/keycard-backup-success-body))}}
(cond
(multiaccounts.model/logged-in? db)
(navigation/set-stack-root :profile-stack [:my-profile :keycard-settings])
@@ -278,7 +278,7 @@
{:db (-> db
(assoc-in [:profile/profiles-overview key-uid :keycard-pairing] pairing)
(assoc :profile/login account)
(assoc :auth-method keychain/auth-method-none)
(assoc :auth-method "none")
(update :keycard dissoc :flow :migration-password)
(dissoc :recovered-account?))
::finish-migration [account settings password encryption-pass login-params]}))
@@ -373,4 +373,3 @@
cofx
{:on-card-connected :keycard/load-recovering-key-screen
:handler (common/dispatch-event :keycard/import-multiaccount)}))
+9 -8
View File
@@ -489,14 +489,15 @@
(log/warn "sign-typed-data not implemented" args))
(defn save-multiaccount-and-login
[{:keys [key-uid multiaccount-data password settings node-config accounts-data]}]
(native-module/save-account-and-login
key-uid
(types/clj->json multiaccount-data)
password
(types/clj->json settings)
node-config
(types/clj->json accounts-data)))
[_]
;; NOTE: disabling as we don't support keycard for now and it's using an outdated endpoint
#_(native-module/save-account-and-login
key-uid
(types/clj->json multiaccount-data)
password
(types/clj->json settings)
node-config
(types/clj->json accounts-data)))
(defn login
[{:keys [key-uid multiaccount-data password]}]
+4 -5
View File
@@ -83,7 +83,7 @@
:error-label nil
:on-verified nil}))
:keycard/persist-pairings (dissoc pairings (keyword instance-uid))
:utils/show-popup {:title ""
:effects.utils/show-popup {:title ""
:content (i18n/label :t/card-unpaired)}}
(common/clear-on-card-connected)
(remove-pairing-from-multiaccount nil)
@@ -100,7 +100,7 @@
:error-label nil
:on-verified nil})
:keycard/get-application-info nil
:utils/show-popup {:title ""
:effects.utils/show-popup {:title ""
:content (i18n/label :t/something-went-wrong)}}
(common/clear-on-card-connected)
(navigation/navigate-to :keycard-settings nil)))
@@ -139,15 +139,14 @@
:error-label nil
:on-verified nil}))
:keycard/persist-pairings (dissoc pairings (keyword instance-uid))
:utils/show-popup {:title (i18n/label (if keys-removed-from-card?
:effects.utils/show-popup {:title (i18n/label (if keys-removed-from-card?
:t/profile-deleted-title
:t/database-reset-title))
:content (i18n/label (if keys-removed-from-card?
:t/profile-deleted-keycard
:t/database-reset-content))
:on-dismiss #(re-frame/dispatch [:logout])}}
;;should be reimplemented
;;:key-storage/delete-profile {:key-uid key-uid
;;should be reimplemented :key-storage/delete-profile {:key-uid key-uid
;;:on-success #(log/debug "[keycard] remove account ok")
;; :on-error #(log/warn "[keycard] remove account: " %)}
(common/clear-on-card-connected)
+5 -8
View File
@@ -2,7 +2,6 @@
(:require
[re-frame.core :as re-frame]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.node.core :as node]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
@@ -11,13 +10,11 @@
[{:keys [db now] :as cofx} log-level]
(let [old-log-level (get-in db [:profile/profile :log-level])]
(when (not= old-log-level log-level)
(rf/merge cofx
(multiaccounts.update/multiaccount-update
:log-level
log-level
{})
(node/prepare-new-config
{:on-success #(re-frame/dispatch [:logout])})))))
(multiaccounts.update/multiaccount-update
cofx
:log-level
log-level
{:on-success #(re-frame/dispatch [:logout])}))))
(rf/defn show-change-log-level-confirmation
{:events [:log-level.ui/log-level-selected]}
+16 -3
View File
@@ -194,7 +194,7 @@
{:events [:mailserver.ui/request-error-pressed]}
[{:keys [db]}]
(let [mailserver-error (:mailserver/request-error db)]
{:utils/show-confirmation
{:effects.utils/show-confirmation
{:title (i18n/label :t/mailserver-request-error-title)
:content (i18n/label :t/mailserver-request-error-content
{:error mailserver-error})
@@ -290,8 +290,7 @@
[{:method "mailservers_addMailserver"
:params [(mailserver->rpc mailserver current-fleet)]
:on-success (fn []
;; we naively logout if the user is connected to
;; the edited mailserver
;; we naively logout if the user is connected to the edited mailserver
(when current
(re-frame/dispatch
[:multiaccounts.logout.ui/logout-confirmed]))
@@ -413,3 +412,17 @@
(rf/merge cofx
{:db (dissoc db :mailserver.edit/mailserver)}
(navigation/navigate-to :edit-mailserver nil)))
(defn add-mailservers
[db mailservers]
(reduce (fn [db {:keys [fleet id name] :as mailserver}]
(let [updated-mailserver
(-> mailserver
(update :id keyword)
(assoc :name (if (seq name) name id))
(dissoc :fleet))]
(assoc-in db
[:mailserver/mailservers (keyword fleet) (keyword id)]
updated-mailserver)))
db
mailservers))
+1 -139
View File
@@ -2,17 +2,10 @@
(:require
[native-module.core :as native-module]
[re-frame.core :as re-frame]
[status-im.data-store.settings :as data-store.settings]
[status-im.node.core :as node]
[status-im.ui.components.colors :as colors]
[status-im.utils.deprecated-types :as types]
[status-im.utils.signing-phrase.core :as signing-phrase]
[status-im2.config :as config]
[status-im2.constants :as constants]
[utils.ethereum.eip.eip55 :as eip55]
[utils.i18n :as i18n]
[utils.re-frame :as rf]
[utils.security.core :as security]))
[utils.re-frame :as rf]))
(defn normalize-derived-data-keys
[derived-data]
@@ -82,134 +75,3 @@
(rf/defn save-multiaccount-and-login-with-keycard
[_ args]
{:keycard/save-multiaccount-and-login args})
(re-frame/reg-fx
::save-account-and-login
(fn [[key-uid multiaccount-data hashed-password settings config accounts-data]]
(native-module/save-account-and-login
key-uid
multiaccount-data
hashed-password
settings
config
accounts-data)))
(rf/defn save-account-and-login
[_ key-uid multiaccount-data password settings node-config accounts-data]
{::save-account-and-login [key-uid
(types/clj->json multiaccount-data)
password
(types/clj->json settings)
node-config
(types/clj->json accounts-data)]})
(defn prepare-accounts-data
[multiaccount]
[(let [{:keys [public-key address]}
(get-in multiaccount [:derived constants/path-default-wallet-keyword])]
{:public-key public-key
:address (eip55/address->checksum address)
:color colors/blue-persist
:wallet true
:path constants/path-default-wallet
:name (i18n/label :t/main-account)})
(let [{:keys [compressed-key public-key address name]}
(get-in multiaccount [:derived constants/path-whisper-keyword])]
{:public-key public-key
:compressed-key compressed-key
:address (eip55/address->checksum address)
:name name
:path constants/path-whisper
:chat true})])
(rf/defn on-multiaccount-created
[{:keys [signing-phrase random-guid-generator db] :as cofx}
{:keys [address chat-key keycard-instance-uid key-uid
keycard-pairing keycard-paired-on mnemonic recovered]
:as multiaccount}
password
{:keys [save-mnemonic? login?] :or {login? true save-mnemonic? false}}]
(let [[wallet-account
{:keys [public-key
compressed-key
name]} :as accounts-data]
(prepare-accounts-data
multiaccount)
multiaccount-data {:name name
:address address
:key-uid key-uid
:keycard-pairing keycard-pairing}
keycard-multiaccount? (boolean keycard-pairing)
eip1581-address (get-in multiaccount
[:derived
constants/path-eip1581-keyword
:address])
new-multiaccount
(cond->
(merge
{;; address of the master key
:address address
;; sha256 of master public key
:key-uid key-uid
;; The address from which we derive any wallet
:wallet-root-address
(get-in multiaccount
[:derived
constants/path-wallet-root-keyword
:address])
:name name
;; public key of the chat account
:public-key public-key
;; compressed key of the chat account
:compressed-key compressed-key
;; default address for Dapps
:dapps-address (:address wallet-account)
:latest-derived-path 0
:signing-phrase signing-phrase
:backup-enabled? true
:installation-id (random-guid-generator)
;; default mailserver (history node) setting
:use-mailservers? true
:recovered recovered}
config/default-multiaccount)
;; The address from which we derive any chat
;; account/encryption keys
eip1581-address
(assoc :eip1581-address eip1581-address)
save-mnemonic?
(assoc :mnemonic mnemonic)
keycard-multiaccount?
(assoc :keycard-instance-uid keycard-instance-uid
:keycard-pairing keycard-pairing
:keycard-paired-on keycard-paired-on))
db (assoc db
:profile/login {:key-uid key-uid
:name name
:password password
:creating? true
:processing true}
:profile/profile new-multiaccount
:profile/wallet-accounts [wallet-account]
:networks/current-network config/default-network
:networks/networks (data-store.settings/rpc->networks config/default-networks))
settings (assoc new-multiaccount
:networks/current-network config/default-network
:networks/networks config/default-networks)]
(rf/merge cofx
{:db db}
(if keycard-multiaccount?
(save-multiaccount-and-login-with-keycard
{:key-uid key-uid
:multiaccount-data multiaccount-data
:password password
:settings settings
:node-config (node/get-new-config db)
:accounts-data accounts-data
:chat-key chat-key})
(save-account-and-login
key-uid
multiaccount-data
(native-module/sha3 (security/safe-unmask-data password))
settings
(node/get-new-config db)
accounts-data)))))
+1 -1
View File
@@ -31,7 +31,7 @@
(rf/merge cofx
{:set-root :progress
:chat.ui/clear-inputs nil
:shell/reset-state nil
:effects.shell/reset-state nil
:hide-popover nil
::logout nil
:profile.settings/webview-debug-changed false
+5 -8
View File
@@ -2,7 +2,6 @@
(:require
[clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.node.core :as node]
[status-im2.navigation.events :as navigation]
[utils.ethereum.chain :as chain]
[utils.i18n :as i18n]
@@ -89,7 +88,7 @@
(rf/defn connect-failure
{:events [::connect-failure]}
[_ reason]
{:utils/show-popup
{:effects.utils/show-popup
{:title (i18n/label :t/error)
:content (str reason)}})
@@ -117,12 +116,10 @@
(rf/defn save-network-settings
{:events [::save-network-settings-pressed]}
[{:keys [db] :as cofx} network]
(rf/merge cofx
{:db (assoc db :networks/current-network network)
:json-rpc/call [{:method "settings_saveSetting"
:params [:networks/current-network network]
:on-success #()}]}
(node/prepare-new-config {:on-success #(re-frame/dispatch [:logout])})))
{:db (assoc db :networks/current-network network)
:json-rpc/call [{:method "settings_saveSetting"
:params [:networks/current-network network]
:on-success #(re-frame/dispatch [:logout])}]})
(rf/defn remove-network
{:events [::remove-network-confirmed]}
+1 -32
View File
@@ -1,12 +1,9 @@
(ns status-im.node.core
(:require
[clojure.string :as string]
[native-module.core :as native-module]
[re-frame.core :as re-frame]
[react-native.platform :as platform]
[status-im.utils.deprecated-types :as types]
[status-im2.config :as config]
[utils.re-frame :as rf]))
[status-im2.config :as config]))
(defn- add-custom-bootnodes
[config network all-bootnodes]
@@ -196,32 +193,4 @@
:always
(add-log-level log-level))))
(defn get-new-config
[db]
(types/clj->json (get-multiaccount-node-config db)))
(rf/defn save-new-config
"Saves a new status-go config for the current account
This RPC method is the only way to change the node config of an account.
NOTE: it is better used indirectly through `prepare-new-config`,
which will take care of building up the proper config based on settings in
app-db"
{:events [::save-new-config]}
[_ config {:keys [on-success]}]
{:json-rpc/call [{:method "settings_saveSetting"
:params [:node-config config]
:on-success on-success}]})
(rf/defn prepare-new-config
"Use this function to apply settings to the current account node config"
[{:keys [db]} {:keys [on-success]}]
(let [key-uid (get-in db [:profile/profile :key-uid])]
{::prepare-new-config [key-uid
(get-new-config db)
#(re-frame/dispatch
[::save-new-config % {:on-success on-success}])]}))
(re-frame/reg-fx
::prepare-new-config
(fn [[key-uid config callback]]
(native-module/prepare-dir-and-update-config key-uid config callback)))
+2 -2
View File
@@ -165,9 +165,9 @@
(if (< (count (filter :enabled? (vals (get-in cofx [:db :pairing/installations]))))
(inc config/max-installations))
{:pairing/enable-installation [installation-id]}
{:utils/show-popup {:title (i18n/label :t/pairing-maximum-number-reached-title)
{:effects.utils/show-popup {:title (i18n/label :t/pairing-maximum-number-reached-title)
:content (i18n/label :t/pairing-maximum-number-reached-content)}}))
:content (i18n/label :t/pairing-maximum-number-reached-content)}}))
(rf/defn disable-fx
{:events [:pairing.ui/disable-installation-pressed]}
+8 -8
View File
@@ -49,8 +49,8 @@
[{:keys [db] :as cofx} {:keys [chat-id]}]
(if-not (own-public-key? db chat-id)
{:dispatch [:chat.ui/start-chat chat-id]}
{:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:content (i18n/label :t/can-not-add-yourself)}}))
{:effects.utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:content (i18n/label :t/can-not-add-yourself)}}))
(rf/defn handle-group-chat
[cofx params]
@@ -71,9 +71,9 @@
(navigation/navigate-back))
:else
{:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:content (i18n/label :t/ens-name-not-found)
:on-dismiss #(re-frame/dispatch [:pop-to-root :shell-stack])}})))
{:effects.utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:content (i18n/label :t/ens-name-not-found)
:on-dismiss #(re-frame/dispatch [:pop-to-root :shell-stack])}})))
(rf/defn handle-eip681
[cofx data]
@@ -103,9 +103,9 @@
(log/info "Unable to find matcher for scanned value"
{:type type
:event ::match-scanned-value})
{:dispatch [:navigate-back]
:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:on-dismiss #(re-frame/dispatch [:pop-to-root :shell-stack])}})))
{:dispatch [:navigate-back]
:effects.utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:on-dismiss #(re-frame/dispatch [:pop-to-root :shell-stack])}})))
(rf/defn on-scan
{:events [::on-scan-success]}
+3 -3
View File
@@ -78,9 +78,9 @@
[{:keys [db]} data typed? result]
(let [{:keys [result error]} (types/json->clj result)]
(if error
{:dispatch [:signing.ui/cancel-is-pressed]
:utils/show-popup {:title (i18n/label :t/sign-request-failed)
:content (:message error)}}
{:dispatch [:signing.ui/cancel-is-pressed]
:effects.utils/show-popup {:title (i18n/label :t/sign-request-failed)
:content (:message error)}}
{:db (update db
:keycard assoc
:hash result
+9 -2
View File
@@ -60,10 +60,17 @@
{:state state
:username username}))
(re-frame/reg-sub
:ens/current-names
:<- [:ens/names]
:<- [:chain-id]
(fn [[all-names chain-id]]
(get all-names chain-id)))
(re-frame/reg-sub
:ens.name/screen
:<- [:get-screen-params :ens-name-details]
:<- [:ens/names]
:<- [:ens/current-names]
(fn [[name ens]]
(let [{:keys [address public-key expiration-date releasable?]} (get ens name)
pending? (nil? address)]
@@ -79,7 +86,7 @@
(re-frame/reg-sub
:ens.main/screen
:<- [:ens/names]
:<- [:ens/current-names]
:<- [:profile/profile]
:<- [:ens/preferred-name]
:<- [:ens/registrations]
-58
View File
@@ -1,58 +0,0 @@
(ns ^{:doc "API to init and stop whisper messaging"} status-im.transport.core
(:require
[re-frame.core :as re-frame]
[status-im.pairing.core :as pairing]
[status-im.stickers.core :as stickers]
status-im.transport.shh
[status-im2.common.universal-links :as universal-links]
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
(rf/defn set-node-info
{:events [:transport.callback/node-info-fetched]}
[{:keys [db]} node-info]
{:db (assoc db :node-info node-info)})
(rf/defn fetch-node-info-fx
[_]
{:json-rpc/call [{:method "admin_nodeInfo"
:on-success #(re-frame/dispatch [:transport.callback/node-info-fetched %])
:on-error #(log/error "node-info: failed error" %)}]})
(defn add-mailservers
[db mailservers]
(reduce (fn [db {:keys [fleet id name] :as mailserver}]
(let [updated-mailserver
(-> mailserver
(update :id keyword)
(assoc :name (if (seq name) name id))
(dissoc :fleet))]
(assoc-in db
[:mailserver/mailservers (keyword fleet) (keyword id)]
updated-mailserver)))
db
mailservers))
(rf/defn start-messenger
"We should only start receiving messages/processing topics once all the
initializiation is completed, otherwise we might receive messages/topics
when the state has not been properly initialized."
[_]
{:json-rpc/call [{:method "wakuext_startMessenger"
:on-success #(re-frame/dispatch [::messenger-started %])
:on-error #(log/error "failed to start messenger")}]})
(rf/defn messenger-started
{:events [::messenger-started]}
[{:keys [db] :as cofx} {:keys [mailservers] :as response}]
(log/info "Messenger started")
(let [new-account? (get db :onboarding-2/new-account?)]
(rf/merge cofx
{:db (-> db
(assoc :messenger/started? true)
(add-mailservers mailservers))}
(fetch-node-info-fx)
(pairing/init)
(stickers/load-packs)
(when-not new-account?
(universal-links/process-stored-event)))))
@@ -1,59 +0,0 @@
(ns ^{:doc "Protocol API and protocol utils"} status-im.transport.message.protocol
(:require
[clojure.set :as set]
[re-frame.core :as re-frame]
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
(defn- link-preview->rpc
[preview]
(update preview
:thumbnail
(fn [thumbnail]
(set/rename-keys thumbnail {:data-uri :dataUri}))))
(defn build-message
[msg]
(-> msg
(update :link-previews #(map link-preview->rpc %))
(set/rename-keys
{:album-id :albumId
:audio-duration-ms :audioDurationMs
:audio-path :audioPath
:chat-id :chatId
:community-id :communityId
:content-type :contentType
:ens-name :ensName
:image-height :imageHeight
:image-path :imagePath
:image-width :imageWidth
:link-previews :linkPreviews
:response-to :responseTo
:sticker :sticker
:text :text})))
(rf/defn send-chat-messages
[_ messages]
{:json-rpc/call [{:method "wakuext_sendChatMessages"
:params [(mapv build-message messages)]
:js-response true
:on-success #(re-frame/dispatch [:transport/message-sent %])
:on-error #(do
(log/warn "failed to send a message" %)
(js/alert (str "failed to send a message: " %)))}]})
(rf/defn send-reaction
[_ {:keys [message-id chat-id emoji-id]}]
{:json-rpc/call [{:method "wakuext_sendEmojiReaction"
:params [chat-id message-id emoji-id]
:js-response true
:on-success #(re-frame/dispatch [:sanitize-messages-and-process-response %])
:on-error #(log/error "failed to send a reaction" %)}]})
(rf/defn send-retract-reaction
[_ {:keys [emoji-reaction-id]}]
{:json-rpc/call [{:method "wakuext_sendEmojiReactionRetraction"
:params [emoji-reaction-id]
:js-response true
:on-success #(re-frame/dispatch [:sanitize-messages-and-process-response %])
:on-error #(log/error "failed to send a reaction retraction" %)}]})
-35
View File
@@ -1,35 +0,0 @@
(ns ^{:doc "Whisper API and events for managing keys and posting messages"} status-im.transport.shh
(:require
[re-frame.core :as re-frame]
[status-im2.common.json-rpc.events :as json-rpc]
[taoensso.timbre :as log]))
(defn generate-sym-key-from-password
[{:keys [password on-success on-error]}]
(json-rpc/call {:method "waku_generateSymKeyFromPassword"
:params [password]
:on-success on-success
:on-error on-error}))
(defn get-sym-key
[{:keys [sym-key-id on-success on-error]}]
(json-rpc/call {:method "waku_getSymKey"
:params [sym-key-id]
:on-success on-success
:on-error on-error}))
(defn log-error
[error]
(log/error :shh/get-new-sym-key-error error))
(re-frame/reg-fx
:shh/generate-sym-key-from-password
(fn [{:keys [password on-success]}]
(generate-sym-key-from-password
{:password password
:on-success (fn [sym-key-id]
(get-sym-key {:sym-key-id sym-key-id
:on-success (fn [sym-key]
(on-success sym-key sym-key-id))
:on-error log-error}))
:on-error log-error})))
-18
View File
@@ -1,18 +0,0 @@
(ns ^{:doc "Utils for transport layer"} status-im.transport.utils
(:require
[clojure.string :as string]))
(defn extract-enode-id
[enode]
(-> enode
(string/split #"/")
(get 2 "")
(string/split #":")
(get 0 "")
(string/split "@")
(get 0)))
(defn extract-url-components
[address]
(when address
(rest (re-matches #"enode://(.*?)@(.*):(.*)" address))))
@@ -7,12 +7,16 @@
[utils.i18n :as i18n])
(:require-macros [status-im.utils.views :as views]))
(defn hide-sheet-and-dispatch
[event]
(re-frame/dispatch [:bottom-sheet/hide-old])
(re-frame/dispatch event))
(defn- normal-mode-settings-data
[{:keys [network-name
current-log-level
waku-bloom-filter-mode
light-client-enabled?
transactions-management-enabled?
wakuv2-flag
current-fleet
webview-debug]}]
(keep
@@ -49,19 +53,12 @@
:accessory :text
:accessory-text current-fleet
:chevron true}
(if wakuv2-flag
{:size :small
:title (i18n/label :t/wakuv2-settings)
:accessibility-label :wakuv2-settings-button
:on-press
#(re-frame/dispatch [:wakuv2.ui/enter-settings-pressed])
:chevron true}
{:size :small
:title (i18n/label :t/bootnodes)
:accessibility-label :bootnodes-settings-button
:on-press
#(re-frame/dispatch [:navigate-to :bootnodes-settings])
:chevron true})
{:size :small
:title (i18n/label :t/wakuv2-settings)
:accessibility-label :wakuv2-settings-button
:on-press
#(re-frame/dispatch [:wakuv2.ui/enter-settings-pressed])
:chevron true}
{:size :small
:title (i18n/label :t/rpc-usage-info)
:accessibility-label :rpc-usage-info
@@ -76,6 +73,15 @@
:on-press
#(re-frame/dispatch [:navigate-to :peers-stats])
:chevron true}
{:size :small
:title (i18n/label :t/light-client-enabled)
:accessibility-label :light-client-enabled
:container-margin-bottom 8
:on-press
#(re-frame/dispatch
[:wakuv2.ui/toggle-light-client (not light-client-enabled?)])
:accessory :switch
:active light-client-enabled?}
{:size :small
:title (i18n/label :t/transactions-management-enabled)
:accessibility-label :transactions-management-enabled
@@ -94,16 +100,7 @@
#(re-frame/dispatch
[:profile.settings/change-webview-debug (not webview-debug)])
:accessory :switch
:active webview-debug}
{:size :small
:title (i18n/label :t/waku-bloom-filter-mode)
:accessibility-label :waku-bloom-filter-mode-settings-switch
:container-margin-bottom 8
:on-press
#(re-frame/dispatch
[:multiaccounts.ui/waku-bloom-filter-mode-switched (not waku-bloom-filter-mode)])
:accessory :switch
:active waku-bloom-filter-mode}]))
:active webview-debug}]))
(defn- flat-list-data
[options]
@@ -117,10 +114,9 @@
(views/defview advanced-settings
[]
(views/letsubs [{:keys [webview-debug]} [:profile/profile]
(views/letsubs [webview-debug [:profile/webview-debug]
light-client-enabled? [:profile/light-client-enabled?]
network-name [:network-name]
waku-bloom-filter-mode [:waku/bloom-filter-mode]
wakuv2-flag [:waku/v2-flag]
transactions-management-enabled? [:wallet-legacy/transactions-management-enabled?]
current-log-level [:log-level/current-log-level]
current-fleet [:fleets/current-fleet]]
@@ -129,10 +125,9 @@
{:network-name network-name
:current-log-level current-log-level
:transactions-management-enabled? transactions-management-enabled?
:light-client-enabled? light-client-enabled?
:current-fleet current-fleet
:dev-mode? false
:wakuv2-flag wakuv2-flag
:waku-bloom-filter-mode waku-bloom-filter-mode
:webview-debug webview-debug})
:key-fn (fn [_ i] (str i))
:render-fn render-item}]))
@@ -1,7 +1,6 @@
(ns status-im.ui.screens.fleet-settings.views
(:require
[re-frame.core :as re-frame]
[status-im.node.core :as node]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.components.list.views :as list]
[status-im.ui.components.react :as react]
@@ -56,7 +56,7 @@
{:events [::on-delete-profile-success]}
[cofx]
(log/info "[delete-profile] on-success")
{:utils/show-popup
{:effects.utils/show-popup
{:title (i18n/label :t/profile-deleted-title)
:content (i18n/label :t/profile-deleted-content)
:on-dismiss #(re-frame/dispatch [:logout])}})
@@ -46,7 +46,8 @@
:key :your-data-belongs-to-you-description}]
[react/view {:style styles/intro-button}
[quo/button
{:on-press #(re-frame/dispatch [:set-in [:my-profile/seed :step] :12-words])}
{:on-press #(do (re-frame/dispatch [:set-in [:my-profile/seed :step] :12-words])
(re-frame/dispatch [:profile.settings/mnemonic-was-shown]))}
(i18n/label :t/ok-continue)]]])
(defn six-words
@@ -207,7 +207,7 @@
key-uid]
:as profile}
@(re-frame/subscribe [:profile/profile-with-image])
customization-color (or (:color @(re-frame/subscribe [:onboarding-2/profile]))
customization-color (or (:color @(re-frame/subscribe [:onboarding/profile]))
@(re-frame/subscribe [:profile/customization-color key-uid]))
on-share #(re-frame/dispatch [:show-popover
{:view :share-chat-key
@@ -1,10 +1,8 @@
(ns status-im.ui.screens.wallet.send.views
(:require-macros [status-im.utils.views :refer [defview letsubs] :as views])
(:require-macros [status-im.utils.views :as views])
(:require
[quo.core :as quo]
[re-frame.core :as re-frame]
[status-im.commands.core :as commands]
[status-im.ui.components.bottom-panel.views :as bottom-panel]
[status-im.ui.components.chat-icon.screen :as chat-icon]
[status-im.ui.components.colors :as colors]
[status-im.ui.components.core :as components.core]
@@ -129,47 +127,6 @@
" "
(:code wallet-currency))])))
(defn select-account-sheet
[{:keys [from message]}]
[react/view {:style (styles/acc-sheet)}
[header
{:small-screen? false
:label :t/select-account}]
[react/view
{:flex-direction :row
:padding-horizontal 24
:align-items :center
:margin-vertical 16}]
[components.core/list-header
(i18n/label :t/from-capitalized)]
[react/view {:flex-direction :row :flex 1 :align-items :center}
[react/view {:flex 1}
[render-account from nil ::commands/set-selected-account]]]
[toolbar/toolbar
{:left
[react/view {:padding-horizontal 8}
[components.core/button
{:type :secondary
:on-press #(re-frame/dispatch [:set :commands/select-account nil])}
(i18n/label :t/cancel)]]
:right
[components.core/button
{:accessibility-label :select-account-bottom-sheet
:disabled (nil? from)
:on-press #(re-frame/dispatch
[::commands/accept-request-address-for-transaction
(:message-id message)
(:address from)])}
(i18n/label :t/share)]}]])
(defview select-account
[]
(letsubs [data [:commands/select-account]]
[bottom-panel/animated-bottom-panel
data
select-account-sheet
#(re-frame/dispatch [:hide-select-acc-sheet])]))
(views/defview request-transaction
[_]
(views/letsubs [{:keys [amount-error amount-text from token sign-enabled?] :as tx}
-4
View File
@@ -6,10 +6,6 @@
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
(def auth-method-biometric "biometric")
(def auth-method-biometric-prepare "biometric-prepare")
(def auth-method-none "none")
(defn- whisper-key-name
[address]
(str address "-whisper"))
+10 -6
View File
@@ -7,7 +7,6 @@
[react-native.mail :as react-native-mail]
[react-native.platform :as platform]
[status-im.bottom-sheet.events :as bottom-sheet]
[status-im.transport.utils :as transport.utils]
[status-im.ui.components.react :as react]
[status-im.utils.build :as build]
[status-im.utils.deprecated-types :as types]
@@ -38,6 +37,11 @@
{:json-rpc/call [{:method "web3_clientVersion"
:on-success #(re-frame/dispatch [:logging/store-web3-client-version %])}]})
(defn extract-url-components
[address]
(when address
(rest (re-matches #"enode://(.*?)@(.*):(.*)" address))))
(defn email-body
"logs attached"
[{:keys [:web3-node-version :mailserver/current-id
@@ -46,7 +50,7 @@
build-version (str build/version " (" build-number ")")
separator (string/join (take 40 (repeat "-")))
[enode-id ip-address port]
(transport.utils/extract-url-components (:enode node-info))]
(extract-url-components (:enode node-info))]
(string/join
"\n"
(concat [(i18n/label :t/report-bug-email-template
@@ -68,7 +72,7 @@
(mapcat
(fn [{:keys [enode]}]
(let [[enode-id ip-address port]
(transport.utils/extract-url-components enode)]
(extract-url-components enode)]
[(str "id: " enode-id)
(str "ip: " ip-address)
(str "port: " port)
@@ -151,15 +155,15 @@
(rf/defn show-client-error
{:events [:show-client-error]}
[_]
{:utils/show-popup {:title (i18n/label :t/cant-report-bug)
:content (i18n/label :t/mail-should-be-configured)}})
{:effects.utils/show-popup {:title (i18n/label :t/cant-report-bug)
:content (i18n/label :t/mail-should-be-configured)}})
(rf/defn show-logs-dialog
{:events [:shake-event]}
[{:keys [db]}]
(when-not (:logging/dialog-shown? db)
{:db (assoc db :logging/dialog-shown? true)
:utils/show-confirmation
:effects.utils/show-confirmation
(cond-> {:title (i18n/label :t/send-logs)
:content (i18n/label :t/send-logs-to
{:email report-email})
-11
View File
@@ -1,11 +0,0 @@
(ns ^{:doc "Pairing utils"} status-im.utils.pairing)
(defn has-paired-installations?
[cofx]
(let [our-installation-id (get-in cofx [:db :profile/profile :installation-id])]
(->>
(get-in cofx [:db :pairing/installations])
vals
(some (fn [{:keys [enabled? installation-id]}]
(and (not= installation-id our-installation-id)
enabled?))))))
-120
View File
@@ -1,120 +0,0 @@
(ns status-im.utils.snoopy
(:require
["react-native/Libraries/vendor/emitter/EventEmitter" :refer [EventEmitter]]
["rn-snoopy" :default snoopy]
["rn-snoopy/stream/bars" :default bars]
["rn-snoopy/stream/buffer" :default buffer]
["rn-snoopy/stream/filter" :default sn-filter]
[clojure.string :as string]
[status-im2.config :as config]))
(defn create-filter
[f]
(fn [^js message]
(let [method (.-method message)
module (.-module message)
^js args (.-args message)
first-arg (when (pos? (.-length args))
(aget args 0))]
(f {:method method
:module module
:first-arg first-arg}))))
(defn status-module-filter
[{:keys [method module first-arg]}]
(or (= module "Status")
(and (= module "RCTNativeAppEventEmitter")
(= method "emit")
(= first-arg "gethEvent"))
(and
(string? method)
(string/starts-with? method "<callback for Status."))))
(defn timer-filter
[{:keys [method]}]
(contains? #{"callTimers" "createTimer"} method))
(defn websocket-filter
[{:keys [module first-arg]}]
(or (= module "WebSocketModule")
(and (= module "RCTDeviceEventEmitter")
(contains? #{"websocketFailed" "websocketMessage"} first-arg))))
(defn ui-manager-filter
[{:keys [module]}]
(= module "UIManager"))
(defn touches-filter
[{:keys [method module]}]
(and (= module "RCTEventEmitter")
(= method "receiveTouches")))
(defn native-animation-filter
[{:keys [method module]}]
(or (= module "NativeAnimatedModule")
(and
(string? method)
(string/starts-with? method "<callback for NativeAnimatedModule."))))
(defn keyboard-observer-filter
[{:keys [module]}]
;; mostly all calls to KeyboardObserver are done by FlatList
(= module "KeyboardObserver"))
(defn threshold-warnings
[{:keys [filter-fn label tick? print-events? threshold events threshold-message]}]
(.subscribe ^js
((bars
(fn [^js a] (.-length a))
threshold
tick?
true
label
threshold-message)
((buffer)
((sn-filter (create-filter filter-fn)
print-events?)
events)))))
;; In order to enable snoopy set SNOOPY=1 in .env file.
;; By default events are not printed and you will see warnings only when
;; the number of events is exceeding the threshold.
;; For debugging UI perf, in particular the number of bridge calls caused
;; by view components set `:print-events?=true` for `ui-manager-filter`,
;; and then collect printed data in logs.
(defn subscribe!
[]
(when config/snoopy-enabled?
(let [emitter-class EventEmitter
emitter (emitter-class.)
events (.stream snoopy emitter)]
(threshold-warnings
{:filter-fn (constantly true)
:label "all messages"
:threshold-message "too many calls to bridge, something suspicious is happening"
:tick? false
:print-events? false
:threshold 400
:events events})
(threshold-warnings
{:filter-fn timer-filter
:label "timer"
:threshold-message "too many setTimeout/setInterval calls"
:tick? false
:print-events? false
:threshold 70
:events events})
(threshold-warnings
{:filter-fn ui-manager-filter
:label "timer"
:threshold-message (str
"too many calls to UIManager, most likely during navigation. "
"Please consider preloading of screens or lazy loading of some components")
:tick? false
:print-events? true
;; todo(rasom): revisit this number when/if
;; https://github.com/status-im/status-mobile/pull/2849 will be merged
:threshold 200
:events events}))))
-31
View File
@@ -1,31 +0,0 @@
(ns status-im.utils.wallet-connect
(:require
["@react-native-async-storage/async-storage" :default AsyncStorage]
["@walletconnect/client" :refer [CLIENT_EVENTS] :default WalletConnectClient]
[clojure.string :as string]
[status-im2.config :as config]))
(defn init
[on-success on-error]
(-> ^js WalletConnectClient
(.init (clj->js {:controller true
:projectId config/wallet-connect-project-id
:logger "debug"
:metadata config/default-wallet-connect-metadata
:storageOptions {:asyncStorage ^js AsyncStorage}}))
(.then on-success)
(.catch on-error)))
(defn session-request-event [] (.-request (.-session CLIENT_EVENTS)))
(defn session-created-event [] (.-created (.-session CLIENT_EVENTS)))
(defn session-deleted-event [] (.-deleted (.-session CLIENT_EVENTS)))
(defn session-proposal-event [] (.-proposal (.-session CLIENT_EVENTS)))
(defn session-updated-event [] (.-updated (.-session CLIENT_EVENTS)))
(defn url?
[url]
(string/starts-with? url "wc:"))
+25 -19
View File
@@ -2,22 +2,11 @@
(:require
[clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.node.core :as node]
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(rf/defn switch-waku-bloom-filter-mode
{:events [:multiaccounts.ui/waku-bloom-filter-mode-switched]}
[cofx enabled?]
(rf/merge cofx
(multiaccounts.update/multiaccount-update
:waku-bloom-filter-mode
enabled?
{})
(node/prepare-new-config
{:on-success #(re-frame/dispatch [:logout])})))
(def address-regex #"/ip4/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/tcp/\d{1,5}/p2p/[a-zA-Z0-9]+")
@@ -108,13 +97,16 @@
vals
(map #(vector (:name %1) (:address %1)))
(into {}))]
(rf/merge cofx
{:db (-> db
(assoc-in [:profile/profile :wakuv2-config :CustomNodes] new-nodes)
(dissoc :wakuv2-nodes/manage :wakuv2-nodes/list))
:dispatch [:navigate-back]}
(node/prepare-new-config
{:on-success #(re-frame/dispatch [:logout])}))))
{:db (-> db
(assoc-in [:profile/profile :wakuv2-config :CustomNodes] new-nodes)
(dissoc :wakuv2-nodes/manage :wakuv2-nodes/list))
:json-rpc/call [{:method "wakuext_setCustomNodes"
:params [{:customNodes new-nodes}]
:on-success #(log/info "updated custom nodes")
:on-error #(log/error "failed to set custom nodes"
{:error %
:custom-nodes new-nodes})}]
:dispatch [:navigate-back]}))
(rf/defn show-delete-node-confirmation
{:events [:wakuv2.ui/delete-pressed]}
@@ -131,3 +123,17 @@
(rf/merge cofx
(delete id)
(navigation/navigate-back)))
(rf/defn toggle-light-client
{:events [:wakuv2.ui/toggle-light-client]}
[{:keys [db]} enabled?]
{:db (assoc-in db [:profile/profile :wakuv2-config :LightClient] enabled?)
:json-rpc/call [{:method "wakuext_setLightClient"
:params [{:enabled enabled?}]
:on-success (fn []
(log/info "light client set successfully" enabled?)
(re-frame/dispatch [:logout]))
:on-error #(log/error "failed to set light client"
{:error %
:enabled? enabled?})}]})
+4 -5
View File
@@ -359,8 +359,8 @@
(let [deleted-address (:address account)
dapps-address (get-in cofx [:db :profile/profile :dapps-address])]
(if (= (string/lower-case dapps-address) (string/lower-case deleted-address))
{:utils/show-popup {:title (i18n/label :t/warning)
:content (i18n/label :t/account-is-used)}}
{:effects.utils/show-popup {:title (i18n/label :t/warning)
:content (i18n/label :t/account-is-used)}}
{:key-storage/delete-imported-key
{:key-uid (get-in db [:profile/profile :key-uid])
:address (:address account)
@@ -379,8 +379,8 @@
(assoc-in [:add-account :scanned-address] address)
(assoc-in [:add-account :address] address))}
(when-not address
{:utils/show-popup {:title (i18n/label :t/error)
:content (i18n/label :t/invalid-address-qr-code)}}))
{:effects.utils/show-popup {:title (i18n/label :t/error)
:content (i18n/label :t/invalid-address-qr-code)}}))
(navigation/navigate-back))))
(re-frame/reg-fx
@@ -392,4 +392,3 @@
{:events [:wallet-legacy.accounts/share]}
[_ address]
{:list.selection/open-share {:message (eip55/address->checksum address)}})
@@ -7,7 +7,6 @@
[status-im.ethereum.ens :as ens]
[status-im.ethereum.tokens :as tokens]
[status-im.qr-scanner.core :as qr-scaner]
[status-im.utils.wallet-connect :as wallet-connect]
[status-im.wallet.utils :as wallet.utils]
[status-im2.common.router :as router]
[status-im2.navigation.events :as navigation]
@@ -173,11 +172,7 @@
(if (links/universal-link? uri)
{:dispatch [:universal-links/handle-url uri]}
{:browser/show-browser-selection uri})
(if (wallet-connect/url? uri)
{:ui/show-error "Wallet Connect not implemented"}
;; Re-enable with https://github.com/status-im/status-mobile/issues/13429
;; {:dispatch [::qr-scaner/handle-wallet-connect-uri {:data uri}]}
{:ui/show-error (i18n/label :t/wallet-invalid-address {:data uri})}))))
{:ui/show-error (i18n/label :t/wallet-invalid-address {:data uri})})))
(rf/defn qr-scanner-result
{:events [:wallet-legacy.send/qr-scanner-result]}
+11 -30
View File
@@ -246,8 +246,8 @@
assets (get visible-tokens chain)
tokens (->> (vals all-tokens)
(remove #(or (:hidden? %)
;;if not scan-all-tokens? remove not
;;visible tokens
;;if not scan-all-tokens? remove
;;not visible tokens
(and (not scan-all-tokens?)
(not (get assets (:symbol %))))))
(reduce (fn [acc {:keys [address symbol]}]
@@ -822,8 +822,8 @@
(rf/defn get-buy-crypto-preference
{:events [::get-buy-crypto]}
[_]
{:async-storage-get {:keys [:buy-crypto-hidden]
:cb #(re-frame/dispatch [::store-buy-crypto-preference %])}})
{:effects.async-storage/get {:keys [:buy-crypto-hidden]
:cb #(re-frame/dispatch [::store-buy-crypto-preference %])}})
(rf/defn wallet-will-focus
{:events [::wallet-stack]}
@@ -844,8 +844,8 @@
(rf/defn hide-buy-crypto
{:events [::hide-buy-crypto]}
[{:keys [db]}]
{:db (assoc db :wallet-legacy/buy-crypto-hidden true)
:async-storage-set {:buy-crypto-hidden true}})
{:db (assoc db :wallet-legacy/buy-crypto-hidden true)
:effects.async-storage/set {:buy-crypto-hidden true}})
(rf/defn store-buy-crypto
{:events [::store-buy-crypto-preference]}
@@ -1023,8 +1023,8 @@
(rf/defn switch-transactions-management-enabled
{:events [:multiaccounts.ui/switch-transactions-management-enabled]}
[{:keys [db]} enabled?]
{:async-storage-set {:transactions-management-enabled? enabled?}
:db (assoc db :wallet-legacy/transactions-management-enabled? enabled?)})
{:effects.async-storage/set {:transactions-management-enabled? enabled?}
:db (assoc db :wallet-legacy/transactions-management-enabled? enabled?)})
(re-frame/reg-fx
:wallet-legacy/initialize-transactions-management-enabled
@@ -1072,10 +1072,9 @@
true])}))
2000)))
(re-frame/reg-fx
;;TODO: this could be replaced by a single API call on status-go side
:wallet-legacy/initialize-wallet
(fn [[network-id network callback]]
;;TODO: this could be replaced by a single API call on status-go side
(re-frame/reg-fx :wallet-legacy/initialize-wallet
(fn [[network-id _network callback]]
(-> (js/Promise.all
(clj->js
[(js/Promise.
@@ -1083,24 +1082,6 @@
(json-rpc/call {:method "accounts_getAccounts"
:on-success resolve-fn
:on-error reject})))
(js/Promise.
(fn [resolve-fn _]
(json-rpc/call
{:method "wallet_addEthereumChain"
:params
[{:isTest false
:tokenOverrides []
:rpcUrl (get-in network [:config :UpstreamConfig :URL])
:chainColor "green"
:chainName (:name network)
:nativeCurrencyDecimals 10
:shortName "erc20"
:layer 1
:chainId (int network-id)
:enabled false
:fallbackURL (get-in network [:config :UpstreamConfig :URL])}]
:on-success resolve-fn
:on-error (fn [_] (resolve-fn nil))})))
(js/Promise.
(fn [resolve-fn _]
(json-rpc/call {:method "wallet_getTokens"
+2 -2
View File
@@ -65,8 +65,8 @@
(rf/defn not-supported
{:events [:wallet-legacy.custom-token/not-supported]}
[{:keys [db]}]
{:db (assoc-in db [:wallet-legacy/custom-token-screen :in-progress?] nil)
:utils/show-popup {:content (i18n/label :t/contract-isnt-supported)}})
{:db (assoc-in db [:wallet-legacy/custom-token-screen :in-progress?] nil)
:effects.utils/show-popup {:content (i18n/label :t/contract-isnt-supported)}})
(rf/defn add-custom-token
{:events [:wallet-legacy.custom-token.ui/add-pressed]}
-288
View File
@@ -1,288 +0,0 @@
(ns status-im.wallet-connect.core
(:require
[clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.browser.core :as browser]
[status-im.signing.core :as signing]
[status-im.utils.deprecated-types :as types]
[status-im.utils.wallet-connect :as wallet-connect]
[status-im2.config :as config]
[status-im2.constants :as constants]
[taoensso.timbre :as log]
[utils.address :as address]
[utils.re-frame :as rf]))
(rf/defn proposal-handler
{:events [:wallet-connect/proposal]}
[{:keys [db] :as cofx} request-event]
(let [proposal (types/js->clj request-event)
proposer (:proposer proposal)
metadata (:metadata proposer)]
{:db (assoc db
:wallet-connect/proposal proposal
:wallet-connect/proposal-metadata metadata)
:show-wallet-connect-sheet nil}))
(rf/defn session-connected
{:events [:wallet-connect/created]}
[{:keys [db]} session]
(let [session (merge (types/js->clj session) {:wc-version 2})
client (get db :wallet-connect/client)]
(log/debug "[wallet connect] session created - " session)
{:show-wallet-connect-success-sheet nil
:db (assoc db
:wallet-connect/session-connected session
:wallet-connect/sessions (types/js->clj
(.-values
(.-session
client))))}))
(rf/defn manage-app
{:events [:wallet-connect/manage-app]}
[{:keys [db]} session]
(let [session (types/js->clj session)]
{:db (assoc db
:wallet-connect/session-managed session
:wallet-connect/showing-app-management-sheet? true)
:show-wallet-connect-app-management-sheet nil}))
(rf/defn request-handler
{:events [:wallet-connect/request]}
[{:keys [db] :as cofx} request-event]
(let [request (types/js->clj request-event)
params (:request request)
pending-requests (or (:wallet-connect/pending-requests db) [])
new-pending-requests (conj pending-requests request)
client (get db :wallet-connect/client)
topic (:topic request)]
{:db (assoc db :wallet-connect/pending-requests new-pending-requests)
:dispatch [:wallet-connect/request-received request]}))
(rf/defn request-handler-test
{:events [:wallet-connect/request-test]}
[{:keys [db] :as cofx}]
{:show-wallet-connect-sheet nil})
(defn subscribe-to-events
[^js wallet-connect-client]
(.on wallet-connect-client
(wallet-connect/session-request-event)
#(re-frame/dispatch [:wallet-connect/request %]))
(.on wallet-connect-client
(wallet-connect/session-created-event)
#(re-frame/dispatch [:wallet-connect/created %]))
(.on wallet-connect-client
(wallet-connect/session-deleted-event)
#(re-frame/dispatch [:wallet-connect/update-sessions]))
(.on wallet-connect-client
(wallet-connect/session-updated-event)
#(re-frame/dispatch [:wallet-connect/update-sessions]))
(.on wallet-connect-client
(wallet-connect/session-proposal-event)
#(re-frame/dispatch [:wallet-connect/proposal %])))
(re-frame/reg-fx
:wc-2-init
(fn []
(wallet-connect/init
#(re-frame/dispatch [:wallet-connect/client-init %])
#(log/error "[wallet-connect]" %))))
(re-frame/reg-fx
:wc-2-subscribe-to-events
(fn [client]
(subscribe-to-events client)))
(re-frame/reg-fx
:wc-2-client-approve-proposal
(fn [[client proposal response]]
(-> ^js client
(.approve (clj->js {:proposal proposal :response response}))
(.then #(log/debug "[wallet-connect] session proposal approved"))
(.catch #(log/error "[wallet-connect] session proposal approval error:" %)))))
(re-frame/reg-fx
:wc-2-client-reject-proposal
(fn [[client proposal]]
(-> ^js client
(.reject (clj->js {:proposal proposal}))
(.then #(log/debug "[wallet-connect] session proposal rejected"))
(.catch #(log/error "[wallet-connect] " %)))))
(re-frame/reg-fx
:wc-2-client-disconnect
(fn [[client topic]]
(-> ^js client
(.disconnect (clj->js {:topic topic}))
(.then #(log/debug "[wallet-connect] session disconnected - topic " topic))
(.catch #(log/error "[wallet-connect] " %)))))
(re-frame/reg-fx
:wc-2-change-session
(fn [[client topic accounts]]
(-> ^js client
(.update (clj->js {:topic topic
:state {:accounts accounts}}))
(.then #(log/debug "[wallet-connect] session topic " topic
" changed to account " (first accounts)))
(.catch #(log/error "[wallet-connect] " %)))))
(re-frame/reg-fx
:wc-2-pair
(fn [[client uri]]
(.pair client (clj->js {:uri uri}))))
(re-frame/reg-fx
:wc-2-respond
(fn [[client response]]
(.respond client (clj->js response))))
(rf/defn approve-proposal
{:events [:wallet-connect/approve-proposal]}
[{:keys [db]} account]
(let [client (get db :wallet-connect/client)
proposal (get db :wallet-connect/proposal)
topic (:topic proposal)
permissions (:permissions proposal)
blockchain (:blockchain permissions)
proposal-chain-ids (map #(last (string/split % #":")) (:chains blockchain))
available-chain-ids (map #(get-in % [:config :NetworkId]) (vals (get db :networks/networks)))
supported-chain-ids (filter (fn [chain-id] #(boolean (some #{chain-id} available-chain-ids)))
proposal-chain-ids)
address (:address account)
accounts (map #(str "eip155:" % ":" (address/normalized-hex address))
supported-chain-ids)
;; TODO: Check for unsupported
metadata (get db :wallet-connect/proposal-metadata)
response {:state {:accounts accounts}
:metadata config/default-wallet-connect-metadata}]
{:hide-wallet-connect-sheet nil
:wc-2-client-approve-proposal [client proposal response]}))
(rf/defn reject-proposal
{:events [:wallet-connect/reject-proposal]}
[{:keys [db]} account]
(let [client (get db :wallet-connect/client)
proposal (get db :wallet-connect/proposal)]
{:hide-wallet-connect-sheet nil
:wc-2-client-reject-proposal client}))
(rf/defn change-session-account
{:events [:wallet-connect/change-session-account]}
[{:keys [db]} topic account]
(let [client (get db :wallet-connect/client)
sessions (get db :wallet-connect/sessions)
session (first (filter #(= (:topic %) topic) sessions))
permissions (:permissions session)
blockchain (:blockchain permissions)
proposal-chain-ids (map #(last (string/split % #":")) (:chains blockchain))
address (:address account)
available-chain-ids (map #(get-in % [:config :NetworkId]) (vals (get db :networks/networks)))
supported-chain-ids (filter (fn [chain-id] #(boolean (some #{chain-id} available-chain-ids)))
proposal-chain-ids)
accounts (map #(str "eip155:" % ":" (address/normalized-hex address))
supported-chain-ids)]
{:db (assoc db
:wallet-connect/showing-app-management-sheet?
false)
:hide-wallet-connect-app-management-sheet nil
:wc-2-change-session [client topic accounts]}))
(rf/defn disconnect-session
{:events [:wallet-connect/disconnect]}
[{:keys [db]} topic]
(let [client (get db :wallet-connect/client)]
{:hide-wallet-connect-app-management-sheet nil
:hide-wallet-connect-success-sheet nil
:wc-2-client-disconnect [client topic]
:db (-> db
(assoc :wallet-connect/sessions
(types/js->clj (.-values (.-session client))))
(dissoc :wallet-connect/session-managed))}))
(rf/defn pair-session
{:events [:wallet-connect/pair]}
[{:keys [db]} {:keys [data]}]
(let [client (get db :wallet-connect/client)]
{:db (assoc db :wallet-connect/scanned-uri data)
:dispatch [:navigate-back]
:wc-2-pair [client data]}))
(rf/defn wallet-connect-client-initate
{:events [:wallet-connect/client-init]}
[{:keys [db] :as cofx} ^js client]
{:db (assoc db
:wallet-connect/client client
:wallet-connect/sessions (types/js->clj (.-values (.-session
client))))
:wc-2-subscribe-to-events client})
(rf/defn update-sessions
{:events [:wallet-connect/update-sessions]}
[{:keys [db] :as cofx}]
(let [client (get db :wallet-connect/client)]
{:db (-> db
(assoc :wallet-connect/sessions (types/js->clj (.-values (.-session client))))
(dissoc :wallet-connect/session-managed))}))
(rf/defn wallet-connect-complete-transaction
{:events [:wallet-connect.dapp/transaction-on-result]}
[{:keys [db]} message-id topic result]
(let [client (get db :wallet-connect/client)
response {:topic topic
:response {:jsonrpc "2.0"
:id message-id
:result result}}]
{:db (assoc db :wallet-connect/response response)
:wc-2-respond [client response]}))
(rf/defn wallet-connect-send-async
[cofx {:keys [method params id] :as payload} message-id topic]
(let [message? (browser/web3-sign-message? method)
dapps-address (get-in cofx [:db :profile/profile :dapps-address])
accounts (get-in cofx [:db :multiaccount/visible-accounts])
typed? (and (not= constants/web3-personal-sign method)
(not= constants/web3-eth-sign method))]
(if (or message? (= constants/web3-send-transaction method))
(let [[address data] (cond (and (= method constants/web3-keycard-sign-typed-data)
(not (vector? params)))
;; We don't use signer argument for keycard sign-typed-data
["0x0" params]
message? (browser/normalize-sign-message-params
params
typed?)
:else [nil nil])]
(when (or (not message?) (and address data))
(signing/sign cofx
(merge
(if message?
{:message {:address address
:data data
:v4 (= constants/web3-sign-typed-data-v4 method)
:typed? typed?
:pinless? (= method constants/web3-keycard-sign-typed-data)
:from address}}
{:tx-obj (-> params
first
(update :from #(or % dapps-address))
(dissoc :gasPrice))})
{:on-result [:wallet-connect.dapp/transaction-on-result message-id topic]
:on-error [:wallet-connect.dapp/transaction-on-error message-id topic]}))))
(when (#{"eth_accounts" "eth_coinbase"} method)
(wallet-connect-complete-transaction
cofx
message-id
topic
(if (= method "eth_coinbase") dapps-address [dapps-address]))))))
(rf/defn wallet-connect-send-async-read-only
[{:keys [db] :as cofx} {:keys [method] :as payload} message-id topic]
(wallet-connect-send-async cofx payload message-id topic))
(rf/defn process-request
{:events [:wallet-connect/request-received]}
[{:keys [db] :as cofx} session-request]
(let [pending-requests (get db :wallet-connect/pending-requests)
{:keys [topic request]} session-request
{:keys [id]} request]
(wallet-connect-send-async-read-only cofx request id topic)))
@@ -1,8 +1,8 @@
(ns status-im2.common.alert.events
(ns status-im2.common.alert.effects
(:require
[re-frame.core :as re-frame]
[react-native.core :as rn]
[utils.i18n :as i18n]))
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
(defn show-popup
([title content]
@@ -26,8 +26,7 @@
(when on-dismiss
{:cancelable false})))))
(re-frame/reg-fx
:utils/show-popup
(rf/reg-fx :effects.utils/show-popup
(fn [{:keys [title content on-dismiss]}]
(show-popup title content on-dismiss)))
@@ -50,8 +49,7 @@
(or extra-options nil))
{:cancelable false}))
(re-frame/reg-fx
:utils/show-confirmation
(rf/reg-fx :effects.utils/show-confirmation
(fn [{:keys [title content confirm-button-text on-accept on-cancel cancel-button-text extra-options]}]
(show-confirmation {:title title
:content content
@@ -60,18 +58,3 @@
:on-accept on-accept
:on-cancel on-cancel
:extra-options extra-options})))
(defn show-question
([title content on-accept]
(show-question title content on-accept nil))
([title content on-accept on-cancel]
(rn/alert
title
content
(vector (merge {:text (i18n/label :t/no)
:accessibility-label :no-button}
(when on-cancel {:onPress on-cancel}))
{:text (i18n/label :t/yes)
:onPress on-accept
:accessibility-label :yes-button})
nil)))
-8
View File
@@ -1,8 +0,0 @@
(ns status-im2.common.async-storage
(:require
[re-frame.core :as re-frame]
react-native.async-storage))
(re-frame/reg-fx :async-storage-set (react-native.async-storage/set-item-factory))
(re-frame/reg-fx :async-storage-get
(fn [{ks :keys cb :cb}] (react-native.async-storage/get-items ks cb)))
@@ -0,0 +1,11 @@
(ns status-im2.common.async-storage.effects
(:require
[react-native.async-storage :as async-storage]
[utils.re-frame :as rf]))
(rf/reg-fx :effects.async-storage/set
(async-storage/set-item-factory))
(rf/reg-fx :effects.async-storage/get
(fn [{ks :keys cb :cb}]
(async-storage/get-items ks cb)))
+1 -1
View File
@@ -51,7 +51,7 @@
(i18n/label :t/grant-face-id-permissions)
(i18n/label :t/biometric-auth-error {:code code}))]
(when handle-error?
{:utils/show-popup
{:effects.utils/show-popup
{:title (i18n/label :t/biometric-auth-login-error-title)
:content content}})))
+8
View File
@@ -0,0 +1,8 @@
(ns status-im2.common.font.effects
(:require
utils.image-server
[utils.re-frame :as rf]))
(rf/reg-fx :effects.font/get-font-file-for-initials-avatar
(fn [callback]
(utils.image-server/get-font-file-ready callback)))
@@ -1,15 +1,9 @@
(ns status-im2.common.font
(ns status-im2.common.font.events
(:require
[clojure.string :as string]
[re-frame.core :as re-frame]
utils.image-server
status-im2.common.font.effects
[utils.re-frame :as rf]))
(re-frame/reg-fx
:font/get-font-file-for-initials-avatar
(fn [callback]
(utils.image-server/get-font-file-ready callback)))
(rf/defn init-abs-root-path
{:events [:font/init-font-file-for-initials-avatar]}
[{:keys [db]} initials-avatar-font-file]
+6 -14
View File
@@ -6,8 +6,10 @@
[status-im2.common.confirmation-drawer.view :as confirmation-drawer]
[status-im2.common.mute-drawer.view :as mute-drawer]
[status-im2.common.muting.helpers :refer [format-mute-till]]
[status-im2.config :as config]
[status-im2.constants :as constants]
[status-im2.contexts.communities.actions.chat.view :as chat-actions]
[status-im2.contexts.chat.actions.view :as chat-actions]
[status-im2.contexts.communities.actions.chat.view :as communities-chat-actions]
[status-im2.contexts.contacts.drawers.nickname-drawer.view :as nickname-drawer]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
@@ -253,16 +255,6 @@
:chevron? true
:add-divider? add-divider?}))
;; TODO(OmarBasem): Requires design input.
(defn fetch-messages-entry
[]
(entry {:icon :i/save
:label (i18n/label :t/fetch-messages)
:on-press #(js/alert "TODO: to be implemented, requires design input")
:danger? false
:accessibility-label :fetch-messages
:sub-label nil
:chevron? true}))
(defn remove-from-contacts-entry
[contact]
@@ -419,8 +411,8 @@
[(mark-as-read-entry chat-id needs-divider?)
(mute-chat-entry chat-id chat-type muted-till)
(notifications-entry false)
(when inside-chat?
(fetch-messages-entry))
(when (and config/fetch-messages-enabled? inside-chat?)
(chat-actions/fetch-messages chat-id))
(when (or (not group-chat) public?)
(show-qr-entry))
(when-not group-chat
@@ -481,7 +473,7 @@
constants/private-group-chat-type
[private-group-chat-actions chat inside-chat?]
constants/community-chat-type
[chat-actions/actions chat inside-chat?]
[communities-chat-actions/actions chat inside-chat?]
nil))
(defn group-details-actions
+65
View File
@@ -0,0 +1,65 @@
(ns status-im2.common.pairing.events
(:require
[quo.foundations.colors :as colors]
[status-im2.constants :as constants]
[status-im2.contexts.communities.discover.events]
[taoensso.timbre :as log]
[utils.re-frame :as rf]))
(rf/defn handle-local-pairing-signals
[{:keys [db]} {:keys [type action data error] :as event}]
(log/info "local pairing signal received"
{:event event})
(let [{:keys [account password]} data
role (get-in db [:syncing :role])
receiver? (= role constants/local-pairing-role-receiver)
sender? (= role constants/local-pairing-role-sender)
connection-success? (and (= type
constants/local-pairing-event-connection-success)
(= action
constants/local-pairing-action-connect))
error-on-pairing? (contains? constants/local-pairing-event-errors type)
completed-pairing? (and (= type
constants/local-pairing-event-transfer-success)
(= action
constants/local-pairing-action-pairing-installation))
received-account? (and (= type
constants/local-pairing-event-received-account)
(= action
constants/local-pairing-action-pairing-account)
(and (some? account) (some? password)))
multiaccount-data (when received-account?
(merge account {:password password}))
navigate-to-syncing-devices? (and (or connection-success? error-on-pairing?) receiver?)
user-in-syncing-devices-screen? (or (= (:view-id db) :syncing-progress)
(= (:view-id db) :syncing-progress-intro))
user-in-sign-in-intro-screen? (= (:view-id db) :sign-in-intro)]
(merge {:db (cond-> db
connection-success?
(assoc-in [:syncing :pairing-status] :connected)
received-account?
(assoc-in [:syncing :profile] multiaccount-data)
error-on-pairing?
(assoc-in [:syncing :pairing-status] :error)
completed-pairing?
(assoc-in [:syncing :pairing-status] :completed))}
(cond
(and navigate-to-syncing-devices? (not user-in-syncing-devices-screen?))
{:dispatch (if user-in-sign-in-intro-screen?
[:navigate-to-within-stack [:syncing-progress-intro :sign-in-intro]]
[:navigate-to :syncing-progress])}
(and completed-pairing? sender?)
{:dispatch [:syncing/clear-states]}
(and completed-pairing? receiver?)
{:dispatch [:profile.login/local-paired-user]}
(and error-on-pairing? (some? error))
{:dispatch [:toasts/upsert
{:icon :i/alert
:icon-color colors/danger-50
:text error}]}))))
@@ -38,10 +38,11 @@
:padding-horizontal screen-padding
:margin-vertical 12})
(def header-text
(defn header-text
[bottom-padding?]
{:padding-horizontal screen-padding
:padding-top 12
:padding-bottom 8
:padding-bottom (when bottom-padding? 8)
:color colors/white})
(def header-sub-text
@@ -53,7 +54,7 @@
:margin-top 20})
(def scan-qr-code-container
{:margin-top 19})
{:margin-top 20})
(def qr-view-finder
{:margin-horizontal screen-padding
+17 -15
View File
@@ -35,13 +35,14 @@
[quo/text
{:size :heading-1
:weight :semi-bold
:style style/header-text}
:style (style/header-text (when subtitle true))}
title]
[quo/text
{:size :paragraph-1
:weight :regular
:style style/header-sub-text}
subtitle]])
(when subtitle
[quo/text
{:size :paragraph-1
:weight :regular
:style style/header-sub-text}
subtitle])])
(defn get-labels-and-on-press-method
[]
@@ -109,21 +110,22 @@
[white-border :bottom-right]]])
(defn- viewfinder
[qr-view-finder]
[qr-view-finder helper-text?]
(let [layout-size (+ (:width qr-view-finder) 2)]
[rn/view {:style (style/viewfinder-container qr-view-finder)}
[white-square layout-size]
[quo/text
{:size :paragraph-2
:weight :regular
:style style/viewfinder-text}
(i18n/label :t/ensure-qr-code-is-in-focus-to-scan)]]))
(when helper-text?
[quo/text
{:size :paragraph-2
:weight :regular
:style style/viewfinder-text}
(i18n/label :t/ensure-qr-code-is-in-focus-to-scan)])]))
(defn- scan-qr-code-tab
[qr-view-finder]
[qr-view-finder helper-text?]
(if (and @camera-permission-granted?
(boolean (not-empty qr-view-finder)))
[viewfinder qr-view-finder]
[viewfinder qr-view-finder helper-text?]
[camera-permission-view]))
(defn- check-qr-code-and-navigate
@@ -223,7 +225,7 @@
[:<>
[rn/view {:style style/scan-qr-code-container}]
[qr-scan-hole-area qr-view-finder]])
[scan-qr-code-tab @qr-view-finder]
[scan-qr-code-tab @qr-view-finder (when subtitle true)]
[rn/view {:style style/flex-spacer}]
(when show-camera?
[quo.theme/provider {:theme :light}
@@ -1,13 +1,12 @@
(ns status-im.signals.core
(ns status-im2.common.signals.events
(:require
[quo.foundations.colors :as colors]
[status-im.chat.models.message :as models.message]
[status-im.ethereum.subscriptions :as ethereum.subscriptions]
[status-im.mailserver.core :as mailserver]
[status-im.transport.message.core :as transport.message]
[status-im.visibility-status-updates.core :as visibility-status-updates]
[status-im2.constants :as constants]
[status-im2.common.pairing.events :as pairing]
[status-im2.contexts.chat.messages.link-preview.events :as link-preview]
[status-im2.contexts.chat.messages.transport.events :as messages.transport]
[status-im2.contexts.communities.discover.events]
[status-im2.contexts.profile.login.events :as profile.login]
[status-im2.contexts.push-notifications.local.events :as local-notifications]
@@ -29,64 +28,6 @@
[{:keys [db]} peer-stats]
{:db (assoc db :peer-stats peer-stats :peers-count (count (:peers peer-stats)))})
(rf/defn handle-local-pairing-signals
[{:keys [db]} {:keys [type action data error] :as event}]
(log/info "local pairing signal received"
{:event event})
(let [{:keys [account password]} data
role (get-in db [:syncing :role])
receiver? (= role constants/local-pairing-role-receiver)
sender? (= role constants/local-pairing-role-sender)
connection-success? (and (= type
constants/local-pairing-event-connection-success)
(= action
constants/local-pairing-action-connect))
error-on-pairing? (contains? constants/local-pairing-event-errors type)
completed-pairing? (and (= type
constants/local-pairing-event-transfer-success)
(= action
constants/local-pairing-action-pairing-installation))
received-account? (and (= type
constants/local-pairing-event-received-account)
(= action
constants/local-pairing-action-pairing-account)
(and (some? account) (some? password)))
multiaccount-data (when received-account?
(merge account {:password password}))
navigate-to-syncing-devices? (and (or connection-success? error-on-pairing?) receiver?)
user-in-syncing-devices-screen? (or (= (:view-id db) :syncing-progress)
(= (:view-id db) :syncing-progress-intro))
user-in-sign-in-intro-screen? (= (:view-id db) :sign-in-intro)]
(merge {:db (cond-> db
connection-success?
(assoc-in [:syncing :pairing-status] :connected)
received-account?
(assoc-in [:syncing :profile] multiaccount-data)
error-on-pairing?
(assoc-in [:syncing :pairing-status] :error)
completed-pairing?
(assoc-in [:syncing :pairing-status] :completed))}
(cond
(and navigate-to-syncing-devices? (not user-in-syncing-devices-screen?))
{:dispatch (if user-in-sign-in-intro-screen?
[:navigate-to-within-stack [:syncing-progress-intro :sign-in-intro]]
[:navigate-to :syncing-progress])}
(and completed-pairing? sender?)
{:dispatch [:syncing/clear-states]}
(and completed-pairing? receiver?)
{:dispatch [:profile.login/local-paired-user]}
(and error-on-pairing? (some? error))
{:dispatch [:toasts/upsert
{:icon :i/alert
:icon-color colors/danger-50
:text error}]}))))
(rf/defn process
{:events [:signals/signal-received]}
[{:keys [db] :as cofx} event-str]
@@ -101,18 +42,18 @@
"backup.performed" {:db (assoc-in db
[:profile/profile :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)
"envelope.sent" (messages.transport/update-envelopes-status cofx
(:ids
(js->clj event-js
:keywordize-keys
true))
:sent)
"envelope.expired" (messages.transport/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)]
@@ -126,9 +67,9 @@
"discovery.summary" (summary cofx (js->clj event-js :keywordize-keys true))
"mediaserver.started" {:db (assoc db :mediaserver/port (.-port event-js))}
"wakuv2.peerstats" (wakuv2-peer-stats cofx (js->clj event-js :keywordize-keys true))
"messages.new" (transport.message/sanitize-messages-and-process-response cofx
event-js
true)
"messages.new" (messages.transport/sanitize-messages-and-process-response cofx
event-js
true)
"wallet" (ethereum.subscriptions/new-wallet-event cofx
(js->clj event-js
:keywordize-keys
@@ -141,7 +82,7 @@
"status.updates.timedout" (visibility-status-updates/handle-visibility-status-updates
cofx
(js->clj event-js :keywordize-keys true))
"localPairing" (handle-local-pairing-signals
"localPairing" (pairing/handle-local-pairing-signals
cofx
(js->clj event-js :keywordize-keys true))
"curated.communities.update" (rf/dispatch [:fetched-contract-communities
@@ -1,7 +1,7 @@
(ns status-im2.common.standard-authentication.core
(:require
status-im2.common.standard-authentication.standard-auth.button.view
status-im2.common.standard-authentication.password-input.view
status-im2.common.standard-authentication.standard-auth.slide-button.view))
(def button status-im2.common.standard-authentication.standard-auth.button.view/view)
(def password-input status-im2.common.standard-authentication.password-input.view/view)
(def slide-button status-im2.common.standard-authentication.standard-auth.slide-button.view/view)
@@ -9,7 +9,7 @@
[utils.re-frame :as rf]))
(defn view
[{:keys [on-enter-password button-label button-icon-left]}]
[{:keys [on-enter-password on-press-biometrics button-label button-icon-left]}]
(let [{:keys [key-uid customization-color] :as profile} (rf/sub [:profile/profile-with-image])
{:keys [error processing password]} (rf/sub [:profile/login])
sign-in-enabled? (rf/sub [:sign-in-enabled?])]
@@ -32,20 +32,21 @@
:customization-color customization-color
:size 24}]]
[password-input/view
{:processing processing
:error error
:default-password password
:sign-in-enabled? sign-in-enabled?}]
[rn/view {:style style/enter-password-button}
[quo/button
{:size 40
:type :primary
:customization-color (or customization-color :primary)
:accessibility-label :login-button
:icon-left button-icon-left
:disabled? (or (not sign-in-enabled?) processing)
:on-press (fn []
(rf/dispatch [:set-in [:profile/login :key-uid] key-uid])
(rf/dispatch [:profile.login/verify-database-password password
#(on-enter-password password)]))}
button-label]]]]]))
{:on-press-biometrics on-press-biometrics
:processing processing
:error error
:default-password password
:sign-in-enabled? sign-in-enabled?}]
[quo/button
{:size 40
:container-style style/enter-password-button
:type :primary
:customization-color (or customization-color :primary)
:accessibility-label :login-button
:icon-left button-icon-left
:disabled? (or (not sign-in-enabled?) processing)
:on-press (fn []
(rf/dispatch [:set-in [:profile/login :key-uid] key-uid])
(rf/dispatch [:profile.login/verify-database-password password
#(on-enter-password password)]))}
button-label]]]]))
@@ -0,0 +1,8 @@
(ns status-im2.common.standard-authentication.events
(:require
[utils.re-frame :as rf]))
(rf/reg-event-fx :standard-auth/on-biometric-success
(fn [{:keys [db]} [callback]]
(let [key-uid (get-in db [:profile/profile :key-uid])]
{:fx [[:keychain/get-user-password [key-uid callback]]]})))
@@ -4,3 +4,7 @@
{:margin-top 8
:flex-direction :row
:align-items :center})
(def auth-button
{:align-self :flex-end
:margin-left 8})
@@ -27,21 +27,30 @@
(rf/dispatch [:set-in [:profile/login :error] ""]))
(defn- view-internal
[{:keys [default-password theme shell?]}]
[{:keys [default-password theme shell? on-press-biometrics]}]
(let [{:keys [error processing]} (rf/sub [:profile/login])
error-message (get-error-message error)
error? (boolean (seq error-message))]
[:<>
[quo/input
{:type :password
:blur? true
:disabled? processing
:placeholder (i18n/label :t/type-your-password)
:auto-focus true
:error? error?
:label (i18n/label :t/profile-password)
:on-change-text on-change-password
:default-value (security/safe-unmask-data default-password)}]
[rn/view {:style {:flex-direction :row}}
[quo/input
{:container-style {:flex 1}
:type :password
:blur? true
:disabled? processing
:placeholder (i18n/label :t/type-your-password)
:auto-focus true
:error? error?
:label (i18n/label :t/profile-password)
:on-change-text on-change-password
:default-value (security/safe-unmask-data default-password)}]
(when on-press-biometrics
[quo/button
{:container-style style/auth-button
:on-press on-press-biometrics
:icon-only? true
:type :outline}
:i/face-id])]
(when error?
[rn/view {:style style/error-message}
[quo/info-message
@@ -60,10 +69,7 @@
:shell? shell?}]))}
[rn/text
{:style {:text-decoration-line :underline
:color (colors/theme-colors
(colors/custom-color :danger 50)
(colors/custom-color :danger 60)
theme)}
:color (colors/resolve-color :danger theme)}
:size :paragraph-2
:suppress-highlighting true}
(i18n/label :t/forgot-password)]]])]))
@@ -1,10 +1,12 @@
(ns status-im2.common.standard-authentication.standard-auth.authorize
(:require
[native-module.core :as native-module]
[react-native.touch-id :as biometric]
[status-im2.common.standard-authentication.enter-password.view :as enter-password]
[taoensso.timbre :as log]
[utils.i18n :as i18n]
[utils.re-frame :as rf]))
[utils.re-frame :as rf]
[utils.security.core :as security]))
(defn reset-password
[]
@@ -12,33 +14,49 @@
(rf/dispatch [:set-in [:profile/login :error] ""]))
(defn authorize
[{:keys [on-enter-password biometric-auth? on-auth-success on-auth-fail on-close
[{:keys [biometric-auth? on-auth-success on-auth-fail on-close
auth-button-label theme blur? auth-button-icon-left]}]
(biometric/get-supported-type
(fn [biometric-type]
(if (and biometric-auth? biometric-type)
(biometric/authenticate
{:reason (i18n/label :t/biometric-auth-confirm-message)
:on-success (fn [response]
(when on-auth-success (on-auth-success response))
(log/info "response" response))
:on-fail (fn [error]
(log/error "Authentication Failed. Error:" error)
(when on-auth-fail (on-auth-fail error))
(rf/dispatch [:show-bottom-sheet
{:theme theme
:shell? blur?
:content (fn []
[enter-password/view
{:on-enter-password on-enter-password}])}]))})
(do
(reset-password)
(rf/dispatch [:show-bottom-sheet
{:on-close on-close
:theme theme
:shell? blur?
:content (fn []
[enter-password/view
{:on-enter-password on-enter-password
:button-icon-left auth-button-icon-left
:button-label auth-button-label}])}]))))))
(let [handle-auth-success (fn [biometric?]
(fn [entered-password]
(let [sha3-pwd (if biometric?
(str (security/safe-unmask-data entered-password))
(native-module/sha3 (str (security/safe-unmask-data
entered-password))))]
(on-auth-success sha3-pwd))))
password-login (fn [{:keys [on-press-biometrics]}]
(rf/dispatch [:show-bottom-sheet
{:on-close on-close
:theme theme
:shell? blur?
:content (fn []
[enter-password/view
{:on-enter-password (handle-auth-success
false)
:on-press-biometrics on-press-biometrics
:button-icon-left auth-button-icon-left
:button-label auth-button-label}])}]))
; biometrics-login recursively passes itself as a parameter because if the user
; fails biometric auth they will be shown the password bottom sheet with an option
; to retrigger biometric auth, so they can endlessly repeat this cycle.
biometrics-login (fn [on-press-biometrics]
(rf/dispatch [:dismiss-keyboard])
(biometric/authenticate
{:reason (i18n/label :t/biometric-auth-confirm-message)
:on-success (fn [_response]
(on-close)
(rf/dispatch [:standard-auth/on-biometric-success
(handle-auth-success true)]))
:on-fail (fn [error]
(on-close)
(log/error "Authentication Failed. Error:" error)
(when on-auth-fail (on-auth-fail error))
(password-login {:on-press-biometrics
#(on-press-biometrics
on-press-biometrics)}))}))]
(biometric/get-supported-type
(fn [biometric-type]
(if (and biometric-auth? biometric-type)
(biometrics-login biometrics-login)
(do
(reset-password)
(password-login {})))))))
@@ -1,44 +0,0 @@
(ns status-im2.common.standard-authentication.standard-auth.button.view
(:require
[quo.core :as quo]
[quo.theme :as quo.theme]
[reagent.core :as reagent]
[status-im2.common.standard-authentication.standard-auth.authorize :as authorize]))
(defn- view-internal
[_]
(let [reset-slider? (reagent/atom false)
on-close #(reset! reset-slider? true)]
(fn [{:keys [biometric-auth?
customization-color
auth-button-label
on-enter-password
on-auth-success
on-press
on-auth-fail
auth-button-icon-left
size
button-label
theme
blur?
container-style
icon-left]}]
[quo/button
{:size size
:container-style container-style
:customization-color customization-color
:icon-left icon-left
:on-press (if on-press
on-press
#(authorize/authorize {:on-close on-close
:auth-button-icon-left auth-button-icon-left
:theme theme
:blur? blur?
:on-enter-password on-enter-password
:biometric-auth? biometric-auth?
:on-auth-success on-auth-success
:on-auth-fail on-auth-fail
:auth-button-label auth-button-label}))}
button-label])))
(def view (quo.theme/with-theme view-internal))
@@ -4,17 +4,21 @@
[quo.theme :as quo.theme]
[react-native.core :as rn]
[reagent.core :as reagent]
[status-im2.common.standard-authentication.standard-auth.authorize :as authorize]))
[status-im2.common.standard-authentication.standard-auth.authorize :as authorize]
[utils.re-frame :as rf]))
(defn- view-internal
[_]
(let [reset-slider? (reagent/atom false)
on-close #(reset! reset-slider? true)]
(fn [{:keys [biometric-auth?
track-text
(let [reset-slider? (reagent/atom false)
on-close (fn []
(js/setTimeout
#(reset! reset-slider? true)
200))
auth-method (rf/sub [:auth-method])
biometric-auth? (= auth-method "biometric")]
(fn [{:keys [track-text
customization-color
auth-button-label
on-enter-password
on-auth-success
on-auth-fail
auth-button-icon-left
@@ -32,7 +36,6 @@
:auth-button-icon-left auth-button-icon-left
:theme theme
:blur? blur?
:on-enter-password on-enter-password
:biometric-auth? biometric-auth?
:on-auth-success on-auth-success
:on-auth-fail on-auth-fail
+2 -2
View File
@@ -44,8 +44,8 @@
(when chat-id
(if-not (own-public-key? db chat-id)
{:dispatch [:chat.ui/start-chat chat-id]}
{:utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:content (i18n/label :t/can-not-add-yourself)}})))
{:effects.utils/show-popup {:title (i18n/label :t/unable-to-read-this-code)
:content (i18n/label :t/can-not-add-yourself)}})))
(rf/defn handle-community-requests
[cofx {:keys [community-id]}]
+1
View File
@@ -172,3 +172,4 @@
(def shell-navigation-disabled? false)
(def community-accounts-selection-enabled? false)
(def fetch-messages-enabled? (enabled? (get-config :FETCH_MESSAGES_ENABLED "1")))
+5
View File
@@ -372,7 +372,9 @@
;; wallet
(def ^:const mainnet-chain-id 1)
(def ^:const optimism-chain-id 10)
(def ^:const optimism-test-chain-id 420)
(def ^:const arbitrum-chain-id 42161)
(def ^:const arbitrum-test-chain-id 421613)
(def ^:const goerli-chain-id 5)
(def ^:const mainnet-short-name "eth")
@@ -388,3 +390,6 @@
(def ^:const account-default-customization-color :blue)
(def ^:const wallet-account-name-max-length 20)
(def ^:const status-address-domain ".stateofus.eth")
(def ^:const eth-address-domain ".eth")
@@ -0,0 +1,22 @@
(ns status-im2.contexts.add-new-contact.effects
(:require
[native-module.core :as native-module]
[status-im.ethereum.ens :as ens]
[status-im2.constants :as constants]
[utils.re-frame :as rf]
[utils.transforms :as transforms]))
(rf/reg-fx :effects.contacts/decompress-public-key
(fn [{:keys [compressed-key on-success on-error]}]
(native-module/compressed-key->public-key
compressed-key
constants/deserialization-key
(fn [resp]
(let [{:keys [error]} (transforms/json->clj resp)]
(if error
(on-error error)
(on-success (str "0x" (subs resp 5)))))))))
(rf/reg-fx :effects.contacts/resolve-public-key-from-ens
(fn [{:keys [chain-id ens on-success on-error]}]
(ens/pubkey chain-id ens on-success on-error)))

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