Compare commits
29
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a42289f387 | ||
|
|
0ba057ae9d | ||
|
|
8b919f4058 | ||
|
|
f79860fb97 | ||
|
|
7a6f05a440 | ||
|
|
de4e233884 | ||
|
|
55a99da2f5 | ||
|
|
6093d56c90 | ||
|
|
9cf4556b9d | ||
|
|
536ebf56cb | ||
|
|
3ad345519b | ||
|
|
dc587e493f | ||
|
|
f692ae2222 | ||
|
|
aa89ebdb93 | ||
|
|
198a4d74a5 | ||
|
|
3b5fe36717 | ||
|
|
03444ae4ff | ||
|
|
390bbdb6ec | ||
|
|
2bc7b62324 | ||
|
|
4376ee8908 | ||
|
|
195f0cfa40 | ||
|
|
ab61d8d5c0 | ||
|
|
aaf0b8e423 | ||
|
|
7e14846f0b | ||
|
|
5ebd133c63 | ||
|
|
563f1c588d | ||
|
|
6b612588c4 | ||
|
|
6ef113e821 | ||
|
|
c25f44c2a0 |
@@ -0,0 +1,4 @@
|
||||
{:linters
|
||||
{:unresolved-symbol
|
||||
{:exclude [(cljs.test/is [match? thrown-match?])
|
||||
(clojure.test/is [match? thrown-match?])]}}}
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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: {
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 851 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
@@ -17,6 +17,7 @@
|
||||
[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"]
|
||||
|
||||
@@ -368,17 +368,6 @@
|
||||
:LineChart #js {}
|
||||
:LineChartBicolor #js {}})
|
||||
|
||||
(def wallet-connect-client
|
||||
#js
|
||||
{:default #js {}
|
||||
:CLIENT_EVENTS #js
|
||||
{:session #js
|
||||
{:request nil
|
||||
:created nil
|
||||
:deleted nil
|
||||
:proposal nil
|
||||
:updated nil}}})
|
||||
|
||||
(def worklet-factory
|
||||
#js {:applyAnimationsToStyle (fn [])})
|
||||
|
||||
@@ -447,7 +436,6 @@
|
||||
"../src/js/worklets/parallax.js" #js {}
|
||||
"../src/js/worklets/identifiers_highlighting.js" #js {}
|
||||
"./fleets.js" default-fleets
|
||||
"@walletconnect/client" wallet-connect-client
|
||||
"../translations/ar.json" (js/JSON.parse (slurp "./translations/ar.json"))
|
||||
"../translations/de.json" (js/JSON.parse (slurp "./translations/de.json"))
|
||||
"../translations/en.json" (js/JSON.parse (slurp "./translations/en.json"))
|
||||
|
||||
@@ -10,40 +10,36 @@
|
||||
|
||||
(defn token-requirement-list-row
|
||||
[tokens padding?]
|
||||
[rn/view
|
||||
{:style (style/token-row padding?)}
|
||||
(doall
|
||||
(map-indexed (fn [token-index token]
|
||||
(let [{:keys [img-src amount sufficient? purchasable?]} token]
|
||||
^{:key token-index}
|
||||
[rn/view {:style style/token-tag-spacing}
|
||||
[token-tag/view
|
||||
{:token-symbol (:symbol token)
|
||||
:token-value amount
|
||||
:size :size-24
|
||||
:options (cond
|
||||
sufficient? :hold
|
||||
purchasable? :add)
|
||||
:token-img-src img-src}]]))
|
||||
tokens))])
|
||||
[rn/view {:style (style/token-row padding?)}
|
||||
(map-indexed (fn [token-index token]
|
||||
(let [{:keys [amount sufficient? purchasable?]} token]
|
||||
^{:key token-index}
|
||||
[rn/view {:style style/token-tag-spacing}
|
||||
[token-tag/view
|
||||
{:token-symbol (:symbol token)
|
||||
:token-value amount
|
||||
:size :size-24
|
||||
:options (cond
|
||||
sufficient? :hold
|
||||
purchasable? :add)}]]))
|
||||
tokens)])
|
||||
|
||||
(defn- internal-view
|
||||
[{:keys [tokens padding? theme]}]
|
||||
[:<>
|
||||
(if (> (count tokens) 1)
|
||||
(doall
|
||||
(map-indexed
|
||||
(fn [token-requirement-index tokens]
|
||||
^{:key token-requirement-index}
|
||||
[rn/view {:margin-bottom 12}
|
||||
(when-not (= token-requirement-index 0)
|
||||
[rn/view {:style (style/token-row-or-border theme)}])
|
||||
(when-not (= token-requirement-index 0)
|
||||
[text/text
|
||||
{:style (style/token-row-or-text padding? theme)
|
||||
:size :label} (string/lower-case (i18n/label :t/or))])
|
||||
[token-requirement-list-row tokens padding?]])
|
||||
tokens))
|
||||
(map-indexed
|
||||
(fn [token-requirement-index tokens]
|
||||
^{:key token-requirement-index}
|
||||
[rn/view {:margin-bottom 12}
|
||||
(when-not (= token-requirement-index 0)
|
||||
[rn/view {:style (style/token-row-or-border theme)}])
|
||||
(when-not (= token-requirement-index 0)
|
||||
[text/text
|
||||
{:style (style/token-row-or-text padding? theme)
|
||||
:size :label} (string/lower-case (i18n/label :t/or))])
|
||||
[token-requirement-list-row tokens padding?]])
|
||||
tokens)
|
||||
[token-requirement-list-row (first tokens) padding?])])
|
||||
|
||||
(def token-requirement-list (quo.theme/with-theme internal-view))
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
|
||||
(defn- valid-color?
|
||||
[color]
|
||||
(or (keyword? color)
|
||||
(and (string? color)
|
||||
(not (string/blank? color)))))
|
||||
(and color
|
||||
(or (keyword? color)
|
||||
(and (string? color)
|
||||
(not (string/blank? color))))))
|
||||
|
||||
(defn- image-icon-style
|
||||
[{:keys [color no-color size container-style theme]}]
|
||||
@@ -37,8 +38,8 @@
|
||||
(cond-> {:size size
|
||||
:accessibility-label accessibility-label
|
||||
:style container-style}
|
||||
(and color (valid-color? color)) (assoc :color color)
|
||||
(and color-2 (valid-color? color-2)) (assoc :color-2 color-2))]
|
||||
(valid-color? color) (assoc :color color)
|
||||
(valid-color? color-2) (assoc :color-2 color-2))]
|
||||
[rn/image
|
||||
{:style (image-icon-style (assoc props :size size))
|
||||
:accessibility-label accessibility-label
|
||||
|
||||
@@ -118,13 +118,61 @@
|
||||
"M2.79504 9.01494C2.89473 8.85584 3.00297 8.70977 3.11963 8.5761C3.90594 7.67512 4.97212 7.45024 5.99992 7.45024C7.02772 7.45024 8.0939 7.67512 8.88021 8.5761C8.99688 8.70978 9.10512 8.85585 9.2048 9.01495C8.9501 9.28561 8.66149 9.52401 8.34577 9.72335C8.25403 9.55824 8.15512 9.41818 8.05145 9.29939C7.56503 8.74204 6.88121 8.55024 5.99992 8.55024C5.11862 8.55024 4.43481 8.74204 3.94839 9.29939C3.84472 9.41818 3.74582 9.55824 3.65408 9.72334C3.33835 9.524 3.04975 9.2856 2.79504 9.01494ZM5.99992 3.5502C5.47525 3.5502 5.04992 3.97552 5.04992 4.5002C5.04992 5.02487 5.47525 5.4502 5.99992 5.4502C6.52459 5.4502 6.94992 5.02487 6.94992 4.5002C6.94992 3.97552 6.52459 3.5502 5.99992 3.5502ZM3.94992 4.5002C3.94992 3.36801 4.86773 2.4502 5.99992 2.4502C7.1321 2.4502 8.04992 3.36801 8.04992 4.5002C8.04992 5.63238 7.1321 6.5502 5.99992 6.5502C4.86773 6.5502 3.94992 5.63238 3.94992 4.5002Z"
|
||||
:fill color-2}]])
|
||||
|
||||
(defn- contact-20
|
||||
[{:keys [color color-2]
|
||||
:or {color colors/neutral-100
|
||||
color-2 colors/white}
|
||||
:as props}]
|
||||
[container props
|
||||
[svg/circle
|
||||
{:cx 10
|
||||
:cy 10
|
||||
:r 7.5
|
||||
:fill color}]
|
||||
[svg/path
|
||||
{:d
|
||||
"M8.65002 7.99998C8.65002 7.25439 9.25443 6.64998 10 6.64998C10.7456 6.64998 11.35 7.25439 11.35 7.99998C11.35 8.74556 10.7456 9.34998 10 9.34998C9.25443 9.34998 8.65002 8.74556 8.65002 7.99998ZM10 5.34998C8.53646 5.34998 7.35002 6.53642 7.35002 7.99998C7.35002 9.46353 8.53646 10.65 10 10.65C11.4636 10.65 12.65 9.46353 12.65 7.99998C12.65 6.53642 11.4636 5.34998 10 5.34998ZM10 13.65C8.67557 13.65 7.53064 14.4186 6.98692 15.5341C6.60094 15.3235 6.23942 15.0737 5.90771 14.79C6.69408 13.3369 8.23179 12.35 10 12.35C11.7682 12.35 13.306 13.3369 14.0923 14.79C13.7606 15.0737 13.3991 15.3235 13.0131 15.5341C12.4694 14.4186 11.3245 13.65 10 13.65Z"
|
||||
:fill color-2}]])
|
||||
|
||||
(defn- verified-20
|
||||
[{:keys [color color-2]
|
||||
:or {color colors/neutral-100
|
||||
color-2 colors/white}
|
||||
:as props}]
|
||||
[container props
|
||||
[svg/path
|
||||
{:d
|
||||
"M18 10C18 8.77003 17.1118 7.74751 15.9418 7.53891C16.6216 6.56407 16.5267 5.21294 15.6569 4.34321C14.7872 3.47344 13.436 3.37852 12.4611 4.05845C12.2526 2.88834 11.23 2 10 2C8.77 2 7.74747 2.88827 7.53889 4.05832C6.56406 3.37846 5.21292 3.47339 4.34318 4.34313C3.47343 5.21288 3.3785 6.56404 4.05839 7.53888C2.88831 7.74743 2 8.76998 2 10C2 11.23 2.88824 12.2525 4.05826 12.4611C3.3784 13.4359 3.47333 14.7871 4.34307 15.6568C5.21284 16.5266 6.56403 16.6215 7.53887 15.9416C7.74741 17.1117 8.76996 18 10 18C11.23 18 12.2525 17.1117 12.4611 15.9417C13.4359 16.6215 14.7871 16.5266 15.6568 15.6569C16.5265 14.7871 16.6215 13.436 15.9416 12.4611C17.1117 12.2526 18 11.23 18 10Z"
|
||||
:fill color}]
|
||||
[svg/path
|
||||
{:d "M7.25 10.75L9.25 12.25L12.75 7.75"
|
||||
:stroke color-2
|
||||
:stroke-width "1.2"}]])
|
||||
|
||||
(defn- untrustworthy-20
|
||||
[{:keys [color color-2]
|
||||
:or {color colors/neutral-100
|
||||
color-2 colors/white}
|
||||
:as props}]
|
||||
[container props
|
||||
[svg/path
|
||||
{:d "M10 2L15.6569 4.34315L18 10L15.6569 15.6569L10 18L4.34315 15.6569L2 10L4.34315 4.34315L10 2Z"
|
||||
:fill color}]
|
||||
[svg/path
|
||||
{:d
|
||||
"M10.75 5.5L10.55 11.5H9.45L9.25 5.5H10.75ZM10 13C10.4142 13 10.75 13.3358 10.75 13.75C10.75 14.1642 10.4142 14.5 10 14.5C9.58579 14.5 9.25 14.1642 9.25 13.75C9.25 13.3358 9.58579 13 10 13Z"
|
||||
:fill color-2}]])
|
||||
|
||||
(def ^:private icons
|
||||
{:i/clear-20 clear-20
|
||||
:i/dropdown-20 dropdown-20
|
||||
:i/pullup-20 pullup-20
|
||||
:i/dropdown-12 dropdown-12
|
||||
:i/pullup-12 pullup-12
|
||||
:i/contact-12 contact-12})
|
||||
{:i/clear-20 clear-20
|
||||
:i/dropdown-20 dropdown-20
|
||||
:i/pullup-20 pullup-20
|
||||
:i/dropdown-12 dropdown-12
|
||||
:i/pullup-12 pullup-12
|
||||
:i/contact-12 contact-12
|
||||
:i/contact-20 contact-20
|
||||
:i/verified-20 verified-20
|
||||
:i/untrustworthy-20 untrustworthy-20})
|
||||
|
||||
(defn- append-to-keyword
|
||||
[k & xs]
|
||||
|
||||
@@ -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)))))
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
[quo.components.avatars.user-avatar.view :as user-avatar]
|
||||
[quo.components.list-items.preview-list.properties :as properties]
|
||||
[quo.components.tags.number-tag.view :as number-tag]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.fast-image :as fast-image]
|
||||
@@ -31,7 +32,12 @@
|
||||
:height size
|
||||
:border-radius border-radius}}]
|
||||
|
||||
(:tokens :network :dapps) [fast-image/fast-image
|
||||
:tokens [token/view
|
||||
{:token item
|
||||
:size size
|
||||
:style {:border-radius border-radius}}]
|
||||
|
||||
(:network :dapps) [fast-image/fast-image
|
||||
{:source (or (:source item) item)
|
||||
:style {:width size
|
||||
:height size
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(def props
|
||||
{:token (resources/get-token :snt)
|
||||
{:token :snt
|
||||
:state :default
|
||||
:label "Status"
|
||||
:networks [(resources/get-network :ethereum)]
|
||||
|
||||
@@ -34,9 +34,7 @@
|
||||
:flex 1})
|
||||
|
||||
(def token-image
|
||||
{:width 32
|
||||
:height 32
|
||||
:border-width 1
|
||||
{:border-width 1
|
||||
:border-radius 16
|
||||
:border-color colors/neutral-80-opa-5
|
||||
:margin-right 8
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
[quo.components.list-items.preview-list.view :as preview-list]
|
||||
[quo.components.list-items.token-network.style :as style]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]))
|
||||
@@ -11,9 +12,11 @@
|
||||
(defn- info
|
||||
[{:keys [token label networks]}]
|
||||
[rn/view {:style style/info}
|
||||
[rn/image
|
||||
{:source (or (:source token) token)
|
||||
:style style/token-image}]
|
||||
(when token
|
||||
[token/view
|
||||
{:style style/token-image
|
||||
:size :size-32
|
||||
:token token}])
|
||||
[rn/view {:style style/token-info}
|
||||
[text/text
|
||||
{:weight :semi-bold
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
(ns quo.components.list-items.token-value.view
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.list-items.token-value.style :as style]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.foundations.common :as common]
|
||||
[quo.foundations.resources :as resources]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]))
|
||||
@@ -14,7 +12,8 @@
|
||||
(defn- internal-view
|
||||
[]
|
||||
(let [state (reagent/atom :default)]
|
||||
(fn [{:keys [theme customization-color status token metrics? values on-press on-long-press]}]
|
||||
(fn [{:keys [theme customization-color status token metrics? values on-press
|
||||
on-long-press]}]
|
||||
(let [bg-opacity (case @state
|
||||
:active 10
|
||||
:pressed 5
|
||||
@@ -34,16 +33,13 @@
|
||||
{:style {:flex-direction :row
|
||||
:align-items :center
|
||||
:flex 1}}
|
||||
[rn/image
|
||||
{:source (resources/get-token token)
|
||||
:style {:width 32
|
||||
:height 32}}]
|
||||
[token/view {:token (:symbol token) :size :size-32}]
|
||||
[rn/view {:style {:margin-left 8}}
|
||||
[text/text {:weight :semi-bold} (common/token-label token)]
|
||||
[text/text {:weight :semi-bold} (:name token)]
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:style {:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)}}
|
||||
(str crypto-value " " (if token (string/upper-case (clj->js token)) ""))]]]
|
||||
(str crypto-value " " (:symbol token))]]]
|
||||
[rn/view
|
||||
{:style {:align-items :flex-end
|
||||
:justify-content :space-between}}
|
||||
|
||||
@@ -59,6 +59,10 @@
|
||||
[theme]
|
||||
{:color (colors/theme-colors colors/neutral-100 colors/white theme)})
|
||||
|
||||
(defn token-logo
|
||||
[size]
|
||||
{:border-radius (if (= size 24) 10 14)})
|
||||
|
||||
(defn circle-logo
|
||||
[size]
|
||||
(if (= size 24)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
[quo.components.list-items.preview-list.view :as preview-list]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.context-tag.style :as style]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]))
|
||||
@@ -73,7 +74,7 @@
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [theme type size state blur? customization-color profile-picture full-name users
|
||||
group-name token-logo amount token-name network-logo network-name networks
|
||||
group-name amount token network-logo network-name networks
|
||||
account-name emoji collectible collectible-name collectible-number duration container-style]
|
||||
:or {customization-color :blue
|
||||
type :default
|
||||
@@ -123,8 +124,11 @@
|
||||
[communities-tag (assoc props :channel? (= type :channel))]
|
||||
|
||||
:token
|
||||
[tag-skeleton {:theme theme :size size :text (str amount " " token-name)}
|
||||
[rn/image {:style (style/circle-logo size) :source token-logo}]]
|
||||
[tag-skeleton {:theme theme :size size :text (str amount " " token)}
|
||||
[token/view
|
||||
{:style (style/token-logo size)
|
||||
:token token
|
||||
:size (if (= size 24) :size-20 :size-28)}]]
|
||||
|
||||
:network
|
||||
[tag-skeleton {:theme theme :size size :text network-name}
|
||||
@@ -182,9 +186,8 @@
|
||||
|
||||
- `:token`
|
||||
- size
|
||||
- token-logo (valid rn/image :source value)
|
||||
- amount
|
||||
- token-name
|
||||
- token
|
||||
|
||||
- `:network`
|
||||
- size
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
(h/test "Token view render"
|
||||
(h/render [summary-tag/view
|
||||
{:type :token
|
||||
:label "1,000 SNT"
|
||||
:image-source "path/to/token-image.png"}])
|
||||
{:type :token
|
||||
:label "1,000 SNT"
|
||||
:token :eth}])
|
||||
(h/is-truthy (h/get-by-text "1,000 SNT"))))
|
||||
|
||||
@@ -24,6 +24,4 @@
|
||||
:border-radius 10})
|
||||
|
||||
(def token-image
|
||||
{:width 24
|
||||
:height 24
|
||||
:border-radius 12})
|
||||
{:border-radius 12})
|
||||
|
||||
@@ -5,12 +5,13 @@
|
||||
[quo.components.avatars.wallet-user-avatar.view :as wallet-user-avatar]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.summary-tag.style :as style]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(defn- left-view
|
||||
[{:keys [label type customization-color emoji image-source]}]
|
||||
[{:keys [label type customization-color emoji image-source token]}]
|
||||
(case type
|
||||
:account
|
||||
[account-avatar/view
|
||||
@@ -38,9 +39,10 @@
|
||||
:profile-picture image-source
|
||||
:customization-color customization-color}]
|
||||
:token
|
||||
[rn/image
|
||||
{:source image-source
|
||||
:style style/token-image}]
|
||||
[token/view
|
||||
{:token token
|
||||
:size :size-24
|
||||
:style style/token-image}]
|
||||
nil))
|
||||
|
||||
(defn- view-internal
|
||||
@@ -50,7 +52,7 @@
|
||||
should vary based on a custom color.
|
||||
- :type - :token / :user / :collectible / :saved-address / :network / :account
|
||||
- :emoji - string - emoji used for displaying account avatar
|
||||
- :image-source - resource - image to display on :network, :collectible :user and :token
|
||||
- :image-source - resource - image to display on :network, :collectible and :user
|
||||
- :theme - :light / :dark"
|
||||
[{:keys [label customization-color type theme]
|
||||
:as props
|
||||
@@ -62,6 +64,7 @@
|
||||
[text/text
|
||||
{:style (style/label type theme)
|
||||
:weight :semi-bold
|
||||
:size :heading-1} label]])
|
||||
:size :heading-1}
|
||||
label]])
|
||||
|
||||
(def view (quo.theme/with-theme view-internal))
|
||||
|
||||
@@ -34,14 +34,10 @@
|
||||
|
||||
(defn token-img
|
||||
[size]
|
||||
(condp = size
|
||||
:size-24 {:width 20
|
||||
:height 20
|
||||
:margin-right 6
|
||||
(case size
|
||||
:size-24 {:margin-right 6
|
||||
:border-radius 10}
|
||||
:size-32 {:width 28
|
||||
:height 28
|
||||
:margin-right 8
|
||||
:size-32 {:margin-right 8
|
||||
:border-radius 14}))
|
||||
|
||||
(defn label
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
[quo.components.icon :as icons]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.token-tag.style :as style]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.hole-view :as hole-view]
|
||||
@@ -14,13 +15,12 @@
|
||||
- :options - false / :add / :hold (default false)
|
||||
- :size - :size-24 / :size-32 (default :size-24)
|
||||
- :blur? - boolean (default false)
|
||||
- :theme - :light / :dark
|
||||
- :token-img-src - token image source
|
||||
- :theme - :light / :dark
|
||||
- :token-value - string - token value
|
||||
- :token-symbol - string"
|
||||
[]
|
||||
(let [container-width (reagent/atom 0)]
|
||||
(fn [{:keys [options size blur? theme token-img-src token-value token-symbol]
|
||||
(fn [{:keys [options size blur? theme token-value token-symbol]
|
||||
:or {size :size-24}}]
|
||||
[rn/view
|
||||
{:on-layout #(reset! container-width
|
||||
@@ -28,21 +28,25 @@
|
||||
[hole-view/hole-view
|
||||
{:holes (if options
|
||||
[{:x (- @container-width
|
||||
(condp = size
|
||||
(case size
|
||||
:size-24 10
|
||||
:size-32 12))
|
||||
:y (condp = size
|
||||
:size-32 12
|
||||
nil))
|
||||
:y (case size
|
||||
:size-24 -6
|
||||
:size-32 -4)
|
||||
:size-32 -4
|
||||
nil)
|
||||
:width 16
|
||||
:height 16
|
||||
:borderRadius 8}]
|
||||
[])}
|
||||
[rn/view
|
||||
{:style (style/container size options blur? theme)}
|
||||
[rn/image
|
||||
{:style (style/token-img size)
|
||||
:source token-img-src}]
|
||||
[rn/view {:style (style/container size options blur? theme)}
|
||||
[token/view
|
||||
{:style (style/token-img size)
|
||||
:token token-symbol
|
||||
:size (case size
|
||||
:size-24 :size-20
|
||||
:size-32 :size-28)}]
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:weight :medium
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
(ns quo.components.text-combinations.username.component-spec
|
||||
(:require [quo.components.text-combinations.username.view :as username]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(defn test-all-status
|
||||
[component-to-render component-props]
|
||||
(h/test "Verified status"
|
||||
(h/render [component-to-render (assoc component-props :status :verified)])
|
||||
(h/is-truthy (h/get-by-label-text :username-status-icon)))
|
||||
|
||||
(h/test "Contact status"
|
||||
(h/render [component-to-render (assoc component-props :status :contact)])
|
||||
(h/is-truthy (h/get-by-label-text :username-status-icon)))
|
||||
|
||||
(h/test "Untrustworthy status"
|
||||
(h/render [component-to-render (assoc component-props :status :untrustworthy)])
|
||||
(h/is-truthy (h/get-by-label-text :username-status-icon)))
|
||||
|
||||
(h/test "Untrustworthy contact status"
|
||||
(h/render [component-to-render (assoc component-props :status :untrustworthy-contact)])
|
||||
(let [icons (h/get-all-by-label-text :username-status-icon)]
|
||||
(h/is-truthy (aget icons 0))
|
||||
(h/is-truthy (aget icons 1))))
|
||||
|
||||
(h/test "Blocked status"
|
||||
(h/render [component-to-render (assoc component-props :status :blocked)])
|
||||
(h/is-truthy (h/get-by-label-text :username-status-icon))))
|
||||
|
||||
(h/describe "Text combinations - Username"
|
||||
(h/test "Renders default"
|
||||
(h/render [username/view {:username "Test username"}])
|
||||
(h/is-truthy (h/get-by-text "Test username")))
|
||||
|
||||
(h/describe "Render different :name-type values"
|
||||
(h/describe "default"
|
||||
(let [props {:name-type :default
|
||||
:username "Test username"}]
|
||||
|
||||
(h/test "default render"
|
||||
(h/render [username/view props])
|
||||
(h/is-truthy (h/get-by-text "Test username")))
|
||||
|
||||
(h/describe "All status are rendered"
|
||||
(test-all-status username/view props))))
|
||||
|
||||
(h/describe "ens"
|
||||
(let [props {:name-type :ens
|
||||
:username "test-username.eth"}]
|
||||
|
||||
(h/test "no status render"
|
||||
(h/render [username/view props])
|
||||
(h/is-truthy (h/get-by-text "test-username.eth")))
|
||||
|
||||
(h/describe "All status are rendered"
|
||||
(test-all-status username/view props))))
|
||||
|
||||
(h/describe "nickname"
|
||||
(let [props {:name-type :nickname
|
||||
:username "Nickname"
|
||||
:name "Real name"}]
|
||||
|
||||
(h/test "no status render"
|
||||
(h/render [username/view props])
|
||||
(h/is-truthy (h/get-by-text "Nickname"))
|
||||
(h/is-truthy (h/get-by-text "Real name")))
|
||||
|
||||
(h/describe "All status are rendered"
|
||||
(test-all-status username/view props))))))
|
||||
@@ -0,0 +1,30 @@
|
||||
(ns quo.components.text-combinations.username.style
|
||||
(:require [quo.foundations.colors :as colors]))
|
||||
|
||||
(def container
|
||||
{:flex-direction :row
|
||||
:height 32})
|
||||
|
||||
(def username-text-container
|
||||
{:flex-direction :row
|
||||
:align-items :flex-end})
|
||||
|
||||
(defn real-name-text
|
||||
[theme blur?]
|
||||
{:color (if blur?
|
||||
(colors/theme-colors colors/neutral-80-opa-40 colors/white-opa-40 theme)
|
||||
(colors/theme-colors colors/neutral-60 colors/neutral-40 theme))})
|
||||
|
||||
(defn real-name-dot
|
||||
[theme blur?]
|
||||
(assoc (real-name-text theme blur?) :margin-horizontal 6))
|
||||
|
||||
(defn status-icon-container
|
||||
[name-type status]
|
||||
(cond-> {:flex-direction :row
|
||||
:margin-left 4}
|
||||
(#{:default :ens} name-type) (assoc :margin-top 8
|
||||
:margin-bottom 4)
|
||||
(= :nickname name-type) (assoc :margin-top 10
|
||||
:margin-bottom 2)
|
||||
(= status :untrustworthy-contact) (assoc :margin-right 2)))
|
||||
@@ -0,0 +1,57 @@
|
||||
(ns quo.components.text-combinations.username.view
|
||||
(:require [quo.components.icon :as icon]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.text-combinations.username.style :as style]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.theme]
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(defn- username-text
|
||||
[{:keys [theme name-type username blur?]
|
||||
real-name :name}]
|
||||
[rn/view {:style style/username-text-container}
|
||||
[text/text
|
||||
{:size :heading-1
|
||||
:weight :semi-bold}
|
||||
username]
|
||||
(when (= name-type :nickname)
|
||||
[:<>
|
||||
[text/text
|
||||
{:style (style/real-name-dot theme blur?)
|
||||
:size :paragraph-1
|
||||
:weight :medium}
|
||||
"∙"]
|
||||
[text/text
|
||||
{:style (style/real-name-text theme blur?)
|
||||
:size :paragraph-1
|
||||
:weight :medium}
|
||||
real-name]])])
|
||||
|
||||
(defn- icon-20
|
||||
[icon-name theme color]
|
||||
[icon/icon icon-name
|
||||
{:accessibility-label :username-status-icon
|
||||
:size 20
|
||||
:color (colors/resolve-color color theme)}])
|
||||
|
||||
(defn status-icon
|
||||
[{:keys [theme name-type status]
|
||||
:or {name-type :default}}]
|
||||
[rn/view {:style (style/status-icon-container name-type status)}
|
||||
(case status
|
||||
:verified [icon-20 :i/verified theme :success]
|
||||
:contact [icon-20 :i/contact theme :blue]
|
||||
:untrustworthy [icon-20 :i/untrustworthy theme :danger]
|
||||
:blocked [icon-20 :i/block theme :danger]
|
||||
:untrustworthy-contact [:<>
|
||||
[icon-20 :i/untrustworthy theme :danger]
|
||||
[icon-20 :i/contact theme :blue]]
|
||||
nil)])
|
||||
|
||||
(defn view-internal
|
||||
[props]
|
||||
[rn/view {:style style/container}
|
||||
[username-text props]
|
||||
[status-icon props]])
|
||||
|
||||
(def view (quo.theme/with-theme view-internal))
|
||||
@@ -0,0 +1,34 @@
|
||||
(ns quo.components.utilities.token.loader
|
||||
(:require [clojure.java.io :as io]
|
||||
[clojure.string :as string]))
|
||||
|
||||
(def ^:private token-path "./resources/images/tokens/mainnet/")
|
||||
|
||||
(defn- clean-filename
|
||||
"Return a (string) filename without the .png extension and @<number>x suffix."
|
||||
[file]
|
||||
(first (string/split (str file) #"@|\.png")))
|
||||
|
||||
(defn- get-js-require
|
||||
[filename]
|
||||
(let [require-path (str "." filename ".png")]
|
||||
`(js/require ~require-path)))
|
||||
|
||||
(defn- get-file-key
|
||||
[filename]
|
||||
(-> filename
|
||||
(string/split #"\/")
|
||||
(peek)
|
||||
(string/lower-case)))
|
||||
|
||||
(defn get-tokens
|
||||
[]
|
||||
(let [files (file-seq (io/file token-path))
|
||||
png-filenames (keep (fn [file]
|
||||
(when (string/ends-with? file "png")
|
||||
(clean-filename file)))
|
||||
files)]
|
||||
(zipmap (map get-file-key png-filenames)
|
||||
(map get-js-require png-filenames))))
|
||||
|
||||
(defmacro resolve-tokens [] (get-tokens))
|
||||
@@ -0,0 +1,14 @@
|
||||
(ns quo.components.utilities.token.loader
|
||||
(:require-macros [quo.components.utilities.token.loader :as loader])
|
||||
(:require [clojure.string :as string]))
|
||||
|
||||
(def ^:private tokens (loader/resolve-tokens))
|
||||
|
||||
(defn- get-token-image*
|
||||
[token]
|
||||
(let [token-symbol (cond-> token
|
||||
(keyword? token) name
|
||||
:always string/lower-case)]
|
||||
(get tokens token-symbol)))
|
||||
|
||||
(def get-token-image (memoize get-token-image*))
|
||||
@@ -0,0 +1,58 @@
|
||||
(ns quo.components.utilities.token.view
|
||||
(:require [quo.components.utilities.token.loader :as token-loader]
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]
|
||||
[utils.number]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:cat
|
||||
[:map {:closed true}
|
||||
[:size {:optional true :default 32} [:or keyword? pos-int?]]
|
||||
[:token {:optional true} [:or keyword? string?]]
|
||||
[:style {:optional true} map?]
|
||||
;; Ignores `token` and uses this as parameter to `rn/image`'s source.
|
||||
[:image-source {:optional true} [:or string? map?]]
|
||||
;; If true, adds `data:image/png;base64,` as prefix to the string passed as `image-source`
|
||||
[:add-b64-prefix? {:optional true} boolean?]]]
|
||||
:any])
|
||||
|
||||
(defn- size->number
|
||||
"Remove `size-` prefix in size keywords and returns a number useful for styling."
|
||||
[size]
|
||||
(-> size name (subs 5) utils.number/parse-int))
|
||||
|
||||
(defn- token-style
|
||||
[style size]
|
||||
(let [size-number (if (keyword? size)
|
||||
(size->number size)
|
||||
size)]
|
||||
(assoc style
|
||||
:width size-number
|
||||
:height size-number)))
|
||||
|
||||
(def ^:private b64-png-image-prefix "data:image/png;base64,")
|
||||
|
||||
(defn view-internal
|
||||
"Render a token image.
|
||||
Props:
|
||||
- style: extra styles to apply to the `rn/image` component.
|
||||
- size: `:size-nn` or just `nn`, being `nn` any number. Defaults to 32.
|
||||
- token: string or keyword, it can contain upper case letters or not.
|
||||
E.g. all of these are valid and resolve to the same:
|
||||
:token/snt | :snt | :SNT | \"SNT\" | \"snt\".
|
||||
- image-source: Ignores `token` and uses this as parameter to `rn/image`'s source.
|
||||
- add-b64-prefix?: If true, adds `data:image/png;base64,` as prefix to the string
|
||||
passed as `image-source`.
|
||||
"
|
||||
[{:keys [token size style image-source add-b64-prefix?]
|
||||
:or {size 32}}]
|
||||
(let [b64-string (if (and image-source add-b64-prefix?)
|
||||
(str b64-png-image-prefix image-source)
|
||||
image-source)
|
||||
source (or b64-string (token-loader/get-token-image token))]
|
||||
[rn/image
|
||||
{:style (token-style style size)
|
||||
:source source}]))
|
||||
|
||||
(def view (schema/instrument #'view-internal ?schema))
|
||||
@@ -93,7 +93,7 @@
|
||||
:end {:x 1 :y 0}}])
|
||||
|
||||
(defn- user-account
|
||||
[]
|
||||
[_]
|
||||
(let [pressed? (reagent/atom false)
|
||||
on-press-in #(reset! pressed? true)
|
||||
on-press-out #(reset! pressed? false)]
|
||||
@@ -147,7 +147,7 @@
|
||||
[gradient-overview theme customization-color])])))))
|
||||
|
||||
(defn- add-account-view
|
||||
[]
|
||||
[_]
|
||||
(let [pressed? (reagent/atom false)]
|
||||
(fn [{:keys [on-press customization-color theme metrics?]}]
|
||||
[rn/pressable
|
||||
|
||||
@@ -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))
|
||||
@@ -2,17 +2,15 @@
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.components.wallet.network-amount.style :as style]
|
||||
[quo.foundations.resources :as resources]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [amount token theme]}]
|
||||
[rn/view {:style style/container}
|
||||
[rn/image
|
||||
{:source (resources/get-token token)
|
||||
:style {:width 12 :height 12}}]
|
||||
[token/view {:token token :size :size-12}]
|
||||
[text/text
|
||||
{:weight :medium
|
||||
:size :paragraph-2
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -16,10 +16,6 @@
|
||||
:flex-direction :row
|
||||
:justify-content :space-between})
|
||||
|
||||
(def token
|
||||
{:width 32
|
||||
:height 32})
|
||||
|
||||
(defn text-input
|
||||
[theme]
|
||||
(merge typography/heading-1
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
[quo.components.dividers.divider-line.view :as divider-line]
|
||||
[quo.components.markdown.text :as text]
|
||||
[quo.components.tags.network-tags.view :as network-tag]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[quo.components.wallet.token-input.style :as style]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.foundations.common :as common]
|
||||
[quo.foundations.resources :as resources]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[reagent.core :as reagent]))
|
||||
@@ -41,9 +41,7 @@
|
||||
:style {:flex-direction :row
|
||||
:flex-grow 1
|
||||
:align-items :flex-end}}
|
||||
[rn/image
|
||||
{:style style/token
|
||||
:source (resources/get-token token)}]
|
||||
[token/view {:token token :size :size-32}]
|
||||
[rn/text-input
|
||||
(cond-> {:auto-focus true
|
||||
:ref #(reset! input-ref %)
|
||||
|
||||
@@ -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))
|
||||
@@ -19,10 +19,10 @@
|
||||
(h/test "Context tag rendered"
|
||||
(h/render [transaction-summary/view
|
||||
{:transaction :send
|
||||
:first-tag {:size 24
|
||||
:type :token
|
||||
:token-name "SNT"
|
||||
:amount 1500}}])
|
||||
:first-tag {:size 24
|
||||
:type :token
|
||||
:token "SNT"
|
||||
:amount 1500}}])
|
||||
(h/is-truthy (h/query-by-label-text :context-tag))))
|
||||
|
||||
|
||||
|
||||
@@ -141,11 +141,14 @@
|
||||
quo.components.tags.token-tag.view
|
||||
quo.components.text-combinations.channel-name.view
|
||||
quo.components.text-combinations.standard-title.view
|
||||
quo.components.text-combinations.username.view
|
||||
quo.components.text-combinations.view
|
||||
quo.components.utilities.token.view
|
||||
quo.components.wallet.account-card.view
|
||||
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 +157,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))
|
||||
@@ -383,12 +387,17 @@
|
||||
(def channel-name quo.components.text-combinations.channel-name.view/view)
|
||||
(def standard-title quo.components.text-combinations.standard-title.view/view)
|
||||
(def text-combinations quo.components.text-combinations.view/view)
|
||||
(def username quo.components.text-combinations.username.view/view)
|
||||
|
||||
;;;; Utilities - Outside of design system
|
||||
(def token quo.components.utilities.token.view/view)
|
||||
|
||||
;;;; Wallet
|
||||
(def account-card quo.components.wallet.account-card.view/view)
|
||||
(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 +408,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)
|
||||
|
||||
@@ -77,9 +77,11 @@
|
||||
[quo.components.tags.summary-tag.component-spec]
|
||||
[quo.components.tags.tiny-tag.component-spec]
|
||||
[quo.components.text-combinations.channel-name.component-spec]
|
||||
[quo.components.text-combinations.username.component-spec]
|
||||
[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 +89,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]))
|
||||
|
||||
@@ -285,10 +285,6 @@
|
||||
(get-in colors-map [color suffix]))))
|
||||
|
||||
(defn- resolve-color*
|
||||
"(resolve-color color theme opacity)
|
||||
color hex string or keyword (resolves from custom, network and semantic colors)
|
||||
theme :light/:dark
|
||||
opacity 0-100 (optional) - if set theme is ignored and goes to 50 suffix internally"
|
||||
([color theme]
|
||||
(resolve-color* color theme nil))
|
||||
([color theme opacity]
|
||||
@@ -300,7 +296,12 @@
|
||||
suffix (get-from-colors-map suffix)
|
||||
opacity (alpha (/ opacity 100))))))
|
||||
|
||||
(def resolve-color (memoize resolve-color*))
|
||||
(def resolve-color
|
||||
"(resolve-color color theme opacity)
|
||||
color hex string or keyword (resolves from custom, network and semantic colors)
|
||||
theme :light/:dark
|
||||
opacity 0-100 (optional) - if set theme is ignored and goes to 50 suffix internally"
|
||||
(memoize resolve-color*))
|
||||
|
||||
(def ^{:deprecated true :superseded-by "resolve-color"}
|
||||
custom-color
|
||||
|
||||
@@ -3,8 +3,3 @@
|
||||
(def currency-label
|
||||
{:eur "€"
|
||||
:usd "$"})
|
||||
|
||||
(def token-label
|
||||
{:eth "Ethereum"
|
||||
:snt "Status"
|
||||
:dai "Dai"})
|
||||
|
||||
@@ -32,197 +32,6 @@
|
||||
[k]
|
||||
(get dapps k))
|
||||
|
||||
(def tokens
|
||||
{:0-native (js/require "../resources/images/tokens/mainnet/0-native.png")
|
||||
:0xbtc (js/require "../resources/images/tokens/mainnet/0XBTC.png")
|
||||
:1st (js/require "../resources/images/tokens/mainnet/1ST.png")
|
||||
:abt (js/require "../resources/images/tokens/mainnet/ABT.png")
|
||||
:abyss (js/require "../resources/images/tokens/mainnet/ABYSS.png")
|
||||
:ae (js/require "../resources/images/tokens/mainnet/AE.png")
|
||||
:agld (js/require "../resources/images/tokens/mainnet/AGLD.png")
|
||||
:akro (js/require "../resources/images/tokens/mainnet/AKRO.png")
|
||||
:amb (js/require "../resources/images/tokens/mainnet/AMB.png")
|
||||
:ampl (js/require "../resources/images/tokens/mainnet/AMPL.png")
|
||||
:ant (js/require "../resources/images/tokens/mainnet/ANT.png")
|
||||
:appc (js/require "../resources/images/tokens/mainnet/APPC.png")
|
||||
:ast (js/require "../resources/images/tokens/mainnet/AST.png")
|
||||
:atmchain (js/require "../resources/images/tokens/mainnet/ATMChain.png")
|
||||
:ausdc (js/require "../resources/images/tokens/mainnet/aUSDC.png")
|
||||
:bal (js/require "../resources/images/tokens/mainnet/BAL.png")
|
||||
:bam (js/require "../resources/images/tokens/mainnet/BAM.png")
|
||||
:band (js/require "../resources/images/tokens/mainnet/BAND.png")
|
||||
:bat (js/require "../resources/images/tokens/mainnet/BAT.png")
|
||||
:blt (js/require "../resources/images/tokens/mainnet/BLT.png")
|
||||
:blz (js/require "../resources/images/tokens/mainnet/BLZ.png")
|
||||
:bnb (js/require "../resources/images/tokens/mainnet/BNB.png")
|
||||
:bnt (js/require "../resources/images/tokens/mainnet/BNT.png")
|
||||
:brln (js/require "../resources/images/tokens/mainnet/BRLN.png")
|
||||
:btm (js/require "../resources/images/tokens/mainnet/BTM.png")
|
||||
:btu (js/require "../resources/images/tokens/mainnet/BTU.png")
|
||||
:cdai (js/require "../resources/images/tokens/mainnet/cDAI.png")
|
||||
:cdt (js/require "../resources/images/tokens/mainnet/CDT.png")
|
||||
:centra (js/require "../resources/images/tokens/mainnet/Centra.png")
|
||||
:cfi (js/require "../resources/images/tokens/mainnet/CFI.png")
|
||||
:ck (js/require "../resources/images/tokens/mainnet/CK.png")
|
||||
:cnd (js/require "../resources/images/tokens/mainnet/CND.png")
|
||||
:cob (js/require "../resources/images/tokens/mainnet/COB.png")
|
||||
:comp (js/require "../resources/images/tokens/mainnet/COMP.png")
|
||||
:crv (js/require "../resources/images/tokens/mainnet/CRV.png")
|
||||
:cvc (js/require "../resources/images/tokens/mainnet/CVC.png")
|
||||
:dai (js/require "../resources/images/tokens/mainnet/DAI.png")
|
||||
:dat (js/require "../resources/images/tokens/mainnet/DAT.png")
|
||||
:data (js/require "../resources/images/tokens/mainnet/DATA.png")
|
||||
:dcn (js/require "../resources/images/tokens/mainnet/DCN.png")
|
||||
:dgd (js/require "../resources/images/tokens/mainnet/DGD.png")
|
||||
:dgx (js/require "../resources/images/tokens/mainnet/DGX.png")
|
||||
:dlt (js/require "../resources/images/tokens/mainnet/DLT.png")
|
||||
:dnt (js/require "../resources/images/tokens/mainnet/DNT.png")
|
||||
:dpy (js/require "../resources/images/tokens/mainnet/DPY.png")
|
||||
:drt (js/require "../resources/images/tokens/mainnet/DRT.png")
|
||||
:dta (js/require "../resources/images/tokens/mainnet/DTA.png")
|
||||
:edg (js/require "../resources/images/tokens/mainnet/EDG.png")
|
||||
:edo (js/require "../resources/images/tokens/mainnet/EDO.png")
|
||||
:ekg (js/require "../resources/images/tokens/mainnet/EKG.png")
|
||||
:eko (js/require "../resources/images/tokens/mainnet/EKO.png")
|
||||
:elf (js/require "../resources/images/tokens/mainnet/ELF.png")
|
||||
:emona (js/require "../resources/images/tokens/mainnet/EMONA.png")
|
||||
:eng (js/require "../resources/images/tokens/mainnet/ENG.png")
|
||||
:enj (js/require "../resources/images/tokens/mainnet/ENJ.png")
|
||||
:ens (js/require "../resources/images/tokens/mainnet/ENS.png")
|
||||
:eos (js/require "../resources/images/tokens/mainnet/EOS.png")
|
||||
:equad (js/require "../resources/images/tokens/mainnet/EQUAD.png")
|
||||
:eth (js/require "../resources/images/tokens/mainnet/ETH-token.png")
|
||||
:eth2x-fli (js/require "../resources/images/tokens/mainnet/ETH2x-FLI.png")
|
||||
:ethos (js/require "../resources/images/tokens/mainnet/ETHOS.png")
|
||||
:evx (js/require "../resources/images/tokens/mainnet/EVX.png")
|
||||
:fuel (js/require "../resources/images/tokens/mainnet/FUEL.png")
|
||||
:fun (js/require "../resources/images/tokens/mainnet/FUN.png")
|
||||
:fxc (js/require "../resources/images/tokens/mainnet/FXC.png")
|
||||
:gdc (js/require "../resources/images/tokens/mainnet/GDC.png")
|
||||
:gen (js/require "../resources/images/tokens/mainnet/GEN.png")
|
||||
:glm (js/require "../resources/images/tokens/mainnet/GLM.png")
|
||||
:gno (js/require "../resources/images/tokens/mainnet/GNO.png")
|
||||
:gnt (js/require "../resources/images/tokens/mainnet/GNT.png")
|
||||
:grid (js/require "../resources/images/tokens/mainnet/GRID.png")
|
||||
:grt (js/require "../resources/images/tokens/mainnet/GRT.png")
|
||||
:hez (js/require "../resources/images/tokens/mainnet/HEZ.png")
|
||||
:hst (js/require "../resources/images/tokens/mainnet/HST.png")
|
||||
:ht (js/require "../resources/images/tokens/mainnet/HT.png")
|
||||
:icn (js/require "../resources/images/tokens/mainnet/ICN.png")
|
||||
:icos (js/require "../resources/images/tokens/mainnet/ICOS.png")
|
||||
:iost (js/require "../resources/images/tokens/mainnet/IOST.png")
|
||||
:kdo (js/require "../resources/images/tokens/mainnet/KDO.png")
|
||||
:kin (js/require "../resources/images/tokens/mainnet/KIN.png")
|
||||
:knc (js/require "../resources/images/tokens/mainnet/KNC.png")
|
||||
:kudos (js/require "../resources/images/tokens/mainnet/Kudos.png")
|
||||
:lend (js/require "../resources/images/tokens/mainnet/LEND.png")
|
||||
:link (js/require "../resources/images/tokens/mainnet/LINK.png")
|
||||
:lisk (js/require "../resources/images/tokens/mainnet/LISK.png")
|
||||
:loom (js/require "../resources/images/tokens/mainnet/LOOM.png")
|
||||
:lpt (js/require "../resources/images/tokens/mainnet/LPT.png")
|
||||
:lrc (js/require "../resources/images/tokens/mainnet/LRC.png")
|
||||
:mana (js/require "../resources/images/tokens/mainnet/MANA.png")
|
||||
:mco (js/require "../resources/images/tokens/mainnet/MCO.png")
|
||||
:mda (js/require "../resources/images/tokens/mainnet/MDA.png")
|
||||
:met (js/require "../resources/images/tokens/mainnet/MET.png")
|
||||
:mfg (js/require "../resources/images/tokens/mainnet/MFG.png")
|
||||
:mgo (js/require "../resources/images/tokens/mainnet/MGO.png")
|
||||
:mkr (js/require "../resources/images/tokens/mainnet/MKR.png")
|
||||
:mln (js/require "../resources/images/tokens/mainnet/MLN.png")
|
||||
:moc (js/require "../resources/images/tokens/mainnet/MOC.png")
|
||||
:mod (js/require "../resources/images/tokens/mainnet/MOD.png")
|
||||
:mth (js/require "../resources/images/tokens/mainnet/MTH.png")
|
||||
:mtl (js/require "../resources/images/tokens/mainnet/MTL.png")
|
||||
:myb (js/require "../resources/images/tokens/mainnet/MYB.png")
|
||||
:nexo (js/require "../resources/images/tokens/mainnet/NEXO.png")
|
||||
:nexxo (js/require "../resources/images/tokens/mainnet/NEXXO.png")
|
||||
:nmr (js/require "../resources/images/tokens/mainnet/NMR.png")
|
||||
:npxs (js/require "../resources/images/tokens/mainnet/NPXS.png")
|
||||
:ogn (js/require "../resources/images/tokens/mainnet/OGN.png")
|
||||
:omg (js/require "../resources/images/tokens/mainnet/OMG.png")
|
||||
:otn (js/require "../resources/images/tokens/mainnet/OTN.png")
|
||||
:oxt (js/require "../resources/images/tokens/mainnet/OXT.png")
|
||||
:pax (js/require "../resources/images/tokens/mainnet/PAX.png")
|
||||
:paxg (js/require "../resources/images/tokens/mainnet/PAXG.png")
|
||||
:pay (js/require "../resources/images/tokens/mainnet/PAY.png")
|
||||
:pbtc (js/require "../resources/images/tokens/mainnet/PBTC.png")
|
||||
:plr (js/require "../resources/images/tokens/mainnet/PLR.png")
|
||||
:poe (js/require "../resources/images/tokens/mainnet/POE.png")
|
||||
:poly (js/require "../resources/images/tokens/mainnet/POLY.png")
|
||||
:powr (js/require "../resources/images/tokens/mainnet/POWR.png")
|
||||
:ppp (js/require "../resources/images/tokens/mainnet/PPP.png")
|
||||
:ppt (js/require "../resources/images/tokens/mainnet/PPT.png")
|
||||
:pt (js/require "../resources/images/tokens/mainnet/PT.png")
|
||||
:qkc (js/require "../resources/images/tokens/mainnet/QKC.png")
|
||||
:qrl (js/require "../resources/images/tokens/mainnet/QRL.png")
|
||||
:qsp (js/require "../resources/images/tokens/mainnet/QSP.png")
|
||||
:r (js/require "../resources/images/tokens/mainnet/R.png")
|
||||
:rae (js/require "../resources/images/tokens/mainnet/RAE.png")
|
||||
:rare (js/require "../resources/images/tokens/mainnet/RARE.png")
|
||||
:rcn (js/require "../resources/images/tokens/mainnet/RCN.png")
|
||||
:rdn (js/require "../resources/images/tokens/mainnet/RDN.png")
|
||||
:ren (js/require "../resources/images/tokens/mainnet/REN.png")
|
||||
:rep (js/require "../resources/images/tokens/mainnet/REP.png")
|
||||
:req (js/require "../resources/images/tokens/mainnet/REQ.png")
|
||||
:rhoc (js/require "../resources/images/tokens/mainnet/RHOC.png")
|
||||
:rlc (js/require "../resources/images/tokens/mainnet/RLC.png")
|
||||
:rol (js/require "../resources/images/tokens/mainnet/ROL.png")
|
||||
:sai (js/require "../resources/images/tokens/mainnet/SAI.png")
|
||||
:salt (js/require "../resources/images/tokens/mainnet/SALT.png")
|
||||
:san (js/require "../resources/images/tokens/mainnet/SAN.png")
|
||||
:sngls (js/require "../resources/images/tokens/mainnet/SNGLS.png")
|
||||
:snm (js/require "../resources/images/tokens/mainnet/SNM.png")
|
||||
:snt (js/require "../resources/images/tokens/mainnet/SNT.png")
|
||||
:snx (js/require "../resources/images/tokens/mainnet/SNX.png")
|
||||
:socks (js/require "../resources/images/tokens/mainnet/SOCKS.png")
|
||||
:spank (js/require "../resources/images/tokens/mainnet/SPANK.png")
|
||||
:spike (js/require "../resources/images/tokens/mainnet/SPIKE.png")
|
||||
:spn (js/require "../resources/images/tokens/mainnet/SPN.png")
|
||||
:st (js/require "../resources/images/tokens/mainnet/ST.png")
|
||||
:storj (js/require "../resources/images/tokens/mainnet/STORJ.png")
|
||||
:storm (js/require "../resources/images/tokens/mainnet/STORM.png")
|
||||
:strk (js/require "../resources/images/tokens/mainnet/STRK.png")
|
||||
:stx (js/require "../resources/images/tokens/mainnet/STX.png")
|
||||
:sub (js/require "../resources/images/tokens/mainnet/SUB.png")
|
||||
:supr (js/require "../resources/images/tokens/mainnet/SUPR.png")
|
||||
:susd (js/require "../resources/images/tokens/mainnet/sUSD.png")
|
||||
:taas (js/require "../resources/images/tokens/mainnet/TAAS.png")
|
||||
:taud (js/require "../resources/images/tokens/mainnet/TAUD.png")
|
||||
:tcad (js/require "../resources/images/tokens/mainnet/TCAD.png")
|
||||
:tgbp (js/require "../resources/images/tokens/mainnet/TGBP.png")
|
||||
:tkn (js/require "../resources/images/tokens/mainnet/TKN.png")
|
||||
:tkx (js/require "../resources/images/tokens/mainnet/TKX.png")
|
||||
:tnt (js/require "../resources/images/tokens/mainnet/TNT.png")
|
||||
:trst (js/require "../resources/images/tokens/mainnet/TRST.png")
|
||||
:trx (js/require "../resources/images/tokens/mainnet/TRX.png")
|
||||
:tusd (js/require "../resources/images/tokens/mainnet/TUSD.png")
|
||||
:ubi (js/require "../resources/images/tokens/mainnet/UBI.png")
|
||||
:ubt (js/require "../resources/images/tokens/mainnet/UBT.png")
|
||||
:ukg (js/require "../resources/images/tokens/mainnet/UKG.png")
|
||||
:uni (js/require "../resources/images/tokens/mainnet/UNI.png")
|
||||
:upp (js/require "../resources/images/tokens/mainnet/UPP.png")
|
||||
:usdc (js/require "../resources/images/tokens/mainnet/USDC.png")
|
||||
:usds (js/require "../resources/images/tokens/mainnet/USDS.png")
|
||||
:usdt (js/require "../resources/images/tokens/mainnet/USDT.png")
|
||||
:veri (js/require "../resources/images/tokens/mainnet/VERI.png")
|
||||
:vgx (js/require "../resources/images/tokens/mainnet/VGX.png")
|
||||
:vib (js/require "../resources/images/tokens/mainnet/VIB.png")
|
||||
:wabi (js/require "../resources/images/tokens/mainnet/WaBi.png")
|
||||
:wbtc (js/require "../resources/images/tokens/mainnet/WBTC.png")
|
||||
:weth (js/require "../resources/images/tokens/mainnet/WETH.png")
|
||||
:wings (js/require "../resources/images/tokens/mainnet/WINGS.png")
|
||||
:wtc (js/require "../resources/images/tokens/mainnet/WTC.png")
|
||||
:xaur (js/require "../resources/images/tokens/mainnet/XAUR.png")
|
||||
:xpa (js/require "../resources/images/tokens/mainnet/XPA.png")
|
||||
:xrl (js/require "../resources/images/tokens/mainnet/XRL.png")
|
||||
:xuc (js/require "../resources/images/tokens/mainnet/XUC.png")
|
||||
:zrx (js/require "../resources/images/tokens/mainnet/ZRX.png")
|
||||
:zsc (js/require "../resources/images/tokens/mainnet/ZSC.png")})
|
||||
|
||||
(defn get-token
|
||||
[k]
|
||||
(get tokens k))
|
||||
|
||||
(def ^:private networks
|
||||
{:arbitrum (js/require "../resources/images/networks/Arbitrum.png")
|
||||
:ethereum (js/require "../resources/images/networks/Ethereum.png")
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
(ns react-native.blob
|
||||
(:require ["react-native-blob-util" :default ReactNativeBlobUtil]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
(defn fetch
|
||||
[base64-uri config on-success]
|
||||
(-> (.config ReactNativeBlobUtil (clj->js config))
|
||||
(.fetch "GET" base64-uri)
|
||||
(.then #(on-success (.path %)))
|
||||
(.catch #(log/error "could not download uri" {:error %}))))
|
||||
@@ -1,64 +0,0 @@
|
||||
(ns status-im.chat.models.gaps
|
||||
(:require
|
||||
[status-im.mailserver.core :as mailserver]
|
||||
[status-im2.contexts.chat.messages.list.events :as message-list]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(rf/defn gaps-filled
|
||||
{:events [:gaps/filled]}
|
||||
[{:keys [db] :as cofx} chat-id message-ids]
|
||||
(rf/merge
|
||||
cofx
|
||||
{:db (-> db
|
||||
(update-in [:messages chat-id] (fn [messages] (apply dissoc messages message-ids)))
|
||||
(dissoc :mailserver/fetching-gaps-in-progress))}
|
||||
(message-list/rebuild-message-list chat-id)))
|
||||
|
||||
(rf/defn gaps-failed
|
||||
{:events [:gaps/failed]}
|
||||
[{:keys [db]} chat-id gap-ids error]
|
||||
(log/error "failed to fetch gaps" chat-id gap-ids error)
|
||||
{:db (dissoc db :mailserver/fetching-gaps-in-progress)})
|
||||
|
||||
(rf/defn sync-chat-from-sync-from-failed
|
||||
{:events [::sync-chat-from-sync-from-failed]}
|
||||
[{:keys [db]} chat-id error]
|
||||
(log/error "failed to sync chat" chat-id error)
|
||||
{:db (dissoc db :mailserver/fetching-gaps-in-progress)})
|
||||
|
||||
(rf/defn sync-chat-from-sync-from-success
|
||||
{:events [::sync-chat-from-sync-from-success]}
|
||||
[{:keys [db] :as cofx} chat-id synced-from]
|
||||
(log/debug "synced success" chat-id synced-from)
|
||||
{:db
|
||||
(-> db
|
||||
(assoc-in [:chats chat-id :synced-from] synced-from)
|
||||
(dissoc :mailserver/fetching-gaps-in-progress))})
|
||||
|
||||
(rf/defn fill-gaps
|
||||
[_ chat-id gap-ids]
|
||||
{:json-rpc/call [{:method "wakuext_fillGaps"
|
||||
:params [chat-id gap-ids]
|
||||
:on-success #(rf/dispatch [:gaps/filled chat-id gap-ids %])
|
||||
:on-error #(rf/dispatch [:gaps/failed chat-id gap-ids %])}]})
|
||||
|
||||
(rf/defn sync-chat-from-sync-from
|
||||
[_ chat-id]
|
||||
(log/debug "syncing chat from sync from")
|
||||
{:json-rpc/call [{:method "wakuext_syncChatFromSyncedFrom"
|
||||
:params [chat-id]
|
||||
:on-success #(rf/dispatch [::sync-chat-from-sync-from-success chat-id %])
|
||||
:on-error #(rf/dispatch [::sync-chat-from-sync-from-failed chat-id %])}]})
|
||||
|
||||
(rf/defn chat-ui-fill-gaps
|
||||
{:events [:chat.ui/fill-gaps]}
|
||||
[{:keys [db] :as cofx} chat-id gap-ids]
|
||||
(let [use-status-nodes? (mailserver/fetch-use-mailservers? {:db db})]
|
||||
(log/info "filling gaps if use-status-nodes = true" chat-id gap-ids)
|
||||
(when use-status-nodes?
|
||||
(rf/merge cofx
|
||||
{:db (assoc db :mailserver/fetching-gaps-in-progress gap-ids)}
|
||||
(if (= gap-ids #{:first-gap})
|
||||
(sync-chat-from-sync-from chat-id)
|
||||
(fill-gaps chat-id gap-ids))))))
|
||||
@@ -1,73 +0,0 @@
|
||||
(ns status-im.chat.models.images
|
||||
(:require
|
||||
["react-native-blob-util" :default ReactNativeBlobUtil]
|
||||
[re-frame.core :as re-frame]
|
||||
[react-native.cameraroll :as cameraroll]
|
||||
[react-native.fs :as fs]
|
||||
[react-native.platform :as platform]
|
||||
[react-native.share :as share]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im2.constants :as constants]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(def temp-image-url (str (fs/cache-dir) "/StatusIm_Image.jpeg"))
|
||||
|
||||
(defn download-image-http
|
||||
[base64-uri on-success]
|
||||
(-> (.config ReactNativeBlobUtil
|
||||
(clj->js {:trusty platform/ios?
|
||||
:path temp-image-url}))
|
||||
(.fetch "GET" base64-uri)
|
||||
(.then #(on-success (.path %)))
|
||||
(.catch #(log/error "could not download image" {:error %}))))
|
||||
|
||||
(defn share-image
|
||||
[uri]
|
||||
(download-image-http uri
|
||||
(fn [downloaded-url]
|
||||
(share/open {:url (str (when platform/android? "file://") downloaded-url)
|
||||
:isNewTask true}
|
||||
#(fs/unlink downloaded-url)
|
||||
#(fs/unlink downloaded-url)))))
|
||||
|
||||
(defn save-image-to-gallery
|
||||
[base64-uri on-success]
|
||||
(-> (download-image-http base64-uri cameraroll/save-image)
|
||||
(.then on-success)
|
||||
(.catch #(log/error (str "could not save image to gallery" %)))))
|
||||
|
||||
(re-frame/reg-fx
|
||||
::chat-open-image-picker-camera
|
||||
(fn [current-chat-id]
|
||||
(react/show-image-picker-camera
|
||||
#(re-frame/dispatch [:chat.ui/image-captured current-chat-id (.-path %)])
|
||||
{})))
|
||||
|
||||
(rf/defn image-captured
|
||||
{:events [:chat.ui/image-captured]}
|
||||
[{:keys [db]} chat-id uri]
|
||||
(let [current-chat-id (or chat-id (:current-chat-id db))
|
||||
images (get-in db [:chat/inputs current-chat-id :metadata :sending-image])]
|
||||
(when (and (< (count images) constants/max-album-photos)
|
||||
(not (get images uri)))
|
||||
{::image-selected [uri current-chat-id]})))
|
||||
|
||||
(rf/defn clear-sending-images
|
||||
{:events [:chat.ui/clear-sending-images]}
|
||||
[{:keys [db]}]
|
||||
{:db (update-in db [:chat/inputs (:current-chat-id db) :metadata] assoc :sending-image {})})
|
||||
|
||||
(rf/defn image-unselected
|
||||
{:events [:chat.ui/image-unselected]}
|
||||
[{:keys [db]} original]
|
||||
(let [current-chat-id (:current-chat-id db)]
|
||||
{:db (update-in db [:chat/inputs current-chat-id :metadata :sending-image] dissoc (:uri original))}))
|
||||
|
||||
(rf/defn chat-show-image-picker-camera
|
||||
{:events [:chat.ui/show-image-picker-camera]}
|
||||
[{:keys [db]} chat-id]
|
||||
(let [current-chat-id (or chat-id (:current-chat-id db))
|
||||
images (get-in db [:chat/inputs current-chat-id :metadata :sending-image])]
|
||||
(when (< (count images) constants/max-album-photos)
|
||||
{::chat-open-image-picker-camera current-chat-id})))
|
||||
@@ -5,7 +5,6 @@
|
||||
[goog.object :as object]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.chat.models.mentions :as mentions]
|
||||
[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]
|
||||
@@ -139,14 +138,21 @@
|
||||
(let [current-chat-id (:current-chat-id db)]
|
||||
{:db (assoc-in db [:chat/inputs current-chat-id :metadata :responding-to-message] nil)}))
|
||||
|
||||
(defn emoji-only-content?
|
||||
"Determines if text is just an emoji"
|
||||
[{:keys [text response-to]}]
|
||||
(and (not response-to)
|
||||
(string? text)
|
||||
(re-matches constants/regx-emoji text)))
|
||||
|
||||
(defn build-text-message
|
||||
[{:keys [db]} input-text current-chat-id]
|
||||
(when-not (string/blank? input-text)
|
||||
(let [{:keys [message-id]}
|
||||
(get-in db [:chat/inputs current-chat-id :metadata :responding-to-message])
|
||||
preferred-name (get-in db [:profile/profile :preferred-name])
|
||||
emoji? (message-content/emoji-only-content? {:text input-text
|
||||
:response-to message-id})]
|
||||
emoji? (emoji-only-content? {:text input-text
|
||||
:response-to message-id})]
|
||||
{:chat-id current-chat-id
|
||||
:content-type (if emoji?
|
||||
constants/content-type-emoji
|
||||
@@ -243,7 +249,7 @@
|
||||
{:json-rpc/call [{:method "wakuext_editMessage"
|
||||
:params [{:id message-id
|
||||
:text text
|
||||
:content-type (if (message-content/emoji-only-content?
|
||||
:content-type (if (emoji-only-content?
|
||||
{:text text
|
||||
:response-to quoted-message})
|
||||
constants/content-type-emoji
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
[status-im2.contexts.chat.messages.delete-message.events :as delete-message]
|
||||
[status-im2.contexts.chat.messages.list.events :as message-list]
|
||||
[status-im2.contexts.chat.messages.list.state :as view.state]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn- message-loaded?
|
||||
@@ -116,30 +115,12 @@
|
||||
(when (and (:current-chat-id db) (= "active" (:app-state db)))
|
||||
[{:ms 100 :dispatch [:chat/mark-all-as-read (:current-chat-id db)]}]))}))
|
||||
|
||||
(rf/defn update-db-message-status
|
||||
[{:keys [db] :as cofx} chat-id message-id status]
|
||||
(when (get-in db [:messages chat-id message-id])
|
||||
(rf/merge cofx
|
||||
{:db (assoc-in db
|
||||
[:messages chat-id message-id :outgoing-status]
|
||||
status)})))
|
||||
|
||||
(rf/defn update-message-status
|
||||
[{:keys [db] :as cofx} chat-id message-id status]
|
||||
(rf/merge cofx
|
||||
(update-db-message-status chat-id message-id status)))
|
||||
|
||||
(rf/defn resend-message
|
||||
[{:keys [db] :as cofx} chat-id message-id]
|
||||
(rf/merge cofx
|
||||
{:json-rpc/call [{:method "wakuext_reSendChatMessage"
|
||||
:params [message-id]
|
||||
:on-success #(log/debug "re-sent message successfully")
|
||||
:on-error #(log/error "failed to re-send message" %)}]}
|
||||
(update-message-status chat-id message-id :sending)))
|
||||
[{:keys [db]} chat-id message-id status]
|
||||
(when (get-in db [:messages chat-id message-id])
|
||||
{:db (assoc-in db [:messages chat-id message-id :outgoing-status] status)}))
|
||||
|
||||
(rf/defn handle-removed-messages
|
||||
{:events [::handle-removed-messages]}
|
||||
[{:keys [db] :as cofx} removed-messages]
|
||||
(let [mark-as-deleted-fx (->> removed-messages
|
||||
(map #(assoc %
|
||||
@@ -166,14 +147,6 @@
|
||||
(concat mark-as-seen-fx)
|
||||
(conj remove-messages-fx)))))
|
||||
|
||||
(comment
|
||||
(handle-removed-messages
|
||||
{:db {:messages {:c1 {:m1 {:chat-id :c1 :message-id :m1}
|
||||
:m2 {:chat-id :c1 :message-id :m2}}
|
||||
:c2 {:m3 {:chat-id :c2 :message-id :m3}
|
||||
:m4 {:chat-id :c2 :message-id :m4}}}}}
|
||||
[:m1 :m3]))
|
||||
|
||||
(defn remove-cleared-message
|
||||
[messages cleared-at]
|
||||
(into {}
|
||||
@@ -182,7 +155,6 @@
|
||||
messages)))
|
||||
|
||||
(rf/defn handle-cleared-histories-messages
|
||||
{:events [::handle-cleared-hisotories-messages]}
|
||||
[{:keys [db]} cleared-histories]
|
||||
{:db (reduce (fn [acc current]
|
||||
(update-in acc
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
(ns status-im.chat.models.message-content
|
||||
(:require
|
||||
[status-im2.constants :as constants]))
|
||||
|
||||
(defn emoji-only-content?
|
||||
"Determines if text is just an emoji"
|
||||
[{:keys [text response-to]}]
|
||||
(and (not response-to)
|
||||
(string? text)
|
||||
(re-matches constants/regx-emoji text)))
|
||||
@@ -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 %])}]})
|
||||
@@ -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
|
||||
|
||||
@@ -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 %)))))
|
||||
@@ -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)))
|
||||
@@ -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
@@ -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])]
|
||||
|
||||
@@ -10,13 +10,9 @@
|
||||
status-im.bootnodes.core
|
||||
status-im.browser.core
|
||||
status-im.browser.permissions
|
||||
status-im.chat.models.gaps
|
||||
status-im.chat.models.images
|
||||
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
|
||||
@@ -43,12 +39,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]
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
[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]
|
||||
@@ -278,7 +277,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]}))
|
||||
|
||||
@@ -96,8 +96,6 @@
|
||||
:contact (handle-view-profile cofx data)
|
||||
:browser (handle-browse cofx data)
|
||||
:eip681 (handle-eip681 cofx data)
|
||||
;; Re-enable with https://github.com/status-im/status-mobile/issues/13429
|
||||
;;:wallet-connect (handle-wallet-connect cofx data)
|
||||
:localpairing (handle-local-pairing cofx data)
|
||||
(do
|
||||
(log/info "Unable to find matcher for scanned value"
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -121,14 +121,6 @@
|
||||
(reg-root-key-sub :signing/tx :signing/tx)
|
||||
(reg-root-key-sub :signing/edit-fee :signing/edit-fee)
|
||||
|
||||
;; wallet connect
|
||||
(reg-root-key-sub :wallet-connect/proposal-metadata :wallet-connect/proposal-metadata)
|
||||
(reg-root-key-sub :wallet-connect/enabled? :wallet-connect/enabled?)
|
||||
(reg-root-key-sub :wallet-connect/session-connected :wallet-connect/session-connected)
|
||||
(reg-root-key-sub :wallet-connect/showing-app-management-sheet?
|
||||
:wallet-connect/showing-app-management-sheet?)
|
||||
(reg-root-key-sub :wallet-connect/sessions :wallet-connect/sessions)
|
||||
(reg-root-key-sub :wallet-connect/session-managed :wallet-connect/session-managed)
|
||||
(reg-root-key-sub :contact-requests/pending :contact-requests/pending)
|
||||
|
||||
(reg-root-key-sub :bug-report/description-error :bug-report/description-error)
|
||||
|
||||
@@ -98,17 +98,6 @@
|
||||
{:public-key chat-id
|
||||
:photo-container (:default-chat-icon styles)}])])
|
||||
|
||||
(defn chat-icon-view-toolbar
|
||||
[chat-id group-chat name color emoji size]
|
||||
[emoji-chat-icon-view chat-id group-chat name emoji
|
||||
{:container (styles/container-chat-toolbar size)
|
||||
:size size
|
||||
:chat-icon (styles/chat-icon-chat-toolbar size)
|
||||
:default-chat-icon (styles/default-chat-icon-chat-toolbar color size)
|
||||
:default-chat-icon-text (if (string/blank? emoji)
|
||||
(styles/default-chat-icon-text size)
|
||||
(styles/emoji-chat-icon-text size))}])
|
||||
|
||||
(defn chat-icon-view-chat-list
|
||||
[chat-id group-chat name color]
|
||||
[chat-icon-view chat-id group-chat name
|
||||
@@ -118,19 +107,6 @@
|
||||
:default-chat-icon (styles/default-chat-icon-chat-list color)
|
||||
:default-chat-icon-text (styles/default-chat-icon-text 40)}])
|
||||
|
||||
(defn chat-icon-view-chat-list-redesign
|
||||
[chat-id group-chat name color size]
|
||||
[chat-icon-view chat-id group-chat name
|
||||
{:container (if (= size 20)
|
||||
(styles/token-icon-container-chat-list size)
|
||||
(styles/community-icon-container-chat-list size))
|
||||
:size size
|
||||
:chat-icon (if (= size 20)
|
||||
(styles/community-icon-chat-list-redesign size)
|
||||
(styles/community-icon-chat-list size))
|
||||
:default-chat-icon (styles/default-list-chat-icon-redesign color size)
|
||||
:default-chat-icon-text (styles/default-chat-icon-text size)}])
|
||||
|
||||
(defn chat-icon-view-chat-sheet
|
||||
[chat-id group-chat name color]
|
||||
[chat-icon-view chat-id group-chat name
|
||||
@@ -140,17 +116,6 @@
|
||||
:default-chat-icon (styles/default-chat-icon-chat-list color)
|
||||
:default-chat-icon-text (styles/default-chat-icon-text 40)}])
|
||||
|
||||
(defn emoji-chat-icon-view-chat-sheet
|
||||
[chat-id group-chat name color emoji]
|
||||
[emoji-chat-icon-view chat-id group-chat name emoji
|
||||
{:container styles/container-chat-list
|
||||
:size 40
|
||||
:chat-icon styles/chat-icon-chat-list
|
||||
:default-chat-icon (styles/default-chat-icon-chat-list color)
|
||||
:default-chat-icon-text (if (string/blank? emoji)
|
||||
(styles/default-chat-icon-text 40)
|
||||
(styles/emoji-chat-icon-text 40))}])
|
||||
|
||||
(defn custom-icon-view-list
|
||||
[name color & [size]]
|
||||
[rn/view (styles/container-list-size (or size 40))
|
||||
@@ -181,24 +146,6 @@
|
||||
:default-chat-icon (styles/default-chat-icon-profile colors/default-chat-color size)
|
||||
:default-chat-icon-text (styles/default-chat-icon-text size)}])
|
||||
|
||||
(defn chat-intro-icon-view
|
||||
[icon-text chat-id group-chat styles]
|
||||
(if group-chat
|
||||
[default-chat-icon icon-text styles]
|
||||
(let [photo-path @(re-frame.core/subscribe [:chats/photo-path chat-id])]
|
||||
(when-not (string/blank? photo-path)
|
||||
[photos/photo photo-path styles]))))
|
||||
|
||||
(defn emoji-chat-intro-icon-view
|
||||
[icon-text chat-id group-chat emoji styles]
|
||||
(if group-chat
|
||||
(if (string/blank? emoji)
|
||||
[default-chat-icon icon-text styles]
|
||||
[emoji-chat-icon emoji styles])
|
||||
(let [photo-path @(re-frame.core/subscribe [:chats/photo-path chat-id])]
|
||||
(when-not (string/blank? photo-path)
|
||||
[photos/photo photo-path styles]))))
|
||||
|
||||
(defn profile-icon-view
|
||||
[photo-path name color emoji edit? size override-styles public-key community?]
|
||||
(let [styles (merge {:container {:width size :height size}
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
[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
|
||||
@@ -103,7 +108,13 @@
|
||||
#(re-frame/dispatch
|
||||
[:multiaccounts.ui/waku-bloom-filter-mode-switched (not waku-bloom-filter-mode)])
|
||||
:accessory :switch
|
||||
:active waku-bloom-filter-mode}]))
|
||||
:active waku-bloom-filter-mode}
|
||||
{:size :small
|
||||
:title (i18n/label :t/set-currency)
|
||||
:accessibility-label :wallet-change-currency
|
||||
:on-press #(hide-sheet-and-dispatch
|
||||
[:navigate-to :currency-settings])
|
||||
:chevron true}]))
|
||||
|
||||
(defn- flat-list-data
|
||||
[options]
|
||||
|
||||
@@ -6,19 +6,9 @@
|
||||
[status-im.ui.components.core :as quo]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im2.constants :as constants]
|
||||
[utils.debounce :as debounce]
|
||||
[utils.i18n :as i18n])
|
||||
(:require-macros [status-im.utils.views :refer [defview letsubs]]))
|
||||
|
||||
(defn decline-chat
|
||||
[chat-id]
|
||||
[quo/button
|
||||
{:type :secondary
|
||||
:accessibility-label :decline-chat-button
|
||||
:on-press #(debounce/dispatch-and-chill [:group-chats.ui/leave-chat-confirmed chat-id]
|
||||
2000)}
|
||||
(i18n/label :t/group-chat-decline-invitation)])
|
||||
|
||||
(def message-max-length 100)
|
||||
|
||||
(defn request-membership
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
(ns status-im.ui.screens.chat.message.gap
|
||||
(:require-macros [status-im.utils.views :as views])
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.ui.screens.chat.styles.input.gap :as style]
|
||||
[utils.datetime :as datetime]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(views/defview gap
|
||||
[{:keys [gap-ids chat-id gap-parameters public? community?]}]
|
||||
(views/letsubs [in-progress? [:chats/fetching-gap-in-progress?
|
||||
gap-ids
|
||||
chat-id]
|
||||
connected? [:mailserver/connected?]
|
||||
use-status-nodes? [:mailserver/use-status-nodes?]
|
||||
first-gap? (= gap-ids #{:first-gap})
|
||||
window-height [:dimensions/window-height]]
|
||||
(when (or (not first-gap?) public? community?)
|
||||
[react/view {:style (when-not in-progress? style/gap-container)}
|
||||
[react/touchable-highlight
|
||||
{:on-press (when (and (not in-progress?) use-status-nodes? connected?)
|
||||
(re-frame/dispatch [:chat.ui/fill-gaps chat-id gap-ids]))
|
||||
:style {:height (if in-progress? window-height 48)}}
|
||||
[react/view {:style style/label-container}
|
||||
(if in-progress?
|
||||
[quo/skeleton-list
|
||||
{:parent-height window-height
|
||||
:animated true
|
||||
:content :messages}]
|
||||
[react/nested-text
|
||||
{:style (style/gap-text (and connected? use-status-nodes?))}
|
||||
(i18n/label (if first-gap? :t/load-more-messages :t/fetch-messages))
|
||||
(when first-gap?
|
||||
[{:style style/date}
|
||||
(let [date (datetime/timestamp->long-date
|
||||
(* 1000 (:from gap-parameters)))]
|
||||
(str
|
||||
"\n"
|
||||
(i18n/label :t/load-messages-before
|
||||
{:date date})))])])]]])))
|
||||
+2
-181
@@ -1,4 +1,4 @@
|
||||
(ns status-im.ui.screens.chat.styles.message.message
|
||||
(ns status-im.ui.screens.chat.message.legacy-style
|
||||
(:require
|
||||
[quo.foundations.colors :as quo.colors]
|
||||
[quo.foundations.typography :as typography]
|
||||
@@ -10,50 +10,6 @@
|
||||
[]
|
||||
{:color colors/text})
|
||||
|
||||
(defn system-message-body
|
||||
[_]
|
||||
{:margin-top 4
|
||||
:margin-left 8
|
||||
:margin-right 8
|
||||
:align-self :center
|
||||
:align-items :center})
|
||||
|
||||
(defn message-body
|
||||
[]
|
||||
(let [align :flex-start
|
||||
direction :row]
|
||||
{:flex-direction direction
|
||||
:margin-top 4
|
||||
:align-self align
|
||||
:align-items align}))
|
||||
|
||||
(def message-timestamp
|
||||
{:font-size 10})
|
||||
|
||||
(defn message-status-placeholder
|
||||
[]
|
||||
(merge message-timestamp {:opacity 0 :color "rgba(0,0,0,0)"}))
|
||||
|
||||
(defn message-timestamp-text
|
||||
[]
|
||||
(merge message-timestamp
|
||||
{:color colors/gray
|
||||
:text-align :center}))
|
||||
|
||||
(defn message-status-text
|
||||
[]
|
||||
{:font-size 10
|
||||
:line-height 10
|
||||
:border-color :red
|
||||
:border-width 1
|
||||
:color :red})
|
||||
|
||||
(defn audio-message-timestamp-text
|
||||
[]
|
||||
(merge message-timestamp
|
||||
{:line-height 10
|
||||
:color colors/gray}))
|
||||
|
||||
(defn message-wrapper
|
||||
[{:keys [in-popover?]}]
|
||||
(if (not in-popover?)
|
||||
@@ -61,67 +17,6 @@
|
||||
:padding-right 5}
|
||||
{:margin-right 10}))
|
||||
|
||||
(defn message-author-wrapper
|
||||
[]
|
||||
{:flex-direction :column
|
||||
:flex-shrink 1
|
||||
:align-items :flex-start
|
||||
:margin-left 4})
|
||||
|
||||
(defn pin-indicator
|
||||
[]
|
||||
(merge {:flex-direction :row}))
|
||||
|
||||
(defn pin-indicator-container
|
||||
[]
|
||||
{:margin-top 4
|
||||
:margin-left 54
|
||||
:top 4
|
||||
:justify-content :center
|
||||
:align-self :flex-start
|
||||
:align-items :flex-start})
|
||||
|
||||
(defn pinned-by-text-icon-container
|
||||
[]
|
||||
{:flex-direction :row
|
||||
:align-items :flex-start
|
||||
:top 5
|
||||
:left 8
|
||||
:position :absolute})
|
||||
|
||||
(defn pin-icon-container
|
||||
[]
|
||||
{:flex-direction :row
|
||||
:margin-top 1})
|
||||
|
||||
(defn pinned-by-text
|
||||
[]
|
||||
{:margin-left 5})
|
||||
|
||||
(def message-author-touchable
|
||||
{:margin-left 0
|
||||
:flex-direction :row})
|
||||
|
||||
(def delivery-text
|
||||
{:color colors/gray
|
||||
:margin-top 2
|
||||
:font-size 12})
|
||||
|
||||
(def not-sent-view
|
||||
{:flex-direction :row
|
||||
:margin-bottom 2
|
||||
:padding-top 2})
|
||||
|
||||
(def not-sent-text
|
||||
(assoc delivery-text
|
||||
:color colors/red
|
||||
:text-align :right
|
||||
:padding-top 4))
|
||||
|
||||
(def not-sent-icon
|
||||
{:padding-top 3
|
||||
:padding-left 3})
|
||||
|
||||
(defn emoji-message
|
||||
[{:keys [incoming-group]}]
|
||||
{:font-size 28
|
||||
@@ -129,10 +24,6 @@
|
||||
:margin-right 0 ;; Margin to display outgoing message status
|
||||
:margin-top (if incoming-group 4 0)})
|
||||
|
||||
(def message-view-wrapper
|
||||
{:align-self :flex-end
|
||||
:flex-direction :row-reverse})
|
||||
|
||||
(defn message-view
|
||||
[{:keys [content-type]}]
|
||||
(merge
|
||||
@@ -154,40 +45,6 @@
|
||||
:font-size 14
|
||||
:color colors/gray})
|
||||
|
||||
(defn message-author-name
|
||||
[chosen?]
|
||||
{:font-size (if chosen? 13 12)
|
||||
:font-weight (if chosen? "500" "400")
|
||||
:padding-top 6
|
||||
:padding-left 12
|
||||
:text-align-vertical :center})
|
||||
|
||||
(defn quoted-message-container
|
||||
[]
|
||||
{:margin-bottom 6
|
||||
:margin-top 5
|
||||
:padding-horizontal 15})
|
||||
|
||||
(def quoted-message-author-container
|
||||
{:flex-direction :row
|
||||
:align-items :center
|
||||
:justify-content :flex-start})
|
||||
|
||||
(defn quoted-message-author
|
||||
[chosen?]
|
||||
(assoc (message-author-name chosen?)
|
||||
:padding-bottom 6
|
||||
:padding-top 0
|
||||
:padding-left 0
|
||||
:line-height 18
|
||||
:font-weight "500"
|
||||
:color colors/gray))
|
||||
|
||||
(defn quoted-message-text
|
||||
[]
|
||||
{:font-size 14
|
||||
:color colors/gray})
|
||||
|
||||
(defn message-default-style
|
||||
[]
|
||||
{:font-family "Inter-Regular"
|
||||
@@ -197,19 +54,11 @@
|
||||
:letter-spacing -0.135})
|
||||
|
||||
;; Markdown styles
|
||||
|
||||
(defn default-text-style
|
||||
[]
|
||||
{:max-font-size-multiplier react/max-font-size-multiplier
|
||||
:style (message-default-style)})
|
||||
|
||||
(defn outgoing-text-style
|
||||
[]
|
||||
(update (default-text-style)
|
||||
:style
|
||||
assoc
|
||||
:color colors/white-persist))
|
||||
|
||||
(defn system-text-style
|
||||
[]
|
||||
(update (default-text-style)
|
||||
@@ -284,21 +133,11 @@
|
||||
:line-height 18.2
|
||||
:letter-spacing (typography/tracking 13))))
|
||||
|
||||
(def code-block-background "#2E386B")
|
||||
|
||||
(defn inline-code-style
|
||||
[]
|
||||
{:color colors/white-persist
|
||||
:background-color code-block-background})
|
||||
|
||||
(def codeblock-style
|
||||
{:padding 10
|
||||
:background-color code-block-background
|
||||
:background-color "#2E386B"
|
||||
:border-radius 4})
|
||||
|
||||
(def codeblock-text-style
|
||||
{:color colors/white-persist})
|
||||
|
||||
(defn default-blockquote-style
|
||||
[]
|
||||
{:style {:border-left-width 2
|
||||
@@ -330,24 +169,6 @@
|
||||
(outgoing-blockquote-text-style)
|
||||
(default-blockquote-text-style))
|
||||
|
||||
(defn image-message
|
||||
[{:keys [width height]}]
|
||||
{:overflow :hidden
|
||||
:border-radius 8
|
||||
:width width
|
||||
:height height})
|
||||
|
||||
(defn image-message-border
|
||||
[opts]
|
||||
(merge (image-message opts)
|
||||
{:opacity (:opacity opts)
|
||||
:border-width 1
|
||||
:top 0
|
||||
:left 0
|
||||
:position :absolute
|
||||
:background-color :transparent
|
||||
:border-color colors/black-transparent}))
|
||||
|
||||
(defn community-verified
|
||||
[]
|
||||
{:border-right-width 1
|
||||
@@ -7,9 +7,7 @@
|
||||
[status-im.react-native.resources :as resources]
|
||||
[status-im.ui.components.colors :as quo.colors]
|
||||
[status-im.ui.components.fast-image :as fast-image]
|
||||
[status-im.ui.screens.chat.message.gap :as message.gap]
|
||||
[status-im.ui.screens.chat.styles.message.message :as style]
|
||||
[status-im.ui.screens.chat.utils :as chat.utils]
|
||||
[status-im.ui.screens.chat.message.legacy-style :as style]
|
||||
[status-im2.constants :as constants]
|
||||
[status-im2.contexts.chat.messages.delete-message-for-me.events]
|
||||
[status-im2.contexts.chat.messages.delete-message.events]
|
||||
@@ -131,16 +129,11 @@
|
||||
[:<>]
|
||||
(:parsed-text content))))
|
||||
|
||||
(defview message-author-name
|
||||
[from opts max-length]
|
||||
(letsubs [contact-with-names [:contacts/contact-by-identity from]]
|
||||
(chat.utils/format-author contact-with-names opts max-length)))
|
||||
|
||||
(defmulti ->message :content-type)
|
||||
|
||||
(defmethod ->message constants/content-type-gap
|
||||
[message]
|
||||
[message.gap/gap message])
|
||||
[_]
|
||||
[rn/view])
|
||||
|
||||
;; STATUS ? whats that ?
|
||||
(defmethod ->message constants/content-type-status
|
||||
|
||||
@@ -2,18 +2,41 @@
|
||||
(:require
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[status-im.ui.components.fast-image :as fast-image]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.ui.screens.chat.styles.photos :as style]))
|
||||
[status-im.ui.components.react :as react]))
|
||||
|
||||
(defn radius [size] (/ size 2))
|
||||
|
||||
(defn photo-container
|
||||
[size]
|
||||
{:position :relative
|
||||
:border-radius (radius size)})
|
||||
|
||||
(defn photo-border
|
||||
([size] (photo-border size :absolute))
|
||||
([size position]
|
||||
{:position position
|
||||
:width size
|
||||
:height size
|
||||
:border-color colors/black-transparent
|
||||
:border-width 1
|
||||
:border-radius (radius size)}))
|
||||
|
||||
(defn photo-style
|
||||
[size]
|
||||
{:border-radius (radius size)
|
||||
:width size
|
||||
:height size
|
||||
:background-color colors/white})
|
||||
|
||||
(def memo-photo-rend
|
||||
(memoize
|
||||
(fn [photo-path size accessibility-label _]
|
||||
[react/view {:style (style/photo-container size)}
|
||||
[react/view {:style (photo-container size)}
|
||||
[fast-image/fast-image
|
||||
{:source photo-path
|
||||
:style (style/photo size)
|
||||
:style (photo-style size)
|
||||
:accessibility-label (or accessibility-label :chat-icon)}]
|
||||
[react/view {:style (style/photo-border size)}]])))
|
||||
[react/view {:style (photo-border size)}]])))
|
||||
|
||||
;; "(colors/dark?)" is passed to memoized function to avoid previous themes cache
|
||||
;; TODO: it's only used for old code, `quo/user-avatar` should be used instead for all the new one
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
(ns status-im.ui.screens.chat.sheets
|
||||
(:require
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.ui.components.chat-icon.screen :as chat-icon]
|
||||
[status-im.ui.components.list.item :as list.item]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im2.constants :as constants]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(defn hide-sheet-and-dispatch
|
||||
[event]
|
||||
(re-frame/dispatch [:bottom-sheet/hide-old])
|
||||
(re-frame/dispatch event))
|
||||
|
||||
(defn one-to-one-chat-accents
|
||||
[chat-id]
|
||||
(let [{:keys [primary-name] :as contact} @(re-frame/subscribe [:contacts/contact-by-identity chat-id])]
|
||||
[react/view
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:icon [chat-icon/contact-icon-contacts-tab contact]
|
||||
:title primary-name
|
||||
:subtitle (i18n/label :t/view-profile)
|
||||
:accessibility-label :view-chat-details-button
|
||||
:chevron true
|
||||
:on-press #(do
|
||||
(hide-sheet-and-dispatch [:chat.ui/show-profile chat-id])
|
||||
(re-frame/dispatch [:pin-message/load-pin-messages chat-id]))}]
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/mark-all-read)
|
||||
:accessibility-label :mark-all-read-button
|
||||
:icon :main-icons/check
|
||||
:on-press #(hide-sheet-and-dispatch [:chat.ui/mark-all-read-pressed chat-id])}]
|
||||
[list.item/list-item
|
||||
{:theme :negative
|
||||
:title (i18n/label :t/delete-chat)
|
||||
:accessibility-label :delete-chat-button
|
||||
:icon :main-icons/delete
|
||||
:on-press #(re-frame/dispatch [:chat.ui/show-remove-confirmation chat-id])}]]))
|
||||
|
||||
(defn community-chat-accents
|
||||
[]
|
||||
(fn [{:keys [chat-id group-chat chat-name color emoji]}]
|
||||
[react/view
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title chat-name
|
||||
:icon [chat-icon/emoji-chat-icon-view-chat-sheet
|
||||
chat-id group-chat chat-name color emoji]
|
||||
:subtitle (i18n/label :t/view-details)
|
||||
:chevron true
|
||||
:accessibility-label :view-community-channel-details
|
||||
:on-press #(do
|
||||
(hide-sheet-and-dispatch [:navigate-to :community-channel-details
|
||||
{:chat-id chat-id}])
|
||||
(re-frame/dispatch [:pin-message/load-pin-messages chat-id]))}]
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/mark-all-read)
|
||||
:accessibility-label :mark-all-read-button
|
||||
:icon :main-icons/check
|
||||
:on-press #(hide-sheet-and-dispatch [:chat.ui/mark-all-read-pressed chat-id])}]]))
|
||||
|
||||
(defn group-chat-accents
|
||||
[]
|
||||
(fn [{:keys [chat-id group-chat chat-name color invitation-admin]}]
|
||||
(let [{:keys [member?]} @(re-frame/subscribe [:group-chat/inviter-info chat-id])
|
||||
removed? @(re-frame/subscribe [:group-chat/removed-from-current-chat?])]
|
||||
(if invitation-admin
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/remove)
|
||||
:accessibility-label :remove-group-chat
|
||||
:icon :main-icons/delete
|
||||
:on-press #(hide-sheet-and-dispatch [:group-chats.ui/remove-chat-confirmed
|
||||
chat-id])}]
|
||||
[react/view
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title chat-name
|
||||
:subtitle (i18n/label :t/group-info)
|
||||
:icon [chat-icon/chat-icon-view-chat-sheet
|
||||
chat-id group-chat chat-name color]
|
||||
:chevron true
|
||||
:on-press #(do
|
||||
(hide-sheet-and-dispatch [:show-group-chat-profile chat-id])
|
||||
(re-frame/dispatch [:pin-message/load-pin-messages chat-id]))}]
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/mark-all-read)
|
||||
:accessibility-label :mark-all-read-button
|
||||
:icon :main-icons/check
|
||||
:on-press #(hide-sheet-and-dispatch [:chat.ui/mark-all-read-pressed chat-id])}]
|
||||
(when member?
|
||||
[list.item/list-item
|
||||
{:theme :negative
|
||||
:title (i18n/label :t/leave-chat)
|
||||
:accessibility-label :leave-chat-button
|
||||
:icon :main-icons/arrow-left
|
||||
:on-press #(re-frame/dispatch [:group-chats.ui/leave-chat-pressed chat-id])}])
|
||||
(when removed?
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/remove)
|
||||
:accessibility-label :remove-group-chat
|
||||
:icon :main-icons/delete
|
||||
:on-press #(hide-sheet-and-dispatch [:group-chats.ui/remove-chat-confirmed
|
||||
chat-id])}])]))))
|
||||
|
||||
(defn actions
|
||||
[{:keys [chat-type chat-id]
|
||||
:as current-chat}]
|
||||
(cond
|
||||
|
||||
(= chat-type constants/community-chat-type)
|
||||
[community-chat-accents current-chat]
|
||||
|
||||
(= chat-type constants/private-group-chat-type)
|
||||
[group-chat-accents current-chat]
|
||||
|
||||
:else [one-to-one-chat-accents chat-id]))
|
||||
|
||||
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
(ns status-im.ui.screens.chat.stickers.styles)
|
||||
|
||||
(def stickers-panel
|
||||
{:flex 1 :margin 5 :flex-direction :row :justify-content :space-between :flex-wrap :wrap})
|
||||
|
||||
(defn pack-icon
|
||||
[background-color icon-size icon-horizontal-margin]
|
||||
{:background-color background-color
|
||||
:margin-vertical 5
|
||||
:margin-horizontal icon-horizontal-margin
|
||||
:height icon-size
|
||||
:width icon-size
|
||||
:border-radius (/ icon-size 2)
|
||||
:align-items :center
|
||||
:justify-content :center})
|
||||
@@ -1,169 +0,0 @@
|
||||
(ns status-im.ui.screens.chat.stickers.views
|
||||
(:require-macros [status-im.utils.views :refer [defview letsubs]])
|
||||
(:require
|
||||
[re-frame.core :as re-frame]
|
||||
[reagent.core :as reagent]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[status-im.ui.components.core :as quo]
|
||||
[status-im.ui.components.fast-image :as fast-image]
|
||||
[status-im.ui.components.icons.icons :as icons]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.ui.screens.chat.stickers.styles :as styles]
|
||||
[utils.debounce :as debounce]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(def icon-size 28)
|
||||
(def icon-horizontal-margin 8)
|
||||
(def indicator-width 16)
|
||||
(def dx (- (+ icon-horizontal-margin (/ icon-size 2)) (/ indicator-width 2)))
|
||||
(def icon-container (+ (* icon-horizontal-margin 2) icon-size))
|
||||
(def scroll-x (reagent/atom 0))
|
||||
|
||||
(defn- no-stickers-yet-panel
|
||||
[]
|
||||
[react/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[icons/icon :stickers-icons/stickers-big
|
||||
{:color colors/gray
|
||||
:width 64
|
||||
:height 64}]
|
||||
[react/text {:style {:margin-vertical 8 :font-size 17}} (i18n/label :t/you-dont-have-stickers)]
|
||||
[quo/button
|
||||
{:type :secondary
|
||||
:on-press #(re-frame/dispatch [:navigate-to :stickers])}
|
||||
(i18n/label :t/get-stickers)]])
|
||||
|
||||
(defn- stickers-panel
|
||||
[stickers window-width]
|
||||
[react/view {:width window-width :flex 1}
|
||||
[react/scroll-view
|
||||
[react/view {:style styles/stickers-panel}
|
||||
(for [{:keys [url] :as sticker} stickers]
|
||||
^{:key (str url)}
|
||||
[react/touchable-highlight
|
||||
{:style {:height 75 :width 75 :margin 5}
|
||||
:on-press #(debounce/dispatch-and-chill [:chat/send-sticker sticker] 1000)}
|
||||
[fast-image/fast-image
|
||||
{:style {:width "100%" :height "100%"}
|
||||
:accessibility-label :sticker-icon
|
||||
:source {:uri (str url "&download=true")}}]])]]])
|
||||
|
||||
(defview recent-stickers-panel
|
||||
[window-width]
|
||||
(letsubs [stickers [:stickers/recent-stickers]]
|
||||
(if (seq stickers)
|
||||
[stickers-panel stickers window-width]
|
||||
[react/view
|
||||
{:style {:flex 1
|
||||
:align-items :center
|
||||
:justify-content :center
|
||||
:width window-width}}
|
||||
[icons/icon :stickers-icons/sticker-history
|
||||
{:width 64
|
||||
:height 64
|
||||
:color colors/gray}]
|
||||
[react/text
|
||||
{:style {:margin-top 12
|
||||
:font-size 17}}
|
||||
(i18n/label :t/recently-used-stickers)]])))
|
||||
|
||||
(defn update-scroll-position
|
||||
[^js ref installed-packs selected-pack window-width animated?]
|
||||
(when ref
|
||||
;; bug on Android https://github.com/facebook/react-native/issues/24531
|
||||
(js/setTimeout
|
||||
(fn []
|
||||
(let [x (if (= selected-pack :recent)
|
||||
0
|
||||
(* (inc (some #(when (= selected-pack (:id (second %))) (first %))
|
||||
(map-indexed vector installed-packs)))
|
||||
window-width))]
|
||||
(.scrollTo ref #js {:x x :animated animated?})))
|
||||
1)))
|
||||
|
||||
(defn on-scroll
|
||||
[^js e installed-packs window-width]
|
||||
(let [num (/ (.-nativeEvent.contentOffset.x e) window-width)
|
||||
pack-id (if (zero? num)
|
||||
:recent
|
||||
(get-in (vec installed-packs) [(dec num) :id]))]
|
||||
(when pack-id
|
||||
(re-frame/dispatch [:stickers/select-pack pack-id]))))
|
||||
|
||||
(defview stickers-paging-panel
|
||||
[installed-packs selected-pack]
|
||||
(letsubs [ref (atom nil)
|
||||
width [:dimensions/window-width]]
|
||||
{:UNSAFE_componentWillUpdate
|
||||
(fn [_ [_ installed-packs selected-pack]]
|
||||
(update-scroll-position @ref installed-packs selected-pack width true))
|
||||
:component-did-mount #(update-scroll-position @ref installed-packs selected-pack width false)}
|
||||
[react/scroll-view
|
||||
{:style {:flex 1}
|
||||
:horizontal true
|
||||
:paging-enabled true
|
||||
:ref #(reset! ref %)
|
||||
:shows-horizontal-scroll-indicator false
|
||||
:on-momentum-scroll-end #(on-scroll % installed-packs width)
|
||||
:scroll-event-throttle 8
|
||||
:scroll-to-overflow-enabled true
|
||||
:on-scroll #(reset! scroll-x (.-nativeEvent.contentOffset.x ^js %))}
|
||||
^{:key "recent"}
|
||||
[recent-stickers-panel width]
|
||||
(for [{:keys [stickers id]} installed-packs]
|
||||
^{:key (str "sticker" id)}
|
||||
[stickers-panel (map #(assoc % :pack id) stickers) width])]))
|
||||
|
||||
(defn pack-icon
|
||||
[{:keys [id on-press background-color]
|
||||
:or {on-press #(re-frame/dispatch [:stickers/select-pack id])}}
|
||||
icon]
|
||||
[react/touchable-highlight {:on-press on-press}
|
||||
[react/view {:style {:align-items :center}}
|
||||
[react/view {:style (styles/pack-icon background-color icon-size icon-horizontal-margin)}
|
||||
icon]]])
|
||||
|
||||
(defview scroll-indicator
|
||||
[]
|
||||
(letsubs [window-width [:dimensions/window-width]]
|
||||
[react/view
|
||||
{:style {:height 2
|
||||
:width indicator-width
|
||||
:border-radius 1
|
||||
:margin-left (+ dx (* icon-container (/ @scroll-x window-width)))
|
||||
:background-color colors/blue}}]))
|
||||
|
||||
(defview stickers-view
|
||||
[]
|
||||
(letsubs [selected-pack [:stickers/selected-pack]
|
||||
installed-packs [:stickers/installed-packs]]
|
||||
[react/view
|
||||
{:style {:background-color colors/white
|
||||
:flex 1}}
|
||||
(cond
|
||||
(= selected-pack :recent) [stickers-paging-panel installed-packs selected-pack]
|
||||
(not (seq installed-packs)) [no-stickers-yet-panel]
|
||||
:else [stickers-paging-panel installed-packs selected-pack])
|
||||
[react/view {:style {:flex-direction :row :padding-horizontal 4}}
|
||||
[pack-icon
|
||||
{:on-press #(re-frame/dispatch [:navigate-to :stickers])
|
||||
:selected? false
|
||||
:background-color colors/blue}
|
||||
[icons/icon :main-icons/add {:width 20 :height 20 :color colors/white-persist}]]
|
||||
[react/view {:width 2}]
|
||||
[react/scroll-view {:horizontal true :style {:padding-left 2}}
|
||||
[react/view
|
||||
[react/view {:style {:flex-direction :row}}
|
||||
[pack-icon {:id :recent :background-color colors/white}
|
||||
[icons/icon :stickers-icons/recent
|
||||
{:color colors/gray
|
||||
:width 44
|
||||
:height 44}]]
|
||||
(for [{:keys [id thumbnail]} installed-packs]
|
||||
^{:key (str "pack-icon" id)}
|
||||
[pack-icon
|
||||
{:id id
|
||||
:background-color colors/white}
|
||||
[fast-image/fast-image
|
||||
{:style {:width icon-size :height icon-size :border-radius (/ icon-size 2)}
|
||||
:source {:uri (str thumbnail "&download=true")}}]])]
|
||||
[scroll-indicator]]]]]))
|
||||
@@ -1,35 +0,0 @@
|
||||
(ns status-im.ui.screens.chat.styles.input.gap
|
||||
(:require
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
|
||||
(defn gap-container
|
||||
[]
|
||||
{:align-self :stretch
|
||||
:margin-top 24
|
||||
:margin-bottom 24
|
||||
:height 48
|
||||
:align-items :center
|
||||
:justify-content :center
|
||||
:border-color colors/gray-lighter
|
||||
:border-top-width 1
|
||||
:border-bottom-width 1})
|
||||
|
||||
(def label-container
|
||||
{:flex 1
|
||||
:align-items :center
|
||||
:justify-content :center
|
||||
:text-align :center})
|
||||
|
||||
(defn gap-text
|
||||
[connected?]
|
||||
{:text-align :center
|
||||
:color (if connected?
|
||||
colors/blue
|
||||
colors/gray)})
|
||||
|
||||
(def touchable
|
||||
{:height 48})
|
||||
|
||||
(def date
|
||||
{:typography :caption
|
||||
:color colors/gray})
|
||||
@@ -1,59 +0,0 @@
|
||||
(ns status-im.ui.screens.chat.styles.main
|
||||
(:require
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
|
||||
(def toolbar-container
|
||||
{:flex 1
|
||||
:align-items :center
|
||||
:flex-direction :row})
|
||||
|
||||
(def chat-name-view
|
||||
{:flex 1
|
||||
:justify-content :center})
|
||||
|
||||
(def chat-name-text
|
||||
{:typography :main-medium
|
||||
:font-size 15
|
||||
:line-height 22})
|
||||
|
||||
(def toolbar-subtitle
|
||||
{:typography :caption
|
||||
:line-height 16
|
||||
:color colors/text-gray})
|
||||
|
||||
;; this map looks a bit strange
|
||||
;; but this way of setting elevation seems to be the only way to set z-index (in RN 0.30)
|
||||
(defn add-contact
|
||||
[]
|
||||
{:flex-direction :row
|
||||
:align-items :center
|
||||
:justify-content :center
|
||||
:padding-vertical 6
|
||||
:border-bottom-width 1
|
||||
:border-color colors/gray-lighter})
|
||||
|
||||
(def add-contact-text
|
||||
{:margin-left 4
|
||||
:color colors/blue})
|
||||
|
||||
(def empty-chat-container
|
||||
{:flex 1
|
||||
:justify-content :center
|
||||
:align-items :center
|
||||
:padding-vertical 50
|
||||
:margin-right 6})
|
||||
|
||||
(def loading-text
|
||||
{:color colors/gray
|
||||
:font-size 15
|
||||
:line-height 22
|
||||
:letter-spacing -0.2
|
||||
:margin-right 4
|
||||
:text-align :center})
|
||||
|
||||
(def contact-request
|
||||
{:width "100%"
|
||||
:justify-content :center
|
||||
:align-items :center
|
||||
:border-top-width 1
|
||||
:border-color colors/gray-transparent-10})
|
||||
@@ -1,9 +0,0 @@
|
||||
(ns status-im.ui.screens.chat.styles.message.sheets
|
||||
(:require
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
|
||||
(def sheet-text
|
||||
{:color colors/gray
|
||||
:padding 24
|
||||
:line-height 22
|
||||
:font-size 15})
|
||||
@@ -1,29 +0,0 @@
|
||||
(ns status-im.ui.screens.chat.styles.photos
|
||||
(:require
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
|
||||
(def default-size 36)
|
||||
|
||||
(defn radius [size] (/ size 2))
|
||||
|
||||
(defn photo-container
|
||||
[size]
|
||||
{:position :relative
|
||||
:border-radius (radius size)})
|
||||
|
||||
(defn photo-border
|
||||
([size] (photo-border size :absolute))
|
||||
([size position]
|
||||
{:position position
|
||||
:width size
|
||||
:height size
|
||||
:border-color colors/black-transparent
|
||||
:border-width 1
|
||||
:border-radius (radius size)}))
|
||||
|
||||
(defn photo
|
||||
[size]
|
||||
{:border-radius (radius size)
|
||||
:width size
|
||||
:height size
|
||||
:background-color colors/white})
|
||||
@@ -28,32 +28,3 @@
|
||||
:line-height (if profile? 22 18)
|
||||
:font-weight "400"}}
|
||||
primary-name])))
|
||||
|
||||
(defn format-author
|
||||
([contact] (format-author contact nil nil))
|
||||
([contact {:keys [modal profile? you?]} max-length]
|
||||
(let [{:keys [primary-name secondary-name]} contact]
|
||||
(if secondary-name
|
||||
[react/nested-text
|
||||
{:number-of-lines 2
|
||||
:style {:color (if modal colors/white-persist colors/black)
|
||||
:font-size (if profile? 15 13)
|
||||
:line-height (if profile? 22 18)
|
||||
:letter-spacing -0.2
|
||||
:font-weight "600"}}
|
||||
(subs primary-name 0 81)
|
||||
(when you?
|
||||
[{:style {:color colors/black-light :font-weight "500" :font-size 13}}
|
||||
(str " " (i18n/label :t/You))])
|
||||
[{:style {:color colors/black-light :font-weight "500"}}
|
||||
(str " " (subs secondary-name 0 81))]]
|
||||
[react/text
|
||||
{:style {:color (if modal colors/white-persist colors/black)
|
||||
:font-size (if profile? 15 13)
|
||||
:line-height (if profile? 22 18)
|
||||
:font-weight "600"
|
||||
:letter-spacing -0.2}
|
||||
:number-of-lines 1}
|
||||
(if (and max-length (> (count primary-name) max-length))
|
||||
(str (subs primary-name 0 max-length) "...")
|
||||
primary-name)]))))
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.topbar :as topbar]
|
||||
[status-im.ui.screens.chat.photos :as photos]
|
||||
[status-im.ui.screens.chat.sheets :as chat.sheets]
|
||||
[status-im.ui.screens.chat.utils :as chat.utils]
|
||||
[status-im.ui.screens.profile.components.styles :as profile.components.styles]
|
||||
[status-im2.constants :as constants]
|
||||
@@ -20,6 +19,11 @@
|
||||
[utils.i18n :as i18n])
|
||||
(:require-macros [status-im.utils.views :refer [defview letsubs]]))
|
||||
|
||||
(defn hide-sheet-and-dispatch
|
||||
[event]
|
||||
(re-frame/dispatch [:bottom-sheet/hide-old])
|
||||
(re-frame/dispatch event))
|
||||
|
||||
(defn member-sheet
|
||||
[chat-id member us-admin?]
|
||||
[react/view
|
||||
@@ -30,7 +34,7 @@
|
||||
:subtitle (i18n/label :t/view-profile)
|
||||
:accessibility-label :view-chat-details-button
|
||||
:chevron true
|
||||
:on-press #(chat.sheets/hide-sheet-and-dispatch
|
||||
:on-press #(hide-sheet-and-dispatch
|
||||
[:chat.ui/show-profile
|
||||
(:public-key member)])}]
|
||||
(when (and us-admin? (not (:admin? member)))
|
||||
@@ -39,15 +43,15 @@
|
||||
:title (i18n/label :t/make-admin)
|
||||
:accessibility-label :make-admin
|
||||
:icon :main-icons/make-admin
|
||||
:on-press #(chat.sheets/hide-sheet-and-dispatch [:group-chats.ui/make-admin-pressed
|
||||
chat-id (:public-key member)])}])
|
||||
:on-press #(hide-sheet-and-dispatch [:group-chats.ui/make-admin-pressed
|
||||
chat-id (:public-key member)])}])
|
||||
(when-not (:admin? member)
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/remove-from-chat)
|
||||
:accessibility-label :remove-from-chat
|
||||
:icon :main-icons/remove-contact
|
||||
:on-press #(chat.sheets/hide-sheet-and-dispatch
|
||||
:on-press #(hide-sheet-and-dispatch
|
||||
[:group-chats.ui/remove-member-pressed chat-id
|
||||
(:public-key member)])}])])
|
||||
|
||||
@@ -102,7 +106,7 @@
|
||||
:on-press #(re-frame/dispatch [:open-modal :add-participants-toggle-list])}])
|
||||
[chat-group-members-view chat-id admin? current-pk]])
|
||||
|
||||
(defn hide-sheet-and-dispatch
|
||||
(defn hide-sheet-and-dispatch-old
|
||||
[event]
|
||||
(re-frame/dispatch [:bottom-sheet/hide-old])
|
||||
(debounce/dispatch-and-chill event 2000))
|
||||
@@ -125,14 +129,15 @@
|
||||
:subtitle (when-not allow-adding-members? (i18n/label :t/members-limit-reached))
|
||||
:accessibility-label :accept-invitation-button
|
||||
:icon :main-icons/checkmark-circle
|
||||
:on-press #(hide-sheet-and-dispatch
|
||||
:on-press #(hide-sheet-and-dispatch-old
|
||||
[:group-chats.ui/add-members-from-invitation id (:public-key contact)])}]
|
||||
[list.item/list-item
|
||||
{:theme :negative
|
||||
:title (i18n/label :t/decline)
|
||||
:accessibility-label :decline-invitation-button
|
||||
:icon :main-icons/cancel
|
||||
:on-press #(hide-sheet-and-dispatch [:send-group-chat-membership-rejection id])}]]))
|
||||
:on-press #(hide-sheet-and-dispatch-old [:send-group-chat-membership-rejection
|
||||
id])}]]))
|
||||
|
||||
(defn contacts-list-item
|
||||
[{:keys [from] :as invitation}]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -67,7 +67,6 @@
|
||||
[status-im.ui.screens.wallet.buy-crypto.views :as wallet.buy-crypto]
|
||||
[status-im.ui.screens.wallet.collectibles.views :as wallet.collectibles]
|
||||
[status-im.ui.screens.wallet.custom-tokens.views :as custom-tokens]
|
||||
[status-im.ui.screens.wallet.manage-connections.views :as manage-all-connections]
|
||||
[status-im.ui.screens.wallet.recipient.views :as recipient]
|
||||
[status-im.ui.screens.wallet.send.views :as wallet.send]
|
||||
[status-im.ui.screens.wallet.settings.views :as wallet-settings]
|
||||
@@ -647,12 +646,6 @@
|
||||
:insets {:bottom? true}
|
||||
:component keycard.pairing/change-pairing-code}
|
||||
|
||||
{:name :show-all-connections
|
||||
:options {:topBar {:title {:text (i18n/label :t/all-connections)}}
|
||||
:insets {:bottom? true
|
||||
:top? true}}
|
||||
:component manage-all-connections/views}
|
||||
|
||||
;; BUG REPORT
|
||||
{:name :bug-report
|
||||
:options {:insets {:top? true}}
|
||||
|
||||
@@ -28,13 +28,6 @@
|
||||
:accessibility-label :wallet-manage-assets
|
||||
:on-press #(hide-sheet-and-dispatch
|
||||
[:navigate-to :wallet-settings-assets])}]
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/wallet-manage-app-connections)
|
||||
:icon :main-icons/manage-connections
|
||||
:accessibility-label :wallet-manage-app-connections
|
||||
:on-press #(hide-sheet-and-dispatch
|
||||
[:navigate-to :show-all-connections])}]
|
||||
[list.item/list-item
|
||||
{:theme :accent
|
||||
:title (i18n/label :t/scan-tokens)
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
(ns status-im.ui.screens.wallet.manage-connections.styles
|
||||
(:require
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
|
||||
(def dapp-icon
|
||||
{:width 30
|
||||
:height 30
|
||||
:resize-mode :cover
|
||||
:margin 10
|
||||
:border-radius 15
|
||||
:border-width 2
|
||||
:padding 10})
|
||||
|
||||
(def app-row
|
||||
{:flex-direction :row
|
||||
:margin-vertical 8
|
||||
:align-items :center})
|
||||
|
||||
(def app-column
|
||||
{:flex-direction :column
|
||||
:max-width 160
|
||||
:justify-content :center})
|
||||
|
||||
(def dapp-name
|
||||
{:font-size 15})
|
||||
|
||||
(def dapp-url
|
||||
{:font-size 15
|
||||
:opacity 0.5})
|
||||
|
||||
(def selected-account
|
||||
{:font-size 13
|
||||
:color colors/white})
|
||||
|
||||
(defn selected-account-container
|
||||
[account-background-color]
|
||||
{:background-color account-background-color
|
||||
:padding-horizontal 10
|
||||
:justify-content :center
|
||||
:flex-direction :row
|
||||
:align-items :center
|
||||
:border-radius 40
|
||||
:height 26})
|
||||
|
||||
(def delete-icon-container
|
||||
{:margin-horizontal 10})
|
||||
@@ -1,20 +0,0 @@
|
||||
(ns status-im.ui.screens.wallet.manage-connections.views
|
||||
(:require
|
||||
[re-frame.core :as re-frame]
|
||||
[react-native.core :as rn]
|
||||
[status-im.ui.screens.wallet.manage-connections.styles :as styles]
|
||||
[status-im2.common.not-implemented :as not-implemented]))
|
||||
|
||||
(defn print-session-info
|
||||
[{:keys [peer]}]
|
||||
^{:key peer}
|
||||
[rn/view
|
||||
[:<>
|
||||
[not-implemented/not-implemented
|
||||
[rn/view {:style styles/app-row}]]]])
|
||||
|
||||
(defn views
|
||||
[]
|
||||
(let [sessions @(re-frame/subscribe [:wallet-connect/sessions])]
|
||||
[rn/view {:margin-top 10}
|
||||
(doall (map print-session-info sessions))]))
|
||||
@@ -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}
|
||||
|
||||
@@ -1,155 +0,0 @@
|
||||
(ns status-im.ui.screens.wallet-connect.session-proposal.styles
|
||||
(:require
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
|
||||
(defn toolbar-container
|
||||
[background-color]
|
||||
{:height 36
|
||||
:border-radius 18
|
||||
:background-color background-color
|
||||
:align-items :center
|
||||
:flex-direction :row
|
||||
:padding-left 13
|
||||
:padding-right 6})
|
||||
|
||||
(def toolbar-text
|
||||
{:flex-grow 1
|
||||
:margin-right 3})
|
||||
|
||||
(defn dapp-logo
|
||||
[]
|
||||
{:width 120
|
||||
:height 120
|
||||
:resize-mode :cover
|
||||
:margin-top 31
|
||||
:border-radius 16
|
||||
:border-width 2
|
||||
:border-color (:interactive-02 @colors/theme)
|
||||
:padding 5})
|
||||
|
||||
(def sheet-body-container
|
||||
{:flex 1
|
||||
:align-items :center})
|
||||
|
||||
(defn acc-sheet
|
||||
[]
|
||||
{:background-color (:ui-background @colors/theme)
|
||||
:border-top-right-radius 16
|
||||
:border-top-left-radius 16
|
||||
:padding-bottom 1})
|
||||
|
||||
(defn proposal-sheet-container
|
||||
[]
|
||||
{:background-color (:ui-background @colors/theme)
|
||||
:width "100%"
|
||||
:align-items :center
|
||||
:padding-top 0
|
||||
:padding-bottom 50
|
||||
:border-top-right-radius 16
|
||||
:border-top-left-radius 16})
|
||||
|
||||
(defn proposal-sheet-header
|
||||
[]
|
||||
{:flex-direction :row
|
||||
:align-items :center
|
||||
:justify-content :center
|
||||
:height 56
|
||||
:width "100%"
|
||||
:border-color colors/gray-lighter
|
||||
:border-bottom-width 1})
|
||||
|
||||
(def proposal-title-container
|
||||
{:align-items :center
|
||||
:margin-top 21})
|
||||
|
||||
(def message-title
|
||||
{:margin-top 10
|
||||
:margin-bottom 14
|
||||
:margin-horizontal 72.5
|
||||
:text-align :center})
|
||||
|
||||
(defn proposal-buttons-container
|
||||
[]
|
||||
{:width "100%"
|
||||
:height 76
|
||||
:border-color colors/gray-lighter
|
||||
:border-top-width 1
|
||||
:flex 1
|
||||
:flex-direction :row
|
||||
:justify-content :space-between
|
||||
:align-items :center
|
||||
:padding-horizontal 16})
|
||||
|
||||
(defn success-button-container
|
||||
[]
|
||||
{:width "100%"
|
||||
:height 76
|
||||
:border-color colors/gray-lighter
|
||||
:border-top-width 1
|
||||
:flex-direction :row
|
||||
:justify-content :flex-end
|
||||
:align-items :center
|
||||
:padding-horizontal 16})
|
||||
|
||||
(defn account-container
|
||||
[color account-selected?]
|
||||
{:height 34
|
||||
:background-color color
|
||||
:border-radius 17
|
||||
:padding-horizontal 10
|
||||
:justify-content :center
|
||||
:margin-right 4
|
||||
:opacity (if account-selected? 1 0.5)})
|
||||
|
||||
(def account-selector-container
|
||||
{:height 80
|
||||
:width "100%"
|
||||
:justify-content :center
|
||||
:padding-horizontal 16})
|
||||
|
||||
(def account-selector-wrapper
|
||||
{:margin-top 40
|
||||
:width "100%"})
|
||||
|
||||
(def account-selector-list
|
||||
{:height 40
|
||||
:width "100%"
|
||||
:margin-top 10})
|
||||
|
||||
(def single-account-container
|
||||
{:width "100%"
|
||||
:align-items :center
|
||||
:padding-top 8})
|
||||
|
||||
(defn blur-view
|
||||
[]
|
||||
{:position :absolute
|
||||
:top 60
|
||||
:left 0
|
||||
:right 0
|
||||
:bottom 0
|
||||
:background-color (:blurred-bg @colors/theme)})
|
||||
|
||||
(def shadow
|
||||
{:width "100%"
|
||||
:height 50
|
||||
:opacity 0.3})
|
||||
|
||||
(defn management-sheet-header
|
||||
[]
|
||||
{:width "100%"
|
||||
:flex-direction :row
|
||||
:padding 16
|
||||
:align-items :center
|
||||
:border-bottom-width 1
|
||||
:border-bottom-color colors/gray-lighter})
|
||||
|
||||
(def management-icon
|
||||
{:width 40
|
||||
:height 40
|
||||
:border-radius 20
|
||||
:margin-right 16})
|
||||
|
||||
(def app-info-container
|
||||
{:flex-direction :column
|
||||
:flex 1})
|
||||
@@ -1,246 +0,0 @@
|
||||
(ns status-im.ui.screens.wallet-connect.session-proposal.views
|
||||
(:require-macros [status-im.utils.views :refer [defview letsubs]])
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[re-frame.core :as re-frame]
|
||||
[react-native.platform :as platform]
|
||||
[reagent.core :as reagent]
|
||||
[status-im.ui.components.bottom-panel.views :as bottom-panel]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[status-im.ui.components.core :as quo]
|
||||
[status-im.ui.components.icons.icons :as icons]
|
||||
[status-im.ui.components.list.views :as list]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.ui.screens.wallet-connect.session-proposal.styles :as styles]
|
||||
[status-im.utils.utils :as status.utils]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.security.core]))
|
||||
|
||||
(def chevron-icon-container-width 24)
|
||||
|
||||
(def chevron-icon-container-height 24)
|
||||
|
||||
(defn toolbar-selection
|
||||
[{:keys [text background-color on-press]}]
|
||||
[react/touchable-opacity {:on-press on-press}
|
||||
[react/view (styles/toolbar-container background-color)
|
||||
[quo/text
|
||||
{:color :inverse
|
||||
:weight :medium
|
||||
:style styles/toolbar-text}
|
||||
text]
|
||||
[icons/icon
|
||||
:main-icons/chevron-down
|
||||
{:color (:text-05 @colors/theme)
|
||||
:width chevron-icon-container-width
|
||||
:height chevron-icon-container-height}]]])
|
||||
|
||||
(def show-account-selector? (reagent/atom false))
|
||||
|
||||
(defn render-account
|
||||
[{:keys [address name color] :as account} _ _ {:keys [selected-account on-select]}]
|
||||
(let [account-selected? (= (:address @selected-account) address)]
|
||||
[react/touchable-without-feedback
|
||||
{:on-press #(do
|
||||
(reset! selected-account (merge {} account))
|
||||
(when on-select (on-select)))}
|
||||
[react/view (styles/account-container color account-selected?)
|
||||
[quo/text
|
||||
{:color :inverse
|
||||
:weight (if account-selected? :medium :regular)}
|
||||
name]]]))
|
||||
|
||||
(defn account-selector
|
||||
[accounts selected-account-atom on-select]
|
||||
[react/view styles/account-selector-container
|
||||
[quo/text {:size :small} (i18n/label :t/select-account)]
|
||||
[list/flat-list
|
||||
{:data accounts
|
||||
:key-fn :address
|
||||
:render-fn render-account
|
||||
:render-data {:selected-account selected-account-atom
|
||||
:on-select on-select}
|
||||
:horizontal true
|
||||
:shows-horizontal-scroll-indicator false
|
||||
:extra-data @selected-account-atom
|
||||
:style styles/account-selector-list}]])
|
||||
|
||||
(defn account-picker
|
||||
[accounts selected-account-atom {:keys [on-press on-select]}]
|
||||
(if (> (count accounts) 1)
|
||||
[react/view {:style styles/account-selector-wrapper}
|
||||
[account-selector accounts selected-account-atom on-select]]
|
||||
[react/touchable-opacity {:style styles/single-account-container}
|
||||
[toolbar-selection
|
||||
{:text (:name @selected-account-atom)
|
||||
:background-color (:color @selected-account-atom)
|
||||
:on-press on-press}]]))
|
||||
|
||||
(defview success-sheet-view
|
||||
[{:keys [topic]}]
|
||||
(letsubs [visible-accounts [:visible-accounts-without-watch-only]
|
||||
dapps-account [:dapps-account]
|
||||
sessions [:wallet-connect/sessions]
|
||||
managed-session [:wallet-connect/session-managed]]
|
||||
(let [{:keys [peer state] :as session} (first (filter #(= (:topic %) topic) sessions))
|
||||
{:keys [metadata]} peer
|
||||
{:keys [accounts]} state
|
||||
{:keys [name icons]} metadata
|
||||
filtered-icons (status.utils/exclude-svg-resources icons)
|
||||
icon-uri (when (and filtered-icons (pos? (count filtered-icons)))
|
||||
(first filtered-icons))
|
||||
address (last (string/split (first accounts) #":"))
|
||||
account (first (filter #(= (:address %) address) visible-accounts))
|
||||
selected-account-atom (reagent/atom account)]
|
||||
[react/view (styles/proposal-sheet-container)
|
||||
[react/view (styles/proposal-sheet-header)
|
||||
[quo/text
|
||||
{:weight :bold
|
||||
:size :large}
|
||||
(i18n/label :t/successful-connection)]]
|
||||
[react/image
|
||||
{:style (styles/dapp-logo)
|
||||
:source {:uri icon-uri}}]
|
||||
[react/view styles/sheet-body-container
|
||||
[react/view styles/proposal-title-container
|
||||
[quo/text
|
||||
{:weight :bold
|
||||
:size :large}
|
||||
name]
|
||||
[quo/text
|
||||
{:weight :regular
|
||||
:size :large}
|
||||
(i18n/label :t/connected)]]]
|
||||
[account-picker
|
||||
(vector dapps-account)
|
||||
selected-account-atom
|
||||
{:on-press (fn []
|
||||
(re-frame/dispatch [:wallet-connect/manage-app session])
|
||||
(reset! show-account-selector? true))}]
|
||||
[quo/text
|
||||
{:weight :regular
|
||||
:color :secondary
|
||||
:style styles/message-title}
|
||||
(i18n/label :t/manage-connections)]
|
||||
[react/view (styles/success-button-container)
|
||||
[quo/button
|
||||
{:theme :accent
|
||||
:on-press #(do
|
||||
(reset! show-account-selector? false)
|
||||
(re-frame/dispatch [:hide-wallet-connect-success-sheet]))}
|
||||
(i18n/label :t/close)]]
|
||||
(when managed-session
|
||||
(if platform/ios?
|
||||
[react/blur-view
|
||||
{:style (styles/blur-view)
|
||||
:blurAmount 2
|
||||
:blurType (if (colors/dark?) :dark :light)}]
|
||||
[react/view (styles/blur-view)]))])))
|
||||
|
||||
(defview app-management-sheet-view
|
||||
[{:keys [topic]}]
|
||||
(letsubs [sessions [:wallet-connect/sessions]
|
||||
visible-accounts [:visible-accounts-without-watch-only]]
|
||||
(let [{:keys [peer state]} (first (filter #(= (:topic %) topic) sessions))
|
||||
{:keys [metadata]} peer
|
||||
{:keys [accounts]} state
|
||||
{:keys [name icons url]} metadata
|
||||
filtered-icons (status-im.utils.utils/exclude-svg-resources icons)
|
||||
icon-uri (when (and filtered-icons (pos? (count filtered-icons)))
|
||||
(first filtered-icons))
|
||||
address (last (string/split (first accounts) #":"))
|
||||
account (first (filter #(= (:address %) address) visible-accounts))
|
||||
selected-account-atom (reagent/atom account)]
|
||||
[react/view {:style (merge (styles/acc-sheet) {:background-color "rgba(0,0,0,0)"})}
|
||||
[react/linear-gradient
|
||||
{:colors ["rgba(0,0,0,0)" "rgba(0,0,0,0.3)"]
|
||||
:start {:x 0 :y 0}
|
||||
:end {:x 0 :y 1}
|
||||
:style styles/shadow}]
|
||||
[react/view (styles/proposal-sheet-container)
|
||||
[react/view (styles/management-sheet-header)
|
||||
[react/image
|
||||
{:style styles/management-icon
|
||||
:source {:uri icon-uri}}]
|
||||
[react/view styles/app-info-container
|
||||
[quo/text {:weight :medium} name]
|
||||
[quo/text
|
||||
{:color :secondary
|
||||
:number-of-lines 1
|
||||
:elipsize-mode :tail} url]]
|
||||
[quo/button
|
||||
{:type :secondary
|
||||
:theme :secondary
|
||||
:on-press #(re-frame/dispatch [:wallet-connect/disconnect topic])}
|
||||
(i18n/label :t/disconnect)]]
|
||||
[account-selector
|
||||
visible-accounts
|
||||
selected-account-atom
|
||||
#(re-frame/dispatch
|
||||
[:wallet-connect/change-session-account topic @selected-account-atom])]]])))
|
||||
|
||||
(defview session-proposal-sheet
|
||||
[{:keys [name icons]}]
|
||||
(letsubs [visible-accounts [:visible-accounts-without-watch-only]
|
||||
dapps-account [:dapps-account]]
|
||||
(let [filtered-icons (status-im.utils.utils/exclude-svg-resources icons)
|
||||
icon-uri (when (and filtered-icons (> (count filtered-icons) 0))
|
||||
(first filtered-icons))
|
||||
selected-account-atom (reagent/atom dapps-account)]
|
||||
[react/view (styles/proposal-sheet-container)
|
||||
[react/view (styles/proposal-sheet-header)
|
||||
[quo/text
|
||||
{:weight :bold
|
||||
:size :large}
|
||||
(i18n/label :t/connection-request)]]
|
||||
[react/image
|
||||
{:style (styles/dapp-logo)
|
||||
:source {:uri icon-uri}}]
|
||||
[react/view styles/sheet-body-container
|
||||
[react/view styles/proposal-title-container
|
||||
[quo/text
|
||||
{:weight :bold
|
||||
:size :large}
|
||||
(str name " ")]
|
||||
[quo/text
|
||||
{:weight :regular
|
||||
:size :large}
|
||||
(i18n/label :t/wallet-connect-proposal-title)]]]
|
||||
[account-picker visible-accounts selected-account-atom]
|
||||
[react/view
|
||||
(merge (styles/proposal-buttons-container)
|
||||
(when (= (count visible-accounts) 1) {:margin-top 12}))
|
||||
[quo/button
|
||||
{:type :secondary
|
||||
:on-press #(re-frame/dispatch [:wallet-connect/reject-proposal])}
|
||||
(i18n/label :t/reject)]
|
||||
[quo/button
|
||||
{:theme :accent
|
||||
:on-press #(re-frame/dispatch [:wallet-connect/approve-proposal @selected-account-atom])}
|
||||
(i18n/label :t/connect)]]])))
|
||||
|
||||
(defview wallet-connect-proposal-sheet
|
||||
[]
|
||||
(letsubs [proposal-metadata [:wallet-connect/proposal-metadata]]
|
||||
[bottom-panel/animated-bottom-panel
|
||||
proposal-metadata
|
||||
session-proposal-sheet
|
||||
#(re-frame/dispatch [:hide-wallet-connect-sheet])]))
|
||||
|
||||
(defview wallet-connect-success-sheet-view
|
||||
[]
|
||||
(letsubs [session [:wallet-connect/session-connected]]
|
||||
[bottom-panel/animated-bottom-panel
|
||||
session
|
||||
success-sheet-view
|
||||
#(re-frame/dispatch [:hide-wallet-connect-success-sheet])]))
|
||||
|
||||
(defview wallet-connect-app-management-sheet-view
|
||||
[]
|
||||
(letsubs [session [:wallet-connect/session-managed]]
|
||||
[bottom-panel/animated-bottom-panel
|
||||
session
|
||||
app-management-sheet-view
|
||||
#(re-frame/dispatch [:hide-wallet-connect-app-management-sheet])
|
||||
#(re-frame/dispatch [:hide-wallet-connect-app-management-sheet])
|
||||
false]))
|
||||
@@ -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"))
|
||||
|
||||
@@ -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?))))))
|
||||
@@ -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}))))
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user