Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f3538756a |
@@ -4,6 +4,7 @@ DEFAULT_NETWORK=mainnet_rpc
|
||||
DEV_BUILD=1
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=status.prod
|
||||
GROUP_CHATS_ENABLED=1
|
||||
LOG_LEVEL=info
|
||||
MAILSERVER_CONFIRMATIONS_ENABLED=1
|
||||
|
||||
@@ -2,7 +2,7 @@ DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=goerli_rpc
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=status.staging
|
||||
FLEET=status.prod
|
||||
GROUP_CHATS_ENABLED=1
|
||||
LOG_LEVEL=debug
|
||||
MAILSERVER_CONFIRMATIONS_ENABLED=0
|
||||
|
||||
@@ -3,6 +3,7 @@ DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=goerli_rpc
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=status.prod
|
||||
GROUP_CHATS_ENABLED=1
|
||||
LOG_LEVEL=debug
|
||||
MAILSERVER_CONFIRMATIONS_ENABLED=1
|
||||
|
||||
@@ -2,6 +2,7 @@ DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=status.prod
|
||||
GROUP_CHATS_ENABLED=1
|
||||
LOG_LEVEL=info
|
||||
MAILSERVER_CONFIRMATIONS_ENABLED=1
|
||||
|
||||
@@ -2,6 +2,7 @@ DEBUG_WEBVIEW=0
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
ETHEREUM_DEV_CLUSTER=0
|
||||
EXTENSIONS=0
|
||||
FLEET=status.prod
|
||||
GROUP_CHATS_ENABLED=1
|
||||
LOG_LEVEL=
|
||||
MAILSERVER_CONFIRMATIONS_ENABLED=1
|
||||
|
||||
+9
-14
@@ -1,15 +1,10 @@
|
||||
/*
|
||||
|
||||
# Format top-level js files.
|
||||
*
|
||||
!*.js
|
||||
|
||||
# Ignore all except src/js/**/*.js
|
||||
!/src/
|
||||
/src/*
|
||||
!/src/js
|
||||
!/src/js/**/*.js
|
||||
|
||||
# Ignore all except translations/en.json
|
||||
!/translations/
|
||||
/translations/*
|
||||
!/translations/en.json
|
||||
!*/
|
||||
*.clj-kondo
|
||||
*.shadow-cljs
|
||||
modules
|
||||
result
|
||||
target
|
||||
component-spec
|
||||
/app
|
||||
|
||||
@@ -6,8 +6,4 @@ module.exports = {
|
||||
tabWidth: 2,
|
||||
trailingComma: 'all',
|
||||
useTabs: false,
|
||||
|
||||
// JSON sorting
|
||||
jsonSortOrder: '{ "/.*/": "caseInsensitiveLexical" } ',
|
||||
plugins: ['prettier-plugin-sort-json'],
|
||||
};
|
||||
|
||||
@@ -317,7 +317,7 @@ lint: ##@test Run code style checks
|
||||
scripts/lint/translations.clj && \
|
||||
zprint '{:search-config? true}' -sfc $$ALL_CLOJURE_FILES && \
|
||||
sh scripts/lint/trailing-newline.sh && \
|
||||
node_modules/.bin/prettier --check .
|
||||
node_modules/.bin/prettier --write .
|
||||
|
||||
# NOTE: We run the linter twice because of https://github.com/kkinnear/zprint/issues/271
|
||||
lint-fix: export TARGET := clojure
|
||||
@@ -353,17 +353,14 @@ test: export SHADOW_NS_REGEXP := .*-test$$
|
||||
test: ##@test Run all Clojure tests
|
||||
test: _test-clojure
|
||||
|
||||
test-repl-run-watcher: export TARGET := default
|
||||
test-repl-run-watcher: export SHADOW_OUTPUT_TO := target/test/test.js
|
||||
test-repl-run-watcher: export SHADOW_NS_REGEXP := .*-test$$
|
||||
test-repl-run-watcher: ##@test Watch all Clojure tests and support REPL connections
|
||||
yarn install && shadow-cljs compile mocks && yarn shadow-cljs watch test
|
||||
|
||||
test-repl-run-js-backend: export TARGET := default
|
||||
test-repl-run-js-backend: export SHADOW_OUTPUT_TO := target/test/test.js
|
||||
test-repl-run-js-backend: export SHADOW_NS_REGEXP := .*-test$$
|
||||
test-repl-run-js-backend: ##@test Run Clojure tests in node with REPL support
|
||||
node --require ./test-resources/override.js $$SHADOW_OUTPUT_TO --repl # \
|
||||
test-watch-for-repl: export TARGET := default
|
||||
test-watch-for-repl: export SHADOW_OUTPUT_TO := target/test/test.js
|
||||
test-watch-for-repl: export SHADOW_NS_REGEXP := .*-test$$
|
||||
test-watch-for-repl: ##@test Watch all Clojure tests and support REPL connections
|
||||
yarn install && shadow-cljs compile mocks && \
|
||||
concurrently --kill-others --prefix-colors 'auto' --names 'build,repl' \
|
||||
'yarn shadow-cljs watch test --verbose' \
|
||||
"until [ -f $$SHADOW_OUTPUT_TO ] ; do sleep 1 ; done ; node --require ./test-resources/override.js $$SHADOW_OUTPUT_TO --repl"
|
||||
|
||||
test-unit: export SHADOW_OUTPUT_TO := target/unit_test/test.js
|
||||
test-unit: export SHADOW_NS_REGEXP := ^(?!tests\.integration-test)(?!tests\.contract-test).*-test$$
|
||||
|
||||
@@ -99,7 +99,7 @@ pipeline {
|
||||
--rerun_count=2 \
|
||||
--testrail_report=True \
|
||||
-m testrail_id \
|
||||
-m \"nightly\" \
|
||||
-m \"new_ui_critical or new_ui_medium\" \
|
||||
-k \"${params.KEYWORD_EXPRESSION}\" \
|
||||
--apk=${params.APK_URL ?: apk_path}
|
||||
"""
|
||||
|
||||
@@ -35,11 +35,13 @@ pipeline {
|
||||
description: 'OBSOLETE ARGUMENT TO BE REMOVED',
|
||||
defaultValue: 'DUMMY',
|
||||
)
|
||||
/* Commented to use TEST_MARKERS values from job params
|
||||
string(
|
||||
name: 'TEST_MARKERS',
|
||||
description: 'Marker expression for matching tests to run.',
|
||||
defaultValue: 'smoke',
|
||||
defaultValue: 'new_ui_critical',
|
||||
)
|
||||
*/
|
||||
}
|
||||
|
||||
options {
|
||||
|
||||
+2
-2
@@ -915,7 +915,7 @@ PODS:
|
||||
- glog
|
||||
- RCT-Folly (= 2022.05.16.00)
|
||||
- React-Core
|
||||
- react-native-compat (2.11.2):
|
||||
- react-native-compat (2.12.2):
|
||||
- glog
|
||||
- RCT-Folly (= 2022.05.16.00)
|
||||
- React-Core
|
||||
@@ -1517,7 +1517,7 @@ SPEC CHECKSUMS:
|
||||
react-native-blob-util: 600972b1782380a5a7d5db61a3817ea32349dae9
|
||||
react-native-blur: 799045500f56146afc46245148080e7b7623cb75
|
||||
react-native-cameraroll: af8eec1e585d053ff485d98ec837f9a8a11b5745
|
||||
react-native-compat: 3af9add14d349701306d3d052638435f6795ac2c
|
||||
react-native-compat: 84e00e8dcff9251278c0d48f2bce81f4502e3925
|
||||
react-native-config: 5330c8258265c1e5fdb8c009d2cabd6badd96727
|
||||
react-native-get-random-values: 21325b2244dfa6b58878f51f9aa42821e7ba3d06
|
||||
react-native-hole-view: 6935448993bac79f2b5a4ad7e9741094cf810679
|
||||
|
||||
+1
-2
@@ -97,8 +97,7 @@
|
||||
"jest-silent-reporter": "^0.5.0",
|
||||
"nodemon": "^2.0.16",
|
||||
"nyc": "^14.1.1",
|
||||
"prettier": "^3.3.3",
|
||||
"prettier-plugin-sort-json": "^4.0.0",
|
||||
"prettier": "^2.8.8",
|
||||
"process": "0.11.10",
|
||||
"react-test-renderer": "18.1.0",
|
||||
"shadow-cljs": "2.26.2",
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 5.1 KiB |
@@ -18,7 +18,6 @@
|
||||
[{:keys [current-log-level
|
||||
telemetry-enabled?
|
||||
light-client-enabled?
|
||||
store-confirmations-enabled?
|
||||
current-fleet
|
||||
test-networks-enabled?
|
||||
is-goerli-enabled?
|
||||
@@ -78,15 +77,6 @@
|
||||
[:wakuv2.ui/toggle-light-client (not light-client-enabled?)])
|
||||
:accessory :switch
|
||||
:active light-client-enabled?}
|
||||
{:size :small
|
||||
:title (i18n/label :t/store-confirmations)
|
||||
:accessibility-label :store-confirmations
|
||||
:container-margin-bottom 8
|
||||
:on-press
|
||||
#(re-frame/dispatch
|
||||
[:wakuv2.ui/toggle-store-confirmations (not store-confirmations-enabled?)])
|
||||
:accessory :switch
|
||||
:active store-confirmations-enabled?}
|
||||
{:size :small
|
||||
:title "Testnet mode"
|
||||
:accessibility-label :test-networks-enabled
|
||||
@@ -124,14 +114,13 @@
|
||||
|
||||
(views/defview advanced-settings
|
||||
[]
|
||||
(views/letsubs [test-networks-enabled? [:profile/test-networks-enabled?]
|
||||
is-goerli-enabled? [:profile/is-goerli-enabled?]
|
||||
light-client-enabled? [:profile/light-client-enabled?]
|
||||
store-confirmations-enabled? [:profile/store-confirmations-enabled?]
|
||||
telemetry-enabled? [:profile/telemetry-enabled?]
|
||||
current-log-level [:log-level/current-log-level]
|
||||
current-fleet [:fleets/current-fleet]
|
||||
peer-syncing-enabled? [:profile/peer-syncing-enabled?]]
|
||||
(views/letsubs [test-networks-enabled? [:profile/test-networks-enabled?]
|
||||
is-goerli-enabled? [:profile/is-goerli-enabled?]
|
||||
light-client-enabled? [:profile/light-client-enabled?]
|
||||
telemetry-enabled? [:profile/telemetry-enabled?]
|
||||
current-log-level [:log-level/current-log-level]
|
||||
current-fleet [:fleets/current-fleet]
|
||||
peer-syncing-enabled? [:profile/peer-syncing-enabled?]]
|
||||
[:<>
|
||||
[quo/page-nav
|
||||
{:type :title
|
||||
@@ -141,14 +130,13 @@
|
||||
:on-press #(rf/dispatch [:navigate-back])}]
|
||||
[list/flat-list
|
||||
{:data (flat-list-data
|
||||
{:current-log-level current-log-level
|
||||
:telemetry-enabled? telemetry-enabled?
|
||||
:light-client-enabled? light-client-enabled?
|
||||
:store-confirmations-enabled? store-confirmations-enabled?
|
||||
:current-fleet current-fleet
|
||||
:dev-mode? false
|
||||
:test-networks-enabled? test-networks-enabled?
|
||||
:is-goerli-enabled? is-goerli-enabled?
|
||||
:peer-syncing-enabled? peer-syncing-enabled?})
|
||||
{:current-log-level current-log-level
|
||||
:telemetry-enabled? telemetry-enabled?
|
||||
:light-client-enabled? light-client-enabled?
|
||||
:current-fleet current-fleet
|
||||
:dev-mode? false
|
||||
:test-networks-enabled? test-networks-enabled?
|
||||
:is-goerli-enabled? is-goerli-enabled?
|
||||
:peer-syncing-enabled? peer-syncing-enabled?})
|
||||
:key-fn (fn [_ i] (str i))
|
||||
:render-fn render-item}]]))
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
(ns legacy.status-im.utils.hex
|
||||
(:require
|
||||
[clojure.string :as string]))
|
||||
|
||||
(defn normalize-hex
|
||||
[hex]
|
||||
(when hex
|
||||
(string/lower-case (if (string/starts-with? hex "0x")
|
||||
(subs hex 2)
|
||||
hex))))
|
||||
|
||||
(defn valid-hex?
|
||||
[hex]
|
||||
(let [hex (normalize-hex hex)]
|
||||
(and (re-matches #"^[0-9a-fA-F]+$" hex)
|
||||
(not= (js/parseInt hex 16) 0))))
|
||||
@@ -137,19 +137,3 @@
|
||||
:on-error #(log/error "failed to set light client"
|
||||
{:error %
|
||||
:enabled? enabled?})}]})
|
||||
|
||||
(rf/defn toggle-store-confirmations
|
||||
{:events [:wakuv2.ui/toggle-store-confirmations]}
|
||||
[{:keys [db]} enabled?]
|
||||
{:db (assoc-in db
|
||||
[:profile/profile :wakuv2-config :EnableStoreConfirmationForMessagesSent]
|
||||
enabled?)
|
||||
|
||||
:json-rpc/call [{:method "wakuext_setStoreConfirmationForMessagesSent"
|
||||
:params [{:enabled enabled?}]
|
||||
:on-success (fn []
|
||||
(log/info "store confirmation set successfully" enabled?)
|
||||
(re-frame/dispatch [:logout]))
|
||||
:on-error #(log/error "failed to set store confirmation"
|
||||
{:error %
|
||||
:enabled? enabled?})}]})
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
(ns quo.components.avatars.token-avatar.view
|
||||
(:require [quo.components.avatars.token-avatar.style :as style]
|
||||
[quo.components.utilities.token.view :as token]
|
||||
[react-native.core :as rn]
|
||||
[react-native.hole-view :as hole-view]
|
||||
[react-native.platform :as platform]
|
||||
@@ -13,14 +12,13 @@
|
||||
[:map {:closed true}
|
||||
[:type {:optional true} [:enum :asset :collectible]]
|
||||
[:context? {:optional true} [:maybe :boolean]]
|
||||
[:image {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:token {:optional true} [:maybe [:or :keyword :string]]]
|
||||
[:image :schema.common/image-source]
|
||||
[:network-image {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [type context? image token network-image container-style]}]
|
||||
[{:keys [type context? image network-image container-style]}]
|
||||
[rn/view
|
||||
{:style (merge style/container container-style)
|
||||
:accessibility-label :token-avatar}
|
||||
@@ -34,11 +32,9 @@
|
||||
[])
|
||||
:style style/hole-view}
|
||||
platform/android? (assoc :key context?))
|
||||
[token/view
|
||||
{:size :size-32
|
||||
:token token
|
||||
:style (style/image type)
|
||||
:image-source image}]]
|
||||
[rn/image
|
||||
{:source image
|
||||
:style (style/image type)}]]
|
||||
(when context?
|
||||
[rn/image
|
||||
{:source network-image
|
||||
|
||||
@@ -21,17 +21,15 @@
|
||||
(colors/theme-colors colors/white colors/neutral-95 theme))})
|
||||
|
||||
(defn buttons-container
|
||||
[actions container-style]
|
||||
(merge
|
||||
{:flex-direction (if (= actions :two-vertical-actions) :column :row)
|
||||
:justify-content :space-around
|
||||
:padding-vertical 12
|
||||
:gap 12
|
||||
:padding-horizontal 20}
|
||||
container-style))
|
||||
[actions]
|
||||
{:flex-direction (if (= actions :two-vertical-actions) :column :row)
|
||||
:justify-content :space-around
|
||||
:padding-vertical 12
|
||||
:gap 12
|
||||
:padding-horizontal 20})
|
||||
|
||||
(def button-container
|
||||
{:flex-grow 1})
|
||||
{:flex 1})
|
||||
|
||||
(def description-top
|
||||
{:flex-direction :row
|
||||
|
||||
@@ -30,8 +30,7 @@
|
||||
[:button-two-props {:optional true} [:maybe :map]]
|
||||
[:scroll? {:optional true} [:maybe :boolean]]
|
||||
[:blur? {:optional true} [:maybe :boolean]]
|
||||
[:container-style {:optional true} [:maybe :map]]
|
||||
[:buttons-container-style {:optional true} [:maybe :map]]]]]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
(def ^:private role-icon
|
||||
@@ -43,7 +42,7 @@
|
||||
(defn- view-internal
|
||||
[{:keys [actions description description-text description-top-text error-message role button-one-label
|
||||
button-two-label blur? button-one-props button-two-props scroll? container-style
|
||||
buttons-container-style context-tag-props]}]
|
||||
context-tag-props]}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[rn/view
|
||||
{:style (merge (style/container scroll? blur? theme) container-style)}
|
||||
@@ -73,14 +72,14 @@
|
||||
:context (i18n/label (keyword "t" role))}
|
||||
context-tag-props)]])
|
||||
|
||||
[rn/view {:style (style/buttons-container actions buttons-container-style)}
|
||||
[rn/view {:style (style/buttons-container actions)}
|
||||
(when (or (= actions :two-actions)
|
||||
(= actions :two-vertical-actions))
|
||||
[button/button
|
||||
(merge
|
||||
{:size 40
|
||||
:container-style style/button-container
|
||||
:background (when (or blur? scroll?) :blur)
|
||||
:container-style style/button-container
|
||||
:theme theme
|
||||
:accessibility-label :button-two}
|
||||
button-two-props)
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
{:type :spending-cap
|
||||
:label "Spending Cap"
|
||||
:button-label "Edit"
|
||||
:button-icon :i/options
|
||||
:on-button-press on-button-press
|
||||
:avatar-props {:image "image"}}])
|
||||
(h/fire-event :press (h/get-by-text "Edit"))
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
:style (style/description blur? theme)}
|
||||
description])]
|
||||
(when (= type :account) [tiny-tag/view {:label tag-label}])
|
||||
(when (and (= type :spending-cap) button-icon)
|
||||
(when (= type :spending-cap)
|
||||
[button/button
|
||||
{:type :outline
|
||||
:size 24
|
||||
|
||||
@@ -79,20 +79,14 @@
|
||||
[counter-view counter])
|
||||
[rn/view {:style (style/collectible-border theme)}]]]))
|
||||
|
||||
(defn invalid-image?
|
||||
[image-src]
|
||||
(or (nil? image-src)
|
||||
(string/blank? image-src)))
|
||||
|
||||
(defn view-internal
|
||||
[{:keys [container-style square? on-press counter image-src native-ID supported-file?
|
||||
on-collectible-load aspect-ratio gradient-color-index]
|
||||
:or {gradient-color-index :gradient-1
|
||||
on-collectible-load (fn [])}}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
[error? set-error] (rn/use-state (invalid-image? image-src))]
|
||||
(rn/use-effect #(set-error (invalid-image? image-src))
|
||||
[image-src])
|
||||
[error? set-error] (rn/use-state (or (nil? image-src)
|
||||
(string/blank? image-src)))]
|
||||
[rn/pressable
|
||||
{:style (merge container-style (style/container aspect-ratio))
|
||||
:accessibility-label :expanded-collectible
|
||||
|
||||
@@ -121,7 +121,6 @@
|
||||
[:card? {:optional true} [:maybe :boolean]]
|
||||
[:right-icon {:optional true} [:maybe :keyword]]
|
||||
[:right-content {:optional true} [:maybe :map]]
|
||||
[:icon-color {:optional true} [:maybe :schema.common/customization-color]]
|
||||
[:status {:optional true} [:maybe [:enum :default :loading]]]
|
||||
[:subtitle-type {:optional true} [:maybe [:enum :default :icon :network :account :editable]]]
|
||||
[:size {:optional true} [:maybe [:enum :default :small :large]]]
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
(ns quo.components.slideshow.slider-bar.component-spec
|
||||
(:require
|
||||
[quo.components.slideshow.slider-bar.view :as slider-bar]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(h/describe "Slideshow: slider-bar"
|
||||
(h/test "default render"
|
||||
(h/render-with-theme-provider [slider-bar/view {:accessibility-label :slider-bar}])
|
||||
(h/is-truthy (h/query-by-label-text :slider-bar)))
|
||||
|
||||
(h/test "render with total-amount and active-index"
|
||||
(h/render-with-theme-provider [slider-bar/view
|
||||
{:total-amount 4
|
||||
:active-index 1
|
||||
:accessibility-label :slider-bar}])
|
||||
(h/is-truthy (h/query-by-label-text :slider-bar))
|
||||
(h/is-equal 4 (count (h/query-all-by-label-text :slide-bar-item))))
|
||||
|
||||
(h/test "render with total-amount active-index and possible scroll"
|
||||
(h/render-with-theme-provider [slider-bar/view
|
||||
{:total-amount 10
|
||||
:active-index 7
|
||||
:accessibility-label :slider-bar}])
|
||||
(h/is-truthy (h/query-by-label-text :slider-bar))
|
||||
(h/is-equal 10 (count (h/query-all-by-label-text :slide-bar-item)))))
|
||||
@@ -1,14 +0,0 @@
|
||||
(ns quo.components.slideshow.slider-bar.schema)
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:cat
|
||||
[:map {:closed true}
|
||||
[:total-amount {:optional true} [:maybe :int]]
|
||||
[:active-index {:optional true} :int]
|
||||
[:customization-color {:optional true}
|
||||
[:maybe :schema.common/customization-color]]
|
||||
[:blur? {:optional true} [:maybe :boolean]]
|
||||
[:accessibility-label {:optional true} [:maybe :keyword]]
|
||||
[:container-style {:optional true} [:maybe :map]]]]
|
||||
:any])
|
||||
@@ -1,31 +0,0 @@
|
||||
(ns quo.components.slideshow.slider-bar.style
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]))
|
||||
|
||||
(def list-wrapper
|
||||
{:align-items :center})
|
||||
|
||||
(defn list-bar
|
||||
[bar-width]
|
||||
{:width bar-width})
|
||||
|
||||
(defn item-wrapper
|
||||
[{:keys [size spacing]}]
|
||||
{:width size
|
||||
:height size
|
||||
:margin-left spacing
|
||||
:flex 1
|
||||
:align-items :center
|
||||
:justify-content :center})
|
||||
|
||||
(defn item
|
||||
[{:keys [size spacing active? customization-color theme blur?]}]
|
||||
{:width size
|
||||
:height size
|
||||
:border-radius spacing
|
||||
:background-color
|
||||
(cond
|
||||
(and blur? active?) colors/white
|
||||
(and blur? (not active?)) colors/white-opa-10
|
||||
(and (not blur?) active?) (colors/resolve-color customization-color theme)
|
||||
:else (colors/theme-colors colors/neutral-20 colors/neutral-80 theme))})
|
||||
@@ -1,150 +0,0 @@
|
||||
(ns quo.components.slideshow.slider-bar.view
|
||||
(:require
|
||||
[quo.components.slideshow.slider-bar.schema :as component-schema]
|
||||
[quo.components.slideshow.slider-bar.style :as style]
|
||||
[quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[react-native.reanimated :as reanimated]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(def item-size 8)
|
||||
(def item-spacing item-size)
|
||||
(def max-length 6)
|
||||
(def bar-width (* (+ item-spacing item-size) max-length))
|
||||
|
||||
(def micro-scale 0.25)
|
||||
(def small-scale 0.5)
|
||||
(def medium-scale 0.75)
|
||||
(def default-scale 1)
|
||||
|
||||
(def items-before-scroll
|
||||
(/ max-length 2))
|
||||
|
||||
(defn- calc-relative-index
|
||||
"Calculates item index in visible area"
|
||||
[index active-index total-length]
|
||||
(let [last-index (dec total-length)]
|
||||
(cond
|
||||
(< active-index items-before-scroll) index
|
||||
(> active-index
|
||||
(- last-index items-before-scroll)) (+ (- index total-length) max-length)
|
||||
:else (+ (- index active-index) items-before-scroll))))
|
||||
|
||||
(defn- calc-first-item-scale
|
||||
"Calculates scale for first item in visible area"
|
||||
[active-index]
|
||||
(cond
|
||||
(= active-index items-before-scroll) medium-scale
|
||||
(> active-index items-before-scroll) small-scale
|
||||
:else default-scale))
|
||||
|
||||
(defn- calc-second-item-scale
|
||||
"Calculates scale for second item in visible area"
|
||||
[active-index]
|
||||
(if (> active-index items-before-scroll)
|
||||
medium-scale
|
||||
default-scale))
|
||||
|
||||
(defn- calc-last-item-scale
|
||||
"Calculates scale for last item in visible area"
|
||||
[active-index total-length]
|
||||
(let [last-index (dec total-length)]
|
||||
(if (> active-index (- last-index items-before-scroll))
|
||||
medium-scale
|
||||
small-scale)))
|
||||
|
||||
(defn- calc-last-but-one-item-scale
|
||||
"Calculates scale for before last item in visible area"
|
||||
[active-index total-length]
|
||||
(if (> active-index (- (dec total-length) items-before-scroll))
|
||||
default-scale
|
||||
medium-scale))
|
||||
|
||||
(defn- get-scale
|
||||
[index active-index total-length]
|
||||
(let [relative-index (calc-relative-index index active-index total-length)]
|
||||
(if (or (= index active-index)
|
||||
(< total-length max-length))
|
||||
default-scale
|
||||
(cond
|
||||
(< relative-index 0) micro-scale
|
||||
(= relative-index 0) (calc-first-item-scale active-index)
|
||||
(= relative-index 1) (calc-second-item-scale active-index)
|
||||
(= relative-index 4) (calc-last-but-one-item-scale active-index total-length)
|
||||
(= relative-index 5) (calc-last-item-scale active-index total-length)
|
||||
(> relative-index 5) micro-scale
|
||||
:else
|
||||
default-scale))))
|
||||
|
||||
(defn- bar-item
|
||||
[index _ _ {:keys [active-index total-length customization-color theme blur?]}]
|
||||
(let [active? (= index active-index)
|
||||
shared-scale (reanimated/use-shared-value (get-scale index active-index total-length))]
|
||||
(rn/use-effect (fn []
|
||||
(let [new-scale-value (get-scale index active-index total-length)]
|
||||
(reanimated/animate shared-scale new-scale-value)))
|
||||
[index active-index total-length])
|
||||
[rn/view
|
||||
{:key index
|
||||
:style (style/item-wrapper {:size item-size
|
||||
:spacing item-spacing})}
|
||||
[reanimated/view
|
||||
{:accessibility-label :slide-bar-item
|
||||
:style
|
||||
(reanimated/apply-animations-to-style
|
||||
{:transform [{:scale shared-scale}]}
|
||||
(style/item {:size item-size
|
||||
:spacing item-spacing
|
||||
:active? active?
|
||||
:customization-color customization-color
|
||||
:theme theme
|
||||
:blur? blur?}))}]]))
|
||||
|
||||
(defn- get-item-layout
|
||||
[_ index]
|
||||
(let [length (+ item-size item-spacing)]
|
||||
#js {:length length
|
||||
:index index
|
||||
:offset (* index length)}))
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [customization-color blur? accessibility-label container-style]
|
||||
:as props}]
|
||||
(let [active-index (or (:active-index props) 0)
|
||||
total-amount (or (:total-amount props) 1)
|
||||
theme (quo.theme/use-theme)
|
||||
flat-list-ref (rn/use-ref-atom nil)
|
||||
set-flat-list-ref (rn/use-callback #(reset! flat-list-ref %))
|
||||
center-position 0.5
|
||||
data (range total-amount)
|
||||
scroll-to-index (rn/use-callback
|
||||
(fn []
|
||||
(some-> ^js @flat-list-ref
|
||||
(.scrollToIndex #js {:animated true
|
||||
:index active-index
|
||||
:viewOffset item-spacing
|
||||
:viewPosition center-position})))
|
||||
[flat-list-ref active-index])]
|
||||
(rn/use-effect scroll-to-index [active-index])
|
||||
[rn/view
|
||||
{:style (merge style/list-wrapper container-style)
|
||||
:accessibility-label accessibility-label}
|
||||
[reanimated/flat-list
|
||||
{:style (style/list-bar bar-width)
|
||||
:data data
|
||||
:scroll-enabled false
|
||||
:ref set-flat-list-ref
|
||||
:shows-horizontal-scroll-indicator false
|
||||
:bounces false
|
||||
:horizontal true
|
||||
:extra-data (str active-index)
|
||||
:render-data {:active-index active-index
|
||||
:total-length total-amount
|
||||
:customization-color customization-color
|
||||
:theme theme
|
||||
:blur? blur?}
|
||||
:get-item-layout get-item-layout
|
||||
:render-fn bar-item
|
||||
:key-fn identity}]]))
|
||||
|
||||
(def view (schema/instrument #'view-internal component-schema/?schema))
|
||||
@@ -53,7 +53,7 @@
|
||||
(def ^:private ?network
|
||||
[:map
|
||||
[:network-logo {:optional true} [:maybe :schema.common/image-source]]
|
||||
[:network-name {:optional true} [:maybe [:or :string :keyword]]]])
|
||||
[:network-name {:optional true} [:maybe :string]]])
|
||||
|
||||
(def ^:private ?multinetwork
|
||||
[:map
|
||||
|
||||
@@ -41,8 +41,7 @@
|
||||
:align-items :center
|
||||
:height size
|
||||
:background-color background-color
|
||||
:border-radius border-radius
|
||||
:flex-shrink 1}
|
||||
:border-radius border-radius}
|
||||
(= state :selected) (assoc :height (+ size 2)
|
||||
:border-color border-color
|
||||
:border-width 1))))
|
||||
@@ -51,13 +50,11 @@
|
||||
[size]
|
||||
{:margin-right (if (= size 24) 6 10)
|
||||
:flex-direction :row
|
||||
:flex-shrink 1
|
||||
:align-items :center})
|
||||
|
||||
(defn tag-spacing
|
||||
[size shrinkable?]
|
||||
(cond-> {:margin-left (if (= size 24) 4 8)}
|
||||
shrinkable? (assoc :flex-shrink 1)))
|
||||
[size]
|
||||
{:margin-left (if (= size 24) 4 8)})
|
||||
|
||||
(defn text
|
||||
[theme]
|
||||
|
||||
@@ -17,19 +17,17 @@
|
||||
[schema.core :as schema]))
|
||||
|
||||
(defn- tag-skeleton
|
||||
[{:keys [size text theme shrinkable?]
|
||||
[{:keys [size text theme]
|
||||
:or {size 24
|
||||
theme (quo.theme/use-theme)}}
|
||||
logo-component]
|
||||
[rn/view {:style (style/tag-container size)}
|
||||
logo-component
|
||||
[rn/view {:style (style/tag-spacing size shrinkable?)}
|
||||
[rn/view {:style (style/tag-spacing size)}
|
||||
[text/text
|
||||
{:style (style/text theme)
|
||||
:weight :medium
|
||||
:size (if (= size 24) :paragraph-2 :paragraph-1)
|
||||
:number-of-lines 1
|
||||
:ellipsize-mode :middle}
|
||||
{:style (style/text theme)
|
||||
:weight :medium
|
||||
:size (if (= size 24) :paragraph-2 :paragraph-1)}
|
||||
text]]])
|
||||
|
||||
(defn- communities-tag
|
||||
@@ -39,7 +37,7 @@
|
||||
icon-size (if (= size 24) 16 20)]
|
||||
[rn/view {:style (style/tag-container size)}
|
||||
[fast-image/fast-image {:style (style/circle-logo size) :source community-logo}]
|
||||
[rn/view {:style (style/tag-spacing size false)}
|
||||
[rn/view {:style (style/tag-spacing size)}
|
||||
[text/text
|
||||
{:style (style/text theme)
|
||||
:weight :medium
|
||||
@@ -150,10 +148,9 @@
|
||||
|
||||
:collectible
|
||||
[tag-skeleton
|
||||
{:theme theme
|
||||
:size size
|
||||
:text (str collectible-name " #" collectible-number)
|
||||
:shrinkable? true}
|
||||
{:theme theme
|
||||
:size size
|
||||
:text (str collectible-name " #" collectible-number)}
|
||||
[rn/image {:style (style/rounded-logo size) :source collectible}]]
|
||||
|
||||
:account
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
(ns quo.components.wallet.swap-input.component-spec
|
||||
(:require [quo.components.wallet.swap-input.view :as swap-input]
|
||||
[test-helpers.component :as h]))
|
||||
|
||||
(h/describe "Wallet: Swap Input"
|
||||
(h/test "should render correctly with props"
|
||||
(h/render-with-theme-provider
|
||||
[swap-input/view
|
||||
{:type :pay
|
||||
:error? false
|
||||
:token "SNT"
|
||||
:status :default
|
||||
:currency-symbol "€"
|
||||
:value "5"
|
||||
:fiat-value "1.50"
|
||||
:network-tag-props {:title "Max: 200 SNT"}}])
|
||||
(h/is-truthy (h/get-by-label-text :swap-input))
|
||||
(h/is-truthy (h/get-by-text "SNT"))
|
||||
(h/is-truthy (h/get-by-text "€1.50"))
|
||||
(h/is-truthy (h/get-by-text "Max: 200 SNT")))
|
||||
|
||||
(h/test "should render correctly with approval label"
|
||||
(h/render-with-theme-provider
|
||||
[swap-input/view
|
||||
{:type :pay
|
||||
:show-approval-label? true
|
||||
:approval-label-props
|
||||
{:status :approve
|
||||
:token-value "10"
|
||||
:token-symbol "SNT"}}])
|
||||
(h/is-truthy (h/get-by-text "Approve 10 SNT"))))
|
||||
@@ -1,74 +0,0 @@
|
||||
(ns quo.components.wallet.swap-input.style
|
||||
(:require [quo.foundations.colors :as colors]
|
||||
[quo.foundations.typography :as typography]))
|
||||
|
||||
(defn- border-color
|
||||
[theme]
|
||||
(colors/theme-colors colors/neutral-10 colors/neutral-80 theme))
|
||||
|
||||
(defn- loader-color
|
||||
[theme]
|
||||
(colors/theme-colors colors/neutral-5 colors/neutral-90 theme))
|
||||
|
||||
(defn content
|
||||
[theme]
|
||||
{:border-width 1
|
||||
:border-radius 16
|
||||
:border-color (border-color theme)
|
||||
:background-color (colors/theme-colors colors/white colors/neutral-95 theme)})
|
||||
|
||||
(defn row-1
|
||||
[loading?]
|
||||
{:padding 12
|
||||
:gap 8
|
||||
:align-items (if loading? :center :flex-end)
|
||||
:flex-direction :row})
|
||||
|
||||
(defn row-1-loader
|
||||
[theme]
|
||||
{:width 74
|
||||
:height 14
|
||||
:border-radius 6
|
||||
:background-color (loader-color theme)})
|
||||
|
||||
(def input-container
|
||||
{:flex 1
|
||||
:flex-direction :row
|
||||
:gap 5
|
||||
:height 32
|
||||
:align-items :flex-end})
|
||||
|
||||
(defn input
|
||||
[disabled? error? theme]
|
||||
(assoc typography/font-semi-bold
|
||||
:font-size 27
|
||||
:flex-shrink 1
|
||||
:padding 0
|
||||
:color (cond
|
||||
error? (colors/resolve-color :danger theme)
|
||||
disabled? (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)
|
||||
:else (colors/theme-colors colors/neutral-100 colors/white theme))
|
||||
:line-height 32))
|
||||
|
||||
(defn token-symbol
|
||||
[theme]
|
||||
{:padding-bottom 3
|
||||
:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)})
|
||||
|
||||
(defn row-2
|
||||
[align-right?]
|
||||
{:flex-direction :row
|
||||
:justify-content (if align-right? :flex-end :space-between)
|
||||
:align-items :center
|
||||
:padding 12})
|
||||
|
||||
(defn row-2-loader
|
||||
[theme]
|
||||
{:width 80
|
||||
:height 10
|
||||
:margin-vertical 7
|
||||
:border-radius 6
|
||||
:background-color (loader-color theme)})
|
||||
|
||||
(def fiat-amount
|
||||
{:color colors/neutral-50})
|
||||
@@ -1,121 +0,0 @@
|
||||
(ns quo.components.wallet.swap-input.view
|
||||
(:require [oops.core :as oops]
|
||||
[quo.components.avatars.token-avatar.view :as token-avatar]
|
||||
[quo.components.buttons.button.view :as buttons]
|
||||
[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.wallet.approval-label.schema :as approval-label.schema]
|
||||
[quo.components.wallet.approval-label.view :as approval-label]
|
||||
[quo.components.wallet.swap-input.style :as style]
|
||||
[quo.foundations.colors :as colors]
|
||||
quo.theme
|
||||
[react-native.core :as rn]
|
||||
[schema.core :as schema]))
|
||||
|
||||
(def ?schema
|
||||
[:=>
|
||||
[:catn
|
||||
[:props
|
||||
[:map {:closed true}
|
||||
[:type {:optional true} [:maybe [:enum :pay :receive]]]
|
||||
[:status {:optional true} [:maybe [:enum :default :disabled :loading]]]
|
||||
[:token {:optional true} [:maybe :string]]
|
||||
[:value {:optional true} [:maybe :string]]
|
||||
[:default-value {:optional true} [:maybe :string]]
|
||||
[:currency-symbol {:optional true} [:maybe :string]]
|
||||
[:fiat-value {:optional true} [:maybe :string]]
|
||||
[:show-approval-label? {:optional true} [:maybe :boolean]]
|
||||
[:error? {:optional true} [:maybe :boolean]]
|
||||
[:show-keyboard? {:optional true} [:maybe :boolean]]
|
||||
[:approval-label-props {:optional true} [:maybe approval-label.schema/?schema]]
|
||||
[:network-tag-props {:optional true} [:maybe :map]]
|
||||
[:on-change-text {:optional true} [:maybe fn?]]
|
||||
[:enable-swap? {:optional true} [:maybe :boolean]]
|
||||
[:on-swap-press {:optional true} [:maybe fn?]]
|
||||
[:on-token-press {:optional true} [:maybe fn?]]
|
||||
[:on-max-press {:optional true} [:maybe fn?]]
|
||||
[:customization-color {:optional true} [:maybe :schema.common/customization-color]]
|
||||
[:container-style {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
(defn view-internal
|
||||
[{:keys [type status token value fiat-value show-approval-label? error? network-tag-props
|
||||
approval-label-props default-value enable-swap?
|
||||
currency-symbol on-change-text show-keyboard?
|
||||
container-style on-swap-press on-token-press on-max-press]}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
pay? (= type :pay)
|
||||
disabled? (= status :disabled)
|
||||
loading? (= status :loading)
|
||||
controlled-input? (some? value)
|
||||
input-ref (rn/use-ref-atom nil)
|
||||
set-input-ref (rn/use-callback (fn [ref] (reset! input-ref ref)) [])
|
||||
focus-input (rn/use-callback (fn []
|
||||
(some-> @input-ref
|
||||
(oops/ocall "focus")))
|
||||
[input-ref])]
|
||||
[rn/view
|
||||
{:style container-style
|
||||
:accessibility-label :swap-input}
|
||||
[rn/view {:style (style/content theme)}
|
||||
[rn/view
|
||||
{:style (style/row-1 loading?)}
|
||||
[rn/pressable {:on-press on-token-press}
|
||||
[token-avatar/view
|
||||
{:type :asset
|
||||
:token token}]]
|
||||
(if loading?
|
||||
[rn/view {:style (style/row-1-loader theme)}]
|
||||
[:<>
|
||||
[rn/pressable
|
||||
{:style style/input-container
|
||||
:on-press focus-input}
|
||||
[rn/text-input
|
||||
(cond-> {:ref set-input-ref
|
||||
:style (style/input disabled? error? theme)
|
||||
:placeholder-text-color (colors/theme-colors colors/neutral-40
|
||||
colors/neutral-50
|
||||
theme)
|
||||
:keyboard-type :numeric
|
||||
:auto-focus true
|
||||
:on-change-text on-change-text
|
||||
:show-soft-input-on-focus show-keyboard?
|
||||
:default-value default-value
|
||||
:placeholder "0"}
|
||||
controlled-input? (assoc :value value))]
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:weight :semi-bold
|
||||
:style (style/token-symbol theme)}
|
||||
token]]
|
||||
(when (and pay? enable-swap?)
|
||||
[buttons/button
|
||||
{:type :outline
|
||||
:size 32
|
||||
:on-press on-swap-press
|
||||
:icon-only? true}
|
||||
:i/reorder])])]
|
||||
[divider-line/view]
|
||||
[rn/view
|
||||
{:style (style/row-2 (or (not pay?) loading?))}
|
||||
(when-not loading?
|
||||
[:<>
|
||||
(when pay?
|
||||
[rn/pressable {:on-press on-max-press}
|
||||
[network-tag/view
|
||||
(assoc network-tag-props
|
||||
:status
|
||||
(if error? :error :default))]])
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:style style/fiat-amount
|
||||
:weight :medium}
|
||||
(str currency-symbol fiat-value)]])
|
||||
(when loading?
|
||||
[rn/view {:style (style/row-2-loader theme)}])]]
|
||||
(when (and (not= status :loading) (= type :pay) show-approval-label?)
|
||||
[approval-label/view
|
||||
approval-label-props])]))
|
||||
|
||||
(def view (schema/instrument #'view-internal ?schema))
|
||||
@@ -51,7 +51,8 @@
|
||||
|
||||
(defn prop-text
|
||||
[theme]
|
||||
{:color (colors/theme-colors colors/neutral-100 colors/white theme)})
|
||||
{:margin-right 4
|
||||
:color (colors/theme-colors colors/neutral-100 colors/white theme)})
|
||||
|
||||
(def icon-container
|
||||
{:width 32
|
||||
@@ -60,15 +61,12 @@
|
||||
|
||||
(def container
|
||||
{:flex-direction :row
|
||||
:flex 1
|
||||
:column-gap 8})
|
||||
|
||||
(def content-line
|
||||
{:flex-direction :row
|
||||
:margin-top 2
|
||||
:align-items :center
|
||||
:column-gap 4
|
||||
:justify-content :flex-start})
|
||||
{:flex-direction :row
|
||||
:margin-top 2
|
||||
:align-items :center})
|
||||
|
||||
(def icon-hole-view
|
||||
{:width 32
|
||||
|
||||
@@ -98,11 +98,8 @@
|
||||
|
||||
(defn prop-tag
|
||||
[props blur?]
|
||||
[context-tag/view
|
||||
(assoc props
|
||||
:size 24
|
||||
:blur? blur?
|
||||
:container-style {:flex-shrink 1})])
|
||||
[rn/view {:style {:margin-right 4}}
|
||||
[context-tag/view (merge props {:size 24 :blur? blur?})]])
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [state blur? first-tag second-tag third-tag fourth-tag on-press
|
||||
@@ -124,7 +121,7 @@
|
||||
:on-press-out on-press-out}
|
||||
[rn/view {:style style/container}
|
||||
[transaction-icon-view props theme]
|
||||
[rn/view {:style {:flex 1}}
|
||||
[rn/view
|
||||
[transaction-header props theme]
|
||||
[rn/view {:style style/content-line}
|
||||
(when first-tag [prop-tag first-tag blur?])
|
||||
|
||||
@@ -147,7 +147,6 @@
|
||||
quo.components.settings.settings-item.view
|
||||
quo.components.share.qr-code.view
|
||||
quo.components.share.share-qr-code.view
|
||||
quo.components.slideshow.slider-bar.view
|
||||
quo.components.switchers.group-messaging-card.view
|
||||
quo.components.tabs.account-selector
|
||||
quo.components.tabs.segmented-tab
|
||||
@@ -186,7 +185,6 @@
|
||||
quo.components.wallet.progress-bar.view
|
||||
quo.components.wallet.required-tokens.view
|
||||
quo.components.wallet.summary-info.view
|
||||
quo.components.wallet.swap-input.view
|
||||
quo.components.wallet.token-input.view
|
||||
quo.components.wallet.transaction-progress.view
|
||||
quo.components.wallet.transaction-summary.view
|
||||
@@ -420,9 +418,6 @@
|
||||
(def qr-code quo.components.share.qr-code.view/view)
|
||||
(def share-qr-code quo.components.share.share-qr-code.view/view)
|
||||
|
||||
;;;; Slideshow
|
||||
(def slider-bar quo.components.slideshow.slider-bar.view/view)
|
||||
|
||||
;;;; SWITCHER
|
||||
(def group-messaging-card quo.components.switchers.group-messaging-card.view/view)
|
||||
|
||||
@@ -473,7 +468,6 @@
|
||||
(def progress-bar quo.components.wallet.progress-bar.view/view)
|
||||
(def required-tokens quo.components.wallet.required-tokens.view/view)
|
||||
(def summary-info quo.components.wallet.summary-info.view/view)
|
||||
(def swap-input quo.components.wallet.swap-input.view/view)
|
||||
(def network-link quo.components.wallet.network-link.view/view)
|
||||
(def token-input quo.components.wallet.token-input.view/view)
|
||||
(def wallet-overview quo.components.wallet.wallet-overview.view/view)
|
||||
|
||||
@@ -87,7 +87,6 @@
|
||||
quo.components.settings.reorder-item.component-spec
|
||||
quo.components.settings.settings-item.component-spec
|
||||
quo.components.share.share-qr-code.component-spec
|
||||
quo.components.slideshow.slider-bar.component-spec
|
||||
quo.components.switchers.base-card.component-spec
|
||||
quo.components.switchers.group-messaging-card.component-spec
|
||||
quo.components.tags.collectible-tag.component-spec
|
||||
@@ -112,7 +111,6 @@
|
||||
quo.components.wallet.progress-bar.component-spec
|
||||
quo.components.wallet.required-tokens.component-spec
|
||||
quo.components.wallet.summary-info.component-spec
|
||||
quo.components.wallet.swap-input.component-spec
|
||||
quo.components.wallet.token-input.component-spec
|
||||
quo.components.wallet.transaction-progress.component-spec
|
||||
quo.components.wallet.transaction-summary.component-spec
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
:gnosis (js/require "../resources/images/networks/Gnosis.png")
|
||||
:hermez (js/require "../resources/images/networks/Hermez.png")
|
||||
:optimism (js/require "../resources/images/networks/Optimism.png")
|
||||
:paraswap (js/require "../resources/images/networks/Paraswap.png")
|
||||
:polygon (js/require "../resources/images/networks/Polygon.png")
|
||||
:scroll (js/require "../resources/images/networks/Scroll.png")
|
||||
:taiko (js/require "../resources/images/networks/Taiko.png")
|
||||
|
||||
@@ -62,17 +62,16 @@
|
||||
(bean/->js {:id id
|
||||
:namespaces approved-namespaces})))
|
||||
|
||||
(defn disconnect-session
|
||||
[{:keys [web3-wallet reason topic]}]
|
||||
(oops/ocall web3-wallet
|
||||
"disconnectSession"
|
||||
(bean/->js {:topic topic
|
||||
:reason reason})))
|
||||
|
||||
(defn get-active-sessions
|
||||
[web3-wallet]
|
||||
(oops/ocall web3-wallet "getActiveSessions"))
|
||||
|
||||
(defn core-pairing-disconnnect
|
||||
[web3-wallet topic]
|
||||
(oops/ocall web3-wallet
|
||||
"core.pairing.disconnect"
|
||||
(bean/->js {:topic topic})))
|
||||
|
||||
(defn core-pairing-pair
|
||||
[web3-wallet url]
|
||||
(oops/ocall web3-wallet
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
(ns status-im.common.floating-button-page.floating-container.style
|
||||
(:require [quo.foundations.colors :as colors]
|
||||
[react-native.safe-area :as safe-area]))
|
||||
(:require [react-native.safe-area :as safe-area]))
|
||||
|
||||
(defn content-container
|
||||
[blur? keyboard-shown?]
|
||||
@@ -12,12 +11,7 @@
|
||||
:padding-horizontal 20}
|
||||
blur? (dissoc :padding-vertical :padding-horizontal))))
|
||||
|
||||
(defn blur-inner-container
|
||||
[theme shell-overlay?]
|
||||
{:background-color (colors/theme-colors colors/white-70-blur
|
||||
(if shell-overlay?
|
||||
colors/neutral-80-opa-80-blur
|
||||
colors/neutral-95-opa-70-blur)
|
||||
theme)
|
||||
(def blur-inner-container
|
||||
{:background-color :transparent ; required, otherwise blur-view will shrink
|
||||
:padding-vertical 12
|
||||
:padding-horizontal 20})
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
(ns status-im.common.floating-button-page.floating-container.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[quo.foundations.colors :as colors]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]
|
||||
[status-im.common.floating-button-page.floating-container.style :as style]))
|
||||
|
||||
(defn- blur-container
|
||||
[child shell-overlay?]
|
||||
[child]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[quo/blur
|
||||
{:blur-amount 20
|
||||
:blur-type :transparent
|
||||
:overlay-color :transparent}
|
||||
[rn/view {:style (style/blur-inner-container theme shell-overlay?)}
|
||||
{:blur-amount 52
|
||||
:blur-radius 20
|
||||
:blur-type :transparent
|
||||
:blur-overlay-color (colors/theme-colors colors/white-70-blur colors/neutral-95-opa-70-blur theme)}
|
||||
[rn/view {:style style/blur-inner-container}
|
||||
child]]))
|
||||
|
||||
(defn view
|
||||
[{:keys [on-layout keyboard-shown? blur? shell-overlay?]} child]
|
||||
[{:keys [on-layout keyboard-shown? blur?]} child]
|
||||
[rn/view
|
||||
{:style (style/content-container blur? keyboard-shown?)
|
||||
:on-layout on-layout}
|
||||
(if blur?
|
||||
[blur-container child shell-overlay?]
|
||||
[blur-container child]
|
||||
child)])
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
(defn view
|
||||
[{:keys [header footer customization-color footer-container-padding header-container-style
|
||||
content-container-style gradient-cover? keyboard-should-persist-taps shell-overlay?]
|
||||
content-container-style gradient-cover? keyboard-should-persist-taps]
|
||||
:or {footer-container-padding (safe-area/get-top)}}
|
||||
& children]
|
||||
(reagent/with-let [scroll-view-ref (atom nil)
|
||||
@@ -121,8 +121,7 @@
|
||||
[floating-container/view
|
||||
{:on-layout set-footer-container-height
|
||||
:keyboard-shown? keyboard-shown?
|
||||
:blur? show-background?
|
||||
:shell-overlay? shell-overlay?}
|
||||
:blur? show-background?}
|
||||
footer]]]])
|
||||
(finally
|
||||
(remove-listeners))))
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
(ns status-im.common.metrics-confirmation-modal.style)
|
||||
|
||||
(def points-wrapper
|
||||
{:margin-top 11
|
||||
:margin-horizontal 20
|
||||
:gap 21
|
||||
:margin-bottom 15})
|
||||
|
||||
(def item-text
|
||||
{:margin-top 10
|
||||
:margin-left -4})
|
||||
|
||||
(def info-text
|
||||
{:margin-top -5})
|
||||
@@ -1,79 +0,0 @@
|
||||
(ns status-im.common.metrics-confirmation-modal.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.common.metrics-confirmation-modal.style :as style]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn- dismiss-keyboard
|
||||
[]
|
||||
(rf/dispatch [:dismiss-keyboard]))
|
||||
|
||||
(defn- hide-bottom-sheet
|
||||
[]
|
||||
(rf/dispatch [:hide-bottom-sheet]))
|
||||
|
||||
(defn- toggle-metrics
|
||||
[enabled?]
|
||||
(rf/dispatch [:centralized-metrics/toggle-centralized-metrics enabled?]))
|
||||
|
||||
(def ^:private will-receive-points
|
||||
[:t/ip-address
|
||||
:t/universally-unique-identifiers-of-device
|
||||
:t/logs-of-actions-withing-the-app])
|
||||
|
||||
(def ^:private not-receive-points
|
||||
[:t/your-profile-information
|
||||
:t/your-addresses
|
||||
:t/information-you-input-and-send])
|
||||
|
||||
(defn- bullet-points
|
||||
[{:keys [title points]}]
|
||||
[rn/view
|
||||
[quo/text {:weight :semi-bold}
|
||||
title]
|
||||
(for [label points]
|
||||
^{:key label}
|
||||
[quo/markdown-list
|
||||
{:description (i18n/label label)
|
||||
:blur? true
|
||||
:container-style style/item-text}])])
|
||||
|
||||
(defn- on-share-usage
|
||||
[]
|
||||
(toggle-metrics true)
|
||||
(hide-bottom-sheet))
|
||||
|
||||
(defn- on-do-not-share
|
||||
[]
|
||||
(toggle-metrics false)
|
||||
(hide-bottom-sheet))
|
||||
|
||||
(defn view
|
||||
[{:keys [settings?]}]
|
||||
(rn/use-mount #(dismiss-keyboard))
|
||||
[:<>
|
||||
[quo/drawer-top
|
||||
{:title (i18n/label :t/help-us-improve-status)
|
||||
:description (i18n/label :t/collecting-usage-data)}]
|
||||
[rn/view {:style style/points-wrapper}
|
||||
[bullet-points
|
||||
{:title (i18n/label :t/what-we-will-receive)
|
||||
:points will-receive-points}]
|
||||
[bullet-points
|
||||
{:title (i18n/label :t/what-we-wont-receive)
|
||||
:points not-receive-points}]
|
||||
(when-not settings?
|
||||
[quo/text
|
||||
{:size :paragraph-2
|
||||
:style style/info-text}
|
||||
(i18n/label :t/sharing-usage-data-can-be-turned-off)])]
|
||||
[quo/bottom-actions
|
||||
{:actions :two-actions
|
||||
:blur? true
|
||||
:button-one-label (i18n/label :t/share-usage-data)
|
||||
:button-one-props {:on-press on-share-usage}
|
||||
:button-two-label (i18n/label (if settings? :t/do-not-share :t/not-now))
|
||||
:button-two-props {:type :grey
|
||||
:on-press on-do-not-share}}]])
|
||||
@@ -72,7 +72,7 @@
|
||||
|
||||
;; CONFIG VALUES
|
||||
(def log-level (string/upper-case (get-config :LOG_LEVEL "")))
|
||||
(def fleet (get-config :FLEET ""))
|
||||
(def fleet (get-config :FLEET "waku.sandbox"))
|
||||
(def apn-topic (get-config :APN_TOPIC "im.status.ethereum"))
|
||||
(def default-network (get-config :DEFAULT_NETWORK "goerli_rpc"))
|
||||
(def max-installations 2)
|
||||
|
||||
@@ -45,11 +45,6 @@
|
||||
(def ^:const activity-center-membership-status-accepted 2)
|
||||
(def ^:const activity-center-membership-status-declined 3)
|
||||
|
||||
;; Choose the maximum number of notifications that *usually/safely* fit on
|
||||
;; most screens, so that the UI doesn't have to needlessly render
|
||||
;; notifications.
|
||||
(def ^:const notifications-per-page 7)
|
||||
|
||||
(def ^:const mute-for-15-mins-type 1)
|
||||
(def ^:const mute-for-1-hour-type 2)
|
||||
(def ^:const mute-for-8-hours-type 3)
|
||||
@@ -281,21 +276,16 @@
|
||||
#{wallet-connect-personal-sign-method
|
||||
wallet-connect-eth-sign-method
|
||||
wallet-connect-eth-send-transaction-method
|
||||
;; NOTE: disabled, as we have no clear use cases for it and other wallets don't support it
|
||||
;; wallet-connect-eth-sign-transaction-method
|
||||
wallet-connect-eth-sign-transaction-method
|
||||
wallet-connect-eth-sign-typed-method
|
||||
wallet-connect-eth-sign-typed-v4-method})
|
||||
(def ^:const wallet-connect-supported-events #{"accountsChanged" "chainChanged"})
|
||||
(def ^:const wallet-connect-session-proposal-event "session_proposal")
|
||||
(def ^:const wallet-connect-session-request-event "session_request")
|
||||
(def ^:const wallet-connect-session-delete-event "session_delete")
|
||||
(def ^:const wallet-connect-user-rejected-error-key "USER_REJECTED")
|
||||
(def ^:const wallet-connect-user-disconnected-reason-key "USER_DISCONNECTED")
|
||||
|
||||
(def ^:const transaction-pending-type-wallet-connect-transfer "WalletConnectTransfer")
|
||||
|
||||
(def ^:const token-sort-priority {"SNT" 1 "STT" 1 "ETH" 2 "DAI" 3})
|
||||
|
||||
(def ^:const dapp-permission-contact-code "contact-code")
|
||||
(def ^:const dapp-permission-web3 "web3")
|
||||
(def ^:const dapp-permission-qr-code "qr-code")
|
||||
@@ -516,9 +506,6 @@
|
||||
(def ^:const optimism-full-name "Optimism")
|
||||
(def ^:const arbitrum-full-name "Arbitrum")
|
||||
|
||||
(def ^:const sepolia-full-name "Sepolia")
|
||||
(def ^:const goerli-full-name "Goerli")
|
||||
|
||||
(def ^:const mainnet-network-name :mainnet)
|
||||
(def ^:const ethereum-network-name :ethereum)
|
||||
(def ^:const optimism-network-name :optimism)
|
||||
@@ -580,8 +567,5 @@
|
||||
(def ^:const max-recommended-slippage 5)
|
||||
(def ^:const max-slippage-decimal-places 2)
|
||||
(def ^:const swap-default-provider
|
||||
{:name :paraswap
|
||||
:full-name "Paraswap"
|
||||
:color :blue
|
||||
:contract-address "0xdef171fe48cf0115b1d80b88dc8eab59176fee57"
|
||||
{:name "Paraswap"
|
||||
:terms-and-conditions-url "https://files.paraswap.io/tos_v4.pdf"})
|
||||
|
||||
@@ -7,17 +7,10 @@
|
||||
[taoensso.timbre :as log]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(def ^:const user-confirmed-key :centralized-metrics/user-confirmed?)
|
||||
(def ^:const enabled-key :centralized-metrics/enabled?)
|
||||
|
||||
(defn show-confirmation-modal?
|
||||
[db]
|
||||
(not (user-confirmed-key db)))
|
||||
|
||||
(defn push-event?
|
||||
[db]
|
||||
(or (not (user-confirmed-key db))
|
||||
(enabled-key db)))
|
||||
(or (not (:centralized-metrics/user-confirmed? db))
|
||||
(:centralized-metrics/enabled? db)))
|
||||
|
||||
(defn centralized-metrics-interceptor
|
||||
[context]
|
||||
@@ -36,16 +29,5 @@
|
||||
(fn [{:keys [db]} [enabled?]]
|
||||
{:fx [[:effects.centralized-metrics/toggle-metrics enabled?]]
|
||||
:db (assoc db
|
||||
user-confirmed-key
|
||||
true
|
||||
enabled-key
|
||||
enabled?)}))
|
||||
|
||||
(rf/reg-event-fx :centralized-metrics/check-modal
|
||||
(fn [{:keys [db]} [modal-view]]
|
||||
(when (show-confirmation-modal? db)
|
||||
{:fx [[:dispatch
|
||||
[:show-bottom-sheet
|
||||
{:content (fn [] [modal-view])
|
||||
:shell? true}]]]})))
|
||||
|
||||
:centralized-metrics/user-confirmed? true
|
||||
:centralized-metrics/enabled? enabled?)}))
|
||||
|
||||
@@ -6,11 +6,6 @@
|
||||
[status-im.contexts.centralized-metrics.tracking :as tracking]
|
||||
[test-helpers.unit :as h]))
|
||||
|
||||
(deftest show-confirmation-modal-test
|
||||
(testing "returns true if the user confirmed"
|
||||
(is (false? (events/show-confirmation-modal? {events/user-confirmed-key true})))
|
||||
(is (true? (events/show-confirmation-modal? {})))))
|
||||
|
||||
(deftest push-event-test
|
||||
(testing "returns correct boolean value"
|
||||
(is (true? (events/push-event? {:centralized-metrics/user-confirmed? false})))
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
:on-error #(p-reject (str "failed to sign data\n" %))}))))
|
||||
|
||||
(defn- edit-shared-addresses-for-community
|
||||
[community-id signatures addresses-to-reveal airdrop-address _share-future-addresses?]
|
||||
[community-id signatures addresses-to-reveal airdrop-address]
|
||||
(promesa/create
|
||||
(fn [p-resolve p-reject]
|
||||
(rpc/call
|
||||
@@ -41,16 +41,15 @@
|
||||
:on-error p-reject}))))
|
||||
|
||||
(defn- request-to-join
|
||||
[community-id signatures addresses-to-reveal airdrop-address share-future-addresses?]
|
||||
[community-id signatures addresses-to-reveal airdrop-address]
|
||||
(promesa/create
|
||||
(fn [p-resolve p-reject]
|
||||
(rpc/call
|
||||
{:method :wakuext_requestToJoinCommunity
|
||||
:params [{:communityId community-id
|
||||
:signatures signatures
|
||||
:addressesToReveal addresses-to-reveal
|
||||
:airdropAddress airdrop-address
|
||||
:shareFutureAddresses share-future-addresses?}]
|
||||
:params [{:communityId community-id
|
||||
:signatures signatures
|
||||
:addressesToReveal addresses-to-reveal
|
||||
:airdropAddress airdrop-address}]
|
||||
:js-response true
|
||||
:on-success p-resolve
|
||||
:on-error p-reject}))))
|
||||
@@ -65,18 +64,15 @@
|
||||
|
||||
(defn- sign-and-call-endpoint
|
||||
[{:keys [community-id password pub-key
|
||||
addresses-to-reveal airdrop-address share-future-addresses?
|
||||
addresses-to-reveal airdrop-address
|
||||
on-success on-error
|
||||
callback]}]
|
||||
(-> (promesa/let [sign-params (generate-requests-for-signing pub-key
|
||||
community-id
|
||||
addresses-to-reveal)
|
||||
(-> (promesa/let [sign-params (generate-requests-for-signing pub-key community-id addresses-to-reveal)
|
||||
signatures (sign-data sign-params password)
|
||||
result (callback community-id
|
||||
signatures
|
||||
addresses-to-reveal
|
||||
airdrop-address
|
||||
share-future-addresses?)]
|
||||
airdrop-address)]
|
||||
(run-callback-or-event on-success result))
|
||||
(promesa/catch #(run-callback-or-event on-error %))))
|
||||
|
||||
@@ -91,7 +87,6 @@
|
||||
[:or [:set string?]
|
||||
[:sequential string?]]]
|
||||
[:airdrop-address string?]
|
||||
[:share-future-addresses? boolean?]
|
||||
[:on-success [:or fn? :schema.re-frame/event]]
|
||||
[:on-error [:or fn? :schema.re-frame/event]]
|
||||
[:callback fn?]]]
|
||||
|
||||
@@ -17,12 +17,13 @@
|
||||
(rf/reg-event-fx :communities/initialize-permission-addresses initialize-permission-addresses)
|
||||
|
||||
(defn do-init-permission-addresses
|
||||
[{:keys [db]} [community-id revealed-accounts share-future-addresses?]]
|
||||
[{:keys [db]} [community-id revealed-accounts]]
|
||||
(let [wallet-accounts (utils/sorted-operable-non-watch-only-accounts db)
|
||||
addresses-to-reveal (if (seq revealed-accounts)
|
||||
(set (keys revealed-accounts))
|
||||
;; Reveal all addresses as fallback.
|
||||
(set (map :address wallet-accounts)))
|
||||
|
||||
;; When there are no revealed addresses, such as when joining a
|
||||
;; community, use first address for airdrops.
|
||||
airdrop-address (or (->> revealed-accounts
|
||||
@@ -34,7 +35,10 @@
|
||||
first
|
||||
:address))]
|
||||
{:db (-> db
|
||||
(assoc-in [:communities/selected-share-all-addresses community-id] share-future-addresses?)
|
||||
;; Set to false by default while we don't persist the user's choice
|
||||
;; in status-go, otherwise whenever the view is mounted, the choice
|
||||
;; of selected addresses won't be respected.
|
||||
(assoc-in [:communities/selected-share-all-addresses community-id] false)
|
||||
(assoc-in [:communities/all-addresses-to-reveal community-id] addresses-to-reveal)
|
||||
(assoc-in [:communities/all-airdrop-addresses community-id] airdrop-address))
|
||||
:fx [[:dispatch
|
||||
@@ -56,44 +60,36 @@
|
||||
is selecting an airdrop address, we must submit to status-go the current
|
||||
choice of addresses to share, and vice-versa. If we omit addresses to share,
|
||||
status-go will default to all available."
|
||||
[{:keys [db]}
|
||||
[{:keys [community-id password on-success addresses airdrop-address share-future-addresses?]}]]
|
||||
(let [pub-key (get-in db [:profile/profile :public-key])
|
||||
wallet-accounts (utils/sorted-operable-non-watch-only-accounts db)
|
||||
addresses-to-reveal (if (seq addresses)
|
||||
(set addresses)
|
||||
(get-in db [:communities/all-addresses-to-reveal community-id]))
|
||||
new-airdrop-address (if (contains? addresses-to-reveal airdrop-address)
|
||||
airdrop-address
|
||||
(->> wallet-accounts
|
||||
(filter #(contains? addresses-to-reveal (:address %)))
|
||||
first
|
||||
:address))
|
||||
share-future-addresses? (if (nil? share-future-addresses?)
|
||||
(get-in db [:communities/selected-share-all-addresses community-id])
|
||||
share-future-addresses?)]
|
||||
[{:keys [db]} [{:keys [community-id password on-success addresses airdrop-address]}]]
|
||||
(let [pub-key (get-in db [:profile/profile :public-key])
|
||||
wallet-accounts (utils/sorted-operable-non-watch-only-accounts db)
|
||||
addresses-to-reveal (if (seq addresses)
|
||||
(set addresses)
|
||||
(get-in db [:communities/all-addresses-to-reveal community-id]))
|
||||
new-airdrop-address (if (contains? addresses-to-reveal airdrop-address)
|
||||
airdrop-address
|
||||
(->> wallet-accounts
|
||||
(filter #(contains? addresses-to-reveal (:address %)))
|
||||
first
|
||||
:address))]
|
||||
{:fx [[:effects.community/edit-shared-addresses
|
||||
{:community-id community-id
|
||||
:password password
|
||||
:pub-key pub-key
|
||||
:addresses-to-reveal addresses-to-reveal
|
||||
:share-future-addresses? share-future-addresses?
|
||||
:airdrop-address new-airdrop-address
|
||||
:on-success (fn []
|
||||
(when (fn? on-success)
|
||||
(on-success addresses-to-reveal
|
||||
new-airdrop-address
|
||||
share-future-addresses?))
|
||||
(rf/dispatch [:communities/edit-shared-addresses-success
|
||||
community-id addresses-to-reveal airdrop-address]))
|
||||
:on-error [:communities/edit-shared-addresses-failure community-id]}]]}))
|
||||
{:community-id community-id
|
||||
:password password
|
||||
:pub-key pub-key
|
||||
:addresses-to-reveal addresses-to-reveal
|
||||
:airdrop-address new-airdrop-address
|
||||
:on-success (fn []
|
||||
(when (fn? on-success)
|
||||
(on-success addresses-to-reveal new-airdrop-address))
|
||||
(rf/dispatch [:communities/edit-shared-addresses-success
|
||||
community-id addresses-to-reveal airdrop-address]))
|
||||
:on-error [:communities/edit-shared-addresses-failure community-id]}]]}))
|
||||
|
||||
(rf/reg-event-fx :communities/edit-shared-addresses edit-shared-addresses)
|
||||
|
||||
(rf/reg-event-fx :communities/edit-shared-addresses-success
|
||||
(fn [_ [community-id addresses-to-reveal airdrop-address share-future-addresses?]]
|
||||
(fn [_ [community-id addresses-to-reveal airdrop-address]]
|
||||
{:fx [[:dispatch [:communities/set-airdrop-address community-id airdrop-address]]
|
||||
[:dispatch [:communities/set-share-all-addresses community-id share-future-addresses?]]
|
||||
[:dispatch [:communities/set-addresses-to-reveal community-id addresses-to-reveal]]]}))
|
||||
|
||||
(rf/reg-event-fx :communities/edit-shared-addresses-failure
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
(is
|
||||
(match?
|
||||
{:db (-> (:db cofx)
|
||||
(assoc-in [:communities/selected-share-all-addresses community-id] true)
|
||||
(assoc-in [:communities/selected-share-all-addresses community-id] false)
|
||||
(assoc-in [:communities/all-addresses-to-reveal community-id] addresses-to-reveal)
|
||||
(assoc-in [:communities/all-airdrop-addresses community-id] airdrop-address))
|
||||
:fx [[:dispatch
|
||||
@@ -82,7 +82,7 @@
|
||||
[:dispatch
|
||||
[:communities/check-permissions-to-join-during-selection community-id
|
||||
addresses-to-reveal]]]}
|
||||
(sut/do-init-permission-addresses cofx [community-id revealed-accounts true])))))
|
||||
(sut/do-init-permission-addresses cofx [community-id revealed-accounts])))))
|
||||
|
||||
;; Expect to mark all addresses to be revealed and first one to receive
|
||||
;; airdrops when no addresses were previously revealed.
|
||||
@@ -93,7 +93,7 @@
|
||||
(is
|
||||
(match?
|
||||
{:db (-> (:db cofx)
|
||||
(assoc-in [:communities/selected-share-all-addresses community-id] true)
|
||||
(assoc-in [:communities/selected-share-all-addresses community-id] false)
|
||||
(assoc-in [:communities/all-addresses-to-reveal community-id] addresses-to-reveal))
|
||||
:fx [[:dispatch
|
||||
[:communities/check-permissions-to-join-community
|
||||
@@ -101,7 +101,7 @@
|
||||
[:dispatch
|
||||
[:communities/check-permissions-to-join-during-selection community-id
|
||||
addresses-to-reveal]]]}
|
||||
(sut/do-init-permission-addresses cofx [community-id revealed-accounts true]))))))
|
||||
(sut/do-init-permission-addresses cofx [community-id revealed-accounts]))))))
|
||||
|
||||
(deftest edit-shared-addresses-test
|
||||
(testing
|
||||
@@ -109,7 +109,6 @@
|
||||
fallback to all wallet addresses"
|
||||
(let [pub-key "abcdef"
|
||||
revealed-addresses #{"0xB" "0xC"}
|
||||
share-future-addresses? true
|
||||
cofx {:db {:profile/profile {:public-key pub-key}
|
||||
:communities/all-addresses-to-reveal {community-id revealed-addresses}}}
|
||||
airdrop-address "0xB"
|
||||
@@ -117,24 +116,22 @@
|
||||
actual
|
||||
(sut/edit-shared-addresses
|
||||
cofx
|
||||
[{:community-id community-id
|
||||
:password password
|
||||
:airdrop-address airdrop-address
|
||||
:share-future-addresses? share-future-addresses?
|
||||
:on-success (fn [new-addresses-to-reveal]
|
||||
(is (match? revealed-addresses new-addresses-to-reveal)))}])
|
||||
[{:community-id community-id
|
||||
:password password
|
||||
:airdrop-address airdrop-address
|
||||
:on-success (fn [new-addresses-to-reveal]
|
||||
(is (match? revealed-addresses new-addresses-to-reveal)))}])
|
||||
|
||||
on-success-wrapper (-> actual :fx first second :on-success)]
|
||||
(is (match?
|
||||
{:fx [[:effects.community/edit-shared-addresses
|
||||
{:community-id community-id
|
||||
:password password
|
||||
:pub-key pub-key
|
||||
:addresses-to-reveal revealed-addresses
|
||||
:share-future-addresses? share-future-addresses?
|
||||
:airdrop-address airdrop-address
|
||||
:on-success fn?
|
||||
:on-error [:communities/edit-shared-addresses-failure community-id]}]]}
|
||||
{:community-id community-id
|
||||
:password password
|
||||
:pub-key pub-key
|
||||
:addresses-to-reveal revealed-addresses
|
||||
:airdrop-address airdrop-address
|
||||
:on-success fn?
|
||||
:on-error [:communities/edit-shared-addresses-failure community-id]}]]}
|
||||
actual))
|
||||
|
||||
(on-success-wrapper)))
|
||||
|
||||
@@ -203,9 +203,7 @@
|
||||
:addresses-for-permissions])
|
||||
(rf/dispatch [:hide-bottom-sheet]))}]))}])
|
||||
(rf/dispatch [:communities/set-share-all-addresses id flag-share-all-addresses]))
|
||||
(do
|
||||
(rf/dispatch [:communities/set-share-all-addresses id flag-share-all-addresses])
|
||||
(rf/dispatch [:communities/set-addresses-to-reveal id addresses-to-reveal]))))
|
||||
(rf/dispatch [:communities/set-addresses-to-reveal id addresses-to-reveal])))
|
||||
highest-role (rf/sub [:communities/highest-role-for-selection id])
|
||||
[unmodified-role _] (rn/use-state highest-role)]
|
||||
|
||||
@@ -263,7 +261,6 @@
|
||||
can-edit-addresses? (rf/sub [:communities/can-edit-shared-addresses? id])
|
||||
|
||||
wallet-accounts (rf/sub [:wallet/operable-accounts-without-watched-accounts])
|
||||
joined (rf/sub [:communities/community-joined id])
|
||||
unmodified-addresses-to-reveal (rf/sub [:communities/addresses-to-reveal id])
|
||||
[addresses-to-reveal set-addresses-to-reveal] (rn/use-state unmodified-addresses-to-reveal)
|
||||
|
||||
@@ -288,6 +285,7 @@
|
||||
(set-flag-share-all-addresses new-value)
|
||||
(when new-value
|
||||
(set-addresses-to-reveal (set (map :address wallet-accounts))))))]
|
||||
|
||||
(rn/use-mount
|
||||
(fn []
|
||||
(when-not flag-share-all-addresses
|
||||
@@ -312,7 +310,6 @@
|
||||
flag-share-all-addresses]
|
||||
:header [quo/page-setting
|
||||
{:checked? flag-share-all-addresses
|
||||
:disabled? joined
|
||||
:customization-color color
|
||||
:on-change toggle-flag-share-all-addresses
|
||||
:setting-text (i18n/label
|
||||
|
||||
@@ -47,11 +47,12 @@
|
||||
:label (i18n/label :t/view-token-gating)}))
|
||||
|
||||
(defn- action-mark-as-read
|
||||
[chat-id]
|
||||
{:icon :i/mark-as-read
|
||||
:accessibility-label :chat-mark-as-read
|
||||
:on-press #(hide-sheet-and-dispatch [:chat.ui/mark-all-read-pressed chat-id])
|
||||
:label (i18n/label :t/mark-as-read)})
|
||||
[]
|
||||
(when config/show-not-implemented-features?
|
||||
{:icon :i/mark-as-read
|
||||
:accessibility-label :chat-mark-as-read
|
||||
:on-press not-implemented/alert
|
||||
:label (i18n/label :t/mark-as-read)}))
|
||||
|
||||
(defn- action-toggle-muted
|
||||
[id muted? muted-till chat-type]
|
||||
@@ -129,7 +130,7 @@
|
||||
(and (not inside-chat?) (not locked?))
|
||||
[quo/action-drawer
|
||||
[[(when-not hide-view-members? (action-view-members-and-details community-id chat-id))
|
||||
(action-mark-as-read chat-id)
|
||||
(action-mark-as-read)
|
||||
(action-toggle-muted chat-id muted muted-till chat-type)
|
||||
(action-notification-settings)
|
||||
(action-pinned-messages chat-id)
|
||||
@@ -142,7 +143,7 @@
|
||||
[[(action-view-members-and-details community-id chat-id)
|
||||
(when token-gated?
|
||||
(action-token-requirements))
|
||||
(action-mark-as-read chat-id)
|
||||
(action-mark-as-read)
|
||||
(action-toggle-muted chat-id muted muted-till chat-type)
|
||||
(action-notification-settings)
|
||||
(when config/fetch-messages-enabled?
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
[status-im.navigation.events :as navigation]
|
||||
[status-im.navigation.transitions :as transitions]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.collection :as collection-utils]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn handle-community
|
||||
@@ -373,14 +372,15 @@
|
||||
(when (and community joined (not fetching-revealed-accounts))
|
||||
{:db (assoc-in db [:communities community-id :fetching-revealed-accounts] true)
|
||||
:json-rpc/call
|
||||
[{:method "wakuext_latestRequestToJoinForCommunity"
|
||||
:params [community-id]
|
||||
:on-success [:communities/get-revealed-accounts-success community-id on-success]
|
||||
:on-error (fn [err]
|
||||
(log/error {:message "failed to fetch revealed accounts"
|
||||
:community-id community-id
|
||||
:err err})
|
||||
(rf/dispatch [:communities/get-revealed-accounts-failed community-id]))}]})))
|
||||
[{:method "wakuext_getRevealedAccounts"
|
||||
:params [community-id (get-in db [:profile/profile :public-key])]
|
||||
:js-response true
|
||||
:on-success [:communities/get-revealed-accounts-success community-id on-success]
|
||||
:on-error (fn [err]
|
||||
(log/error {:message "failed to fetch revealed accounts"
|
||||
:community-id community-id
|
||||
:err err})
|
||||
(rf/dispatch [:communities/get-revealed-accounts-failed community-id]))}]})))
|
||||
|
||||
(rf/reg-event-fx :communities/get-revealed-accounts get-revealed-accounts)
|
||||
|
||||
@@ -399,18 +399,22 @@
|
||||
[:json-rpc/call :schema.common/rpc-call]]]])
|
||||
|
||||
(rf/reg-event-fx :communities/get-revealed-accounts-success
|
||||
(fn [{:keys [db]} [community-id on-success request-to-join]]
|
||||
(fn [{:keys [db]} [community-id on-success revealed-accounts-js]]
|
||||
(when-let [community (get-in db [:communities community-id])]
|
||||
(let [revealed-accounts (collection-utils/index-by :address (:revealedAccounts request-to-join))
|
||||
share-future-addresses? (:shareFutureAddresses request-to-join)
|
||||
(let [revealed-accounts
|
||||
(reduce
|
||||
(fn [acc {:keys [address] :as revealed-account}]
|
||||
(assoc acc address revealed-account))
|
||||
{}
|
||||
(data-store.communities/<-revealed-accounts-rpc revealed-accounts-js))
|
||||
|
||||
community-with-revealed-accounts
|
||||
(-> community
|
||||
(assoc :revealed-accounts revealed-accounts)
|
||||
(assoc :share-future-addresses? share-future-addresses?)
|
||||
(dissoc :fetching-revealed-accounts))]
|
||||
{:db (assoc-in db [:communities community-id] community-with-revealed-accounts)
|
||||
:fx [(when (vector? on-success)
|
||||
[:dispatch (conj on-success revealed-accounts share-future-addresses?)])]}))))
|
||||
[:dispatch (conj on-success revealed-accounts)])]}))))
|
||||
|
||||
(rf/reg-event-fx :communities/get-revealed-accounts-failed
|
||||
(fn [{:keys [db]} [community-id]]
|
||||
|
||||
@@ -146,8 +146,8 @@
|
||||
effects (events/get-revealed-accounts {:db db} [community-id])]
|
||||
(is (match? (assoc-in db [:communities community-id :fetching-revealed-accounts] true)
|
||||
(:db effects)))
|
||||
(is (match? {:method "wakuext_latestRequestToJoinForCommunity"
|
||||
:params [community-id]}
|
||||
(is (match? {:method "wakuext_getRevealedAccounts"
|
||||
:params [community-id "profile-public-key"]}
|
||||
(-> effects :json-rpc/call first (select-keys [:method :params]))))))))
|
||||
|
||||
(deftest handle-community-test
|
||||
|
||||
@@ -117,14 +117,13 @@
|
||||
{:community community-name})}]]]})))
|
||||
|
||||
(defn request-to-join-with-signatures
|
||||
[_ [community-id addresses-to-reveal signatures share-future-addresses?]]
|
||||
[_ [community-id addresses-to-reveal signatures]]
|
||||
{:fx [[:json-rpc/call
|
||||
[{:method "wakuext_requestToJoinCommunity"
|
||||
:params [{:communityId community-id
|
||||
:signatures signatures
|
||||
:addressesToReveal addresses-to-reveal
|
||||
:shareFutureAddresses share-future-addresses?
|
||||
:airdropAddress (first addresses-to-reveal)}]
|
||||
:params [{:communityId community-id
|
||||
:signatures signatures
|
||||
:addressesToReveal addresses-to-reveal
|
||||
:airdropAddress (first addresses-to-reveal)}]
|
||||
:js-response true
|
||||
:on-success [:communities/requested-to-join]
|
||||
:on-error [:communities/requested-to-join-error community-id]}]]]})
|
||||
@@ -154,18 +153,16 @@
|
||||
(defn request-to-join-with-addresses
|
||||
[{:keys [db]}
|
||||
[{:keys [community-id password]}]]
|
||||
(let [pub-key (get-in db [:profile/profile :public-key])
|
||||
addresses-to-reveal (get-in db [:communities/all-addresses-to-reveal community-id])
|
||||
share-future-addresses? (get-in db [:communities/selected-share-all-addresses community-id])
|
||||
airdrop-address (get-in db [:communities/all-airdrop-addresses community-id])]
|
||||
(let [pub-key (get-in db [:profile/profile :public-key])
|
||||
addresses-to-reveal (get-in db [:communities/all-addresses-to-reveal community-id])
|
||||
airdrop-address (get-in db [:communities/all-airdrop-addresses community-id])]
|
||||
{:fx [[:effects.community/request-to-join
|
||||
{:community-id community-id
|
||||
:password password
|
||||
:pub-key pub-key
|
||||
:addresses-to-reveal addresses-to-reveal
|
||||
:airdrop-address airdrop-address
|
||||
:share-future-addresses? share-future-addresses?
|
||||
:on-success [:communities/requested-to-join]
|
||||
:on-error [:communities/requested-to-join-error community-id]}]]}))
|
||||
{:community-id community-id
|
||||
:password password
|
||||
:pub-key pub-key
|
||||
:addresses-to-reveal addresses-to-reveal
|
||||
:airdrop-address airdrop-address
|
||||
:on-success [:communities/requested-to-join]
|
||||
:on-error [:communities/requested-to-join-error community-id]}]]}))
|
||||
|
||||
(rf/reg-event-fx :communities/request-to-join-with-addresses request-to-join-with-addresses)
|
||||
|
||||
@@ -37,22 +37,19 @@
|
||||
(sut/sign-data cofx [community-id password sign-params])))))
|
||||
|
||||
(deftest request-to-join-with-signatures-test
|
||||
(let [cofx {:db {}}
|
||||
addresses-to-reveal [account-pub-key "0x2"]
|
||||
share-future-addresses? true
|
||||
signatures ["11111" "222222"]
|
||||
expected {:fx [[:json-rpc/call
|
||||
[{:method "wakuext_requestToJoinCommunity"
|
||||
:params [{:communityId community-id
|
||||
:signatures signatures
|
||||
:addressesToReveal addresses-to-reveal
|
||||
:shareFutureAddresses share-future-addresses?
|
||||
:airdropAddress "0x1"}]
|
||||
:js-response true
|
||||
:on-success [:communities/requested-to-join]
|
||||
:on-error [:communities/requested-to-join-error
|
||||
community-id]}]]]}]
|
||||
(let [cofx {:db {}}
|
||||
addresses-to-reveal [account-pub-key "0x2"]
|
||||
signatures ["11111" "222222"]
|
||||
expected {:fx [[:json-rpc/call
|
||||
[{:method "wakuext_requestToJoinCommunity"
|
||||
:params [{:communityId community-id
|
||||
:signatures signatures
|
||||
:addressesToReveal addresses-to-reveal
|
||||
:airdropAddress "0x1"}]
|
||||
:js-response true
|
||||
:on-success [:communities/requested-to-join]
|
||||
:on-error [:communities/requested-to-join-error
|
||||
community-id]}]]]}]
|
||||
(is (match? expected
|
||||
(sut/request-to-join-with-signatures cofx
|
||||
[community-id addresses-to-reveal signatures
|
||||
share-future-addresses?])))))
|
||||
[community-id addresses-to-reveal signatures])))))
|
||||
|
||||
@@ -5,8 +5,13 @@
|
||||
|
||||
(def background-container
|
||||
{:background-color colors/neutral-100
|
||||
:flex 1
|
||||
:overflow :hidden})
|
||||
:flex-direction :row
|
||||
:position :absolute
|
||||
:overflow :hidden
|
||||
:top 0
|
||||
:bottom 0
|
||||
:left 0
|
||||
:right 0})
|
||||
|
||||
(def background-blur-overlay
|
||||
{:position :absolute
|
||||
|
||||
@@ -25,12 +25,13 @@
|
||||
:sub-text (i18n/label :t/explore-the-decentralized-web)}])
|
||||
|
||||
(defn background-image
|
||||
[image-view-width]
|
||||
[content-width]
|
||||
[rn/image
|
||||
{:resize-mode :stretch
|
||||
:style {:flex 1
|
||||
:width image-view-width}
|
||||
:source (resources/get-image :onboarding-illustration)}])
|
||||
{:resize-mode :stretch
|
||||
:resize-method :scale
|
||||
:style {:top 138
|
||||
:width content-width}
|
||||
:source (resources/get-image :onboarding-illustration)}])
|
||||
|
||||
(defonce progress (atom nil))
|
||||
(defonce paused? (atom nil))
|
||||
|
||||
@@ -5,9 +5,12 @@
|
||||
|
||||
(defn header-container
|
||||
[status-bar-height content-width index header-background]
|
||||
{:margin-left (* content-width index)
|
||||
{:position :absolute
|
||||
:top 0
|
||||
:left (* content-width index)
|
||||
:padding-top (+ 30 status-bar-height)
|
||||
:width content-width
|
||||
:height (+ 96 status-bar-height)
|
||||
:flex-direction :row
|
||||
:background-color (when header-background colors/onboarding-header-black)})
|
||||
|
||||
@@ -59,9 +62,9 @@
|
||||
:top (+ 12 status-bar-height)})
|
||||
|
||||
(defn carousel-container
|
||||
[left animate? width]
|
||||
(cond->> {:flex-direction :row
|
||||
:flex 1
|
||||
:width width
|
||||
:margin-left left}
|
||||
animate? (reanimated/apply-animations-to-style {:margin-left left})))
|
||||
[left animate?]
|
||||
(cond->> {:position :absolute
|
||||
:top 0
|
||||
:flex-direction :row
|
||||
:left left}
|
||||
animate? (reanimated/apply-animations-to-style {:left left})))
|
||||
|
||||
@@ -18,18 +18,19 @@
|
||||
:size :heading-2}
|
||||
(get-in header-text [index :text])]
|
||||
[quo/text
|
||||
{:style style/carousel-sub-text}
|
||||
{:style style/carousel-sub-text
|
||||
:size :paragraph-1}
|
||||
(get-in header-text [index :sub-text])]])
|
||||
|
||||
(defn content-view
|
||||
[{:keys [window-width status-bar-height index header-text header-background]} content]
|
||||
(let [content-width (* 4 window-width)]
|
||||
[rn/view {:style {:flex 1}}
|
||||
[:<>
|
||||
(when content content)
|
||||
[rn/view {:style (style/header-container status-bar-height content-width index header-background)}
|
||||
(for [index (range 4)]
|
||||
^{:key index}
|
||||
[header-text-view index window-width header-text])]
|
||||
(when content content)]))
|
||||
[header-text-view index window-width header-text])]]))
|
||||
|
||||
(defn progress-bar
|
||||
[{:keys [static? progress-bar-width]}]
|
||||
@@ -63,10 +64,10 @@
|
||||
:swipeable (animation/composed-gestures progress paused? is-dragging? drag-amount)
|
||||
:tappable (animation/tap-gesture progress paused?)
|
||||
nil)]
|
||||
[rn/view {:style {:flex 1}}
|
||||
[:<>
|
||||
[gesture/gesture-detector {:gesture identified-gesture}
|
||||
[container-view {:style (style/carousel-container carousel-left animate? (* 4 window-width))}
|
||||
(for [index (range 1)]
|
||||
[container-view {:style (style/carousel-container carousel-left animate?)}
|
||||
(for [index (range 2)]
|
||||
^{:key index}
|
||||
[content-view
|
||||
{:window-width window-width
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
[react-native.core :as rn]
|
||||
[react-native.safe-area :as safe-area]
|
||||
[status-im.common.check-before-syncing.view :as check-before-syncing]
|
||||
[status-im.common.metrics-confirmation-modal.view :as metrics-modal]
|
||||
[status-im.common.not-implemented :as not-implemented]
|
||||
[status-im.common.resources :as resources]
|
||||
[status-im.config :as config]
|
||||
@@ -127,7 +126,6 @@
|
||||
|
||||
(defn- internal-view
|
||||
[sign-in-type]
|
||||
(rn/use-mount #(rf/dispatch [:centralized-metrics/check-modal metrics-modal/view]))
|
||||
(let [{:keys [top]} (safe-area/get-insets)]
|
||||
[rn/view {:style style/content-container}
|
||||
[quo/page-nav
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
|
||||
(def title-container
|
||||
{:margin-horizontal 20
|
||||
:padding-bottom 20
|
||||
:padding-top 12})
|
||||
:padding-vertical 12})
|
||||
|
||||
(defn page-container
|
||||
[insets]
|
||||
{:flex 1
|
||||
:padding-top (+ (:top insets) 56)})
|
||||
{:flex 1
|
||||
:justify-content :space-between
|
||||
:padding-top (+ (:top insets) 56)})
|
||||
|
||||
(defn page-illustration
|
||||
[width]
|
||||
{:flex 1
|
||||
:margin-top 12
|
||||
:margin-bottom 10
|
||||
:width width})
|
||||
{:flex 1
|
||||
:padding-top 12
|
||||
:padding-bottom 10
|
||||
:width width})
|
||||
|
||||
(defn buttons
|
||||
[insets]
|
||||
|
||||
@@ -2,16 +2,11 @@
|
||||
|
||||
(defn page-container
|
||||
[insets]
|
||||
{:flex 1
|
||||
:padding-top (:top insets)})
|
||||
{:flex 1
|
||||
:justify-content :space-between
|
||||
:padding-top (:top insets)})
|
||||
|
||||
(defn page-illustration
|
||||
[width]
|
||||
{:flex 1
|
||||
:width width})
|
||||
|
||||
(def title-style
|
||||
{:position :absolute
|
||||
:left 0
|
||||
:right 0
|
||||
:top 0})
|
||||
|
||||
@@ -17,22 +17,19 @@
|
||||
(defn generate-keys-title
|
||||
[]
|
||||
[quo/text-combinations
|
||||
{:container-style {:margin-horizontal 20
|
||||
:margin-vertical 12}
|
||||
{:container-style {:margin-horizontal 20}
|
||||
:title (i18n/label :t/generating-keys)}])
|
||||
|
||||
(defn saving-keys-title
|
||||
[]
|
||||
[quo/text-combinations
|
||||
{:container-style {:margin-horizontal 20
|
||||
:margin-vertical 12}
|
||||
{:container-style {:margin-horizontal 20}
|
||||
:title (i18n/label :t/saving-keys-to-device)}])
|
||||
|
||||
(defn keys-saved-title
|
||||
[]
|
||||
[quo/text-combinations
|
||||
{:container-style {:margin-horizontal 20
|
||||
:margin-vertical 12}
|
||||
{:container-style {:margin-horizontal 20}
|
||||
:title (i18n/label :t/keys-saved)}])
|
||||
|
||||
(defn sequence-animation
|
||||
@@ -64,42 +61,46 @@
|
||||
reanimated/easings))))))
|
||||
|
||||
(defn title
|
||||
[]
|
||||
(let [generate-keys-opacity (reanimated/use-shared-value 1)
|
||||
[insets]
|
||||
(let [top-insets (+ (if rn/small-screen? 62 112) (:insets insets))
|
||||
generate-keys-opacity (reanimated/use-shared-value 1)
|
||||
saving-keys-opacity (reanimated/use-shared-value 0)
|
||||
keys-saved-opacity (reanimated/use-shared-value 0)]
|
||||
(sequence-animation generate-keys-opacity saving-keys-opacity keys-saved-opacity)
|
||||
[rn/view
|
||||
{:style {:margin-top 56
|
||||
:height 56}}
|
||||
{:position :absolute
|
||||
:top top-insets}
|
||||
[reanimated/view
|
||||
{:style (reanimated/apply-animations-to-style
|
||||
{:opacity generate-keys-opacity}
|
||||
style/title-style)}
|
||||
{:position :absolute})}
|
||||
[generate-keys-title]]
|
||||
[reanimated/view
|
||||
{:style (reanimated/apply-animations-to-style
|
||||
{:opacity saving-keys-opacity}
|
||||
style/title-style)}
|
||||
{:position :absolute})}
|
||||
[saving-keys-title]]
|
||||
[reanimated/view
|
||||
{:style (reanimated/apply-animations-to-style
|
||||
{:opacity keys-saved-opacity}
|
||||
style/title-style)}
|
||||
{:position :absolute})}
|
||||
[keys-saved-title]]]))
|
||||
|
||||
(defn content
|
||||
[]
|
||||
(let [width (:width (rn/get-window))]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style (style/page-illustration width)
|
||||
:source (resources/get-image :generate-keys1)}]))
|
||||
[rn/view
|
||||
{:top 156
|
||||
:position :absolute}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style (style/page-illustration width)
|
||||
:source (resources/get-image :generate-keys1)}]]))
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [insets (safe-area/get-insets)]
|
||||
[rn/view {:style (style/page-container insets)}
|
||||
[:<>
|
||||
[title]
|
||||
[title insets]
|
||||
[content]]]))
|
||||
|
||||
@@ -7,8 +7,9 @@
|
||||
:justify-content :flex-end})
|
||||
|
||||
(def text-container
|
||||
{:text-align :center
|
||||
:margin-top 4
|
||||
{:flex 1
|
||||
:text-align :center
|
||||
:margin-top 16
|
||||
:flex-wrap :wrap})
|
||||
|
||||
(def plain-text
|
||||
@@ -18,8 +19,9 @@
|
||||
{:flex 1
|
||||
:color colors/white})
|
||||
|
||||
(defn bottom-actions-container
|
||||
[bottom-insets]
|
||||
{:background-color colors/onboarding-header-black
|
||||
:flex-shrink 1
|
||||
:padding-bottom (+ 20 bottom-insets)})
|
||||
(def bottom-actions-container
|
||||
{:position :absolute
|
||||
:background-color colors/onboarding-header-black
|
||||
:left 0
|
||||
:right 0
|
||||
:padding-bottom 40})
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[react-native.safe-area :as safe-area]
|
||||
[status-im.contexts.onboarding.common.background.view :as background]
|
||||
[status-im.contexts.onboarding.common.overlay.view :as overlay]
|
||||
[status-im.contexts.onboarding.intro.style :as style]
|
||||
@@ -15,7 +14,7 @@
|
||||
[rn/view {:style style/page-container}
|
||||
[background/view false]
|
||||
[quo/bottom-actions
|
||||
{:container-style (style/bottom-actions-container (safe-area/get-bottom))
|
||||
{:container-style style/bottom-actions-container
|
||||
:actions :two-vertical-actions
|
||||
:description :bottom
|
||||
:description-text [quo/text
|
||||
|
||||
@@ -170,7 +170,6 @@
|
||||
[status-im.contexts.preview.quo.settings.settings-item :as settings-item]
|
||||
[status-im.contexts.preview.quo.share.qr-code :as qr-code]
|
||||
[status-im.contexts.preview.quo.share.share-qr-code :as share-qr-code]
|
||||
[status-im.contexts.preview.quo.slideshow.slider-bar :as slider-bar]
|
||||
[status-im.contexts.preview.quo.style :as style]
|
||||
[status-im.contexts.preview.quo.switcher.group-messaging-card :as
|
||||
group-messaging-card]
|
||||
@@ -212,7 +211,6 @@
|
||||
[status-im.contexts.preview.quo.wallet.progress-bar :as progress-bar]
|
||||
[status-im.contexts.preview.quo.wallet.required-tokens :as required-tokens]
|
||||
[status-im.contexts.preview.quo.wallet.summary-info :as summary-info]
|
||||
[status-im.contexts.preview.quo.wallet.swap-input :as swap-input]
|
||||
[status-im.contexts.preview.quo.wallet.token-input :as token-input]
|
||||
[status-im.contexts.preview.quo.wallet.transaction-progress :as transaction-progress]
|
||||
[status-im.contexts.preview.quo.wallet.transaction-summary :as
|
||||
@@ -504,8 +502,6 @@
|
||||
:component qr-code/view}
|
||||
{:name :share-qr-code
|
||||
:component share-qr-code/view}]
|
||||
:slideshow [{:name :slider-bar
|
||||
:component slider-bar/view}]
|
||||
:switchers [{:name :group-messaging-card
|
||||
:component group-messaging-card/view}
|
||||
{:name :switcher-cards
|
||||
@@ -571,7 +567,6 @@
|
||||
{:name :required-tokens
|
||||
:component required-tokens/view}
|
||||
{:name :summary-info :component summary-info/view}
|
||||
{:name :swap-input :component swap-input/view}
|
||||
{:name :token-input :component token-input/view}
|
||||
{:name :wallet-activity :component wallet-activity/view}
|
||||
{:name :transaction-progress :component transaction-progress/view}
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
(ns status-im.contexts.preview.quo.slideshow.slider-bar
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.contexts.preview.quo.preview :as preview]))
|
||||
|
||||
(def descriptor
|
||||
[{:key :total-amount
|
||||
:type :number}
|
||||
{:label "Blur (dark only)?"
|
||||
:key :blur?
|
||||
:type :boolean}
|
||||
(preview/customization-color-option)])
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [[state set-state] (rn/use-state {:total-amount 10
|
||||
:active-index 0
|
||||
:blur? false
|
||||
:customization-color :blue})]
|
||||
[preview/preview-container
|
||||
{:state state
|
||||
:set-state set-state
|
||||
:descriptor descriptor
|
||||
:blur? (:blur? state)
|
||||
:show-blur-background? true
|
||||
:blur-dark-only? true}
|
||||
[rn/view
|
||||
{:style {:flex-direction :row
|
||||
:justify-content :center
|
||||
:gap 10
|
||||
:padding 10}}
|
||||
[quo/button
|
||||
{:type :outline
|
||||
:style {:disabled true}
|
||||
:disabled? (zero? (:active-index state))
|
||||
:icon-only? true
|
||||
:on-press (fn []
|
||||
(set-state (update state :active-index dec)))}
|
||||
:i/chevron-left]
|
||||
[quo/button
|
||||
{:type :outline
|
||||
:disabled? (= (:active-index state)
|
||||
(dec (:total-amount state)))
|
||||
:icon-only? true
|
||||
:on-press (fn []
|
||||
(set-state (update state :active-index inc)))}
|
||||
:i/chevron-right]]
|
||||
[quo/slider-bar state]]))
|
||||
@@ -1,68 +0,0 @@
|
||||
(ns status-im.contexts.preview.quo.wallet.swap-input
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[quo.foundations.resources :as resources]
|
||||
[react-native.core :as rn]
|
||||
[status-im.contexts.preview.quo.preview :as preview]))
|
||||
|
||||
(def descriptor
|
||||
[{:type :select
|
||||
:key :type
|
||||
:options [{:key :pay}
|
||||
{:key :receive}]}
|
||||
{:type :select
|
||||
:key :status
|
||||
:options [{:key :default}
|
||||
{:key :disabled}
|
||||
{:key :loading}]}
|
||||
{:type :select
|
||||
:key :value
|
||||
:options [{:key :token}
|
||||
{:key :fiat}]}
|
||||
{:type :boolean
|
||||
:key :error?}
|
||||
{:type :boolean
|
||||
:key :enable-swap?}
|
||||
{:type :boolean
|
||||
:key :show-approval-label?}
|
||||
(preview/customization-color-option)])
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [[state set-state] (rn/use-state {:type :pay
|
||||
:error? false
|
||||
:token "SNT"
|
||||
:customization-color :blue
|
||||
:show-approval-label? false
|
||||
:enable-swap? true
|
||||
:status :default
|
||||
:currency-symbol "€"})
|
||||
[value set-value] (rn/use-state "")
|
||||
on-press (fn [v] (set-value (str value v)))
|
||||
delete (fn [] (set-value #(subs % 0 (dec (count %)))))]
|
||||
[preview/preview-container
|
||||
{:state state
|
||||
:set-state set-state
|
||||
:descriptor descriptor}
|
||||
[quo/swap-input
|
||||
(assoc state
|
||||
:on-swap-press #(js/alert "Swap Pressed")
|
||||
:on-token-press #(js/alert "Token Pressed")
|
||||
:on-max-press #(js/alert "Max Pressed")
|
||||
:value value
|
||||
:fiat-value (str (.toFixed (* value 0.3) 2))
|
||||
:container-style {:margin-bottom 20}
|
||||
:network-tag-props {:title "Max: 200 SNT"
|
||||
:networks [{:source (resources/get-network :ethereum)}]}
|
||||
:approval-label-props
|
||||
{:status :approve
|
||||
:token-value "10"
|
||||
:button-props {:on-press
|
||||
#(js/alert "Approve Pressed")}
|
||||
:customization-color (:customization-color state)
|
||||
:token-symbol "SNT"})]
|
||||
[quo/numbered-keyboard
|
||||
{:left-action :dot
|
||||
:delete-key? true
|
||||
:on-press on-press
|
||||
:on-delete delete}]]))
|
||||
@@ -29,21 +29,19 @@
|
||||
[]
|
||||
(let [log-enabled? (boolean (not-empty config/log-level))]
|
||||
(assoc (login)
|
||||
:deviceName (native-module/get-installation-name)
|
||||
:rootDataDir (native-module/backup-disabled-data-dir)
|
||||
:rootKeystoreDir (native-module/keystore-dir)
|
||||
:logLevel (when log-enabled? config/log-level)
|
||||
:logEnabled log-enabled?
|
||||
:logFilePath (native-module/log-file-directory)
|
||||
:verifyTransactionURL config/verify-transaction-url
|
||||
:verifyENSURL config/verify-ens-url
|
||||
:verifyENSContractAddress config/verify-ens-contract-address
|
||||
:verifyTransactionChainID config/verify-transaction-chain-id
|
||||
:wakuV2LightClient true
|
||||
:wakuV2Fleet config/fleet
|
||||
:wakuV2EnableStoreConfirmationForMessagesSent false
|
||||
:previewPrivacy config/blank-preview?
|
||||
:testNetworksEnabled config/test-networks-enabled?)))
|
||||
:deviceName (native-module/get-installation-name)
|
||||
:rootDataDir (native-module/backup-disabled-data-dir)
|
||||
:rootKeystoreDir (native-module/keystore-dir)
|
||||
:logLevel (when log-enabled? config/log-level)
|
||||
:logEnabled log-enabled?
|
||||
:logFilePath (native-module/log-file-directory)
|
||||
:verifyTransactionURL config/verify-transaction-url
|
||||
:verifyENSURL config/verify-ens-url
|
||||
:verifyENSContractAddress config/verify-ens-contract-address
|
||||
:verifyTransactionChainID config/verify-transaction-chain-id
|
||||
:wakuV2LightClient true
|
||||
:previewPrivacy config/blank-preview?
|
||||
:testNetworksEnabled config/test-networks-enabled?)))
|
||||
|
||||
(defn strip-file-prefix
|
||||
[path]
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
[react-native.safe-area :as safe-area]
|
||||
[status-im.common.check-before-syncing.view :as check-before-syncing]
|
||||
[status-im.common.confirmation-drawer.view :as confirmation-drawer]
|
||||
[status-im.common.metrics-confirmation-modal.view :as metrics-modal]
|
||||
[status-im.common.standard-authentication.core :as standard-authentication]
|
||||
[status-im.config :as config]
|
||||
[status-im.constants :as constants]
|
||||
@@ -255,7 +254,6 @@
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(rn/use-mount #(rf/dispatch [:centralized-metrics/check-modal metrics-modal/view]))
|
||||
(let [[show-profiles? set-show-profiles] (rn/use-state false)
|
||||
show-profiles (rn/use-callback #(set-show-profiles true))
|
||||
hide-profiles (rn/use-callback #(set-show-profiles false))]
|
||||
|
||||
+6
-8
@@ -113,8 +113,7 @@
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [view-id (rf/sub [:view-id])
|
||||
profile-color (rf/sub [:profile/customization-color])
|
||||
(let [profile-color (rf/sub [:profile/customization-color])
|
||||
accounts-addresses (rf/sub [:wallet/addresses])
|
||||
saved-addresses-addresses (rf/sub [:wallet/saved-addresses-addresses])
|
||||
[address-or-ens set-address-or-ens] (rn/use-state "")
|
||||
@@ -176,12 +175,11 @@
|
||||
:on-press navigate-back
|
||||
:margin-top (safe-area/get-top)
|
||||
:accessibility-label :add-address-to-save-page-nav}]
|
||||
:footer (when (= view-id :screen/settings.add-address-to-save)
|
||||
[quo/button
|
||||
{:customization-color profile-color
|
||||
:disabled? button-disabled?
|
||||
:on-press on-press-continue}
|
||||
(i18n/label :t/continue)])}
|
||||
:footer [quo/button
|
||||
{:customization-color profile-color
|
||||
:disabled? button-disabled?
|
||||
:on-press on-press-continue}
|
||||
(i18n/label :t/continue)]}
|
||||
[quo/page-top
|
||||
{:container-style style/header-container
|
||||
:blur? true
|
||||
|
||||
@@ -121,8 +121,7 @@
|
||||
:on-press on-press-save}
|
||||
(i18n/label :t/save-address)]
|
||||
:customization-color address-color
|
||||
:gradient-cover? true
|
||||
:shell-overlay? true}
|
||||
:gradient-cover? true}
|
||||
[quo/wallet-user-avatar
|
||||
{:full-name (if (string/blank? address-label)
|
||||
placeholder
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
(ns status-im.contexts.shell.activity-center.context
|
||||
(:require
|
||||
["react" :as react]
|
||||
[oops.core :as oops]
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(defonce ^:private context
|
||||
(react/createContext {}))
|
||||
|
||||
(defn provider
|
||||
[state & children]
|
||||
(into [:> (oops/oget context :Provider) {:value state}]
|
||||
children))
|
||||
|
||||
(defn use-context
|
||||
[]
|
||||
(let [ctx (rn/use-context context)]
|
||||
{:active-swipeable (oops/oget ctx :activeSwipeable)}))
|
||||
@@ -15,7 +15,10 @@
|
||||
(def defaults
|
||||
{:filter-status :unread
|
||||
:filter-type types/no-type
|
||||
:notifications-per-page constants/notifications-per-page})
|
||||
;; Choose the maximum number of notifications that *usually/safely* fit on
|
||||
;; most screens, so that the UI doesn't have to needlessly render
|
||||
;; notifications.
|
||||
:notifications-per-page 8})
|
||||
|
||||
;;;; Navigation
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
(ns status-im.contexts.shell.activity-center.notification.admin.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.shell.activity-center.notification.common.style :as common-style]
|
||||
[status-im.contexts.shell.activity-center.notification.common.view :as common]
|
||||
@@ -24,50 +23,42 @@
|
||||
:text (i18n/label :t/decline)}])
|
||||
|
||||
(defn- swipeable
|
||||
[{:keys [notification extra-fn]} child]
|
||||
(let [{:keys [community-id id
|
||||
membership-status]} notification
|
||||
accept (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:communities/accept-request-to-join-pressed
|
||||
community-id id]))
|
||||
[community-id id])
|
||||
decline (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:communities/decline-request-to-join-pressed
|
||||
community-id id]))
|
||||
[community-id id])]
|
||||
[{:keys [active-swipeable notification extra-fn]} child]
|
||||
(let [{:keys [community-id id membership-status]} notification]
|
||||
(cond
|
||||
(#{constants/activity-center-membership-status-accepted
|
||||
constants/activity-center-membership-status-declined}
|
||||
membership-status)
|
||||
[common/swipeable
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:extra-fn extra-fn}
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child]
|
||||
|
||||
(= membership-status constants/activity-center-membership-status-pending)
|
||||
[common/swipeable
|
||||
{:left-button swipe-button-accept
|
||||
:left-on-press accept
|
||||
:right-button swipe-button-decline
|
||||
:right-on-press decline
|
||||
:extra-fn extra-fn}
|
||||
{:left-button swipe-button-accept
|
||||
:left-on-press #(rf/dispatch [:communities/accept-request-to-join-pressed community-id id])
|
||||
:right-button swipe-button-decline
|
||||
:right-on-press #(rf/dispatch [:communities/decline-request-to-join-pressed community-id
|
||||
id])
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child]
|
||||
|
||||
:else
|
||||
child)))
|
||||
|
||||
(defn view
|
||||
[{:keys [notification] :as props}]
|
||||
[{:keys [notification set-swipeable-height customization-color] :as props}]
|
||||
(let [{:keys [author community-id id membership-status
|
||||
read timestamp]} notification
|
||||
community-name (rf/sub [:communities/name community-id])
|
||||
community-logo (rf/sub [:communities/logo community-id])
|
||||
customization-color (rf/sub [:profile/customization-color])]
|
||||
community (rf/sub [:communities/community community-id])
|
||||
community-name (:name community)
|
||||
community-image (get-in community [:images :thumbnail :uri])]
|
||||
[swipeable props
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/join-request)
|
||||
@@ -75,13 +66,14 @@
|
||||
:icon :i/add-user
|
||||
:timestamp (datetime/timestamp->relative timestamp)
|
||||
:unread? (not read)
|
||||
:on-layout set-swipeable-height
|
||||
:context [[common/user-avatar-tag author]
|
||||
(i18n/label :t/wants-to-join)
|
||||
[quo/context-tag
|
||||
{:type :community
|
||||
:size 24
|
||||
:blur? true
|
||||
:community-logo community-logo
|
||||
:community-logo community-image
|
||||
:community-name community-name}]]
|
||||
:items (condp = membership-status
|
||||
constants/activity-center-membership-status-accepted
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
(def swipe-action-width 80)
|
||||
(def swipe-button-border-radius 16)
|
||||
(def swipe-button-margin 8)
|
||||
|
||||
(def user-avatar-tag
|
||||
{:background-color colors/white-opa-10})
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
(ns status-im.contexts.shell.activity-center.notification.common.view
|
||||
(:require
|
||||
[oops.core :as oops]
|
||||
[quo.core :as quo]
|
||||
[quo.foundations.colors :as colors]
|
||||
[react-native.core :as rn]
|
||||
[react-native.gesture :as gesture]
|
||||
[status-im.contexts.profile.utils :as profile.utils]
|
||||
[status-im.contexts.shell.activity-center.context :as ac.context]
|
||||
[status-im.contexts.shell.activity-center.notification.common.style :as style]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
@@ -16,7 +14,7 @@
|
||||
(let [profile (rf/sub [:contacts/contact-by-identity user-id])]
|
||||
[rn/view
|
||||
{:on-start-should-set-responder
|
||||
(fn []
|
||||
(fn [_event]
|
||||
(rf/dispatch [:navigate-back])
|
||||
(rf/dispatch [:chat.ui/show-profile user-id])
|
||||
true)}
|
||||
@@ -35,27 +33,35 @@
|
||||
swipe-button
|
||||
swipeable-ref
|
||||
style]}]
|
||||
(fn [_ drag-x]
|
||||
(let [extra (extra-fn)
|
||||
opacity (oops/ocall drag-x :interpolate interpolation-opacity)
|
||||
translate-x (oops/ocall drag-x :interpolate interpolation-translate-x)]
|
||||
(fn [_ ^js drag-x]
|
||||
(let [{:keys [height] :as extra} (extra-fn)
|
||||
opacity (.interpolate drag-x interpolation-opacity)
|
||||
translate-x (.interpolate drag-x interpolation-translate-x)]
|
||||
[gesture/rect-button
|
||||
{:style (merge {:border-radius style/swipe-button-border-radius} style)
|
||||
:accessibility-label :notification-swipe-action-button
|
||||
:on-press (fn []
|
||||
(when @swipeable-ref
|
||||
(oops/ocall @swipeable-ref :close)
|
||||
(.close ^js @swipeable-ref)
|
||||
(reset! active-swipeable nil))
|
||||
(on-press extra))}
|
||||
[swipe-button
|
||||
{:style {:opacity opacity
|
||||
:transform [{:translateX translate-x}]
|
||||
:flex 1
|
||||
:height height
|
||||
:width style/swipe-action-width}}
|
||||
extra]])))
|
||||
|
||||
(defn- close-active-swipeable
|
||||
[active-swipeable swipeable]
|
||||
(fn [_]
|
||||
(when (and @active-swipeable
|
||||
(not= @active-swipeable @swipeable))
|
||||
(.close ^js @active-swipeable))
|
||||
(reset! active-swipeable @swipeable)))
|
||||
|
||||
(defn swipe-button-container
|
||||
[{:keys [style icon text]}]
|
||||
[{:keys [style icon text]} _]
|
||||
[rn/animated-view
|
||||
{:accessibility-label :notification-swipe
|
||||
:style style}
|
||||
@@ -97,54 +103,47 @@
|
||||
(rf/dispatch [:activity-center.notifications/delete (:id notification)]))
|
||||
|
||||
(defn swipeable
|
||||
[{:keys [extra-fn
|
||||
left-button
|
||||
left-on-press
|
||||
right-button
|
||||
right-on-press]}
|
||||
child]
|
||||
(let [{:keys [active-swipeable]} (ac.context/use-context)
|
||||
this-swipeable (rn/use-ref-atom nil)
|
||||
set-this-swipeable (rn/use-callback #(reset! this-swipeable %)
|
||||
[this-swipeable])
|
||||
on-swipeable-will-open (rn/use-callback
|
||||
(fn []
|
||||
(when (and @active-swipeable
|
||||
(not= @active-swipeable @this-swipeable))
|
||||
(oops/ocall @active-swipeable :close))
|
||||
(reset! active-swipeable @this-swipeable))
|
||||
[@active-swipeable @this-swipeable])]
|
||||
[gesture/swipeable
|
||||
(cond-> {:ref set-this-swipeable
|
||||
:accessibility-label :notification-swipeable
|
||||
:friction 2
|
||||
:on-swipeable-will-open on-swipeable-will-open
|
||||
:children-container-style {:padding-horizontal 20}}
|
||||
left-button
|
||||
(assoc :overshoot-left false
|
||||
:left-threshold style/swipe-action-width
|
||||
:render-left-actions (render-swipe-action
|
||||
{:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn
|
||||
:interpolation-opacity style/left-swipe-opacity-interpolation-js
|
||||
:interpolation-translate-x
|
||||
style/left-swipe-translate-x-interpolation-js
|
||||
:on-press left-on-press
|
||||
:swipe-button left-button
|
||||
:swipeable-ref this-swipeable
|
||||
:style {:left style/swipe-button-margin}}))
|
||||
|
||||
right-button
|
||||
(assoc :overshoot-right false
|
||||
:right-threshold style/swipe-action-width
|
||||
:render-right-actions (render-swipe-action
|
||||
{:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn
|
||||
:interpolation-opacity style/right-swipe-opacity-interpolation-js
|
||||
:interpolation-translate-x
|
||||
style/right-swipe-translate-x-interpolation-js
|
||||
:on-press right-on-press
|
||||
:swipe-button right-button
|
||||
:swipeable-ref this-swipeable
|
||||
:style {:right (- style/swipe-button-margin)}})))
|
||||
child]))
|
||||
[_]
|
||||
(let [swipeable-ref (atom nil)]
|
||||
(fn [{:keys [active-swipeable
|
||||
extra-fn
|
||||
left-button
|
||||
left-on-press
|
||||
right-button
|
||||
right-on-press]}
|
||||
& children]
|
||||
(into
|
||||
[gesture/swipeable
|
||||
(merge
|
||||
{:ref #(reset! swipeable-ref %)
|
||||
:accessibility-label :notification-swipeable
|
||||
:friction 2
|
||||
:on-swipeable-will-open (close-active-swipeable active-swipeable swipeable-ref)
|
||||
:children-container-style {:padding-horizontal 20}}
|
||||
(when left-button
|
||||
{:overshoot-left false
|
||||
:left-threshold style/swipe-action-width
|
||||
:render-left-actions (render-swipe-action
|
||||
{:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn
|
||||
:interpolation-opacity style/left-swipe-opacity-interpolation-js
|
||||
:interpolation-translate-x
|
||||
style/left-swipe-translate-x-interpolation-js
|
||||
:on-press left-on-press
|
||||
:swipe-button left-button
|
||||
:swipeable-ref swipeable-ref
|
||||
:style {:left 8}})})
|
||||
(when right-button
|
||||
{:overshoot-right false
|
||||
:right-threshold style/swipe-action-width
|
||||
:render-right-actions (render-swipe-action
|
||||
{:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn
|
||||
:interpolation-opacity style/right-swipe-opacity-interpolation-js
|
||||
:interpolation-translate-x
|
||||
style/right-swipe-translate-x-interpolation-js
|
||||
:on-press right-on-press
|
||||
:swipe-button right-button
|
||||
:swipeable-ref swipeable-ref
|
||||
:style {:right -8}})}))]
|
||||
children))))
|
||||
|
||||
+16
-18
@@ -1,7 +1,6 @@
|
||||
(ns status-im.contexts.shell.activity-center.notification.community-kicked.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[react-native.gesture :as gesture]
|
||||
[status-im.contexts.shell.activity-center.notification.common.style :as common-style]
|
||||
[status-im.contexts.shell.activity-center.notification.common.view :as common]
|
||||
@@ -10,34 +9,33 @@
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn- swipeable
|
||||
[{:keys [extra-fn]} child]
|
||||
[{:keys [active-swipeable extra-fn]} child]
|
||||
[common/swipeable
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:extra-fn extra-fn}
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child])
|
||||
|
||||
(defn view
|
||||
[{:keys [notification extra-fn]}]
|
||||
(let [{:keys [id community-id read
|
||||
[{:keys [notification set-swipeable-height customization-color] :as props}]
|
||||
(let [{:keys [community-id read
|
||||
timestamp]} notification
|
||||
community (rf/sub [:communities/community community-id])
|
||||
community-name (:name community)
|
||||
community-image (get-in community [:images :thumbnail :uri])
|
||||
customization-color (rf/sub [:profile/customization-color])
|
||||
on-press (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:navigate-back])
|
||||
(rf/dispatch [:activity-center.notifications/mark-as-read id]))
|
||||
[id])]
|
||||
[swipeable {:extra-fn extra-fn}
|
||||
[gesture/touchable-without-feedback {:on-press on-press}
|
||||
community-image (get-in community [:images :thumbnail :uri])]
|
||||
[swipeable props
|
||||
[gesture/touchable-without-feedback
|
||||
{:on-press (fn []
|
||||
(rf/dispatch [:navigate-back])
|
||||
(rf/dispatch [:activity-center.notifications/mark-as-read (:id notification)]))}
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/community-kicked-heading)
|
||||
:customization-color customization-color
|
||||
:icon :i/placeholder
|
||||
:on-layout set-swipeable-height
|
||||
:timestamp (datetime/timestamp->relative timestamp)
|
||||
:unread? (not read)
|
||||
:context [[quo/text {:style common-style/user-avatar-tag-text}
|
||||
|
||||
+27
-30
@@ -1,7 +1,6 @@
|
||||
(ns status-im.contexts.shell.activity-center.notification.community-request.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[react-native.gesture :as gesture]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.shell.activity-center.notification.common.style :as common-style]
|
||||
@@ -11,23 +10,27 @@
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn- swipeable
|
||||
[{:keys [extra-fn]} child]
|
||||
[{:keys [active-swipeable extra-fn]} child]
|
||||
[common/swipeable
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:extra-fn extra-fn}
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child])
|
||||
|
||||
(defn- get-header-text-and-context
|
||||
[community-logo community-name community-permissions membership-status]
|
||||
(let [open? (not= 3 (:access community-permissions))
|
||||
[community membership-status]
|
||||
(let [community-name (:name community)
|
||||
permissions (:permissions community)
|
||||
open? (not= 3 (:access permissions))
|
||||
community-image (get-in community [:images :thumbnail :uri])
|
||||
community-context-tag [quo/context-tag
|
||||
{:type :community
|
||||
:size 24
|
||||
:blur? true
|
||||
:community-logo community-logo
|
||||
:community-logo community-image
|
||||
:community-name community-name}]]
|
||||
(cond
|
||||
(= membership-status constants/activity-center-membership-status-idle)
|
||||
@@ -53,33 +56,27 @@
|
||||
:t/joined-community
|
||||
:t/community-request-accepted-body-text)
|
||||
(when open? {:community community-name}))]
|
||||
community-context-tag]})))
|
||||
community-context-tag]}
|
||||
|
||||
:else nil)))
|
||||
|
||||
(defn view
|
||||
[{:keys [notification extra-fn]}]
|
||||
[{:keys [notification set-swipeable-height customization-color] :as props}]
|
||||
(let [{:keys [community-id membership-status read
|
||||
timestamp]} notification
|
||||
community-name (rf/sub [:communities/name community-id])
|
||||
community-logo (rf/sub [:communities/logo community-id])
|
||||
community-permissions (rf/sub [:communities/permissions community-id])
|
||||
customization-color (rf/sub [:profile/customization-color])
|
||||
{:keys [header-text
|
||||
context]} (get-header-text-and-context community-logo
|
||||
community-name
|
||||
community-permissions
|
||||
membership-status)
|
||||
on-press (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:navigate-back])
|
||||
(rf/dispatch [:communities/navigate-to-community-overview
|
||||
community-id]))
|
||||
[community-id])]
|
||||
[swipeable {:extra-fn extra-fn}
|
||||
[gesture/touchable-without-feedback {:on-press on-press}
|
||||
timestamp]} notification
|
||||
community (rf/sub [:communities/community community-id])
|
||||
{:keys [header-text context]} (get-header-text-and-context community
|
||||
membership-status)]
|
||||
[swipeable props
|
||||
[gesture/touchable-without-feedback
|
||||
{:on-press (fn []
|
||||
(rf/dispatch [:navigate-back])
|
||||
(rf/dispatch [:communities/navigate-to-community-overview community-id]))}
|
||||
[quo/activity-log
|
||||
{:title header-text
|
||||
:customization-color customization-color
|
||||
:icon :i/communities
|
||||
:on-layout set-swipeable-height
|
||||
:timestamp (datetime/timestamp->relative timestamp)
|
||||
:unread? (not read)
|
||||
:context context}]]]))
|
||||
|
||||
+28
-41
@@ -1,7 +1,6 @@
|
||||
(ns status-im.contexts.shell.activity-center.notification.contact-requests.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
quo.theme
|
||||
[react-native.core :as rn]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.shell.activity-center.notification.common.style :as common-style]
|
||||
@@ -25,52 +24,48 @@
|
||||
:text (i18n/label :t/decline)}])
|
||||
|
||||
(defn- swipeable
|
||||
[{:keys [extra-fn notification]} child]
|
||||
[{:keys [active-swipeable extra-fn notification]} child]
|
||||
(let [{:keys [id author message]} notification
|
||||
{:keys [contact-request-state]} message
|
||||
{:keys [public-key]} (rf/sub [:multiaccount/contact])
|
||||
outgoing? (= public-key author)
|
||||
accept (rn/use-callback
|
||||
#(rf/dispatch [:activity-center.contact-requests/accept id])
|
||||
[id])
|
||||
decline (rn/use-callback
|
||||
#(rf/dispatch [:activity-center.contact-requests/decline id])
|
||||
[id])]
|
||||
outgoing? (= public-key author)]
|
||||
(cond
|
||||
(or (#{constants/contact-request-message-state-accepted
|
||||
constants/contact-request-message-state-declined}
|
||||
contact-request-state)
|
||||
(and outgoing? (= contact-request-state constants/contact-request-message-state-pending)))
|
||||
[common/swipeable
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:extra-fn extra-fn}
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child]
|
||||
|
||||
(and (= contact-request-state constants/contact-request-message-state-pending)
|
||||
(not outgoing?))
|
||||
[common/swipeable
|
||||
{:left-button swipe-button-accept
|
||||
:left-on-press accept
|
||||
:right-button swipe-button-decline
|
||||
:right-on-press decline
|
||||
:extra-fn extra-fn}
|
||||
{:left-button swipe-button-accept
|
||||
:left-on-press #(rf/dispatch [:activity-center.contact-requests/accept id])
|
||||
:right-button swipe-button-decline
|
||||
:right-on-press #(rf/dispatch [:activity-center.contact-requests/decline id])
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child]
|
||||
|
||||
:else
|
||||
child)))
|
||||
|
||||
(defn- outgoing-contact-request-view
|
||||
[{:keys [notification]} theme]
|
||||
[{:keys [notification set-swipeable-height customization-color]} theme]
|
||||
(let [{:keys [chat-id message last-message accepted]} notification
|
||||
{:keys [contact-request-state] :as message} (or message last-message)
|
||||
customization-color (rf/sub [:profile/customization-color])]
|
||||
{:keys [contact-request-state] :as message} (or message last-message)]
|
||||
(if accepted
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/contact-request-was-accepted)
|
||||
:customization-color customization-color
|
||||
:on-layout set-swipeable-height
|
||||
:icon :i/add-user
|
||||
:timestamp (datetime/timestamp->relative (:timestamp notification))
|
||||
:unread? (not (:read notification))
|
||||
@@ -81,6 +76,7 @@
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/contact-request)
|
||||
:customization-color customization-color
|
||||
:on-layout set-swipeable-height
|
||||
:icon :i/add-user
|
||||
:timestamp (datetime/timestamp->relative (:timestamp notification))
|
||||
:unread? (not (:read notification))
|
||||
@@ -106,22 +102,13 @@
|
||||
nil)}])))
|
||||
|
||||
(defn- incoming-contact-request-view
|
||||
[{:keys [notification]} theme]
|
||||
(let [{:keys [id author message
|
||||
last-message]} notification
|
||||
customization-color (rf/sub [:profile/customization-color])
|
||||
message (or message last-message)
|
||||
accept (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:activity-center.contact-requests/accept id]))
|
||||
[id])
|
||||
decline (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:activity-center.contact-requests/decline id]))
|
||||
[id])]
|
||||
[{:keys [notification set-swipeable-height customization-color]} theme]
|
||||
(let [{:keys [id author message last-message]} notification
|
||||
message (or message last-message)]
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/contact-request)
|
||||
:customization-color customization-color
|
||||
:on-layout set-swipeable-height
|
||||
:icon :i/add-user
|
||||
:timestamp (datetime/timestamp->relative (:timestamp notification))
|
||||
:unread? (not (:read notification))
|
||||
@@ -153,13 +140,13 @@
|
||||
:key :button-decline
|
||||
:label (i18n/label :t/decline)
|
||||
:accessibility-label :decline-contact-request
|
||||
:on-press decline}
|
||||
:on-press #(rf/dispatch [:activity-center.contact-requests/decline id])}
|
||||
{:type :button
|
||||
:subtype :positive
|
||||
:key :button-accept
|
||||
:label (i18n/label :t/accept)
|
||||
:accessibility-label :accept-contact-request
|
||||
:on-press accept}]
|
||||
:on-press #(rf/dispatch [:activity-center.contact-requests/accept id])}]
|
||||
|
||||
nil)}]))
|
||||
|
||||
@@ -168,16 +155,16 @@
|
||||
(let [{:keys [author message last-message]} notification
|
||||
{:keys [public-key]} (rf/sub [:multiaccount/contact])
|
||||
{:keys [contact-request-state]} (or message last-message)
|
||||
theme (quo.theme/use-theme)]
|
||||
app-theme (rf/sub [:theme])]
|
||||
[swipeable props
|
||||
(cond
|
||||
(= public-key author)
|
||||
[outgoing-contact-request-view props theme]
|
||||
[outgoing-contact-request-view props app-theme]
|
||||
|
||||
(= contact-request-state constants/contact-request-message-state-accepted)
|
||||
[rn/pressable
|
||||
{:on-press #(rf/dispatch [:chat.ui/start-chat author])}
|
||||
[incoming-contact-request-view props theme]]
|
||||
[incoming-contact-request-view props app-theme]]
|
||||
|
||||
:else
|
||||
[incoming-contact-request-view props theme])]))
|
||||
[incoming-contact-request-view props app-theme])]))
|
||||
|
||||
+99
-95
@@ -105,7 +105,7 @@
|
||||
(rf/dispatch [:activity-center.notifications/mark-as-read id]))
|
||||
|
||||
(defn- swipeable
|
||||
[{:keys [extra-fn notification replying?] :as props} child]
|
||||
[{:keys [active-swipeable extra-fn notification replying?] :as props} child]
|
||||
(let [{:keys [id message
|
||||
contact-verification-status]} notification
|
||||
challenger? (:outgoing message)]
|
||||
@@ -116,21 +116,23 @@
|
||||
(and (not challenger?)
|
||||
(= contact-verification-status constants/contact-verification-status-pending))
|
||||
[common/swipeable
|
||||
{:left-button swipe-button-reply
|
||||
:left-on-press #(prepare-challenge-reply props)
|
||||
:right-button swipe-button-decline
|
||||
:right-on-press #(decline-challenge id)
|
||||
:extra-fn extra-fn}
|
||||
{:left-button swipe-button-reply
|
||||
:left-on-press #(prepare-challenge-reply props)
|
||||
:right-button swipe-button-decline
|
||||
:right-on-press #(decline-challenge id)
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child]
|
||||
|
||||
(and challenger?
|
||||
(= contact-verification-status constants/contact-verification-status-accepted))
|
||||
[common/swipeable
|
||||
{:left-button swipe-button-trust
|
||||
:left-on-press #(mark-challenge-trusted id)
|
||||
:right-button swipe-button-untrustworthy
|
||||
:right-on-press #(mark-challenge-untrustworthy id)
|
||||
:extra-fn extra-fn}
|
||||
{:left-button swipe-button-trust
|
||||
:left-on-press #(mark-challenge-trusted id)
|
||||
:right-button swipe-button-untrustworthy
|
||||
:right-on-press #(mark-challenge-untrustworthy id)
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child]
|
||||
|
||||
(#{constants/contact-verification-status-accepted
|
||||
@@ -138,11 +140,12 @@
|
||||
constants/contact-verification-status-trusted}
|
||||
contact-verification-status)
|
||||
[common/swipeable
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:extra-fn extra-fn}
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child]
|
||||
|
||||
:else
|
||||
@@ -151,9 +154,8 @@
|
||||
(defn view
|
||||
[_]
|
||||
(let [reply (atom "")]
|
||||
(fn [{:keys [notification replying?] :as props}]
|
||||
(let [customization-color (rf/sub [:profile/customization-color])
|
||||
{:keys [id message
|
||||
(fn [{:keys [notification set-swipeable-height replying? customization-color] :as props}]
|
||||
(let [{:keys [id message
|
||||
contact-verification-status]} notification
|
||||
challenger? (:outgoing message)]
|
||||
;; TODO(@ilmotta): Declined challenges should only be displayed for the challengee, not the
|
||||
@@ -163,84 +165,86 @@
|
||||
(= contact-verification-status constants/contact-verification-status-declined))
|
||||
[swipeable props
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/identity-verification-request)
|
||||
:customization-color customization-color
|
||||
:icon :i/friend
|
||||
:timestamp (datetime/timestamp->relative (:timestamp notification))
|
||||
:unread? (not (:read notification))
|
||||
:on-update-reply #(reset! reply %)
|
||||
:replying? replying?
|
||||
:max-reply-length max-reply-length
|
||||
:valid-reply? valid-reply?
|
||||
:context (context-tags challenger? notification)
|
||||
:message (activity-message challenger? notification)
|
||||
:items
|
||||
(cond-> []
|
||||
(and challenger?
|
||||
(= contact-verification-status constants/contact-verification-status-accepted))
|
||||
(concat
|
||||
[{:type :button
|
||||
:subtype :danger
|
||||
:key :button-mark-as-untrustworthy
|
||||
:label (i18n/label :t/untrustworthy)
|
||||
:accessibility-label :mark-contact-verification-as-untrustworthy
|
||||
:on-press #(mark-challenge-untrustworthy id)}
|
||||
{:type :button
|
||||
:subtype :positive
|
||||
:key :button-accept
|
||||
:label (i18n/label :t/accept)
|
||||
:accessibility-label :mark-contact-verification-as-trusted
|
||||
:on-press #(mark-challenge-trusted id)}])
|
||||
(merge
|
||||
(when-not replying?
|
||||
{:on-layout set-swipeable-height})
|
||||
{:title (i18n/label :t/identity-verification-request)
|
||||
:customization-color customization-color
|
||||
:icon :i/friend
|
||||
:timestamp (datetime/timestamp->relative (:timestamp notification))
|
||||
:unread? (not (:read notification))
|
||||
:on-update-reply #(reset! reply %)
|
||||
:replying? replying?
|
||||
:max-reply-length max-reply-length
|
||||
:valid-reply? valid-reply?
|
||||
:context (context-tags challenger? notification)
|
||||
:message (activity-message challenger? notification)
|
||||
:items
|
||||
(cond-> []
|
||||
(and challenger?
|
||||
(= contact-verification-status constants/contact-verification-status-accepted))
|
||||
(concat
|
||||
[{:type :button
|
||||
:subtype :danger
|
||||
:key :button-mark-as-untrustworthy
|
||||
:label (i18n/label :t/untrustworthy)
|
||||
:accessibility-label :mark-contact-verification-as-untrustworthy
|
||||
:on-press #(mark-challenge-untrustworthy id)}
|
||||
{:type :button
|
||||
:subtype :positive
|
||||
:key :button-accept
|
||||
:label (i18n/label :t/accept)
|
||||
:accessibility-label :mark-contact-verification-as-trusted
|
||||
:on-press #(mark-challenge-trusted id)}])
|
||||
|
||||
(and challenger?
|
||||
(= contact-verification-status constants/contact-verification-status-trusted))
|
||||
(concat [{:type :status
|
||||
:subtype :positive
|
||||
:key :status-trusted
|
||||
:label (i18n/label :t/status-confirmed)}])
|
||||
(and challenger?
|
||||
(= contact-verification-status constants/contact-verification-status-trusted))
|
||||
(concat [{:type :status
|
||||
:subtype :positive
|
||||
:key :status-trusted
|
||||
:label (i18n/label :t/status-confirmed)}])
|
||||
|
||||
(and challenger?
|
||||
(= contact-verification-status
|
||||
constants/contact-verification-status-untrustworthy))
|
||||
(concat [{:type :status
|
||||
:subtype :negative
|
||||
:key :status-untrustworthy
|
||||
:label (i18n/label :t/untrustworthy)}])
|
||||
(and challenger?
|
||||
(= contact-verification-status constants/contact-verification-status-untrustworthy))
|
||||
(concat [{:type :status
|
||||
:subtype :negative
|
||||
:key :status-untrustworthy
|
||||
:label (i18n/label :t/untrustworthy)}])
|
||||
|
||||
(and (not challenger?)
|
||||
(= contact-verification-status constants/contact-verification-status-accepted))
|
||||
(concat [{:type :status
|
||||
:subtype :positive
|
||||
:key :status-accepted
|
||||
:label (i18n/label :t/replied)}])
|
||||
(and (not challenger?)
|
||||
(= contact-verification-status constants/contact-verification-status-accepted))
|
||||
(concat [{:type :status
|
||||
:subtype :positive
|
||||
:key :status-accepted
|
||||
:label (i18n/label :t/replied)}])
|
||||
|
||||
(and (not challenger?)
|
||||
(= contact-verification-status constants/contact-verification-status-declined))
|
||||
(concat [{:type :status
|
||||
:subtype :negative
|
||||
:key :status-declined
|
||||
:label (i18n/label :t/declined)}])
|
||||
(and (not challenger?)
|
||||
(= contact-verification-status constants/contact-verification-status-declined))
|
||||
(concat [{:type :status
|
||||
:subtype :negative
|
||||
:key :status-declined
|
||||
:label (i18n/label :t/declined)}])
|
||||
|
||||
(and (not challenger?)
|
||||
(= contact-verification-status constants/contact-verification-status-pending))
|
||||
(concat
|
||||
[{:type :button
|
||||
:subtype :danger
|
||||
:key :button-decline
|
||||
:label (i18n/label :t/decline)
|
||||
:accessibility-label :decline-contact-verification
|
||||
:on-press #(decline-challenge id)}
|
||||
(if replying?
|
||||
{:type :button
|
||||
:subtype :primary
|
||||
:key :button-reply
|
||||
:label (i18n/label :t/send-reply)
|
||||
:accessibility-label :reply-to-contact-verification
|
||||
:disable-when invalid-reply?
|
||||
:on-press #(send-challenge-reply id @reply)}
|
||||
{:type :button
|
||||
:subtype :primary
|
||||
:key :button-send-reply
|
||||
:label (i18n/label :t/message-reply)
|
||||
:accessibility-label :send-reply-to-contact-verification
|
||||
:on-press #(prepare-challenge-reply props)})]))}]])))))
|
||||
(and (not challenger?)
|
||||
(= contact-verification-status constants/contact-verification-status-pending))
|
||||
(concat
|
||||
[{:type :button
|
||||
:subtype :danger
|
||||
:key :button-decline
|
||||
:label (i18n/label :t/decline)
|
||||
:accessibility-label :decline-contact-verification
|
||||
:on-press #(decline-challenge id)}
|
||||
(if replying?
|
||||
{:type :button
|
||||
:subtype :primary
|
||||
:key :button-reply
|
||||
:label (i18n/label :t/send-reply)
|
||||
:accessibility-label :reply-to-contact-verification
|
||||
:disable-when invalid-reply?
|
||||
:on-press #(send-challenge-reply id @reply)}
|
||||
{:type :button
|
||||
:subtype :primary
|
||||
:key :button-send-reply
|
||||
:label (i18n/label :t/message-reply)
|
||||
:accessibility-label :send-reply-to-contact-verification
|
||||
:on-press #(prepare-challenge-reply props)})]))})]])))))
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
(ns status-im.contexts.shell.activity-center.notification.membership.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[react-native.gesture :as gesture]
|
||||
[status-im.contexts.shell.activity-center.notification.common.style :as common-style]
|
||||
[status-im.contexts.shell.activity-center.notification.common.view :as common]
|
||||
@@ -34,50 +33,35 @@
|
||||
:text (i18n/label :t/decline)}])
|
||||
|
||||
(defn- swipeable
|
||||
[{:keys [notification extra-fn]} child]
|
||||
(let [{:keys [accepted dismissed
|
||||
id]} notification
|
||||
accept (rn/use-callback
|
||||
(fn [] (rf/dispatch [:activity-center.notifications/accept id]))
|
||||
[id])
|
||||
dismiss (rn/use-callback
|
||||
(fn [] (rf/dispatch [:activity-center.notifications/dismiss id]))
|
||||
[id])]
|
||||
[{:keys [active-swipeable notification extra-fn]} child]
|
||||
(let [{:keys [accepted dismissed id]} notification]
|
||||
(if (or accepted dismissed)
|
||||
[common/swipeable
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:extra-fn extra-fn}
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child]
|
||||
[common/swipeable
|
||||
{:left-button swipe-button-accept
|
||||
:left-on-press accept
|
||||
:right-button swipe-button-decline
|
||||
:right-on-press dismiss
|
||||
:extra-fn extra-fn}
|
||||
{:left-button swipe-button-accept
|
||||
:left-on-press #(rf/dispatch [:activity-center.notifications/accept id])
|
||||
:right-button swipe-button-decline
|
||||
:right-on-press #(rf/dispatch [:activity-center.notifications/dismiss id])
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child])))
|
||||
|
||||
(defn view
|
||||
[{:keys [notification] :as props}]
|
||||
(let [{:keys [id accepted dismissed author read
|
||||
timestamp chat-name
|
||||
chat-id]} notification
|
||||
customization-color (rf/sub [:profile/customization-color])
|
||||
accept (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:activity-center.notifications/accept id]))
|
||||
[id])
|
||||
dismiss (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:activity-center.notifications/dismiss id]))
|
||||
[id])]
|
||||
[{:keys [notification set-swipeable-height customization-color] :as props}]
|
||||
(let [{:keys [id accepted dismissed author read timestamp chat-name chat-id]} notification]
|
||||
[swipeable props
|
||||
[pressable {:accepted accepted :chat-id chat-id}
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/added-to-group-chat)
|
||||
:customization-color customization-color
|
||||
:on-layout set-swipeable-height
|
||||
:icon :i/add-user
|
||||
:timestamp (datetime/timestamp->relative timestamp)
|
||||
:unread? (not read)
|
||||
@@ -94,10 +78,13 @@
|
||||
:key :button-accept
|
||||
:label (i18n/label :t/accept)
|
||||
:accessibility-label :accept-group-chat-invitation
|
||||
:on-press accept}
|
||||
:on-press #(rf/dispatch
|
||||
[:activity-center.notifications/accept id])}
|
||||
{:type :button
|
||||
:subtype :danger
|
||||
:key :button-decline
|
||||
:label (i18n/label :t/decline)
|
||||
:accessibility-label :decline-group-chat-invitation
|
||||
:on-press dismiss}])}]]]))
|
||||
:on-press #(rf/dispatch
|
||||
[:activity-center.notifications/dismiss
|
||||
id])}])}]]]))
|
||||
|
||||
@@ -30,24 +30,25 @@
|
||||
parsed-text-children))))
|
||||
|
||||
(defn- swipeable
|
||||
[{:keys [extra-fn]} child]
|
||||
[{:keys [active-swipeable extra-fn]} child]
|
||||
[common/swipeable
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:extra-fn extra-fn}
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child])
|
||||
|
||||
(defn view
|
||||
[{:keys [notification extra-fn]}]
|
||||
[{:keys [notification set-swipeable-height customization-color] :as props}]
|
||||
(let [{:keys [author chat-name community-id chat-id
|
||||
message read timestamp]} notification
|
||||
community-chat? (not (string/blank? community-id))
|
||||
community-name (rf/sub [:communities/name community-id])
|
||||
community-logo (rf/sub [:communities/logo community-id])
|
||||
customization-color (rf/sub [:profile/customization-color])]
|
||||
[swipeable {:extra-fn extra-fn}
|
||||
community (rf/sub [:communities/community community-id])
|
||||
community-name (:name community)
|
||||
community-image (get-in community [:images :thumbnail :uri])]
|
||||
[swipeable props
|
||||
[gesture/touchable-without-feedback
|
||||
{:on-press (fn []
|
||||
(rf/dispatch [:hide-popover])
|
||||
@@ -55,6 +56,7 @@
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/mention)
|
||||
:customization-color customization-color
|
||||
:on-layout set-swipeable-height
|
||||
:icon :i/mention
|
||||
:timestamp (datetime/timestamp->relative timestamp)
|
||||
:unread? (not read)
|
||||
@@ -66,7 +68,7 @@
|
||||
{:type :channel
|
||||
:blur? true
|
||||
:size 24
|
||||
:community-logo community-logo
|
||||
:community-logo community-image
|
||||
:community-name community-name
|
||||
:channel-name chat-name}]
|
||||
[quo/context-tag
|
||||
|
||||
@@ -51,26 +51,26 @@
|
||||
nil))
|
||||
|
||||
(defn- swipeable
|
||||
[{:keys [extra-fn]} child]
|
||||
[{:keys [active-swipeable extra-fn]} child]
|
||||
[common/swipeable
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:extra-fn extra-fn}
|
||||
{:left-button common/swipe-button-read-or-unread
|
||||
:left-on-press common/swipe-on-press-toggle-read
|
||||
:right-button common/swipe-button-delete
|
||||
:right-on-press common/swipe-on-press-delete
|
||||
:active-swipeable active-swipeable
|
||||
:extra-fn extra-fn}
|
||||
child])
|
||||
|
||||
(defn view
|
||||
[{:keys [notification extra-fn]}]
|
||||
[{:keys [notification set-swipeable-height customization-color] :as props}]
|
||||
(let [{:keys [author chat-name community-id chat-id
|
||||
message read timestamp
|
||||
album-messages]} notification
|
||||
community-chat? (not (string/blank? community-id))
|
||||
community-name (rf/sub [:communities/name community-id])
|
||||
community-logo (rf/sub [:communities/logo community-id])
|
||||
customization-color (rf/sub [:profile/customization-color])
|
||||
media-server-port (rf/sub [:mediaserver/port])]
|
||||
[swipeable {:extra-fn extra-fn}
|
||||
message read timestamp album-messages]} notification
|
||||
community-chat? (not (string/blank? community-id))
|
||||
community (rf/sub [:communities/community community-id])
|
||||
community-name (:name community)
|
||||
community-image (get-in community [:images :thumbnail :uri])
|
||||
media-server-port (rf/sub [:mediaserver/port])]
|
||||
[swipeable props
|
||||
[gesture/touchable-without-feedback
|
||||
{:on-press (fn []
|
||||
(rf/dispatch [:hide-popover])
|
||||
@@ -78,6 +78,7 @@
|
||||
[quo/activity-log
|
||||
{:title (i18n/label :t/message-reply)
|
||||
:customization-color customization-color
|
||||
:on-layout set-swipeable-height
|
||||
:icon :i/reply
|
||||
:timestamp (datetime/timestamp->relative timestamp)
|
||||
:unread? (not read)
|
||||
@@ -88,7 +89,7 @@
|
||||
{:type :channel
|
||||
:blur? true
|
||||
:size 24
|
||||
:community-logo community-logo
|
||||
:community-logo community-image
|
||||
:community-name community-name
|
||||
:channel-name chat-name}]
|
||||
[quo/context-tag
|
||||
@@ -112,7 +113,10 @@
|
||||
|
||||
(= (:content-type message)
|
||||
constants/content-type-gif)
|
||||
:gif)
|
||||
:gif
|
||||
|
||||
:else
|
||||
nil)
|
||||
:body (get-message-content message
|
||||
album-messages
|
||||
media-server-port)}}]]]))
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
(ns status-im.contexts.shell.activity-center.view
|
||||
(:require
|
||||
[oops.core :as oops]
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[react-native.navigation :as navigation]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.shell.activity-center.context :as ac.context]
|
||||
[status-im.contexts.shell.activity-center.header.view :as header]
|
||||
[status-im.contexts.shell.activity-center.notification-types :as types]
|
||||
[status-im.contexts.shell.activity-center.notification.admin.view :as admin]
|
||||
@@ -24,68 +23,61 @@
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(defn notification-component
|
||||
[{:keys [type] :as notification} index]
|
||||
(let [extra-fn (rn/use-callback
|
||||
(fn []
|
||||
{:notification notification})
|
||||
[notification])
|
||||
props {:notification notification
|
||||
:extra-fn extra-fn}]
|
||||
;; Notifications are expensive to render. Without `delay-render` the opening
|
||||
;; animation of the Activity Center can be clunky and the time to open the
|
||||
;; AC after pressing the bell icon can be high.
|
||||
[rn/view {:style (style/notification-container index)}
|
||||
(cond
|
||||
(= type types/contact-verification)
|
||||
[contact-verification/view props]
|
||||
|
||||
(= type types/contact-request)
|
||||
[contact-requests/view props]
|
||||
|
||||
(= type types/mention)
|
||||
[mentions/view props]
|
||||
|
||||
(= type types/reply)
|
||||
[reply/view props]
|
||||
|
||||
(= type types/admin)
|
||||
[admin/view props]
|
||||
|
||||
(some types/membership [type])
|
||||
(condp = type
|
||||
types/private-group-chat [membership/view props]
|
||||
types/community-request [community-request/view props]
|
||||
types/community-kicked [community-kicked/view props]
|
||||
nil))]))
|
||||
|
||||
(defn- fetch-next-page
|
||||
[]
|
||||
(rf/dispatch [:activity-center.notifications/fetch-next-page]))
|
||||
(let [height (atom 0)
|
||||
set-swipeable-height #(reset! height (oops/oget % "nativeEvent.layout.height"))]
|
||||
(fn [{:keys [type] :as notification} index _ {:keys [active-swipeable customization-color]}]
|
||||
(let [props {:height height
|
||||
:customization-color customization-color
|
||||
:active-swipeable active-swipeable
|
||||
:set-swipeable-height set-swipeable-height
|
||||
:notification notification
|
||||
:extra-fn (fn [] {:height @height :notification notification})}]
|
||||
[rn/view {:style (style/notification-container index)}
|
||||
(cond
|
||||
(= type types/contact-verification)
|
||||
[contact-verification/view props]
|
||||
|
||||
(= type types/contact-request)
|
||||
[contact-requests/view props]
|
||||
|
||||
(= type types/mention)
|
||||
[mentions/view props]
|
||||
|
||||
(= type types/reply)
|
||||
[reply/view props]
|
||||
|
||||
(= type types/admin)
|
||||
[admin/view props]
|
||||
|
||||
(some types/membership [type])
|
||||
(condp = type
|
||||
types/private-group-chat [membership/view props]
|
||||
types/community-request [community-request/view props]
|
||||
types/community-kicked [community-kicked/view props]
|
||||
nil)
|
||||
|
||||
:else
|
||||
nil)]))))
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [notifications (rf/sub [:activity-center/notifications])
|
||||
|
||||
;; We globally control the active swipeable for all notifications
|
||||
;; because when a swipe left/right gesture initiates, the previously
|
||||
;; active swiped notification (if any) must be removed & closed with
|
||||
;; animation.
|
||||
active-swipeable (rn/use-ref-atom nil)]
|
||||
(rn/use-mount
|
||||
(fn []
|
||||
(rf/dispatch [:activity-center.notifications/fetch-first-page])))
|
||||
|
||||
[ac.context/provider {:active-swipeable active-swipeable}
|
||||
[quo/overlay {:type :shell}
|
||||
[rn/view {:style {:flex 1 :padding-top (navigation/status-bar-height)}}
|
||||
[header/header]
|
||||
(rn/delay-render
|
||||
[rn/flat-list
|
||||
{:data notifications
|
||||
:initial-num-to-render constants/notifications-per-page
|
||||
:content-container-style {:flex-grow 1}
|
||||
:empty-component [empty-tab/empty-tab]
|
||||
:key-fn :id
|
||||
:on-scroll-to-index-failed identity
|
||||
:on-end-reached fetch-next-page
|
||||
:render-fn notification-component}])]]]))
|
||||
(let [active-swipeable (atom nil)]
|
||||
(rf/dispatch [:activity-center.notifications/fetch-first-page])
|
||||
(fn []
|
||||
(let [notifications (rf/sub [:activity-center/notifications])
|
||||
customization-color (rf/sub [:profile/customization-color])]
|
||||
[quo/overlay {:type :shell}
|
||||
[rn/view {:flex 1 :padding-top (navigation/status-bar-height)}
|
||||
[header/header]
|
||||
[rn/flat-list
|
||||
{:data notifications
|
||||
:render-data {:active-swipeable active-swipeable
|
||||
:customization-color customization-color}
|
||||
:content-container-style {:flex-grow 1}
|
||||
:empty-component [empty-tab/empty-tab]
|
||||
:key-fn :id
|
||||
:on-scroll-to-index-failed identity
|
||||
:on-end-reached #(rf/dispatch [:activity-center.notifications/fetch-next-page])
|
||||
:render-fn notification-component}]]
|
||||
]))))
|
||||
|
||||
@@ -117,14 +117,13 @@
|
||||
(defn- f-internal-view
|
||||
[]
|
||||
(let [{:keys [keyboard-shown]} (hooks/use-keyboard)]
|
||||
(rn/use-mount
|
||||
(fn []
|
||||
(when keyboard-shown
|
||||
(rn/dismiss-keyboard!))))
|
||||
[scan-qr-code/view
|
||||
{:title (i18n/label :t/scan-qr)
|
||||
:share-button? true
|
||||
:on-success-scan on-qr-code-scanned}]))
|
||||
[:<>
|
||||
(when keyboard-shown
|
||||
(rn/dismiss-keyboard!))
|
||||
[scan-qr-code/view
|
||||
{:title (i18n/label :t/scan-qr)
|
||||
:share-button? true
|
||||
:on-success-scan on-qr-code-scanned}]]))
|
||||
|
||||
(defn view
|
||||
[]
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
(ns status-im.contexts.shell.share.wallet.style
|
||||
(:require
|
||||
[quo.foundations.colors :as colors]))
|
||||
|
||||
(defn indicator-wrapper-style
|
||||
[active?]
|
||||
{:width 8
|
||||
:height 8
|
||||
:border-radius 4
|
||||
:background-color colors/white
|
||||
:opacity (if active? 1.0 0.5)})
|
||||
|
||||
(def indicator-list-style
|
||||
{:display :flex
|
||||
:flex-direction :row
|
||||
:align-items :center
|
||||
:justify-content :center
|
||||
:gap 8})
|
||||
@@ -6,6 +6,7 @@
|
||||
[react-native.platform :as platform]
|
||||
[reagent.core :as reagent]
|
||||
[status-im.contexts.shell.share.style :as style]
|
||||
[status-im.contexts.shell.share.wallet.style :as wallet-style]
|
||||
[status-im.contexts.wallet.common.utils :as utils]
|
||||
[status-im.contexts.wallet.common.utils.networks :as network-utils]
|
||||
[status-im.contexts.wallet.sheets.network-preferences.view :as network-preferences]
|
||||
@@ -84,6 +85,16 @@
|
||||
:on-legacy-press on-legacy-press
|
||||
:on-settings-press on-settings-press}]]]))))
|
||||
|
||||
(defn- indicator
|
||||
[active?]
|
||||
[rn/view {:style (wallet-style/indicator-wrapper-style active?)}])
|
||||
|
||||
(defn- indicator-list
|
||||
[num-indicators current-index]
|
||||
[rn/view {:style wallet-style/indicator-list-style}
|
||||
(for [i (range num-indicators)]
|
||||
^{:key i} [indicator (= current-index i)])])
|
||||
|
||||
(defn render-item
|
||||
[{:keys [address] :as account}]
|
||||
[wallet-qr-code-item
|
||||
@@ -125,7 +136,4 @@
|
||||
:render-fn render-item}]
|
||||
(when (> num-accounts 1)
|
||||
[rn/view {:style {:margin-top 20}}
|
||||
[quo/slider-bar
|
||||
{:total-amount num-accounts
|
||||
:active-index @current-index
|
||||
:blur? true}]])]))))
|
||||
[indicator-list num-accounts @current-index]])]))))
|
||||
|
||||
@@ -346,8 +346,7 @@
|
||||
#(reset! camera-permission-granted? %)
|
||||
#(reset! camera-permission-granted? false)))))
|
||||
[:<>
|
||||
[rn/view {:style style/absolute-fill}
|
||||
background]
|
||||
background
|
||||
(when camera-ready-to-scan?
|
||||
[render-camera
|
||||
{:torch-mode torch-mode
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
;; We delay the navigation because we need re-frame to update the DB on time.
|
||||
;; By doing it, we skip a blink while visiting the collectible detail page.
|
||||
[:dispatch-later
|
||||
{:ms 17
|
||||
{:ms 1
|
||||
:dispatch [:navigate-to :screen/wallet.collectible]}]]})))
|
||||
|
||||
(defn- keep-not-empty-value
|
||||
|
||||
@@ -79,20 +79,12 @@
|
||||
(rf/dispatch [:wallet/clear-collectible-details]))
|
||||
|
||||
(defn animated-header
|
||||
[{:keys [scroll-amount title-opacity page-nav-type theme]}]
|
||||
(let [blur-amount (header-animations/use-blur-amount scroll-amount)
|
||||
layer-opacity (header-animations/use-layer-opacity
|
||||
scroll-amount
|
||||
(colors/theme-colors colors/white-opa-0
|
||||
colors/neutral-95-opa-0
|
||||
theme)
|
||||
(colors/theme-colors colors/white-opa-50
|
||||
colors/neutral-95-opa-70-blur
|
||||
theme))
|
||||
{{preview-uri :uri} :preview-url
|
||||
{title :name} :collectible-data
|
||||
{description :name} :collection-data
|
||||
id :id} (rf/sub [:wallet/collectible-details])]
|
||||
[{:keys [scroll-amount title-opacity page-nav-type picture title description theme id]}]
|
||||
(let [blur-amount (header-animations/use-blur-amount scroll-amount)
|
||||
layer-opacity (header-animations/use-layer-opacity
|
||||
scroll-amount
|
||||
(colors/theme-colors colors/white-opa-0 colors/neutral-95-opa-0 theme)
|
||||
(colors/theme-colors colors/white-opa-50 colors/neutral-95-opa-70-blur theme))]
|
||||
[rn/view {:style (style/animated-header)}
|
||||
[reanimated/blur-view
|
||||
{:style {:flex 1
|
||||
@@ -105,7 +97,7 @@
|
||||
[reanimated/view {:style layer-opacity}
|
||||
[quo/page-nav
|
||||
{:type page-nav-type
|
||||
:picture preview-uri
|
||||
:picture picture
|
||||
:title title
|
||||
:description description
|
||||
:background :blur
|
||||
@@ -118,7 +110,7 @@
|
||||
{:content (fn []
|
||||
[options-drawer/view
|
||||
{:name title
|
||||
:image preview-uri
|
||||
:image picture
|
||||
:id id}])
|
||||
:theme theme}])}]
|
||||
:center-opacity title-opacity}]]]]))
|
||||
@@ -152,11 +144,10 @@
|
||||
[_]
|
||||
(let [selected-tab (reagent/atom :overview)
|
||||
on-tab-change #(reset! selected-tab %)]
|
||||
(fn [{:keys [set-title-bottom theme]}]
|
||||
(fn [{:keys [collectible set-title-bottom theme]}]
|
||||
(let [title-ref (rn/use-ref-atom nil)
|
||||
set-title-ref (rn/use-callback #(reset! title-ref %))
|
||||
animation-shared-element-id (rf/sub [:animation-shared-element-id])
|
||||
collectible (rf/sub [:wallet/collectible-details])
|
||||
collectible-owner (rf/sub [:wallet/collectible-details-owner collectible])
|
||||
aspect-ratio (rf/sub [:wallet/collectible-aspect-ratio])
|
||||
gradient-color (rf/sub [:wallet/collectible-gradient-color])
|
||||
@@ -205,14 +196,14 @@
|
||||
token-id
|
||||
{:images [collectible-image]
|
||||
:index 0
|
||||
:on-options-press #(rf/dispatch
|
||||
[:show-bottom-sheet
|
||||
{:content
|
||||
(fn []
|
||||
[options-drawer/view
|
||||
{:name collectible-name
|
||||
:image preview-uri
|
||||
:id id}])}])}])))
|
||||
:on-options-press #(rf/dispatch [:show-bottom-sheet
|
||||
{:content
|
||||
(fn []
|
||||
[options-drawer/view
|
||||
{:name collectible-name
|
||||
:image
|
||||
preview-uri
|
||||
:id id}])}])}])))
|
||||
:on-collectible-load (fn []
|
||||
;; We need to delay the measurement because the
|
||||
;; navigation has an animation
|
||||
@@ -250,24 +241,33 @@
|
||||
|
||||
(defn view
|
||||
[_]
|
||||
(let [{:keys [top]} (safe-area/get-insets)
|
||||
theme (quo.theme/use-theme)
|
||||
title-bottom-coord (rn/use-ref-atom 0)
|
||||
set-title-bottom (rn/use-callback
|
||||
(fn [_ y _ height]
|
||||
(reset! title-bottom-coord
|
||||
(get-title-bottom-y-position y height))))
|
||||
scroll-amount (reanimated/use-shared-value 0)
|
||||
title-opacity (reanimated/use-shared-value 0)]
|
||||
(let [{:keys [top]} (safe-area/get-insets)
|
||||
theme (quo.theme/use-theme)
|
||||
title-bottom-coord (rn/use-ref-atom 0)
|
||||
set-title-bottom (rn/use-callback
|
||||
(fn [_ y _ height]
|
||||
(reset! title-bottom-coord
|
||||
(get-title-bottom-y-position y height))))
|
||||
scroll-amount (reanimated/use-shared-value 0)
|
||||
title-opacity (reanimated/use-shared-value 0)
|
||||
{:keys [collection-data
|
||||
collectible-data
|
||||
preview-url]
|
||||
:as collectible} (rf/sub [:wallet/collectible-details])]
|
||||
[rn/view {:style (style/background-color theme)}
|
||||
[animated-header
|
||||
{:scroll-amount scroll-amount
|
||||
{:id (:id collectible)
|
||||
:scroll-amount scroll-amount
|
||||
:title-opacity title-opacity
|
||||
:page-nav-type :title-description
|
||||
:picture (:uri preview-url)
|
||||
:title (:name collectible-data)
|
||||
:description (:name collection-data)
|
||||
:theme theme}]
|
||||
[reanimated/scroll-view
|
||||
{:style (style/scroll-view top)
|
||||
:on-scroll #(on-scroll % scroll-amount title-opacity title-bottom-coord)}
|
||||
[collectible-details
|
||||
{:set-title-bottom set-title-bottom
|
||||
{:collectible collectible
|
||||
:set-title-bottom set-title-bottom
|
||||
:theme theme}]]]))
|
||||
|
||||
@@ -4,19 +4,12 @@
|
||||
[utils.re-frame :as rf]
|
||||
[utils.transforms :as transforms]))
|
||||
|
||||
(defonce ^:private request-id-atom (atom 0))
|
||||
|
||||
(defn- get-unique-request-id
|
||||
[]
|
||||
(swap! request-id-atom inc)
|
||||
@request-id-atom)
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/fetch-activities-for-current-account
|
||||
(fn [{:keys [db]}]
|
||||
(let [address (-> db :wallet :current-viewing-account-address)
|
||||
chain-ids (chain/chain-ids db)
|
||||
request-id (get-unique-request-id)
|
||||
request-id 0
|
||||
filters {:period {:startTimestamp 0
|
||||
:endTimestamp 0}
|
||||
:types []
|
||||
@@ -27,10 +20,9 @@
|
||||
:filterOutAssets false
|
||||
:filterOutCollectibles false}
|
||||
offset 0
|
||||
limit 50
|
||||
limit 35
|
||||
request-params [request-id [address] chain-ids filters offset limit]]
|
||||
{:db (assoc-in db [:wallet :ui :activity-tab :request request-id] address)
|
||||
:fx [[:json-rpc/call
|
||||
{:fx [[:json-rpc/call
|
||||
[{;; This method is deprecated and will be replaced by
|
||||
;; "wallet_startActivityFilterSession"
|
||||
;; https://github.com/status-im/status-mobile/issues/19864
|
||||
@@ -40,31 +32,13 @@
|
||||
{:event :wallet/fetch-activities-for-current-account
|
||||
:params request-params}]}]]]})))
|
||||
|
||||
(def ^:private activity-transaction-id (comp hash :transaction))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/activity-filtering-for-current-account-done
|
||||
(fn [{:keys [db]} [{:keys [message requestId]}]]
|
||||
(let [address (get-in db [:wallet :ui :activity-tab :request requestId])
|
||||
activities (->> message
|
||||
(transforms/json->clj)
|
||||
(:activities)
|
||||
(cske/transform-keys transforms/->kebab-case-keyword))
|
||||
activities-indexed (zipmap (map activity-transaction-id activities)
|
||||
activities)]
|
||||
{:db (assoc-in db [:wallet :activities address] activities-indexed)})))
|
||||
|
||||
(def ^:private nested-merge (partial merge-with merge))
|
||||
|
||||
(rf/reg-event-fx
|
||||
:wallet/activities-filtering-entries-updated
|
||||
(fn [{:keys [db]} [{:keys [message requestId]}]]
|
||||
(let [address (get-in db [:wallet :ui :activity-tab :request requestId])
|
||||
activities (->> message
|
||||
(transforms/json->clj)
|
||||
(cske/transform-keys transforms/->kebab-case-keyword))
|
||||
activities-indexed (zipmap (map activity-transaction-id activities)
|
||||
activities)]
|
||||
{:db (-> db
|
||||
(update-in [:wallet :ui :activity-tab :request] dissoc requestId)
|
||||
(update-in [:wallet :activities address] nested-merge activities-indexed))})))
|
||||
(fn [{:keys [db]} [{:keys [message]}]]
|
||||
(let [address (-> db :wallet :current-viewing-account-address)
|
||||
activities (->> message
|
||||
(transforms/json->clj)
|
||||
(:activities)
|
||||
(cske/transform-keys transforms/->kebab-case-keyword))
|
||||
sorted-activities (sort :timestamp activities)]
|
||||
{:db (assoc-in db [:wallet :activities address] sorted-activities)})))
|
||||
|
||||
@@ -11,81 +11,31 @@
|
||||
|
||||
(defn send-and-receive-activity
|
||||
[{:keys [transaction relative-date status sender recipient token amount network-name
|
||||
network-logo token-id nft-url nft-name]}]
|
||||
(if token-id
|
||||
[quo/wallet-activity
|
||||
{:transaction transaction
|
||||
:timestamp relative-date
|
||||
:status status
|
||||
:counter 1
|
||||
:first-tag {:size 24
|
||||
:type :collectible
|
||||
:collectible nft-url
|
||||
:collectible-name (if (> amount 1)
|
||||
(str amount " " nft-name)
|
||||
nft-name)
|
||||
:collectible-number token-id}
|
||||
:second-tag-prefix :t/from
|
||||
:second-tag {:type :address :address sender}
|
||||
:third-tag-prefix :t/to
|
||||
:third-tag {:type :address :address recipient}
|
||||
:fourth-tag-prefix :t/via
|
||||
:fourth-tag {:size 24
|
||||
:type :network
|
||||
:network-name network-name
|
||||
:network-logo network-logo}
|
||||
:blur? false}]
|
||||
[quo/wallet-activity
|
||||
{:transaction transaction
|
||||
:timestamp relative-date
|
||||
:status status
|
||||
:counter 1
|
||||
:first-tag {:size 24
|
||||
:type :token
|
||||
:token token
|
||||
:amount amount}
|
||||
:second-tag-prefix :t/from
|
||||
:second-tag {:type :address :address sender}
|
||||
:third-tag-prefix :t/to
|
||||
:third-tag {:type :address :address recipient}
|
||||
:fourth-tag-prefix :t/via
|
||||
:fourth-tag {:size 24
|
||||
:type :network
|
||||
:network-name network-name
|
||||
:network-logo network-logo}
|
||||
:blur? false}]))
|
||||
|
||||
;; WIP to add the mint activity.
|
||||
;(defn mint-activity
|
||||
; [{:keys [transaction relative-date status recipient network-name
|
||||
; network-logo nft-name nft-url token-id]}]
|
||||
; [quo/wallet-activity
|
||||
; {:transaction transaction
|
||||
; :timestamp relative-date
|
||||
; :status status
|
||||
; :counter 1
|
||||
; :first-tag {:size 24
|
||||
; :type :collectible
|
||||
; :collectible nft-url
|
||||
; :collectible-name nft-name
|
||||
; :collectible-number token-id}
|
||||
; :second-tag-prefix :t/at
|
||||
; :second-tag {:type :address :address recipient}
|
||||
; :third-tag-prefix :t/to
|
||||
; :third-tag {:type :address :address recipient}
|
||||
; :fourth-tag-prefix :t/via
|
||||
; :fourth-tag {:size 24
|
||||
; :type :network
|
||||
; :network-name network-name
|
||||
; :network-logo network-logo}
|
||||
; :blur? false}])
|
||||
network-logo]}]
|
||||
[quo/wallet-activity
|
||||
{:transaction transaction
|
||||
:timestamp relative-date
|
||||
:status status
|
||||
:counter 1
|
||||
:first-tag {:size 24
|
||||
:type :token
|
||||
:token token
|
||||
:amount amount}
|
||||
:second-tag-prefix :t/from
|
||||
:second-tag {:type :address :address sender}
|
||||
:third-tag-prefix :t/to
|
||||
:third-tag {:type :address :address recipient}
|
||||
:fourth-tag-prefix :t/via
|
||||
:fourth-tag {:size 24
|
||||
:type :network
|
||||
:network-name network-name
|
||||
:network-logo network-logo}
|
||||
:blur? false}])
|
||||
|
||||
(defn activity-item
|
||||
[{:keys [transaction] :as activity}]
|
||||
(case transaction
|
||||
(:send :receive) [send-and-receive-activity activity]
|
||||
;; WIP to add the mint activity.
|
||||
;; :mint [mint-activity activity]
|
||||
nil))
|
||||
|
||||
(defn view
|
||||
|
||||
@@ -307,14 +307,10 @@
|
||||
:color color
|
||||
:currency currency
|
||||
:currency-symbol currency-symbol}))
|
||||
calculated-tokens (map calculate-token tokens)]
|
||||
calculated-tokens (map calculate-token tokens)
|
||||
token-priority {"SNT" 1 "STT" 1 "ETH" 2 "DAI" 3}]
|
||||
(sort-by (fn [token]
|
||||
(let [fiat-value (get-in token [:values :fiat-unformatted-value])
|
||||
priority (get constants/token-sort-priority (:token token) ##Inf)]
|
||||
priority (get token-priority (:token token) 999)]
|
||||
[(- fiat-value) priority]))
|
||||
calculated-tokens)))
|
||||
|
||||
(defn sort-tokens
|
||||
[tokens]
|
||||
(let [priority #(get constants/token-sort-priority (:symbol %) ##Inf)]
|
||||
(sort-by (juxt (comp - :balance) priority) tokens)))
|
||||
|
||||
@@ -172,20 +172,17 @@
|
||||
|
||||
(defn get-network-details
|
||||
[chain-id]
|
||||
(as-> chain-id $
|
||||
(condp contains? $
|
||||
#{constants/ethereum-mainnet-chain-id constants/ethereum-goerli-chain-id
|
||||
constants/ethereum-sepolia-chain-id}
|
||||
mainnet-network-details
|
||||
(condp contains? chain-id
|
||||
#{constants/ethereum-mainnet-chain-id constants/ethereum-goerli-chain-id
|
||||
constants/ethereum-sepolia-chain-id}
|
||||
mainnet-network-details
|
||||
|
||||
#{constants/arbitrum-mainnet-chain-id constants/arbitrum-goerli-chain-id
|
||||
constants/arbitrum-sepolia-chain-id}
|
||||
arbitrum-network-details
|
||||
#{constants/arbitrum-mainnet-chain-id constants/arbitrum-goerli-chain-id
|
||||
constants/arbitrum-sepolia-chain-id}
|
||||
arbitrum-network-details
|
||||
|
||||
#{constants/optimism-mainnet-chain-id constants/optimism-goerli-chain-id
|
||||
constants/optimism-sepolia-chain-id}
|
||||
optimism-network-details
|
||||
#{constants/optimism-mainnet-chain-id constants/optimism-goerli-chain-id
|
||||
constants/optimism-sepolia-chain-id}
|
||||
optimism-network-details
|
||||
|
||||
nil)
|
||||
(when $
|
||||
(assoc $ :chain-id chain-id))))
|
||||
nil))
|
||||
|
||||
@@ -149,14 +149,5 @@
|
||||
expected-order ["DAI" "ETH" "SNT"]]
|
||||
(is (= expected-order sorted-tokens))))))))
|
||||
|
||||
(deftest sort-tokens-test
|
||||
(testing "sort-tokens function"
|
||||
(let [mock-tokens [{:symbol "ETH" :balance 5}
|
||||
{:symbol "DAI" :balance 10}
|
||||
{:symbol "SNT" :balance 1}]
|
||||
sorted-tokens (map :symbol (utils/sort-tokens mock-tokens))
|
||||
expected-order ["DAI" "ETH" "SNT"]]
|
||||
(is (= expected-order sorted-tokens)))))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
[:wallet-connect/disconnect-dapp
|
||||
{:topic topic
|
||||
:on-success (fn []
|
||||
(rf/dispatch [:wallet-connect/remove-pairing-by-topic topic])
|
||||
(rf/dispatch [:toasts/upsert
|
||||
{:id :dapp-disconnect-success
|
||||
:type :positive
|
||||
@@ -82,8 +83,7 @@
|
||||
[]
|
||||
(let [{:keys [bottom]} (safe-area/get-insets)
|
||||
{:keys [color] :as wallet-account} (rf/sub [:wallet/current-viewing-account])
|
||||
sessions (rf/sub
|
||||
[:wallet-connect/sessions-for-current-account])
|
||||
pairings (rf/sub [:wallet-connect/pairings])
|
||||
theme (quo.theme/use-theme)]
|
||||
[rn/view {:flex 1}
|
||||
[header
|
||||
@@ -91,7 +91,7 @@
|
||||
:wallet-account wallet-account
|
||||
:on-close #(rf/dispatch [:navigate-back])
|
||||
:on-add #(rf/dispatch [:navigate-to :screen/wallet.scan-dapp])}]
|
||||
(if (empty? sessions)
|
||||
(if (empty? pairings)
|
||||
[quo/empty-state
|
||||
{:title (i18n/label :t/no-dapps)
|
||||
:description (i18n/label :t/no-dapps-description)
|
||||
@@ -99,16 +99,16 @@
|
||||
:container-style style/empty-container-style}]
|
||||
[rn/view (style/dapps-container bottom)
|
||||
[rn/flat-list
|
||||
{:data sessions
|
||||
{:data pairings
|
||||
:always-bounce-vertical false
|
||||
:content-container-style (style/dapps-list theme)
|
||||
:render-fn (fn [{:keys [topic pairingTopic name url iconUrl]}]
|
||||
:render-fn (fn [{:keys [topic]
|
||||
{:keys [icons name url]} :peerMetadata}]
|
||||
[quo/dapp
|
||||
{:dapp {:avatar iconUrl
|
||||
:name name
|
||||
:value url
|
||||
:topic topic
|
||||
:pairing-topic pairingTopic}
|
||||
{:dapp {:avatar (get icons 0)
|
||||
:name name
|
||||
:value url
|
||||
:topic topic}
|
||||
:accessibility-label (str "dapp-" topic)
|
||||
:state :default
|
||||
:action :icon
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user