Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
73d5cb24f8 | ||
|
|
614eeafde9 | ||
|
|
1dc4ea3a51 | ||
|
|
dbef1c9edc | ||
|
|
4853cde20b | ||
|
|
4c5f3282c4 | ||
|
|
376493b0b3 | ||
|
|
886f7b43d1 | ||
|
|
c8c785f136 | ||
|
|
b2602ba15e | ||
|
|
4b0a983d68 | ||
|
|
af5c613cc0 | ||
|
|
550602db12 | ||
|
|
5932f7dc99 | ||
|
|
b89dce3c2a | ||
|
|
8aba451be8 |
@@ -36,3 +36,5 @@ SHOW_NOT_IMPLEMENTED_FEATURES=0
|
||||
ENABLE_ALERT_BANNER=0
|
||||
FLAG_WALLET_CONNECT_ENABLED=1
|
||||
API_LOGGING_ENABLED=1
|
||||
SENTRY_ENABLED=0
|
||||
SENTRY_ENVIRONMENT=ci-main
|
||||
|
||||
@@ -40,3 +40,5 @@ ENABLE_ALERT_BANNER=0
|
||||
FLAG_WALLET_CONNECT_ENABLED=1
|
||||
MOBILE_DATA_SYNCING_TOGGLE_ENABLE=0
|
||||
API_LOGGING_ENABLED=1
|
||||
SENTRY_ENABLED=0
|
||||
SENTRY_ENVIRONMENT=ci-main
|
||||
|
||||
@@ -37,3 +37,5 @@ TEST_NETWORKS_ENABLED=1
|
||||
ENABLE_ALERT_BANNER=1
|
||||
FLAG_WALLET_CONNECT_ENABLED=1
|
||||
API_LOGGING_ENABLED=1
|
||||
SENTRY_ENABLED=0
|
||||
SENTRY_ENVIRONMENT=ci-main
|
||||
|
||||
@@ -24,3 +24,5 @@ TEST_NETWORKS_ENABLED=0
|
||||
ENABLE_ALERT_BANNER=1
|
||||
FLAG_WALLET_CONNECT_ENABLED=1
|
||||
API_LOGGING_ENABLED=1
|
||||
SENTRY_ENABLED=1
|
||||
SENTRY_ENVIRONMENT=ci-nightly
|
||||
|
||||
@@ -2,7 +2,7 @@ DEBUG_WEBVIEW=0
|
||||
ETHEREUM_DEV_CLUSTER=0
|
||||
EXTENSIONS=0
|
||||
GROUP_CHATS_ENABLED=1
|
||||
LOG_LEVEL=
|
||||
LOG_LEVEL=debug
|
||||
MAILSERVER_CONFIRMATIONS_ENABLED=1
|
||||
MAINNET_WARNING_ENABLED=1
|
||||
PFS_ENCRYPTION_ENABLED=1
|
||||
@@ -20,4 +20,6 @@ FAST_CREATE_COMMUNITY_ENABLED=0
|
||||
TEST_NETWORKS_ENABLED=0
|
||||
STATUS_PROXY_STAGE_NAME=prod
|
||||
FLAG_WALLET_CONNECT_ENABLED=1
|
||||
API_LOGGING_ENABLED=0
|
||||
API_LOGGING_ENABLED=1
|
||||
SENTRY_ENABLED=1
|
||||
SENTRY_ENVIRONMENT=production
|
||||
|
||||
@@ -41,6 +41,7 @@ pipeline {
|
||||
BUILD_ENV = 'prod'
|
||||
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
|
||||
FASTLANE_DISABLE_COLORS = 1
|
||||
SENTRY_PRODUCTION = "${utils.isReleaseBuild() ? 'true' : 'false'}"
|
||||
}
|
||||
|
||||
stages {
|
||||
|
||||
@@ -134,4 +134,3 @@ def updateBucketJSON(urls, fileName) {
|
||||
writeFile(file: filePath, text: contentJson)
|
||||
return s5cmd.upload(filePath)
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ pipeline {
|
||||
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
|
||||
FASTLANE_DISABLE_COLORS = 1
|
||||
BUNDLE_PATH = "${HOME}/.bundle"
|
||||
SENTRY_PRODUCTION = "${utils.isReleaseBuild() ? 'true' : 'false'}"
|
||||
}
|
||||
|
||||
stages {
|
||||
|
||||
@@ -108,6 +108,15 @@ class StatusModule(private val reactContext: ReactApplicationContext, private va
|
||||
)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun intendedPanic(message: String) {
|
||||
StatusBackendClient.executeStatusGoRequest(
|
||||
endpoint = "IntendedPanic",
|
||||
requestBody = message,
|
||||
statusgoFunction = { Statusgo.intendedPanic(message) },
|
||||
)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun addCentralizedMetric(request: String, callback: Callback) {
|
||||
StatusBackendClient.executeStatusGoRequestWithCallback(
|
||||
|
||||
@@ -109,6 +109,17 @@ RCT_EXPORT_METHOD(getNodeConfig:(RCTResponseSenderBlock)callback) {
|
||||
callback:callback];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(intendedPanic:(NSString *)message) {
|
||||
#if DEBUG
|
||||
NSLog(@"IntendedPanic() method called");
|
||||
#endif
|
||||
[StatusBackendClient executeStatusGoRequest:@"IntendedPanic"
|
||||
body:message
|
||||
statusgoFunction:^NSString *{
|
||||
return StatusgoIntendedPanic(message);
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(fleets) {
|
||||
return [StatusBackendClient executeStatusGoRequestWithResult:@"Fleets"
|
||||
body:@""
|
||||
|
||||
@@ -71,7 +71,7 @@ in stdenv.mkDerivation rec {
|
||||
};
|
||||
};
|
||||
|
||||
buildInputs = with pkgs; [ nodejs openjdk ];
|
||||
buildInputs = with pkgs; [ nodejs openjdk_headless ];
|
||||
nativeBuildInputs = with pkgs; [ bash gradle unzip ]
|
||||
++ lib.optionals stdenv.isDarwin [ file gnumake ];
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ rec {
|
||||
|
||||
shell = mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
openjdk
|
||||
openjdk_headless
|
||||
gradle
|
||||
lsof # used in start-react-native.sh
|
||||
flock # used in nix/scripts/node_modules.sh
|
||||
|
||||
@@ -38,7 +38,7 @@ stdenv.mkDerivation {
|
||||
];
|
||||
};
|
||||
};
|
||||
buildInputs = with pkgs; [ clojure nodejs bash git openjdk];
|
||||
buildInputs = with pkgs; [ clojure nodejs bash git openjdk_headless ];
|
||||
phases = [
|
||||
"unpackPhase" "secretsPhase" "patchPhase"
|
||||
"configurePhase" "buildPhase" "installPhase"
|
||||
|
||||
@@ -49,7 +49,7 @@ in {
|
||||
nodejs = super.nodejs_20;
|
||||
ruby = super.ruby_3_1;
|
||||
yarn = super.yarn.override { nodejs = super.nodejs_20; };
|
||||
openjdk = super.openjdk17_headless;
|
||||
openjdk_headless = super.openjdk17_headless;
|
||||
xcodeWrapper = callPackage ./pkgs/xcodeenv/compose-xcodewrapper.nix { } {
|
||||
versions = ["16.0" "16.1" "16.2"];
|
||||
};
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{ mkShell, openjdk, androidPkgs }:
|
||||
{ mkShell, openjdk_headless, androidPkgs }:
|
||||
|
||||
mkShell {
|
||||
name = "android-sdk-shell";
|
||||
buildInputs = [ openjdk ];
|
||||
buildInputs = [ openjdk_headless ];
|
||||
|
||||
shellHook = ''
|
||||
export ANDROID_HOME="${androidPkgs.sdk}"
|
||||
|
||||
@@ -19,7 +19,7 @@ let
|
||||
# for calling clojure targets in CI or Makefile
|
||||
clojure = mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
clojure flock maven openjdk
|
||||
clojure flock maven openjdk_headless
|
||||
# lint specific utilities
|
||||
babashka clj-kondo clojure-lsp ripgrep zprint
|
||||
];
|
||||
@@ -61,7 +61,7 @@ let
|
||||
|
||||
# for 'scripts/generate-keystore.sh'
|
||||
keytool = mkShell {
|
||||
buildInputs = with pkgs; [ openjdk apksigner ];
|
||||
buildInputs = with pkgs; [ openjdk_headless apksigner ];
|
||||
};
|
||||
|
||||
# for targets needing 'adb', 'apkanalyzer' and other SDK/NDK tools
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ callPackage, lib, buildGoPackage, pkgs
|
||||
, androidPkgs, openjdk, gomobile, xcodeWrapper, removeReferencesTo
|
||||
, androidPkgs, openjdk_headless, gomobile, xcodeWrapper, removeReferencesTo
|
||||
, go-bindata, mockgen, protobuf3_20, protoc-gen-go
|
||||
, meta
|
||||
, source
|
||||
@@ -32,7 +32,7 @@ in buildGoPackage rec {
|
||||
extraSrcPaths = [ gomobile ];
|
||||
nativeBuildInputs = [
|
||||
gomobile removeReferencesTo go-bindata mockgen protoc-gen-go protobuf3_20 fakeGit
|
||||
] ++ optional isAndroid openjdk
|
||||
] ++ optional isAndroid openjdk_headless
|
||||
++ optional isIOS xcodeWrapper;
|
||||
|
||||
ldflags = goBuildLdFlags;
|
||||
@@ -48,6 +48,10 @@ in buildGoPackage rec {
|
||||
# TODO: try removing when go is upgraded to 1.22
|
||||
GODEBUG = "netdns=cgo+2";
|
||||
|
||||
# Sentry for status-go
|
||||
SENTRY_CONTEXT_NAME = "status-mobile";
|
||||
SENTRY_CONTEXT_VERSION = version;
|
||||
|
||||
preBuild = ''
|
||||
echo 'Generate static files'
|
||||
pushd go/src/$goPackagePath
|
||||
|
||||
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 300 KiB |
|
After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 157 KiB |
|
After Width: | Height: | Size: 282 KiB |
|
After Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
After Width: | Height: | Size: 312 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 276 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 242 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 179 KiB |
|
After Width: | Height: | Size: 327 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 229 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 151 KiB |
|
After Width: | Height: | Size: 269 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 237 KiB |
|
After Width: | Height: | Size: 428 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 235 KiB |
|
Before Width: | Height: | Size: 345 KiB After Width: | Height: | Size: 441 KiB |
@@ -47,6 +47,7 @@ SECRETS_ENV_VARS=(
|
||||
'MIXPANEL_APP_ID'
|
||||
'MIXPANEL_APP_TOKEN'
|
||||
'POKT_TOKEN'
|
||||
'SENTRY_DSN_STATUS_GO'
|
||||
)
|
||||
|
||||
# Secrets like this can't be passed via args or they end up in derivation.
|
||||
|
||||
@@ -77,6 +77,11 @@
|
||||
#shadow/env "STATUS_BACKEND_SERVER_IMAGE_SERVER_URI_PREFIX"
|
||||
status-im.config/STATUS_BACKEND_SERVER_ROOT_DATA_DIR #shadow/env
|
||||
"STATUS_BACKEND_SERVER_ROOT_DATA_DIR"
|
||||
|
||||
;; Uncomment this line during development if you want to test the integration with Sentry.
|
||||
;;
|
||||
;; status-im.config/SENTRY_DSN_STATUS_GO #shadow/env "SENTRY_DSN_STATUS_GO"
|
||||
|
||||
status-im.config/MIXPANEL_APP_ID #shadow/env "MIXPANEL_APP_ID"
|
||||
status-im.config/MIXPANEL_APP_TOKEN #shadow/env "MIXPANEL_APP_TOKEN"
|
||||
status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY"
|
||||
@@ -119,6 +124,7 @@
|
||||
status-im.config/INFURA_TOKEN #shadow/env "INFURA_TOKEN"
|
||||
status-im.config/STATUS_BUILD_PROXY_USER #shadow/env "STATUS_BUILD_PROXY_USER"
|
||||
status-im.config/STATUS_BUILD_PROXY_PASSWORD #shadow/env "STATUS_BUILD_PROXY_PASSWORD"
|
||||
status-im.config/SENTRY_DSN_STATUS_GO #shadow/env "SENTRY_DSN_STATUS_GO"
|
||||
status-im.config/OPENSEA_API_KEY #shadow/env "OPENSEA_API_KEY"
|
||||
status-im.config/MIXPANEL_APP_ID #shadow/env "MIXPANEL_APP_ID"
|
||||
status-im.config/MIXPANEL_APP_TOKEN #shadow/env "MIXPANEL_APP_TOKEN"
|
||||
|
||||
@@ -2,19 +2,41 @@
|
||||
(:require
|
||||
[legacy.status-im.multiaccounts.update.core :as multiaccounts.update]
|
||||
[re-frame.core :as re-frame]
|
||||
[taoensso.timbre :as log]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(rf/defn save-log-level
|
||||
{:events [:log-level.ui/change-log-level-confirmed]}
|
||||
[{:keys [db] :as cofx} log-level]
|
||||
[{:keys [db]} log-level]
|
||||
(let [old-log-level (get-in db [:profile/profile :log-level])]
|
||||
(when (not= old-log-level log-level)
|
||||
(multiaccounts.update/multiaccount-update
|
||||
cofx
|
||||
:log-level
|
||||
log-level
|
||||
{:on-success #(re-frame/dispatch [:profile/logout])}))))
|
||||
(let [need-set-log-enabled? (or (empty? old-log-level) (empty? log-level))
|
||||
log-enabled? (boolean (seq log-level))
|
||||
rpc-calls (cond-> []
|
||||
log-enabled?
|
||||
(conj {:method "wakuext_setLogLevel"
|
||||
:params [{:logLevel log-level}]
|
||||
:on-error #(log/error "Failed to set log level" %)})
|
||||
|
||||
need-set-log-enabled?
|
||||
(conj {:method "wakuext_setLogEnabled"
|
||||
:params [log-enabled?]
|
||||
:on-error #(log/error "Failed to set log enabled" %)}))]
|
||||
{:fx [[:json-rpc/call
|
||||
(conj (vec (map #(assoc % :on-success nil) (butlast rpc-calls)))
|
||||
(assoc (last rpc-calls)
|
||||
:on-success
|
||||
#(rf/dispatch [:log-level/update-multiaccount log-level])))]]}))))
|
||||
|
||||
(rf/defn update-multiaccount
|
||||
{:events [:log-level/update-multiaccount]}
|
||||
[cofx log-level]
|
||||
(multiaccounts.update/multiaccount-update
|
||||
cofx
|
||||
:log-level
|
||||
log-level
|
||||
{:on-success #(rf/dispatch [:profile/logout])}))
|
||||
|
||||
(rf/defn show-change-log-level-confirmation
|
||||
{:events [:log-level.ui/log-level-selected]}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
(ns legacy.status-im.ui.screens.advanced-settings.views
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[legacy.status-im.ui.components.core :as components]
|
||||
[legacy.status-im.ui.components.list.item :as list.item]
|
||||
[legacy.status-im.ui.components.list.views :as list]
|
||||
[quo.core :as quo]
|
||||
[re-frame.core :as re-frame]
|
||||
[status-im.config :as config]
|
||||
[status-im.feature-flags :as ff]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf])
|
||||
(:require-macros [legacy.status-im.utils.views :as views]))
|
||||
@@ -17,7 +20,16 @@
|
||||
peer-syncing-enabled?]}]
|
||||
(keep
|
||||
identity
|
||||
[{:size :small
|
||||
[(when (ff/enabled? ::ff/app-monitoring.intentional-crash)
|
||||
{:size :small
|
||||
:title (str "Force crash immediately"
|
||||
(when (string/blank? config/sentry-dsn-status-go)
|
||||
" (Sentry DSN is not set)"))
|
||||
:accessibility-label :intended-panic
|
||||
:on-press (fn []
|
||||
(re-frame/dispatch [:app-monitoring/intended-panic
|
||||
"status-mobile intentional panic"]))})
|
||||
{:size :small
|
||||
:title (i18n/label :t/log-level)
|
||||
:accessibility-label :log-level-settings-button
|
||||
:on-press
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
name]]]]))
|
||||
|
||||
(def log-levels
|
||||
"The status-go log library (zap) doesn't support the trace level, so we remove
|
||||
the trace option from the UI. When trace is enabled an error will happen while
|
||||
trying to login (user will see the error 'wrong password')."
|
||||
[{:name "DISABLED"
|
||||
:value ""}
|
||||
{:name "ERROR"
|
||||
@@ -42,9 +45,7 @@
|
||||
{:name "INFO"
|
||||
:value "INFO"}
|
||||
{:name "DEBUG"
|
||||
:value "DEBUG"}
|
||||
{:name "TRACE"
|
||||
:value "TRACE"}])
|
||||
:value "DEBUG"}])
|
||||
|
||||
(views/defview log-level-settings
|
||||
[]
|
||||
|
||||
@@ -569,3 +569,7 @@
|
||||
(.createAccountFromPrivateKey ^js (account-manager)
|
||||
(types/clj->json {:privateKey private-key})
|
||||
callback)))
|
||||
|
||||
(defn intended-panic
|
||||
[message]
|
||||
(.intendedPanic ^js (status) message))
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
(ns quo.components.buttons.slide-button.constants)
|
||||
|
||||
(def track-padding 4)
|
||||
|
||||
(def small-dimensions
|
||||
(def ^:constant small-dimensions
|
||||
{:track-height 40
|
||||
:thumb 32})
|
||||
|
||||
(def large-dimensions
|
||||
(def ^:constant large-dimensions
|
||||
{:track-height 48
|
||||
:thumb 40})
|
||||
|
||||
(def disable-opacity 0.3)
|
||||
(def ^:constant track-padding 4)
|
||||
(def ^:constant disable-opacity 0.3)
|
||||
(def ^:constant default-width 300)
|
||||
|
||||
(def default-width 300)
|
||||
(def ^:constant reset-timeout-ms 500)
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
(when (and reached-end? (not sliding-complete?))
|
||||
(set-sliding-complete true)
|
||||
(when on-complete
|
||||
(on-complete reset-fn))))))
|
||||
(js/setTimeout reset-fn constants/reset-timeout-ms)
|
||||
(on-complete))))))
|
||||
(gesture/on-end (fn [event]
|
||||
(let [x-translation (oops/oget event "translationX")
|
||||
reached-end? (>= x-translation track-width)]
|
||||
@@ -55,10 +56,9 @@
|
||||
on-track-layout (rn/use-callback
|
||||
#(set-track-width (oops/oget % "nativeEvent.layout.width")))
|
||||
reset-fn (rn/use-callback
|
||||
(fn [keep-at-end-after-slide?]
|
||||
(fn []
|
||||
(set-sliding-complete false)
|
||||
(when-not keep-at-end-after-slide?
|
||||
(animations/reset-track-position x-pos))))
|
||||
(animations/reset-track-position x-pos)))
|
||||
dimensions (rn/use-callback
|
||||
(partial utils/get-dimensions
|
||||
(or track-width constants/default-width)
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
(ns quo.components.common.new-feature-dot
|
||||
(:require [quo.components.common.new-feature-gradient :as new-feature-gradient]))
|
||||
|
||||
(def ^:const size 8)
|
||||
|
||||
(defn view
|
||||
[{:keys [style accessibility-label]}]
|
||||
[new-feature-gradient/view
|
||||
{:style (merge {:width size
|
||||
:height size
|
||||
:border-radius (/ size 2)}
|
||||
style)
|
||||
:accessibility-label accessibility-label}])
|
||||
@@ -0,0 +1,16 @@
|
||||
(ns quo.components.common.new-feature-gradient
|
||||
(:require [quo.foundations.colors :as colors]
|
||||
[quo.theme]
|
||||
[react-native.linear-gradient :as linear-gradient]))
|
||||
|
||||
(defn view
|
||||
[{:keys [style accessibility-label]}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[linear-gradient/linear-gradient
|
||||
{:style style
|
||||
:accessibility-label accessibility-label
|
||||
:colors [(colors/resolve-color :yellow theme)
|
||||
colors/new-feature-gradient-pink]
|
||||
:use-angle true
|
||||
:angle 78
|
||||
:angle-center {:x 0.5 :y 0.5}}]))
|
||||
@@ -33,4 +33,12 @@
|
||||
networks-list])
|
||||
(h/is-truthy (h/query-by-label-text :network-dropdown))
|
||||
(h/fire-event :press (h/query-by-label-text :network-dropdown))
|
||||
(h/was-not-called on-press))))
|
||||
(h/was-not-called on-press)))
|
||||
|
||||
(h/test "Should display new chain indicator"
|
||||
(h/render [network-dropdown/view
|
||||
{:state :default
|
||||
:show-new-chain-indicator? true}
|
||||
networks-list])
|
||||
(h/is-truthy (h/query-by-label-text :network-dropdown))
|
||||
(h/is-truthy (h/query-by-label-text :new-chain-indicator))))
|
||||
|
||||
@@ -23,3 +23,7 @@
|
||||
:opacity (if (= state :disabled) 0.3 1)
|
||||
:border-color (container-border-color props)
|
||||
:align-items :center})
|
||||
|
||||
(def new-chain-indicator
|
||||
{:position :absolute
|
||||
:right 0})
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
(ns quo.components.dropdowns.network-dropdown.view
|
||||
(:require
|
||||
[quo.components.common.new-feature-dot :as new-feature-dot]
|
||||
[quo.components.dropdowns.network-dropdown.style :as style]
|
||||
[quo.components.list-items.preview-list.view :as preview-list]
|
||||
[quo.theme :as quo.theme]
|
||||
[react-native.core :as rn]))
|
||||
|
||||
(defn view
|
||||
[{:keys [on-press state] :as props} networks]
|
||||
[{:keys [on-press state show-new-chain-indicator?] :as props} networks]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
[pressed? set-pressed] (rn/use-state false)
|
||||
on-press-in (rn/use-callback #(set-pressed true))
|
||||
@@ -18,6 +19,10 @@
|
||||
:on-press on-press
|
||||
:on-press-in on-press-in
|
||||
:on-press-out on-press-out}
|
||||
(when show-new-chain-indicator?
|
||||
[new-feature-dot/view
|
||||
{:style style/new-chain-indicator
|
||||
:accessibility-label :new-chain-indicator}])
|
||||
[preview-list/view
|
||||
{:type :network
|
||||
:list-size (count networks)
|
||||
|
||||
@@ -200,12 +200,15 @@
|
||||
shown-name]]))
|
||||
|
||||
(defn- wallet-networks-center
|
||||
[{:keys [networks networks-on-press background center-content-container-style]}]
|
||||
[{:keys [networks networks-on-press show-new-chain-indicator? background
|
||||
center-content-container-style]}]
|
||||
[reanimated/view {:style center-content-container-style}
|
||||
[network-dropdown/view
|
||||
{:state :default
|
||||
:on-press networks-on-press
|
||||
:blur? (= background :blur)} networks]])
|
||||
{:state :default
|
||||
:on-press networks-on-press
|
||||
:blur? (= background :blur)
|
||||
:show-new-chain-indicator? show-new-chain-indicator?}
|
||||
networks]])
|
||||
|
||||
(defn page-nav
|
||||
"Props:
|
||||
|
||||
@@ -64,3 +64,20 @@
|
||||
{:margin-top 7
|
||||
:margin-bottom 2
|
||||
:margin-left -1})
|
||||
|
||||
(def new-feature-tag-container
|
||||
{:margin-left 6
|
||||
:border-radius 12
|
||||
:justify-content :center})
|
||||
|
||||
(def new-feature-tag-gradient
|
||||
{:border-radius 12
|
||||
:position :absolute
|
||||
:left 0
|
||||
:right 0
|
||||
:top 0
|
||||
:bottom 0})
|
||||
|
||||
(def new-feature-tag-text
|
||||
{:color colors/white
|
||||
:margin-horizontal 5})
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
[quo.components.avatars.icon-avatar :as icon-avatar]
|
||||
[quo.components.avatars.user-avatar.view :as user-avatar]
|
||||
[quo.components.buttons.button.view :as button]
|
||||
[quo.components.common.new-feature-gradient :as new-feature-gradient]
|
||||
[quo.components.icon :as icon]
|
||||
[quo.components.list-items.preview-list.view :as preview-list]
|
||||
[quo.components.markdown.text :as text]
|
||||
@@ -115,7 +116,9 @@
|
||||
nil)])
|
||||
|
||||
(defn view
|
||||
[{:keys [title on-press action-props accessibility-label blur? container-style content] :as props}]
|
||||
[{:keys [title show-new-feature-tag? on-press action-props accessibility-label blur? container-style
|
||||
content]
|
||||
:as props}]
|
||||
[rn/pressable
|
||||
{:style (merge style/container container-style)
|
||||
:on-press (or on-press (:on-change action-props))
|
||||
@@ -126,10 +129,19 @@
|
||||
[rn/view {:style (style/left-sub-container props)}
|
||||
[image-component props]
|
||||
[rn/view {:style (style/left-container (:image props))}
|
||||
[text/text
|
||||
{:weight :medium
|
||||
:style {:color (when blur? colors/white)}}
|
||||
title]
|
||||
[rn/view {:flex-direction :row}
|
||||
[text/text
|
||||
{:weight :medium
|
||||
:style {:color (when blur? colors/white)}}
|
||||
title]
|
||||
(when show-new-feature-tag?
|
||||
[rn/view {:style style/new-feature-tag-container}
|
||||
[new-feature-gradient/view {:style style/new-feature-tag-gradient}]
|
||||
[text/text
|
||||
{:weight :semi-bold
|
||||
:size :label
|
||||
:style style/new-feature-tag-text}
|
||||
(string/upper-case (i18n/label :t/new))]])]
|
||||
[description-component props]
|
||||
[tag-component props]]]
|
||||
[rn/view {:style (style/sub-container (:alignment action-props))}
|
||||
|
||||
@@ -14,48 +14,43 @@
|
||||
(h/describe "Wallet: Summary Info"
|
||||
(h/test "Type of `status-account` title renders"
|
||||
(h/render-with-theme-provider [summary-info/view
|
||||
{:type :status-account
|
||||
:networks? true
|
||||
:values {:ethereum 150
|
||||
:optimism 50
|
||||
:arbitrum 25}
|
||||
:account-props status-account-props}])
|
||||
{:type :status-account
|
||||
:networks-to-show {:ethereum 150
|
||||
:optimism 50
|
||||
:arbitrum 25}
|
||||
:account-props status-account-props}])
|
||||
(h/is-truthy (h/get-by-text "Collectibles vault")))
|
||||
|
||||
(h/test "Type of `user` title renders"
|
||||
(h/render-with-theme-provider [summary-info/view
|
||||
{:type :user
|
||||
:networks? true
|
||||
:values {:ethereum 150
|
||||
:optimism 50
|
||||
:arbitrum 25}
|
||||
:account-props {:full-name "M L"
|
||||
:status-indicator? false
|
||||
:size :small
|
||||
:customization-color :blue
|
||||
:name "Mark Libot"
|
||||
:address "0x0ah...78b"
|
||||
:status-account (merge status-account-props
|
||||
{:size 16})}}])
|
||||
{:type :user
|
||||
:networks-to-show {:ethereum 150
|
||||
:optimism 50
|
||||
:arbitrum 25}
|
||||
:account-props {:full-name "M L"
|
||||
:status-indicator? false
|
||||
:size :small
|
||||
:customization-color :blue
|
||||
:name "Mark Libot"
|
||||
:address "0x0ah...78b"
|
||||
:status-account (merge status-account-props
|
||||
{:size 16})}}])
|
||||
(h/is-truthy (h/get-by-text "Mark Libot"))
|
||||
(h/is-truthy (h/get-by-text "Collectibles vault")))
|
||||
|
||||
(h/test "Networks true render"
|
||||
(h/test "Networks specified render"
|
||||
(h/render-with-theme-provider [summary-info/view
|
||||
{:type :status-account
|
||||
:networks? true
|
||||
:values {:ethereum 150
|
||||
:optimism 50
|
||||
:arbitrum 25}
|
||||
:account-props status-account-props}])
|
||||
(h/is-truthy (h/get-by-label-text :networks)))
|
||||
{:type :status-account
|
||||
:networks-to-show {:ethereum 150
|
||||
:optimism 50
|
||||
:arbitrum 25}
|
||||
:account-props status-account-props}])
|
||||
(h/is-truthy (h/get-by-label-text :networks))))
|
||||
|
||||
(h/test "Networks false render"
|
||||
(h/describe "Wallet: network summary info"
|
||||
(h/test "Type of `network` title renders"
|
||||
(h/render-with-theme-provider [summary-info/view
|
||||
{:type :status-account
|
||||
:networks? false
|
||||
:values {:ethereum 150
|
||||
:optimism 50
|
||||
:arbitrum 25}
|
||||
:account-props status-account-props}])
|
||||
(h/is-null (h/query-by-label-text :networks))))
|
||||
{:type :network
|
||||
:network-props {:full-name "Ethereum"
|
||||
:network-name :ethereum}}])
|
||||
(h/is-truthy (h/get-by-text "Ethereum"))))
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
[:catn
|
||||
[:props
|
||||
[:map
|
||||
[:type [:enum :status-account :saved-account :account :user :token]]
|
||||
[:type [:enum :status-account :saved-account :account :user :token :network]]
|
||||
[:account-props {:optional true} [:maybe :map]]
|
||||
[:network-props {:optional true} [:maybe :map]]
|
||||
[:token-props {:optional true} [:maybe :map]]
|
||||
[:networks? {:optional true} [:maybe :boolean]]
|
||||
[:values {:optional true} [:maybe :map]]]]]
|
||||
[:networks-to-show {:optional true} [:maybe :map]]]]]
|
||||
:any])
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
[quo.foundations.colors :as colors]))
|
||||
|
||||
(defn container
|
||||
[networks? theme]
|
||||
[networks-to-show? theme]
|
||||
{:width "100%"
|
||||
:height (if networks? 90 56)
|
||||
:height (if networks-to-show? 90 56)
|
||||
:border-radius 16
|
||||
:border-width 1
|
||||
:border-color (colors/theme-colors colors/neutral-10 colors/neutral-80 theme)
|
||||
:margin-bottom (if networks? 4 8)})
|
||||
:margin-bottom (if networks-to-show? 4 8)})
|
||||
|
||||
(def info-container
|
||||
{:flex-direction :row
|
||||
@@ -39,3 +39,7 @@
|
||||
:height 32
|
||||
:flex-direction :row
|
||||
:align-items :center})
|
||||
|
||||
(def network-icon
|
||||
{:width 32
|
||||
:height 32})
|
||||
|
||||
@@ -28,50 +28,35 @@
|
||||
[rn/view
|
||||
{:style (style/dot-divider theme)}])])
|
||||
|
||||
(def ^:private default-token-symbols
|
||||
{:ethereum "ETH"
|
||||
:optimism "OP"
|
||||
:arbitrum "ARB"
|
||||
:base "ETH"})
|
||||
|
||||
(defn networks
|
||||
[values theme]
|
||||
(let [{:keys [ethereum optimism arbitrum base]} values
|
||||
show-optimism? (and optimism
|
||||
(or (pos? (:amount optimism))
|
||||
(= (:amount optimism) "<0.01")))
|
||||
show-arbitrum? (and arbitrum
|
||||
(or (pos? (:amount arbitrum))
|
||||
(= (:amount arbitrum) "<0.01")))
|
||||
show-base? (and base
|
||||
(or (pos? (:amount base))
|
||||
(= (:amount base) "<0.01")))]
|
||||
[rn/view
|
||||
{:style style/networks-container
|
||||
:accessibility-label :networks}
|
||||
(when (and ethereum (pos? (:amount ethereum)))
|
||||
[network-amount
|
||||
{:network :ethereum
|
||||
:amount (str (:amount ethereum) " " (or (:token-symbol ethereum) "ETH"))
|
||||
:divider? (or show-arbitrum? show-optimism?)
|
||||
:theme theme}])
|
||||
(when show-optimism?
|
||||
[network-amount
|
||||
{:network :optimism
|
||||
:amount (str (:amount optimism) " " (or (:token-symbol optimism) "OETH"))
|
||||
:divider? show-arbitrum?
|
||||
:theme theme}])
|
||||
(when show-arbitrum?
|
||||
[network-amount
|
||||
{:network :arbitrum
|
||||
:amount (str (:amount arbitrum) " " (or (:token-symbol arbitrum) "ARB"))
|
||||
:theme theme}])
|
||||
(when show-base?
|
||||
[network-amount
|
||||
{:network :base
|
||||
:amount (str (:amount base) " " (or (:token-symbol base) "ETH"))
|
||||
:theme theme}])]))
|
||||
[networks-to-show theme]
|
||||
(->> networks-to-show
|
||||
(map-indexed
|
||||
(fn [i [k {:keys [amount token-symbol]}]]
|
||||
(when (or (pos? amount)
|
||||
(= amount "<0.01"))
|
||||
[network-amount
|
||||
{:network k
|
||||
:amount (str amount " " (or token-symbol (get default-token-symbols k)))
|
||||
:divider? (not= (dec i) (-> networks-to-show keys count))
|
||||
:theme theme}])))
|
||||
(remove nil?)
|
||||
(into [rn/view
|
||||
{:style style/networks-container
|
||||
:accessibility-label :networks}])))
|
||||
|
||||
(defn- view-internal
|
||||
[{:keys [type account-props token-props networks? values]}]
|
||||
[{:keys [type account-props network-props token-props networks-to-show]}]
|
||||
(let [theme (quo.theme/use-theme)
|
||||
address (or (:address account-props) (:address token-props))]
|
||||
[rn/view
|
||||
{:style (style/container networks? theme)}
|
||||
{:style (style/container (seq? networks-to-show) theme)}
|
||||
[rn/view
|
||||
{:style style/info-container}
|
||||
(case type
|
||||
@@ -82,16 +67,26 @@
|
||||
(assoc account-props
|
||||
:size :size-32
|
||||
:neutral? true)]
|
||||
:network [rn/image
|
||||
{:source (resources/get-network (:network-name network-props))
|
||||
:style style/network-icon}]
|
||||
[user-avatar/user-avatar account-props])
|
||||
[rn/view {:style {:margin-left 8}}
|
||||
(when (not= type :account)
|
||||
[text/text {:weight :semi-bold} (or (:name account-props) (:label token-props))])
|
||||
(when (not (some #{type} [:account :network]))
|
||||
[text/text
|
||||
{:weight :semi-bold}
|
||||
(or (:name account-props) (:label token-props))])
|
||||
(when (= type :network)
|
||||
[text/text
|
||||
{:weight :semi-bold}
|
||||
(:full-name network-props)])
|
||||
[rn/view
|
||||
{:style {:flex-direction :row
|
||||
:align-items :center}}
|
||||
(when (= type :user)
|
||||
[:<>
|
||||
[rn/view {:style {:margin-right 4}} [account-avatar/view (:status-account account-props)]]
|
||||
[rn/view {:style {:margin-right 4}}
|
||||
[account-avatar/view (:status-account account-props)]]
|
||||
[text/text
|
||||
{:size :paragraph-2
|
||||
:style {:color (colors/theme-colors colors/neutral-50 colors/neutral-40 theme)}}
|
||||
@@ -105,10 +100,10 @@
|
||||
:style {:color (when (not= type :account)
|
||||
(colors/theme-colors colors/neutral-50 colors/neutral-40 theme))}}
|
||||
address])]]]
|
||||
(when networks?
|
||||
(when networks-to-show
|
||||
[:<>
|
||||
[rn/view
|
||||
{:style (style/line-divider theme)}]
|
||||
[networks values theme]])]))
|
||||
[networks networks-to-show theme]])]))
|
||||
|
||||
(def view (schema/instrument #'view-internal summary-info-schema/?schema))
|
||||
|
||||
@@ -18,5 +18,6 @@
|
||||
[:dropdown-on-press {:optional true} [:maybe fn?]]
|
||||
[:networks {:optional true}
|
||||
[:maybe [:sequential [:map [:source [:maybe :schema.common/image-source]]]]]]
|
||||
[:dropdown-state {:optional true} [:maybe [:enum :default :disabled]]]]]]
|
||||
[:dropdown-state {:optional true} [:maybe [:enum :default :disabled]]]
|
||||
[:show-new-chain-indicator? {:optional true} [:maybe :boolean]]]]]
|
||||
:any])
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
bars))
|
||||
|
||||
(defn- view-info-top
|
||||
[{:keys [state balance networks dropdown-on-press dropdown-state]}]
|
||||
[{:keys [state balance networks dropdown-on-press dropdown-state show-new-chain-indicator?]}]
|
||||
(let [theme (quo.theme/use-theme)]
|
||||
[rn/view {:style style/container-info-top}
|
||||
(if (= state :loading)
|
||||
@@ -36,9 +36,10 @@
|
||||
:style (style/style-text-heading theme)}
|
||||
balance])
|
||||
[network-dropdown/view
|
||||
{:state (or dropdown-state :default)
|
||||
:blur? true
|
||||
:on-press dropdown-on-press}
|
||||
{:state (or dropdown-state :default)
|
||||
:blur? true
|
||||
:on-press dropdown-on-press
|
||||
:show-new-chain-indicator? show-new-chain-indicator?}
|
||||
networks]]))
|
||||
|
||||
(defn- view-metrics
|
||||
|
||||
@@ -315,6 +315,8 @@
|
||||
networks-short-name
|
||||
socials))
|
||||
|
||||
(def new-feature-gradient-pink "#FF33A3")
|
||||
|
||||
(defn hex-string?
|
||||
[s]
|
||||
(and (string? s) (string/starts-with? s "#")))
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
(ns status-im.common.app-monitoring.effects
|
||||
(:require
|
||||
[native-module.core :as native-module]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(rf/reg-fx :effects.app-monitoring/intended-panic
|
||||
(fn [message]
|
||||
(native-module/intended-panic message)))
|
||||
@@ -0,0 +1,8 @@
|
||||
(ns status-im.common.app-monitoring.events
|
||||
(:require
|
||||
status-im.common.app-monitoring.effects
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
(rf/reg-event-fx :app-monitoring/intended-panic
|
||||
(fn [_ [message]]
|
||||
{:fx [[:effects.app-monitoring/intended-panic message]]}))
|
||||
@@ -26,9 +26,19 @@
|
||||
:qr-code (js/require "../resources/images/ui2/qr-code.png")
|
||||
:keycard-logo (js/require "../resources/images/ui2/keycard-logo.png")
|
||||
:keycard-buy (js/require "../resources/images/ui2/keycard-buy.png")
|
||||
:keycard-backup-positive (js/require "../resources/images/ui2/keycard-backup-positive.png")
|
||||
:keycard-change-pin (js/require "../resources/images/ui2/keycard-change-pin.png")
|
||||
:keycard-change-pin-positive (js/require "../resources/images/ui2/keycard-change-pin-positive.png")
|
||||
:keycard-change-pin-negative (js/require "../resources/images/ui2/keycard-change-pin-negative.png")
|
||||
:keycard-migration (js/require "../resources/images/ui2/keycard-migration.png")
|
||||
:keycard-migration-failed (js/require "../resources/images/ui2/keycard-migration-failed.png")
|
||||
:keycard-migration-succeeded (js/require "../resources/images/ui2/keycard-migration-succeeded.png")
|
||||
:keycard-not-same (js/require "../resources/images/ui2/keycard-not-same.png")
|
||||
:keycard-not-empty (js/require "../resources/images/ui2/keycard-not-empty.png")
|
||||
:keycard-reset-positive (js/require "../resources/images/ui2/keycard-reset-positive.png")
|
||||
:keycard-reset-negative (js/require "../resources/images/ui2/keycard-reset-negative.png")
|
||||
:keycard-unblock (js/require "../resources/images/ui2/keycard-unblock.png")
|
||||
:keycard-unblock-positive (js/require "../resources/images/ui2/keycard-unblock-positive.png")
|
||||
:not-keycard (js/require "../resources/images/ui2/not-keycard.png")
|
||||
:discover (js/require "../resources/images/ui2/discover.png")
|
||||
:invite-friends (js/require "../resources/images/ui2/invite-friends.png")
|
||||
|
||||
@@ -26,8 +26,7 @@
|
||||
:auth-button-label auth-button-label}]))
|
||||
(vec (conj dependencies on-auth-success on-auth-fail)))
|
||||
on-slider-complete (rn/use-callback
|
||||
(fn [reset-slider-fn]
|
||||
(js/setTimeout #(reset-slider-fn false) 500)
|
||||
(fn []
|
||||
(if (fn? on-complete)
|
||||
(on-complete)
|
||||
(on-complete-callback)))
|
||||
|
||||
@@ -144,3 +144,8 @@
|
||||
|
||||
(def re-frisk-host (get-config :RE_FRISK_HOST "localhost"))
|
||||
(def re-frisk-port (get-config :RE_FRISK_PORT "4567"))
|
||||
;;;; Sentry
|
||||
;; Documentation: status-go/internal/sentry/README.md
|
||||
(goog-define SENTRY_DSN_STATUS_GO "")
|
||||
(def sentry-enabled? (enabled? (get-config :SENTRY_ENABLED "0")))
|
||||
(def sentry-dsn-status-go SENTRY_DSN_STATUS_GO)
|
||||
|
||||
@@ -275,7 +275,8 @@
|
||||
{:events [:chat/unmute-chat-community]}
|
||||
[{:keys [db]} chat-id]
|
||||
(let [{:keys [community-id]} (get-in db [:chats chat-id])]
|
||||
{:db (assoc-in db [:communities community-id :muted] false)}))
|
||||
(when community-id
|
||||
{:db (assoc-in db [:communities community-id :muted] false)})))
|
||||
|
||||
(rf/defn mute-chat-failed
|
||||
{:events [:chat/mute-failed]}
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
:on-press events-helper/navigate-back}]
|
||||
[quo/page-top
|
||||
{:title (i18n/label :t/ready-add-keypair-keycard)}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:source (resources/get-image :keycard-migration)}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-migration)}]
|
||||
[common.view/tips]
|
||||
[quo/bottom-actions
|
||||
{:actions :one-action
|
||||
@@ -33,8 +33,11 @@
|
||||
:on-press events-helper/navigate-back}]
|
||||
[quo/page-top
|
||||
{:title (i18n/label :t/backup-keycard-created)}]
|
||||
[rn/view {:style {:flex 1}}]
|
||||
[rn/view {:style {:padding-horizontal 20}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-backup-positive)}]
|
||||
[rn/view {:style {:padding-horizontal 20 :padding-vertical 12}}
|
||||
[quo/button {:on-press events-helper/navigate-back}
|
||||
(i18n/label :t/done)]]])
|
||||
|
||||
@@ -49,7 +52,10 @@
|
||||
{:title (i18n/label :t/keycard-not-empty)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/scan-empty-keycard)}]
|
||||
[rn/view {:style {:flex 1}}]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-not-empty)}]
|
||||
[common.view/tips]
|
||||
[rn/view {:style {:padding-horizontal 20}}
|
||||
[quo/button {:on-press on-press}
|
||||
@@ -65,10 +71,10 @@
|
||||
{:title (i18n/label :t/scan-empty-keycard)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/backup-empty-keycard-only)}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:source (resources/get-image :check-your-keycard)}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :check-your-keycard)}]
|
||||
[common.view/tips]
|
||||
[quo/bottom-actions
|
||||
{:actions :one-action
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
(:require [quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.common.events-helper :as events-helper]
|
||||
[status-im.common.resources :as resources]
|
||||
[status-im.contexts.keycard.common.view :as common.view]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
@@ -32,9 +33,10 @@
|
||||
:on-press events-helper/navigate-back}]
|
||||
[quo/page-top
|
||||
{:title (i18n/label :t/ready-to-change-pin)}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-change-pin)}]
|
||||
[common.view/tips]
|
||||
[quo/bottom-actions
|
||||
{:actions :one-action
|
||||
@@ -52,9 +54,10 @@
|
||||
{:title (i18n/label :t/keycard-pin-changed)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/keycard-pin-changed-description)}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-change-pin-positive)}]
|
||||
[quo/bottom-actions
|
||||
{:actions :one-action
|
||||
:button-one-label (i18n/label :t/done)
|
||||
@@ -70,9 +73,10 @@
|
||||
{:title (i18n/label :t/keycard-pin-change-failed)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/keycard-pin-change-failed-description)}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-change-pin-negative)}]
|
||||
[common.view/tips]
|
||||
[quo/bottom-actions
|
||||
{:actions :one-action
|
||||
|
||||
@@ -42,10 +42,10 @@
|
||||
{:title (i18n/label :t/check-keycard)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/see-keycard-ready)}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:source (resources/get-image :check-your-keycard)}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :check-your-keycard)}]
|
||||
[common.view/tips]
|
||||
[quo/bottom-actions
|
||||
{:actions :one-action
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
(:require [quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.common.events-helper :as events-helper]
|
||||
[status-im.common.resources :as resources]
|
||||
[utils.i18n :as i18n]))
|
||||
|
||||
(defn view
|
||||
@@ -14,8 +15,11 @@
|
||||
{:title (i18n/label :t/different-keycard)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/scan-previous-keycard)}]
|
||||
[rn/view {:style {:flex 1}}]
|
||||
[rn/view {:style {:padding-horizontal 20}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-not-same)}]
|
||||
[rn/view {:style {:padding-horizontal 20 :padding-vertical 12}}
|
||||
[quo/button {:on-press events-helper/navigate-back}
|
||||
(i18n/label :t/try-again)]]])
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
(defn view
|
||||
[]
|
||||
(let [error (rf/sub [:keycard/application-info-error])
|
||||
logged-in? (rf/sub [:multiaccount/logged-in?])
|
||||
{:keys [title description]} (get titles error)]
|
||||
[:<>
|
||||
[quo/page-nav
|
||||
@@ -37,21 +38,31 @@
|
||||
[quo/section-label
|
||||
{:section (i18n/label :t/what-you-can-do) :container-style {:padding-vertical 8}}]
|
||||
(if (= error :keycard/error.keycard-empty)
|
||||
[quo/settings-item
|
||||
{:title (i18n/label :t/use-backup-keycard)
|
||||
:image :icon
|
||||
:image-props :i/placeholder
|
||||
:action :arrow
|
||||
:description :text
|
||||
:description-props {:text (i18n/label :t/create-backup-profile-keycard)}
|
||||
:on-press (fn []
|
||||
(rf/dispatch [:show-bottom-sheet
|
||||
{:content
|
||||
(fn []
|
||||
[backup.view/sheet
|
||||
{:on-continue
|
||||
(rf/dispatch
|
||||
[:keycard/backup.create-or-enter-pin])}])}]))}]
|
||||
(if logged-in?
|
||||
[quo/settings-item
|
||||
{:title (i18n/label :t/use-backup-keycard)
|
||||
:image :icon
|
||||
:image-props :i/placeholder
|
||||
:action :arrow
|
||||
:description :text
|
||||
:description-props {:text (i18n/label :t/create-backup-profile-keycard)}
|
||||
:on-press (fn []
|
||||
(rf/dispatch [:show-bottom-sheet
|
||||
{:content
|
||||
(fn []
|
||||
[backup.view/sheet
|
||||
{:on-continue
|
||||
(rf/dispatch
|
||||
[:keycard/backup.create-or-enter-pin])}])}]))}]
|
||||
[quo/settings-item
|
||||
{:title (i18n/label :t/create-new-profile)
|
||||
:image :icon
|
||||
:image-props :i/profile
|
||||
:action :arrow
|
||||
:description :text
|
||||
:description-props {:text (i18n/label :t/new-key-pair-keycard)}
|
||||
:on-press (fn []
|
||||
(rf/dispatch [:keycard/create.get-phrase]))}])
|
||||
[:<>
|
||||
(when (or (= error :keycard/error.keycard-frozen)
|
||||
(= error :keycard/error.keycard-locked))
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
(:require [quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.common.events-helper :as events-helper]
|
||||
[status-im.common.resources :as resources]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
|
||||
@@ -48,8 +49,11 @@
|
||||
{:title (i18n/label :t/keycard-reset-success)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/keycard-empty-ready)}]
|
||||
[rn/view {:style {:flex 1}}]
|
||||
[rn/view {:style {:padding-horizontal 20}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-reset-positive)}]
|
||||
[rn/view {:style {:padding-horizontal 20 :padding-vertical 12}}
|
||||
[quo/button {:on-press events-helper/navigate-back}
|
||||
(i18n/label :t/done)]]])
|
||||
|
||||
@@ -61,8 +65,11 @@
|
||||
:on-press events-helper/navigate-back}]
|
||||
[quo/page-top
|
||||
{:title (i18n/label :t/keycard-reset-failed)}]
|
||||
[rn/view {:style {:flex 1}}]
|
||||
[rn/view {:style {:padding-horizontal 20}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-reset-negative)}]
|
||||
[rn/view {:style {:padding-horizontal 20 :padding-vertical 12}}
|
||||
[quo/button {:on-press events-helper/navigate-back}
|
||||
(i18n/label :t/try-again)]]])
|
||||
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
:profile-picture profile-picture
|
||||
:customization-color customization-color}
|
||||
:container-style {:margin-top constants/page-nav-height}}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:source (resources/get-image :keycard-migration-failed)}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-migration-failed)}]
|
||||
[quo/divider-label (i18n/label :t/what-you-can-do)]
|
||||
[quo/markdown-list {:description (i18n/label :t/keycard-migration-failed-instruction-1)}]
|
||||
[quo/markdown-list {:description (i18n/label :t/keycard-migration-failed-instruction-2)}]
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
:container-style {:margin-top constants/page-nav-height}}]
|
||||
[quo/text {:style {:padding-horizontal 20}}
|
||||
(i18n/label :t/do-not-quit)]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:source (resources/get-image :keycard-migration)}]]]))
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-migration)}]]))
|
||||
|
||||
@@ -21,11 +21,11 @@
|
||||
:container-style {:margin-top constants/page-nav-height}}]
|
||||
[quo/text {:style {:padding-horizontal 20}}
|
||||
(i18n/label :t/use-keycard-for-status)]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:source (resources/get-image :keycard-migration-succeeded)}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-migration-succeeded)}]
|
||||
[quo/button
|
||||
{:on-press #(rf/dispatch [:profile/logout])
|
||||
:container-style {:margin-horizontal 20}}
|
||||
:container-style {:margin-horizontal 20 :margin-vertical 12}}
|
||||
(i18n/label :t/logout)]]))
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
:context-tag {:full-name profile-name
|
||||
:profile-picture profile-picture
|
||||
:customization-color customization-color}}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:source (resources/get-image :keycard-migration)}]]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-migration)}]
|
||||
[common.view/tips]
|
||||
[quo/bottom-actions
|
||||
{:actions :one-action
|
||||
|
||||
@@ -18,11 +18,16 @@
|
||||
:padding-horizontal 36
|
||||
:padding-vertical 30
|
||||
:background-color (colors/theme-colors colors/white colors/neutral-95 theme)}}
|
||||
[rn/text {:style {:font-size 26 :color "#9F9FA5" :margin-bottom 36}}
|
||||
[rn/text
|
||||
{:style {:font-size 26
|
||||
:color (colors/theme-colors "#8F8E94" "#9F9FA5" theme)
|
||||
:margin-bottom 36}}
|
||||
(i18n/label :t/ready-to-scan)]
|
||||
[rn/image
|
||||
{:source (resources/get-image :nfc-prompt)}]
|
||||
[rn/text {:style {:font-size 16 :color :white :margin-vertical 36}}
|
||||
[rn/image {:source (resources/get-image :nfc-prompt)}]
|
||||
[rn/text
|
||||
{:style {:font-size 16
|
||||
:color (colors/theme-colors "#09101C" :white theme)
|
||||
:margin-vertical 36}}
|
||||
(if connected?
|
||||
(i18n/label :t/connected-dont-move)
|
||||
(i18n/label :t/hold-phone-near-keycard))]
|
||||
@@ -32,6 +37,12 @@
|
||||
(rf/dispatch [:keycard/hide-connection-sheet]))
|
||||
:style {:flex-direction :row}}
|
||||
[rn/view
|
||||
{:style {:background-color "#8E8E93" :flex 1 :align-items :center :padding 18 :border-radius 10}}
|
||||
[rn/text {:style {:color :white :font-size 16}}
|
||||
{:style {:background-color (colors/theme-colors "#D5D4DB" "#8E8E93" theme)
|
||||
:flex 1
|
||||
:align-items :center
|
||||
:padding 18
|
||||
:border-radius 10}}
|
||||
[rn/text
|
||||
{:style {:color (colors/theme-colors "#09101C" :white theme)
|
||||
:font-size 16}}
|
||||
(i18n/label :t/cancel)]]]]]))
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
{:title (i18n/label :t/oops-not-keycard)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/make-sure-keycard)}]
|
||||
[rn/view {:style {:flex 1 :align-items :center :justify-content :center}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:source (resources/get-image :not-keycard)}]]
|
||||
[rn/view {:style {:padding-horizontal 20}}
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :not-keycard)}]
|
||||
[rn/view {:style {:padding-horizontal 20 :padding-vertical 12}}
|
||||
[quo/button {:on-press events-helper/navigate-back}
|
||||
(i18n/label :t/try-again)]]])
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
(:require [quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.common.events-helper :as events-helper]
|
||||
[status-im.common.resources :as resources]
|
||||
[status-im.contexts.keycard.common.view :as common.view]
|
||||
[utils.i18n :as i18n]
|
||||
[utils.re-frame :as rf]))
|
||||
@@ -13,9 +14,14 @@
|
||||
{:icon-name :i/close
|
||||
:on-press events-helper/navigate-back}]
|
||||
[quo/page-top
|
||||
{:title (i18n/label :t/keycard-unblocked)}]
|
||||
[rn/view {:style {:flex 1}}]
|
||||
[rn/view {:style {:padding-horizontal 20}}
|
||||
{:title (i18n/label :t/keycard-unblocked)
|
||||
:description :text
|
||||
:description-text (i18n/label :t/keycard-unblocked-description)}]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-unblock-positive)}]
|
||||
[rn/view {:style {:padding-horizontal 20 :padding-vertical 12}}
|
||||
[quo/button {:on-press events-helper/navigate-back}
|
||||
(i18n/label :t/done)]]])
|
||||
|
||||
@@ -27,7 +33,10 @@
|
||||
:on-press events-helper/navigate-back}]
|
||||
[quo/page-top
|
||||
{:title (i18n/label :t/ready-to-unblock-keycard)}]
|
||||
[rn/view {:style {:flex 1}}]
|
||||
[rn/image
|
||||
{:resize-mode :contain
|
||||
:style {:flex 1 :width (:width (rn/get-window))}
|
||||
:source (resources/get-image :keycard-unblock)}]
|
||||
[common.view/tips]
|
||||
[quo/bottom-actions
|
||||
{:actions :one-action
|
||||
|
||||
@@ -12,17 +12,15 @@
|
||||
:options [{:key :status-account}
|
||||
{:key :user}
|
||||
{:key :saved-account}
|
||||
{:key :account}]}
|
||||
{:key :networks? :type :boolean}])
|
||||
{:key :account}]}])
|
||||
|
||||
|
||||
(defn view
|
||||
[]
|
||||
(let [state (reagent/atom {:type :status-account
|
||||
:networks? true
|
||||
:values {:ethereum {:amount 150}
|
||||
:optimism {:amount 50}
|
||||
:arbitrum {:amount 25}}})
|
||||
(let [state (reagent/atom {:type :status-account
|
||||
:networks-to-show {:ethereum {:amount 150}
|
||||
:optimism {:amount 50}
|
||||
:arbitrum {:amount 25}}})
|
||||
status-account-props {:customization-color :purple
|
||||
:size 32
|
||||
:emoji "🍑"
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
{:dataDir (native-module/backup-disabled-data-dir)
|
||||
:mixpanelAppId config/mixpanel-app-id
|
||||
:mixpanelToken config/mixpanel-token
|
||||
:sentryDSN (if config/sentry-enabled? config/sentry-dsn-status-go "")
|
||||
:mediaServerEnableTLS (config/enabled? config/STATUS_BACKEND_SERVER_MEDIA_SERVER_ENABLE_TLS)
|
||||
:logEnabled (not (string/blank? config/log-level))
|
||||
:logLevel config/log-level
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
[react-native.safe-area :as safe-area]
|
||||
[status-im.common.floating-button-page.view :as floating-button-page]
|
||||
[status-im.contexts.settings.wallet.saved-addresses.add-address-to-save.style :as style]
|
||||
[status-im.contexts.wallet.common.utils :as utils]
|
||||
[status-im.contexts.wallet.common.validation :as validation]
|
||||
[utils.address :as utils-address]
|
||||
[utils.debounce :as debounce]
|
||||
@@ -159,7 +160,7 @@
|
||||
(fn [clipboard-text]
|
||||
(when-not (string/blank? clipboard-text)
|
||||
(-> clipboard-text
|
||||
utils-address/extract-address-without-chains-info
|
||||
utils/on-paste-address-or-ens
|
||||
on-change-text)))))
|
||||
on-press-continue (rn/use-callback
|
||||
(fn []
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
[reagent.core :as reagent]
|
||||
[status-im.common.floating-button-page.view :as floating-button-page]
|
||||
[status-im.contexts.wallet.add-account.add-address-to-watch.style :as style]
|
||||
[status-im.contexts.wallet.common.utils :as utils]
|
||||
[status-im.contexts.wallet.common.validation :as validation]
|
||||
[status-im.subs.wallet.add-account.address-to-watch]
|
||||
[utils.address :as utils-address]
|
||||
@@ -42,7 +43,7 @@
|
||||
paste-on-input #(clipboard/get-string
|
||||
(fn [clipboard-text]
|
||||
(-> clipboard-text
|
||||
utils.address/extract-address-without-chains-info
|
||||
utils/on-paste-address-or-ens
|
||||
on-change-text)))]
|
||||
(rn/use-effect (fn []
|
||||
(when-not (string/blank? scanned-address)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
(ns status-im.contexts.wallet.common.account-switcher.view
|
||||
(:require
|
||||
[quo.core :as quo]
|
||||
[react-native.core :as rn]
|
||||
[status-im.contexts.wallet.sheets.account-options.view :as account-options]
|
||||
[status-im.contexts.wallet.sheets.network-filter.view :as network-filter]
|
||||
[status-im.contexts.wallet.sheets.select-account.view :as select-account]
|
||||
@@ -30,25 +31,33 @@
|
||||
type :no-title}}]
|
||||
(let [{:keys [color emoji watch-only?]} (rf/sub [:wallet/current-viewing-account])
|
||||
networks (rf/sub [:wallet/selected-network-details])
|
||||
sending-collectible? (rf/sub [:wallet/sending-collectible?])]
|
||||
sending-collectible? (rf/sub [:wallet/sending-collectible?])
|
||||
show-new-chain-indicator? (rf/sub [:wallet/show-new-chain-indicator?])
|
||||
on-press-networks (rn/use-callback
|
||||
(fn []
|
||||
(rf/dispatch [:wallet/hide-new-chain-indicator])
|
||||
(rf/dispatch [:show-bottom-sheet
|
||||
{:content network-filter/view}])))]
|
||||
[quo/page-nav
|
||||
{:type type
|
||||
:icon-name icon-name
|
||||
:margin-top margin-top
|
||||
:background :blur
|
||||
:on-press on-press
|
||||
:accessibility-label accessibility-label
|
||||
:networks networks
|
||||
:align-center? true
|
||||
:networks-on-press #(rf/dispatch [:show-bottom-sheet {:content network-filter/view}])
|
||||
:right-side [(when (and (ff/enabled? ::ff/wallet.wallet-connect)
|
||||
(not watch-only?)
|
||||
show-dapps-button?)
|
||||
{:icon-name :i/dapps
|
||||
:on-press #(rf/dispatch [:navigate-to :screen/wallet.connected-dapps])})
|
||||
(when-not sending-collectible?
|
||||
{:content-type :account-switcher
|
||||
:customization-color color
|
||||
:on-press #(on-switcher-press switcher-type params)
|
||||
:emoji emoji
|
||||
:type (when watch-only? :watch-only)})]}]))
|
||||
{:type type
|
||||
:icon-name icon-name
|
||||
:margin-top margin-top
|
||||
:background :blur
|
||||
:on-press on-press
|
||||
:accessibility-label accessibility-label
|
||||
:networks networks
|
||||
:align-center? true
|
||||
:networks-on-press on-press-networks
|
||||
:show-new-chain-indicator? show-new-chain-indicator?
|
||||
:right-side [(when (and (ff/enabled? ::ff/wallet.wallet-connect)
|
||||
(not watch-only?)
|
||||
show-dapps-button?)
|
||||
{:icon-name :i/dapps
|
||||
:on-press #(rf/dispatch [:navigate-to
|
||||
:screen/wallet.connected-dapps])})
|
||||
(when-not sending-collectible?
|
||||
{:content-type :account-switcher
|
||||
:customization-color color
|
||||
:on-press #(on-switcher-press switcher-type params)
|
||||
:emoji emoji
|
||||
:type (when watch-only? :watch-only)})]}]))
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
[status-im.common.qr-codes.view :as qr-codes]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.contexts.wallet.common.utils.networks :as network-utils]
|
||||
[utils.address]
|
||||
[utils.money :as money]
|
||||
[utils.number :as number]
|
||||
[utils.string]))
|
||||
@@ -324,20 +325,19 @@
|
||||
|
||||
(defn make-network-item
|
||||
"This function generates props for quo/category component item"
|
||||
[{:keys [network-name color on-change networks state label-props type blur?]}]
|
||||
(cond-> {:title (string/capitalize (name network-name))
|
||||
:image :icon-avatar
|
||||
:image-props {:icon (resources/get-network network-name)
|
||||
:size :size-20}
|
||||
:action :selector
|
||||
:action-props {:type (or type
|
||||
(if (= :default state)
|
||||
:filled-checkbox
|
||||
:checkbox))
|
||||
:blur? blur?
|
||||
:customization-color color
|
||||
:checked? (contains? networks network-name)
|
||||
:on-change on-change}}
|
||||
[{:keys [network-name color on-change networks label-props type blur?]}]
|
||||
(cond-> {:title (string/capitalize (name network-name))
|
||||
:image :icon-avatar
|
||||
:image-props {:icon (resources/get-network network-name)
|
||||
:size :size-20}
|
||||
;; Remove the following line for v2.35
|
||||
:show-new-feature-tag? (= network-name constants/base-network-name)
|
||||
:action :selector
|
||||
:action-props {:type (or type :checkbox)
|
||||
:blur? blur?
|
||||
:customization-color color
|
||||
:checked? (contains? networks network-name)
|
||||
:on-change on-change}}
|
||||
|
||||
label-props
|
||||
(assoc :label :text
|
||||
@@ -480,3 +480,11 @@
|
||||
(filter (fn [{:keys [tokens]}]
|
||||
(some positive-balance-in-any-chain? tokens))
|
||||
operable-account))))
|
||||
|
||||
(defn on-paste-address-or-ens
|
||||
"Check if the clipboard has any valid address and extract the address without any chain info.
|
||||
If it does not contain an valid address or it is ENS, return the clipboard text as it is"
|
||||
[clipboard-text]
|
||||
(if (utils.address/supported-address? clipboard-text)
|
||||
(utils.address/extract-address-without-chains-info clipboard-text)
|
||||
clipboard-text))
|
||||
|
||||