Merge branch 'develop' into bugfix/21636
BIN
resources/images/ui2/login-syncing@2x.png
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
resources/images/ui2/login-syncing@3x.png
Normal file
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 306 KiB |
BIN
resources/images/ui2/usage-data@2x.png
Normal file
After Width: | Height: | Size: 542 KiB |
BIN
resources/images/ui2/usage-data@3x.png
Normal file
After Width: | Height: | Size: 1.0 MiB |
@ -1,67 +0,0 @@
|
|||||||
(ns legacy.status-im.ui.screens.about-app.views
|
|
||||||
(:require
|
|
||||||
[legacy.status-im.ui.components.colors :as colors]
|
|
||||||
[legacy.status-im.ui.components.copyable-text :as copyable-text]
|
|
||||||
[legacy.status-im.ui.components.icons.icons :as icons]
|
|
||||||
[legacy.status-im.ui.components.list.item :as list.item]
|
|
||||||
[legacy.status-im.ui.components.react :as react]
|
|
||||||
[quo.core :as quo]
|
|
||||||
[utils.i18n :as i18n]
|
|
||||||
[utils.re-frame :as rf])
|
|
||||||
(:require-macros [legacy.status-im.utils.views :as views]))
|
|
||||||
|
|
||||||
(views/defview about-app
|
|
||||||
[]
|
|
||||||
(views/letsubs [app-version [:get-app-short-version]
|
|
||||||
commit-hash [:get-commit-hash]
|
|
||||||
node-version [:get-app-node-version]]
|
|
||||||
[:<>
|
|
||||||
[quo/page-nav
|
|
||||||
{:type :title
|
|
||||||
:title (i18n/label :t/about-app)
|
|
||||||
:background :blur
|
|
||||||
:icon-name :i/close
|
|
||||||
:on-press #(rf/dispatch [:navigate-back])}]
|
|
||||||
[react/scroll-view
|
|
||||||
[copyable-text/copyable-text-view
|
|
||||||
{:copied-text app-version}
|
|
||||||
[list.item/list-item
|
|
||||||
{:size :small
|
|
||||||
:accessibility-label :app-version
|
|
||||||
:title (i18n/label :t/version)
|
|
||||||
:accessory :text
|
|
||||||
:accessory-text app-version}]]
|
|
||||||
[copyable-text/copyable-text-view
|
|
||||||
{:copied-text commit-hash}
|
|
||||||
[list.item/list-item
|
|
||||||
{:size :small
|
|
||||||
:accessibility-label :commit-hash
|
|
||||||
:title (i18n/label :t/app-commit)
|
|
||||||
:accessory :text
|
|
||||||
:accessory-text commit-hash}]]
|
|
||||||
[copyable-text/copyable-text-view
|
|
||||||
{:copied-text node-version}
|
|
||||||
[list.item/list-item
|
|
||||||
{:size :small
|
|
||||||
:accessibility-label :node-version
|
|
||||||
:title (i18n/label :t/node-version)
|
|
||||||
:accessory :text
|
|
||||||
:accessory-text node-version}]]]]))
|
|
||||||
|
|
||||||
(views/defview learn-more-sheet
|
|
||||||
[]
|
|
||||||
(views/letsubs [{:keys [title content]} [:bottom-sheet/options]]
|
|
||||||
[react/view
|
|
||||||
{:style {:padding-left 16
|
|
||||||
:padding-top 16
|
|
||||||
:padding-right 34
|
|
||||||
:padding-bottom 0}}
|
|
||||||
[react/view {:style {:align-items :center :flex-direction :row :margin-bottom 16}}
|
|
||||||
[icons/icon :main-icons/info
|
|
||||||
{:color colors/blue
|
|
||||||
:container-style {:margin-right 13}}]
|
|
||||||
[react/text {:style {:typography :title-bold}} title]]
|
|
||||||
[react/text {:style {:color colors/gray}} content]]))
|
|
||||||
|
|
||||||
(def learn-more
|
|
||||||
{:content learn-more-sheet})
|
|
@ -1,7 +1,6 @@
|
|||||||
(ns legacy.status-im.ui.screens.screens
|
(ns legacy.status-im.ui.screens.screens
|
||||||
(:require
|
(:require
|
||||||
[legacy.status-im.ui.components.colors :as colors]
|
[legacy.status-im.ui.components.colors :as colors]
|
||||||
[legacy.status-im.ui.screens.about-app.views :as about-app]
|
|
||||||
[legacy.status-im.ui.screens.advanced-settings.views :as advanced-settings]
|
[legacy.status-im.ui.screens.advanced-settings.views :as advanced-settings]
|
||||||
[legacy.status-im.ui.screens.appearance.views :as appearance]
|
[legacy.status-im.ui.screens.appearance.views :as appearance]
|
||||||
[legacy.status-im.ui.screens.backup-settings.view :as backup-settings]
|
[legacy.status-im.ui.screens.backup-settings.view :as backup-settings]
|
||||||
@ -93,12 +92,6 @@
|
|||||||
:insets {:top? platform/android?}}
|
:insets {:top? platform/android?}}
|
||||||
:component sync-settings/sync-settings}
|
:component sync-settings/sync-settings}
|
||||||
|
|
||||||
;; ABOUT
|
|
||||||
{:name :about-app
|
|
||||||
:options {:topBar {:visible false}
|
|
||||||
:insets {:top? platform/android?}}
|
|
||||||
:component about-app/about-app}
|
|
||||||
|
|
||||||
;; STATUS HELP
|
;; STATUS HELP
|
||||||
{:name :help-center
|
{:name :help-center
|
||||||
:options {:topBar {:visible false}
|
:options {:topBar {:visible false}
|
||||||
|
@ -16,7 +16,8 @@
|
|||||||
[rn/view {:style (style/loading-container size blur? theme)}]))
|
[rn/view {:style (style/loading-container size blur? theme)}]))
|
||||||
|
|
||||||
(defn- left-subtitle
|
(defn- left-subtitle
|
||||||
[{:keys [size subtitle-type subtitle-color icon icon-color blur? subtitle customization-color emoji
|
[{:keys [size subtitle-text-props subtitle-type subtitle-color icon icon-color blur? subtitle
|
||||||
|
customization-color emoji
|
||||||
network-image]
|
network-image]
|
||||||
:or {subtitle-type :default}}]
|
:or {subtitle-type :default}}]
|
||||||
(let [theme (quo.theme/use-theme)]
|
(let [theme (quo.theme/use-theme)]
|
||||||
@ -39,9 +40,10 @@
|
|||||||
:style style/image}]
|
:style style/image}]
|
||||||
nil)])
|
nil)])
|
||||||
[text/text
|
[text/text
|
||||||
{:weight :medium
|
(merge {:weight :medium
|
||||||
:size :paragraph-2
|
:size :paragraph-2
|
||||||
:style (style/description subtitle-color blur? theme)}
|
:style (style/description subtitle-color blur? theme)}
|
||||||
|
subtitle-text-props)
|
||||||
subtitle]
|
subtitle]
|
||||||
(when (= subtitle-type :editable)
|
(when (= subtitle-type :editable)
|
||||||
[icons/icon :i/edit
|
[icons/icon :i/edit
|
||||||
@ -75,7 +77,8 @@
|
|||||||
|
|
||||||
(defn- left-side
|
(defn- left-side
|
||||||
"The description can either be given as a string `subtitle-type` or a component `custom-subtitle`"
|
"The description can either be given as a string `subtitle-type` or a component `custom-subtitle`"
|
||||||
[{:keys [title status size blur? custom-subtitle icon subtitle subtitle-type subtitle-color icon-color
|
[{:keys [title subtitle-text-props status size blur? custom-subtitle icon subtitle subtitle-type
|
||||||
|
subtitle-color icon-color
|
||||||
customization-color network-image emoji title-icon]
|
customization-color network-image emoji title-icon]
|
||||||
:as props}]
|
:as props}]
|
||||||
(let [theme (quo.theme/use-theme)]
|
(let [theme (quo.theme/use-theme)]
|
||||||
@ -94,6 +97,7 @@
|
|||||||
[custom-subtitle props]
|
[custom-subtitle props]
|
||||||
[left-subtitle
|
[left-subtitle
|
||||||
{:theme theme
|
{:theme theme
|
||||||
|
:subtitle-text-props subtitle-text-props
|
||||||
:size size
|
:size size
|
||||||
:subtitle-type subtitle-type
|
:subtitle-type subtitle-type
|
||||||
:subtitle-color subtitle-color
|
:subtitle-color subtitle-color
|
||||||
@ -140,6 +144,7 @@
|
|||||||
[:size {:optional true} [:maybe [:enum :default :small :large]]]
|
[:size {:optional true} [:maybe [:enum :default :small :large]]]
|
||||||
[:title :string]
|
[:title :string]
|
||||||
[:subtitle {:optional true} [:maybe [:or :string :double]]]
|
[:subtitle {:optional true} [:maybe [:or :string :double]]]
|
||||||
|
[:subtitle-text-props {:optional true} [:maybe :map]]
|
||||||
[:custom-subtitle {:optional true} [:maybe fn?]]
|
[:custom-subtitle {:optional true} [:maybe fn?]]
|
||||||
[:icon {:optional true} [:maybe :keyword]]
|
[:icon {:optional true} [:maybe :keyword]]
|
||||||
[:title-icon {:optional true} [:maybe :keyword]]
|
[:title-icon {:optional true} [:maybe :keyword]]
|
||||||
|
@ -79,11 +79,11 @@
|
|||||||
[rn/view {:style style/community-logo-ring}]])
|
[rn/view {:style style/community-logo-ring}]])
|
||||||
|
|
||||||
(defn- description-container
|
(defn- description-container
|
||||||
[{:keys [description description-text collection-text community-text
|
[{:keys [description description-text collection-text community-text blur?
|
||||||
collection-image community-image blur?]
|
collection-image community-image description-accessibility-label]
|
||||||
context-tag-props :context-tag
|
context-tag-props :context-tag
|
||||||
summary-props :summary}]
|
summary-props :summary}]
|
||||||
[rn/view
|
[rn/view {:accessibility-label description-accessibility-label}
|
||||||
(cond
|
(cond
|
||||||
(and (= description :text) (not (string/blank? description-text)))
|
(and (= description :text) (not (string/blank? description-text)))
|
||||||
[text/text
|
[text/text
|
||||||
|
@ -1,11 +1,20 @@
|
|||||||
(ns status-im.common.privacy.view
|
(ns status-im.common.privacy.view
|
||||||
(:require-macros [legacy.status-im.utils.slurp :refer [slurp]])
|
(:require-macros [legacy.status-im.utils.slurp :refer [slurp]])
|
||||||
(:require [quo.core :as quo]
|
(:require [quo.core :as quo]
|
||||||
[react-native.gesture :as gesture]))
|
[react-native.gesture :as gesture]
|
||||||
|
[status-im.contexts.settings.common.header :as header]
|
||||||
|
[utils.i18n :as i18n]))
|
||||||
|
|
||||||
(def privacy-statement-text (slurp "resources/privacy.mdwn"))
|
(def privacy-statement-text (slurp "resources/privacy.mdwn"))
|
||||||
|
|
||||||
(defn privacy-statement
|
(defn privacy-statement
|
||||||
[]
|
[]
|
||||||
[gesture/scroll-view {:margin 20}
|
[gesture/scroll-view {:style {:margin 20}}
|
||||||
[quo/text privacy-statement-text]])
|
[quo/text privacy-statement-text]])
|
||||||
|
|
||||||
|
(defn view
|
||||||
|
[]
|
||||||
|
[quo/overlay {:type :shell}
|
||||||
|
[header/view {:title (i18n/label :t/privacy-policy)}]
|
||||||
|
[gesture/scroll-view {:style {:padding-horizontal 20}}
|
||||||
|
[quo/text privacy-statement-text]]])
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
(def ui
|
(def ui
|
||||||
{:add-new-contact (js/require "../resources/images/ui2/add-contact.png")
|
{:add-new-contact (js/require "../resources/images/ui2/add-contact.png")
|
||||||
:biometrics (js/require "../resources/images/ui2/biometrics.png")
|
:biometrics (js/require "../resources/images/ui2/biometrics.png")
|
||||||
|
:usage-data (js/require "../resources/images/ui2/usage-data.png")
|
||||||
|
:login-syncing (js/require "../resources/images/ui2/login-syncing.png")
|
||||||
:chat-privately-with-friends (js/require "../resources/images/ui2/chat-privately-with-friends.png")
|
:chat-privately-with-friends (js/require "../resources/images/ui2/chat-privately-with-friends.png")
|
||||||
:desktop-how-to-pair-sign-in (js/require "../resources/images/ui2/desktop-how-to-pair-sign-in.png")
|
:desktop-how-to-pair-sign-in (js/require "../resources/images/ui2/desktop-how-to-pair-sign-in.png")
|
||||||
:desktop-how-to-pair-logged-in (js/require
|
:desktop-how-to-pair-logged-in (js/require
|
||||||
|
@ -10,19 +10,43 @@
|
|||||||
[utils.re-frame :as rf]
|
[utils.re-frame :as rf]
|
||||||
[utils.security.core :as security]))
|
[utils.security.core :as security]))
|
||||||
|
|
||||||
(rf/reg-fx :effects.keycard/call-on-auth-success
|
(defn- handle-password-success
|
||||||
(fn [on-auth-success]
|
[has-partially-operable-accounts? on-auth-success masked-password]
|
||||||
(when on-auth-success (on-auth-success ""))))
|
(let [on-auth-success-callback #(on-auth-success masked-password)]
|
||||||
|
(rf/dispatch [:standard-auth/set-success true])
|
||||||
|
(rf/dispatch [:standard-auth/reset-login-password])
|
||||||
|
(if has-partially-operable-accounts?
|
||||||
|
(rf/dispatch [:wallet/make-partially-operable-accounts-fully-operable
|
||||||
|
{:password masked-password
|
||||||
|
:on-success on-auth-success-callback
|
||||||
|
:on-error on-auth-success-callback}])
|
||||||
|
(on-auth-success-callback))))
|
||||||
|
|
||||||
(defn authorize
|
(defn authorize
|
||||||
[{:keys [db]} [{:keys [on-auth-success keycard-supported?] :as args}]]
|
[{:keys [db]} [{:keys [on-auth-success] :as args}]]
|
||||||
(let [key-uid (get-in db [:profile/profile :key-uid])
|
(let [key-uid (get-in db [:profile/profile :key-uid])
|
||||||
keycard? (get-in db [:profile/profile :keycard-pairing])]
|
keycard-profile? (get-in db [:profile/profile :keycard-pairing])]
|
||||||
{:fx
|
{:fx
|
||||||
[(if keycard?
|
[(if keycard-profile?
|
||||||
(if keycard-supported?
|
[:dispatch
|
||||||
[:effects.keycard/call-on-auth-success on-auth-success]
|
[:standard-auth/authorize-with-keycard
|
||||||
[:dispatch [:keycard/feature-unavailable-show]])
|
{:on-complete
|
||||||
|
(fn [pin]
|
||||||
|
(rf/dispatch
|
||||||
|
[:keycard/connect
|
||||||
|
{:key-uid key-uid
|
||||||
|
:on-success
|
||||||
|
(fn []
|
||||||
|
(rf/dispatch
|
||||||
|
[:keycard/get-keys
|
||||||
|
{:pin pin
|
||||||
|
:on-success (fn [{:keys [encryption-public-key]}]
|
||||||
|
(rf/dispatch [:keycard/disconnect])
|
||||||
|
(handle-password-success false
|
||||||
|
on-auth-success
|
||||||
|
(security/mask-data encryption-public-key)))
|
||||||
|
:on-failure #(rf/dispatch [:keycard/on-action-with-pin-error
|
||||||
|
%])}]))}]))}]]
|
||||||
[:effects.biometric/check-if-available
|
[:effects.biometric/check-if-available
|
||||||
{:key-uid key-uid
|
{:key-uid key-uid
|
||||||
:on-success #(rf/dispatch [:standard-auth/authorize-with-biometric args])
|
:on-success #(rf/dispatch [:standard-auth/authorize-with-biometric args])
|
||||||
@ -84,21 +108,12 @@
|
|||||||
(defn- bottom-sheet-password-view
|
(defn- bottom-sheet-password-view
|
||||||
[{:keys [on-press-biometric on-auth-success auth-button-icon-left auth-button-label]}]
|
[{:keys [on-press-biometric on-auth-success auth-button-icon-left auth-button-label]}]
|
||||||
(fn []
|
(fn []
|
||||||
(let [has-partially-operable-accounts? (rf/sub [:wallet/has-partially-operable-accounts?])
|
(let [has-partially-operable-accounts? (rf/sub [:wallet/has-partially-operable-accounts?])]
|
||||||
handle-password-success
|
|
||||||
(fn [password]
|
|
||||||
(let [sha3-pwd (security/hash-masked-password password)
|
|
||||||
on-auth-success-callback #(on-auth-success sha3-pwd)]
|
|
||||||
(rf/dispatch [:standard-auth/set-success true])
|
|
||||||
(rf/dispatch [:standard-auth/reset-login-password])
|
|
||||||
(if has-partially-operable-accounts?
|
|
||||||
(rf/dispatch [:wallet/make-partially-operable-accounts-fully-operable
|
|
||||||
{:password sha3-pwd
|
|
||||||
:on-success on-auth-success-callback
|
|
||||||
:on-error on-auth-success-callback}])
|
|
||||||
(on-auth-success-callback))))]
|
|
||||||
[enter-password/view
|
[enter-password/view
|
||||||
{:on-enter-password handle-password-success
|
{:on-enter-password #(handle-password-success
|
||||||
|
has-partially-operable-accounts?
|
||||||
|
on-auth-success
|
||||||
|
(security/hash-masked-password %))
|
||||||
:on-press-biometrics on-press-biometric
|
:on-press-biometrics on-press-biometric
|
||||||
:button-icon-left auth-button-icon-left
|
:button-icon-left auth-button-icon-left
|
||||||
:button-label auth-button-label}])))
|
:button-label auth-button-label}])))
|
||||||
|
@ -9,26 +9,25 @@
|
|||||||
|
|
||||||
(defn view
|
(defn view
|
||||||
[{:keys [track-text customization-color auth-button-label on-auth-success on-auth-fail
|
[{:keys [track-text customization-color auth-button-label on-auth-success on-auth-fail
|
||||||
auth-button-icon-left size blur? container-style disabled? dependencies keycard-supported?]
|
auth-button-icon-left size blur? container-style disabled? dependencies on-complete]
|
||||||
:or {container-style {:flex 1}}}]
|
:or {container-style {:flex 1}}}]
|
||||||
(let [theme (quo.theme/use-theme)
|
(let [theme (quo.theme/use-theme)
|
||||||
auth-method (rf/sub [:auth-method])
|
auth-method (rf/sub [:auth-method])
|
||||||
biometric-auth? (= auth-method constants/auth-method-biometric)
|
biometric-auth? (= auth-method constants/auth-method-biometric)
|
||||||
on-complete (rn/use-callback
|
on-complete-callback (rn/use-callback
|
||||||
(fn [reset-slider-fn]
|
(fn [reset-slider-fn]
|
||||||
(js/setTimeout #(reset-slider-fn false) 500)
|
(js/setTimeout #(reset-slider-fn false) 500)
|
||||||
(rf/dispatch
|
(rf/dispatch [:standard-auth/authorize
|
||||||
[:standard-auth/authorize
|
{:auth-button-icon-left auth-button-icon-left
|
||||||
{:auth-button-icon-left auth-button-icon-left
|
:theme theme
|
||||||
:theme theme
|
:blur? blur?
|
||||||
:blur? blur?
|
:biometric-auth? biometric-auth?
|
||||||
:keycard-supported? keycard-supported?
|
:on-auth-success on-auth-success
|
||||||
:biometric-auth? biometric-auth?
|
:on-auth-fail on-auth-fail
|
||||||
:on-auth-success on-auth-success
|
:auth-button-label auth-button-label}]))
|
||||||
:on-auth-fail on-auth-fail
|
(vec (conj dependencies on-auth-success on-auth-fail)))
|
||||||
:auth-button-label auth-button-label}]))
|
on-complete (or on-complete on-complete-callback)
|
||||||
(vec (conj dependencies on-auth-success on-auth-fail)))
|
biometric-type (rf/sub [:biometrics/supported-type])]
|
||||||
biometric-type (rf/sub [:biometrics/supported-type])]
|
|
||||||
[quo/slide-button
|
[quo/slide-button
|
||||||
{:container-style container-style
|
{:container-style container-style
|
||||||
:size size
|
:size size
|
||||||
|
@ -1,11 +1,20 @@
|
|||||||
(ns status-im.common.terms.view
|
(ns status-im.common.terms.view
|
||||||
(:require-macros [legacy.status-im.utils.slurp :refer [slurp]])
|
(:require-macros [legacy.status-im.utils.slurp :refer [slurp]])
|
||||||
(:require [quo.core :as quo]
|
(:require [quo.core :as quo]
|
||||||
[react-native.gesture :as gesture]))
|
[react-native.gesture :as gesture]
|
||||||
|
[status-im.contexts.settings.common.header :as header]
|
||||||
|
[utils.i18n :as i18n]))
|
||||||
|
|
||||||
(def terms-of-use-text (slurp "resources/terms-of-use.mdwn"))
|
(def terms-of-use-text (slurp "resources/terms-of-use.mdwn"))
|
||||||
|
|
||||||
(defn terms-of-use
|
(defn terms-of-use
|
||||||
[]
|
[]
|
||||||
[gesture/scroll-view {:margin 20}
|
[gesture/scroll-view {:style {:margin 20}}
|
||||||
[quo/text terms-of-use-text]])
|
[quo/text terms-of-use-text]])
|
||||||
|
|
||||||
|
(defn view
|
||||||
|
[]
|
||||||
|
[quo/overlay {:type :shell}
|
||||||
|
[header/view {:title (i18n/label :t/terms-of-service)}]
|
||||||
|
[gesture/scroll-view {:style {:padding-horizontal 20}}
|
||||||
|
[quo/text terms-of-use-text]]])
|
||||||
|
@ -642,3 +642,9 @@
|
|||||||
(def ^:const wallet-connect-transaction-refresh-interval-ms 10000)
|
(def ^:const wallet-connect-transaction-refresh-interval-ms 10000)
|
||||||
|
|
||||||
(def ^:const native-token-symbol "ETH")
|
(def ^:const native-token-symbol "ETH")
|
||||||
|
|
||||||
|
;; About app links
|
||||||
|
(def ^:const status-app-url "http://status.app")
|
||||||
|
(def ^:const go-waku-url "https://github.com/waku-org/go-waku")
|
||||||
|
(def ^:const status-go-url "https://github.com/status-im/status-go")
|
||||||
|
(def ^:const status-mobile-url "https://github.com/status-im/status-mobile")
|
||||||
|
@ -11,30 +11,35 @@
|
|||||||
[{:keys [contact-id]}]
|
[{:keys [contact-id]}]
|
||||||
(let [{:keys [contact-request-state
|
(let [{:keys [contact-request-state
|
||||||
community-id
|
community-id
|
||||||
chat-name]} (rf/sub [:chats/current-chat-chat-view])
|
chat-name]} (rf/sub [:chats/current-chat-chat-view])
|
||||||
chat-type (rf/sub [:chats/chat-type])
|
chat-type (rf/sub [:chats/chat-type])
|
||||||
[primary-name _] (if (= chat-type :public-chat)
|
[primary-name _] (if (= chat-type :public-chat)
|
||||||
[(str "#" chat-name) ""]
|
[(str "#" chat-name) ""]
|
||||||
(rf/sub [:contacts/contact-two-names-by-identity contact-id]))
|
(rf/sub [:contacts/contact-two-names-by-identity contact-id]))
|
||||||
community-chat? (= chat-type :community-chat)
|
community-chat? (= chat-type :community-chat)
|
||||||
joined (when community-chat?
|
joined (when community-chat?
|
||||||
(rf/sub [:communities/community-joined community-id]))
|
(rf/sub [:communities/community-joined community-id]))
|
||||||
pending? (when community-chat?
|
pending? (when community-chat?
|
||||||
(rf/sub [:communities/my-pending-request-to-join community-id]))
|
(rf/sub [:communities/my-pending-request-to-join community-id]))
|
||||||
contact-request-send? (or (not contact-request-state)
|
contact-request-send? (or (not contact-request-state)
|
||||||
(= contact-request-state
|
(= contact-request-state
|
||||||
constants/contact-request-state-none))
|
constants/contact-request-state-none))
|
||||||
contact-request-received? (= contact-request-state
|
contact-request-received? (= contact-request-state
|
||||||
constants/contact-request-state-received)
|
constants/contact-request-state-received)
|
||||||
contact-request-pending? (= contact-request-state
|
contact-request-pending? (= contact-request-state
|
||||||
constants/contact-request-state-sent)]
|
constants/contact-request-state-sent)
|
||||||
|
keycard? (rf/sub [:keycard/keycard-profile?])
|
||||||
|
keycard-feature-unavailable (rn/use-callback
|
||||||
|
#(rf/dispatch [:keycard/feature-unavailable-show]))]
|
||||||
[rn/view {:style style/container}
|
[rn/view {:style style/container}
|
||||||
[quo/permission-context
|
[quo/permission-context
|
||||||
{:blur? true
|
{:blur? true
|
||||||
:on-press (cond
|
:on-press (cond
|
||||||
(and community-chat? (not pending?) (not joined))
|
(and community-chat? (not pending?) (not joined))
|
||||||
#(rf/dispatch [:open-modal :community-account-selection-sheet
|
(if keycard?
|
||||||
{:community-id community-id}])
|
keycard-feature-unavailable
|
||||||
|
#(rf/dispatch [:open-modal :community-account-selection-sheet
|
||||||
|
{:community-id community-id}]))
|
||||||
|
|
||||||
(not community-chat?)
|
(not community-chat?)
|
||||||
#(rf/dispatch [:chat.ui/show-profile contact-id]))
|
#(rf/dispatch [:chat.ui/show-profile contact-id]))
|
||||||
|
@ -27,7 +27,10 @@
|
|||||||
(fn []
|
(fn []
|
||||||
(let [theme (quo.theme/use-theme)
|
(let [theme (quo.theme/use-theme)
|
||||||
{:keys [id]} (rf/sub [:get-screen-params])
|
{:keys [id]} (rf/sub [:get-screen-params])
|
||||||
{:keys [color name images]} (rf/sub [:communities/community id])]
|
{:keys [color name images]} (rf/sub [:communities/community id])
|
||||||
|
keycard? (rf/sub [:keycard/keycard-profile?])
|
||||||
|
keycard-feature-unavailable (rn/use-callback
|
||||||
|
#(rf/dispatch [:keycard/feature-unavailable-show]))]
|
||||||
[rn/safe-area-view {:flex 1}
|
[rn/safe-area-view {:flex 1}
|
||||||
[gesture/scroll-view {:style style/container}
|
[gesture/scroll-view {:style style/container}
|
||||||
[rn/view style/page-container
|
[rn/view style/page-container
|
||||||
@ -59,7 +62,9 @@
|
|||||||
(i18n/label :t/cancel)]
|
(i18n/label :t/cancel)]
|
||||||
[quo/button
|
[quo/button
|
||||||
{:accessibility-label :join-community-button
|
{:accessibility-label :join-community-button
|
||||||
:on-press #(join-community-and-navigate-back id)
|
:on-press (if keycard?
|
||||||
|
keycard-feature-unavailable
|
||||||
|
#(join-community-and-navigate-back id))
|
||||||
:container-style {:flex 1}
|
:container-style {:flex 1}
|
||||||
:inner-style {:background-color (colors/resolve-color color theme)}}
|
:inner-style {:background-color (colors/resolve-color color theme)}}
|
||||||
(i18n/label :t/request-to-join)]]
|
(i18n/label :t/request-to-join)]]
|
||||||
|
@ -106,12 +106,14 @@
|
|||||||
[quo/text (i18n/label :t/network-not-supported)])
|
[quo/text (i18n/label :t/network-not-supported)])
|
||||||
|
|
||||||
(defn- request-access-button
|
(defn- request-access-button
|
||||||
[id color]
|
[id color keycard? keycard-feature-unavailable]
|
||||||
[quo/button
|
[quo/button
|
||||||
{:on-press (if config/community-accounts-selection-enabled?
|
{:on-press (if keycard?
|
||||||
#(rf/dispatch [:open-modal :community-account-selection-sheet
|
keycard-feature-unavailable
|
||||||
{:community-id id}])
|
(if config/community-accounts-selection-enabled?
|
||||||
#(rf/dispatch [:open-modal :community-requests-to-join {:id id}]))
|
#(rf/dispatch [:open-modal :community-account-selection-sheet
|
||||||
|
{:community-id id}])
|
||||||
|
#(rf/dispatch [:open-modal :community-requests-to-join {:id id}])))
|
||||||
:accessibility-label :show-request-to-join-screen-button
|
:accessibility-label :show-request-to-join-screen-button
|
||||||
:customization-color color
|
:customization-color color
|
||||||
:container-style {:margin-bottom 12}
|
:container-style {:margin-bottom 12}
|
||||||
@ -126,27 +128,33 @@
|
|||||||
|
|
||||||
(defn- token-requirements
|
(defn- token-requirements
|
||||||
[{:keys [id color role-permissions?]}]
|
[{:keys [id color role-permissions?]}]
|
||||||
(let [{:keys [can-request-access? no-member-permission? networks-not-supported?
|
(let
|
||||||
highest-permission-role
|
[{:keys [can-request-access? no-member-permission? networks-not-supported?
|
||||||
tokens]} (rf/sub [:community/token-gated-overview id])
|
highest-permission-role
|
||||||
highest-role-text (i18n/label
|
tokens]} (rf/sub [:community/token-gated-overview id])
|
||||||
(communities.utils/role->translation-key highest-permission-role :t/member))
|
highest-role-text (i18n/label
|
||||||
on-press (rn/use-callback
|
(communities.utils/role->translation-key highest-permission-role
|
||||||
(fn []
|
:t/member))
|
||||||
(if config/community-accounts-selection-enabled?
|
on-press (rn/use-callback
|
||||||
(rf/dispatch [:open-modal :community-account-selection-sheet
|
(fn []
|
||||||
{:community-id id}])
|
(if config/community-accounts-selection-enabled?
|
||||||
(rf/dispatch [:open-modal :community-requests-to-join
|
(rf/dispatch [:open-modal :community-account-selection-sheet
|
||||||
{:id id}])))
|
{:community-id id}])
|
||||||
[id])
|
(rf/dispatch [:open-modal :community-requests-to-join
|
||||||
on-press-info #(rf/dispatch
|
{:id id}])))
|
||||||
[:show-bottom-sheet {:content token-gated-communities-info}])]
|
[id])
|
||||||
|
on-press-info #(rf/dispatch
|
||||||
|
[:show-bottom-sheet {:content token-gated-communities-info}])
|
||||||
|
keycard? (rf/sub [:keycard/keycard-profile?])
|
||||||
|
keycard-feature-unavailable (rn/use-callback
|
||||||
|
#(rf/dispatch [:keycard/feature-unavailable-show]))]
|
||||||
|
|
||||||
(cond
|
(cond
|
||||||
networks-not-supported?
|
networks-not-supported?
|
||||||
[network-not-supported]
|
[network-not-supported]
|
||||||
|
|
||||||
(or (not role-permissions?) no-member-permission?)
|
(or (not role-permissions?) no-member-permission?)
|
||||||
[request-access-button id color]
|
[request-access-button id color keycard? keycard-feature-unavailable]
|
||||||
|
|
||||||
:else
|
:else
|
||||||
[quo/community-token-gating
|
[quo/community-token-gating
|
||||||
@ -154,7 +162,7 @@
|
|||||||
:tokens tokens
|
:tokens tokens
|
||||||
:community-color color
|
:community-color color
|
||||||
:satisfied? can-request-access?
|
:satisfied? can-request-access?
|
||||||
:on-press on-press
|
:on-press (if keycard? keycard-feature-unavailable on-press)
|
||||||
:on-press-info on-press-info}])))
|
:on-press-info on-press-info}])))
|
||||||
|
|
||||||
(defn- join-community
|
(defn- join-community
|
||||||
|
@ -9,7 +9,9 @@
|
|||||||
status-im.contexts.keycard.pin.events
|
status-im.contexts.keycard.pin.events
|
||||||
status-im.contexts.keycard.sign.events
|
status-im.contexts.keycard.sign.events
|
||||||
[status-im.contexts.keycard.utils :as keycard.utils]
|
[status-im.contexts.keycard.utils :as keycard.utils]
|
||||||
utils.datetime))
|
[utils.address :as address]
|
||||||
|
utils.datetime
|
||||||
|
[utils.ethereum.eip.eip55 :as eip55]))
|
||||||
|
|
||||||
(rf/reg-event-fx :keycard/on-card-connected
|
(rf/reg-event-fx :keycard/on-card-connected
|
||||||
(fn [{:keys [db]} _]
|
(fn [{:keys [db]} _]
|
||||||
@ -65,6 +67,30 @@
|
|||||||
(fn [_ [data]]
|
(fn [_ [data]]
|
||||||
{:effects.keycard/export-key data}))
|
{:effects.keycard/export-key data}))
|
||||||
|
|
||||||
|
(rf/reg-event-fx :keycard/connect-derive-address-and-add-account
|
||||||
|
(fn [_ [{:keys [pin derivation-path key-uid account-preferences]}]]
|
||||||
|
{:fx [[:dispatch
|
||||||
|
[:keycard/connect
|
||||||
|
{:key-uid key-uid
|
||||||
|
:on-success
|
||||||
|
(fn []
|
||||||
|
(rf/dispatch
|
||||||
|
[:keycard/export-key
|
||||||
|
{:pin pin
|
||||||
|
:path derivation-path
|
||||||
|
:on-success (fn [public-key]
|
||||||
|
(let [derived-account {:public-key (str "0x" public-key)
|
||||||
|
:address (eip55/address->checksum
|
||||||
|
(str "0x"
|
||||||
|
(address/public-key->address
|
||||||
|
(subs public-key 2))))
|
||||||
|
:path derivation-path}]
|
||||||
|
(rf/dispatch [:keycard/disconnect])
|
||||||
|
(rf/dispatch [:wallet/add-account
|
||||||
|
(assoc account-preferences :key-uid key-uid)
|
||||||
|
derived-account])))
|
||||||
|
:on-failure #(rf/dispatch [:keycard/on-action-with-pin-error %])}]))}]]]}))
|
||||||
|
|
||||||
(rf/reg-event-fx :keycard/cancel-connection
|
(rf/reg-event-fx :keycard/cancel-connection
|
||||||
(fn [{:keys [db]}]
|
(fn [{:keys [db]}]
|
||||||
{:db (update db
|
{:db (update db
|
||||||
|
@ -5,5 +5,8 @@
|
|||||||
|
|
||||||
(rf/reg-event-fx
|
(rf/reg-event-fx
|
||||||
:keycard/feature-unavailable-show
|
:keycard/feature-unavailable-show
|
||||||
(fn [_]
|
(fn [_ [options]]
|
||||||
{:fx [[:dispatch [:show-bottom-sheet {:content feature-unavailable/view}]]]}))
|
{:fx [[:dispatch
|
||||||
|
[:show-bottom-sheet
|
||||||
|
{:theme (:theme options)
|
||||||
|
:content feature-unavailable/view}]]]}))
|
||||||
|
@ -91,7 +91,7 @@
|
|||||||
:title (i18n/label :t/log-in-by-syncing)
|
:title (i18n/label :t/log-in-by-syncing)
|
||||||
:subtitle (i18n/label :t/log-in-by-syncing-subtitle)
|
:subtitle (i18n/label :t/log-in-by-syncing-subtitle)
|
||||||
:accessibility-label :log-in-by-syncing-icon-card
|
:accessibility-label :log-in-by-syncing-icon-card
|
||||||
:image (resources/get-image :ethereum-address)
|
:image (resources/get-image :login-syncing)
|
||||||
:on-press show-check-before-syncing}])
|
:on-press show-check-before-syncing}])
|
||||||
|
|
||||||
(defn- use-empty-keycard-icon-card
|
(defn- use-empty-keycard-icon-card
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
(ns status-im.contexts.onboarding.share-usage.style)
|
(ns status-im.contexts.onboarding.share-usage.style
|
||||||
|
(:require [quo.foundations.colors :as colors]))
|
||||||
|
|
||||||
(def title-container
|
(def title-container
|
||||||
{:margin-horizontal 20
|
{:margin-horizontal 20
|
||||||
@ -16,3 +17,7 @@
|
|||||||
[insets]
|
[insets]
|
||||||
{:margin 20
|
{:margin 20
|
||||||
:margin-bottom (+ 12 (:bottom insets))})
|
:margin-bottom (+ 12 (:bottom insets))})
|
||||||
|
|
||||||
|
(def page
|
||||||
|
{:flex 1
|
||||||
|
:background-color colors/neutral-100})
|
||||||
|
@ -17,35 +17,38 @@
|
|||||||
(rf/dispatch [:navigate-to-within-stack [next-screen :screen/onboarding.share-usage]]) ;; Onboarding
|
(rf/dispatch [:navigate-to-within-stack [next-screen :screen/onboarding.share-usage]]) ;; Onboarding
|
||||||
(rf/dispatch [:navigate-back]))) ;; Login Screen
|
(rf/dispatch [:navigate-back]))) ;; Login Screen
|
||||||
|
|
||||||
|
(defn- learn-more
|
||||||
|
[]
|
||||||
|
(rf/dispatch [:show-bottom-sheet
|
||||||
|
{:content learn-more-sheet/view
|
||||||
|
:shell? true}]))
|
||||||
|
|
||||||
(defn view
|
(defn view
|
||||||
[]
|
[]
|
||||||
(let [insets (safe-area/get-insets)
|
(let [insets (safe-area/get-insets)
|
||||||
next-screen (:next-screen (rf/sub [:get-screen-params :screen/onboarding.share-usage]))
|
next-screen (:next-screen (rf/sub [:get-screen-params :screen/onboarding.share-usage]))
|
||||||
share-usage-data (rn/use-callback #(share-usage-data-fn true next-screen))
|
share-usage-data (rn/use-callback #(share-usage-data-fn true next-screen))
|
||||||
maybe-later (rn/use-callback #(share-usage-data-fn false next-screen))
|
maybe-later (rn/use-callback #(share-usage-data-fn false next-screen))]
|
||||||
learn-more (rn/use-callback #(rf/dispatch [:show-bottom-sheet
|
[rn/view {:style style/page}
|
||||||
{:content learn-more-sheet/view
|
|
||||||
:shell? true}]))]
|
|
||||||
[:<>
|
|
||||||
[quo/page-nav
|
[quo/page-nav
|
||||||
{:margin-top (:top insets)
|
{:margin-top (:top insets)
|
||||||
:background :blur
|
:background :blur
|
||||||
:icon-name :i/arrow-left
|
:icon-name :i/close
|
||||||
:on-press events-helper/navigate-back
|
:on-press events-helper/navigate-back
|
||||||
:right-side [{:icon-left :i/info
|
:right-side [{:icon-left :i/info
|
||||||
:accessibility-label :learn-more
|
:accessibility-label :learn-more
|
||||||
:label (i18n/label :t/learn-more)
|
:label (i18n/label :t/learn-more)
|
||||||
:on-press learn-more}]}]
|
:on-press learn-more}]}]
|
||||||
[quo/text-combinations
|
[quo/page-top
|
||||||
{:container-style style/title-container
|
{:title (i18n/label :t/help-us-improve-status)
|
||||||
:title (i18n/label :t/help-us-improve-status)
|
|
||||||
:title-accessibility-label :share-usage-title
|
:title-accessibility-label :share-usage-title
|
||||||
:description (i18n/label :t/collecting-usage-data)
|
:description :text
|
||||||
|
:description-text (i18n/label :t/collecting-usage-data)
|
||||||
:description-accessibility-label :share-usage-subtitle}]
|
:description-accessibility-label :share-usage-subtitle}]
|
||||||
[rn/image
|
[rn/image
|
||||||
{:resize-mode :contain
|
{:resize-mode :contain
|
||||||
:style (style/page-illustration (:width (rn/get-window)))
|
:style (style/page-illustration (:width (rn/get-window)))
|
||||||
:source (resources/get-image :biometrics)}]
|
:source (resources/get-image :usage-data)}]
|
||||||
[rn/view {:style (style/buttons insets)}
|
[rn/view {:style (style/buttons insets)}
|
||||||
[quo/button
|
[quo/button
|
||||||
{:size 40
|
{:size 40
|
||||||
|
@ -125,7 +125,7 @@
|
|||||||
:blur? true
|
:blur? true
|
||||||
:image-props :i/light})]
|
:image-props :i/light})]
|
||||||
[{:title (i18n/label :t/about)
|
[{:title (i18n/label :t/about)
|
||||||
:on-press #(rf/dispatch [:open-modal :about-app])
|
:on-press #(rf/dispatch [:open-modal :screen/settings.about])
|
||||||
:action :arrow
|
:action :arrow
|
||||||
:blur? true}
|
:blur? true}
|
||||||
{:title (i18n/label :t/status-help)
|
{:title (i18n/label :t/status-help)
|
||||||
|
@ -7,33 +7,37 @@
|
|||||||
[utils.re-frame :as rf]))
|
[utils.re-frame :as rf]))
|
||||||
|
|
||||||
(defn- on-press-biometric-enable
|
(defn- on-press-biometric-enable
|
||||||
[button-label theme]
|
[button-label theme keycard-profile?]
|
||||||
(fn []
|
(fn []
|
||||||
(rf/dispatch
|
(if keycard-profile?
|
||||||
[:standard-auth/authorize-with-password
|
(rf/dispatch [:keycard/feature-unavailable-show {:theme :dark}])
|
||||||
{:blur? true
|
(rf/dispatch
|
||||||
:theme theme
|
[:standard-auth/authorize-with-password
|
||||||
:auth-button-label (i18n/label :t/biometric-enable-button {:bio-type-label button-label})
|
{:blur? true
|
||||||
:on-auth-success (fn [password]
|
:theme theme
|
||||||
(rf/dispatch [:hide-bottom-sheet])
|
:auth-button-label (i18n/label :t/biometric-enable-button {:bio-type-label button-label})
|
||||||
(rf/dispatch
|
:on-auth-success (fn [password]
|
||||||
[:biometric/authenticate
|
(rf/dispatch [:hide-bottom-sheet])
|
||||||
{:on-success #(rf/dispatch [:biometric/enable password])
|
(rf/dispatch
|
||||||
:on-fail #(rf/dispatch [:biometric/show-message (ex-cause %)])}]))}])))
|
[:biometric/authenticate
|
||||||
|
{:on-success #(rf/dispatch [:biometric/enable password])
|
||||||
|
:on-fail #(rf/dispatch [:biometric/show-message
|
||||||
|
(ex-cause %)])}]))}]))))
|
||||||
|
|
||||||
(defn- get-biometric-item
|
(defn- get-biometric-item
|
||||||
[theme]
|
[theme]
|
||||||
(let [auth-method (rf/sub [:auth-method])
|
(let [auth-method (rf/sub [:auth-method])
|
||||||
biometric-type (rf/sub [:biometrics/supported-type])
|
biometric-type (rf/sub [:biometrics/supported-type])
|
||||||
label (biometric/get-label-by-type biometric-type)
|
keycard-profile? (rf/sub [:keycard/keycard-profile?])
|
||||||
icon (biometric/get-icon-by-type biometric-type)
|
label (biometric/get-label-by-type biometric-type)
|
||||||
supported? (boolean biometric-type)
|
icon (biometric/get-icon-by-type biometric-type)
|
||||||
enabled? (= auth-method constants/auth-method-biometric)
|
supported? (boolean biometric-type)
|
||||||
biometric-on? (and supported? enabled?)
|
enabled? (= auth-method constants/auth-method-biometric)
|
||||||
press-handler (when supported?
|
biometric-on? (and supported? enabled?)
|
||||||
(if biometric-on?
|
press-handler (when supported?
|
||||||
(fn [] (rf/dispatch [:biometric/disable]))
|
(if biometric-on?
|
||||||
(on-press-biometric-enable label theme)))]
|
(fn [] (rf/dispatch [:biometric/disable]))
|
||||||
|
(on-press-biometric-enable label theme keycard-profile?)))]
|
||||||
{:title label
|
{:title label
|
||||||
:image-props icon
|
:image-props icon
|
||||||
:image :icon
|
:image :icon
|
||||||
@ -58,7 +62,8 @@
|
|||||||
|
|
||||||
(defn view
|
(defn view
|
||||||
[]
|
[]
|
||||||
(let [theme (quo.theme/use-theme)]
|
(let [theme (quo.theme/use-theme)
|
||||||
|
keycard-profile? (rf/sub [:keycard/keycard-profile?])]
|
||||||
[quo/overlay {:type :shell :top-inset? true}
|
[quo/overlay {:type :shell :top-inset? true}
|
||||||
[quo/page-nav
|
[quo/page-nav
|
||||||
{:background :blur
|
{:background :blur
|
||||||
@ -68,6 +73,7 @@
|
|||||||
[quo/category
|
[quo/category
|
||||||
{:key :category
|
{:key :category
|
||||||
:data [(get-biometric-item theme)
|
:data [(get-biometric-item theme)
|
||||||
(get-change-password-item)]
|
(when-not keycard-profile?
|
||||||
|
(get-change-password-item))]
|
||||||
:blur? true
|
:blur? true
|
||||||
:list-type :settings}]]))
|
:list-type :settings}]]))
|
||||||
|
9
src/status_im/contexts/settings/about/style.cljs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
(ns status-im.contexts.settings.about.style)
|
||||||
|
|
||||||
|
(def category-spacing {:padding-bottom 12})
|
||||||
|
|
||||||
|
(def app-info-container
|
||||||
|
{:padding-horizontal 20
|
||||||
|
:padding-top 8
|
||||||
|
:padding-bottom 16
|
||||||
|
:row-gap 16})
|
101
src/status_im/contexts/settings/about/view.cljs
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
(ns status-im.contexts.settings.about.view
|
||||||
|
(:require [quo.core :as quo]
|
||||||
|
[react-native.core :as rn]
|
||||||
|
[status-im.constants :as constants]
|
||||||
|
[status-im.contexts.settings.about.style :as style]
|
||||||
|
[status-im.contexts.settings.common.header :as header]
|
||||||
|
[utils.i18n :as i18n]
|
||||||
|
[utils.re-frame :as rf]))
|
||||||
|
|
||||||
|
(defn- open-link
|
||||||
|
[url]
|
||||||
|
(rf/dispatch [:browser.ui/open-url url]))
|
||||||
|
|
||||||
|
(defn- copy
|
||||||
|
[data item-name]
|
||||||
|
(rf/dispatch [:share/copy-text-and-show-toast
|
||||||
|
{:text-to-copy data
|
||||||
|
:post-copy-message (str item-name
|
||||||
|
" "
|
||||||
|
(i18n/label :t/sharing-copied-to-clipboard))}]))
|
||||||
|
|
||||||
|
(def about-data
|
||||||
|
[{:app-info? true}
|
||||||
|
{:category-label (i18n/label :t/website)
|
||||||
|
:items [{:title "status.app"
|
||||||
|
:on-press #(open-link constants/status-app-url)
|
||||||
|
:blur? true
|
||||||
|
:action :arrow
|
||||||
|
:action-props {:icon :i/external}}]}
|
||||||
|
{:category-label (i18n/label :t/github-repos)
|
||||||
|
:items [{:title "status-mobile"
|
||||||
|
:on-press #(open-link constants/status-mobile-url)
|
||||||
|
:blur? true
|
||||||
|
:action :arrow
|
||||||
|
:action-props {:icon :i/external}}
|
||||||
|
{:title "status-go"
|
||||||
|
:on-press #(open-link constants/status-go-url)
|
||||||
|
:blur? true
|
||||||
|
:action :arrow
|
||||||
|
:action-props {:icon :i/external}}
|
||||||
|
{:title "go-waku"
|
||||||
|
:on-press #(open-link constants/go-waku-url)
|
||||||
|
:blur? true
|
||||||
|
:action :arrow
|
||||||
|
:action-props {:icon :i/external}}]}
|
||||||
|
{:category-label (i18n/label :t/documents)
|
||||||
|
:items [{:title (i18n/label :t/privacy-policy)
|
||||||
|
:on-press #(rf/dispatch [:open-modal :screen/settings.privacy-policy])
|
||||||
|
:blur? true
|
||||||
|
:action :arrow}
|
||||||
|
{:title (i18n/label :t/terms-of-service)
|
||||||
|
:on-press #(rf/dispatch [:open-modal :screen/settings.terms-of-use])
|
||||||
|
:blur? true
|
||||||
|
:action :arrow}]}])
|
||||||
|
|
||||||
|
(defn info-item
|
||||||
|
[{:keys [title info]}]
|
||||||
|
[quo/data-item
|
||||||
|
{:size :default
|
||||||
|
:status :default
|
||||||
|
:right-icon :i/copy
|
||||||
|
:card? true
|
||||||
|
:blur? true
|
||||||
|
:title title
|
||||||
|
:on-press #(copy info title)
|
||||||
|
:subtitle info
|
||||||
|
:subtitle-type :default
|
||||||
|
:subtitle-text-props {:number-of-lines 1
|
||||||
|
:ellipsize-mode :middle}}])
|
||||||
|
|
||||||
|
(defn- app-info
|
||||||
|
[]
|
||||||
|
(let [app-version (rf/sub [:get-app-short-version])
|
||||||
|
commit-hash (rf/sub [:get-commit-hash])
|
||||||
|
node-version (rf/sub [:get-app-node-version])]
|
||||||
|
[rn/view {:style style/app-info-container}
|
||||||
|
[info-item {:title (i18n/label :t/version) :info app-version}]
|
||||||
|
[info-item {:title (i18n/label :t/app-commit) :info commit-hash}]
|
||||||
|
[info-item {:title (i18n/label :t/node-version) :info node-version}]]))
|
||||||
|
|
||||||
|
(defn category
|
||||||
|
[{:keys [app-info? category-label items]}]
|
||||||
|
(if app-info?
|
||||||
|
[app-info]
|
||||||
|
[quo/category
|
||||||
|
{:label category-label
|
||||||
|
:list-type :settings
|
||||||
|
:container-style style/category-spacing
|
||||||
|
:blur? true
|
||||||
|
:data items}]))
|
||||||
|
|
||||||
|
(defn view
|
||||||
|
[]
|
||||||
|
[quo/overlay {:type :shell}
|
||||||
|
[header/view {:title (i18n/label :t/about)}]
|
||||||
|
[rn/flat-list
|
||||||
|
{:data about-data
|
||||||
|
:shows-vertical-scroll-indicator false
|
||||||
|
:render-fn category
|
||||||
|
:bounces false
|
||||||
|
:over-scroll-mode :never}]])
|
14
src/status_im/contexts/settings/common/header.cljs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
(ns status-im.contexts.settings.common.header
|
||||||
|
(:require [quo.core :as quo]
|
||||||
|
[react-native.core :as rn]
|
||||||
|
[react-native.safe-area :as safe-area]
|
||||||
|
[status-im.common.events-helper :as events-helper]))
|
||||||
|
|
||||||
|
(defn view
|
||||||
|
[{:keys [title]}]
|
||||||
|
[rn/view {:style {:padding-top (safe-area/get-top)}}
|
||||||
|
[quo/page-nav
|
||||||
|
{:background :blur
|
||||||
|
:icon-name :i/arrow-left
|
||||||
|
:on-press events-helper/navigate-back}]
|
||||||
|
[quo/page-top {:title title}]])
|
@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
(defn- keypair
|
(defn- keypair
|
||||||
[{keypair-type :type
|
[{keypair-type :type
|
||||||
:keys [accounts name]
|
:keys [accounts name keycard?]
|
||||||
:as item}
|
:as item}
|
||||||
_ _
|
_ _
|
||||||
{:keys [profile-picture compressed-key customization-color]}]
|
{:keys [profile-picture compressed-key customization-color]}]
|
||||||
@ -59,7 +59,7 @@
|
|||||||
:type (if default-keypair?
|
:type (if default-keypair?
|
||||||
:default-keypair
|
:default-keypair
|
||||||
:keypair)
|
:keypair)
|
||||||
:stored :on-device
|
:stored (if keycard? :on-keycard :on-device)
|
||||||
:shortened-key shortened-key
|
:shortened-key shortened-key
|
||||||
:customization-color customization-color
|
:customization-color customization-color
|
||||||
:profile-picture profile-picture})}))
|
:profile-picture profile-picture})}))
|
||||||
@ -68,7 +68,7 @@
|
|||||||
[quo/keypair
|
[quo/keypair
|
||||||
{:blur? true
|
{:blur? true
|
||||||
:status-indicator false
|
:status-indicator false
|
||||||
:stored :on-device
|
:stored (if keycard? :on-keycard :on-device)
|
||||||
:action (if default-keypair? :none :options)
|
:action (if default-keypair? :none :options)
|
||||||
:accounts accounts
|
:accounts accounts
|
||||||
:customization-color customization-color
|
:customization-color customization-color
|
||||||
|
@ -38,7 +38,11 @@
|
|||||||
#(if (:enabled? %)
|
#(if (:enabled? %)
|
||||||
:paired-devices
|
:paired-devices
|
||||||
:unpaired-devices)
|
:unpaired-devices)
|
||||||
other-devices)]
|
other-devices)
|
||||||
|
keycard? (rf/sub [:keycard/keycard-profile?])
|
||||||
|
keycard-feature-unavailable (rn/use-callback
|
||||||
|
#(rf/dispatch [:keycard/feature-unavailable-show
|
||||||
|
{:theme :dark}]))]
|
||||||
[quo/overlay {:type :shell :top-inset? true}
|
[quo/overlay {:type :shell :top-inset? true}
|
||||||
[quo/page-nav
|
[quo/page-nav
|
||||||
{:type :no-title
|
{:type :no-title
|
||||||
@ -60,7 +64,9 @@
|
|||||||
:type :primary
|
:type :primary
|
||||||
:customization-color profile-color
|
:customization-color profile-color
|
||||||
:icon-only? true
|
:icon-only? true
|
||||||
:on-press open-setup-syncing-with-customization-color}
|
:on-press (if keycard?
|
||||||
|
keycard-feature-unavailable
|
||||||
|
open-setup-syncing-with-customization-color)}
|
||||||
:i/add]]
|
:i/add]]
|
||||||
[device/view (merge user-device {:this-device? true})]
|
[device/view (merge user-device {:this-device? true})]
|
||||||
(when (seq paired-devices)
|
(when (seq paired-devices)
|
||||||
|
@ -69,7 +69,9 @@
|
|||||||
(let [{:keys [customization-color] :as profile} (rf/sub [:profile/profile-with-image])
|
(let [{:keys [customization-color] :as profile} (rf/sub [:profile/profile-with-image])
|
||||||
{:keys [address path watch-only?]} (rf/sub [:wallet/current-viewing-account])
|
{:keys [address path watch-only?]} (rf/sub [:wallet/current-viewing-account])
|
||||||
{keypair-name :name
|
{keypair-name :name
|
||||||
keypair-type :type} (rf/sub [:wallet/current-viewing-account-keypair])
|
keypair-type :type
|
||||||
|
keycards :keycards} (rf/sub [:wallet/current-viewing-account-keypair])
|
||||||
|
keypair-keycard? (boolean (seq keycards))
|
||||||
networks (rf/sub [:wallet/network-preference-details])
|
networks (rf/sub [:wallet/network-preference-details])
|
||||||
origin-type (case keypair-type
|
origin-type (case keypair-type
|
||||||
:seed
|
:seed
|
||||||
@ -98,7 +100,7 @@
|
|||||||
(when (not watch-only?)
|
(when (not watch-only?)
|
||||||
[quo/account-origin
|
[quo/account-origin
|
||||||
{:type origin-type
|
{:type origin-type
|
||||||
:stored :on-device
|
:stored (if keypair-keycard? :on-keycard :on-device)
|
||||||
:profile-picture (profile.utils/photo profile)
|
:profile-picture (profile.utils/photo profile)
|
||||||
:customization-color customization-color
|
:customization-color customization-color
|
||||||
:derivation-path path
|
:derivation-path path
|
||||||
|
@ -58,13 +58,14 @@
|
|||||||
[item _ _
|
[item _ _
|
||||||
{:keys [profile-picture compressed-key selected-key-uid set-selected-key-uid customization-color]}]
|
{:keys [profile-picture compressed-key selected-key-uid set-selected-key-uid customization-color]}]
|
||||||
(let [profile-keypair? (= (:type item) :profile)
|
(let [profile-keypair? (= (:type item) :profile)
|
||||||
|
keycard? (boolean (seq (:keycards item)))
|
||||||
accounts (parse-accounts (:accounts item))]
|
accounts (parse-accounts (:accounts item))]
|
||||||
[quo/keypair
|
[quo/keypair
|
||||||
{:customization-color customization-color
|
{:customization-color customization-color
|
||||||
:profile-picture (when profile-keypair? profile-picture)
|
:profile-picture (when profile-keypair? profile-picture)
|
||||||
:status-indicator false
|
:status-indicator false
|
||||||
:type (if profile-keypair? :default-keypair :other)
|
:type (if profile-keypair? :default-keypair :other)
|
||||||
:stored :on-device
|
:stored (if keycard? :on-keycard :on-device)
|
||||||
:on-options-press #(js/alert "Options pressed")
|
:on-options-press #(js/alert "Options pressed")
|
||||||
:action :selector
|
:action :selector
|
||||||
:blur? false
|
:blur? false
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
[utils.string]))
|
[utils.string]))
|
||||||
|
|
||||||
(defn- get-keypair-data
|
(defn- get-keypair-data
|
||||||
[{:keys [title primary-keypair? new-keypair? derivation-path customization-color]}]
|
[{:keys [title primary-keypair? new-keypair? derivation-path customization-color keycard?]}]
|
||||||
[{:title title
|
[{:title title
|
||||||
:image (if primary-keypair? :avatar :icon)
|
:image (if primary-keypair? :avatar :icon)
|
||||||
:image-props (if primary-keypair?
|
:image-props (if primary-keypair?
|
||||||
@ -35,7 +35,7 @@
|
|||||||
:button-text (i18n/label :t/edit)
|
:button-text (i18n/label :t/edit)
|
||||||
:alignment :flex-start}
|
:alignment :flex-start}
|
||||||
:description :text
|
:description :text
|
||||||
:description-props {:text (i18n/label :t/on-device)}}
|
:description-props {:text (i18n/label (if keycard? :on-keycard :on-device))}}
|
||||||
(when-not (string/blank? derivation-path)
|
(when-not (string/blank? derivation-path)
|
||||||
(let [formatted-path (string/replace derivation-path #"/" " / ")
|
(let [formatted-path (string/replace derivation-path #"/" " / ")
|
||||||
on-auth-success (fn [password]
|
on-auth-success (fn [password]
|
||||||
@ -123,7 +123,7 @@
|
|||||||
:container-style color-picker-style}]])])))
|
:container-style color-picker-style}]])])))
|
||||||
|
|
||||||
(defn- new-account-origin
|
(defn- new-account-origin
|
||||||
[{:keys [keypair-title derivation-path customization-color]}]
|
[{:keys [keypair-title derivation-path customization-color keycard?]}]
|
||||||
(let [{keypair-name :name} (rf/sub [:wallet/selected-keypair])
|
(let [{keypair-name :name} (rf/sub [:wallet/selected-keypair])
|
||||||
primary? (rf/sub [:wallet/selected-primary-keypair?])
|
primary? (rf/sub [:wallet/selected-primary-keypair?])
|
||||||
keypair-name (or keypair-title
|
keypair-name (or keypair-title
|
||||||
@ -135,7 +135,8 @@
|
|||||||
[quo/category
|
[quo/category
|
||||||
{:list-type :settings
|
{:list-type :settings
|
||||||
:label (i18n/label :t/origin)
|
:label (i18n/label :t/origin)
|
||||||
:data (get-keypair-data {:primary-keypair? primary?
|
:data (get-keypair-data {:keycard? keycard?
|
||||||
|
:primary-keypair? primary?
|
||||||
:title keypair-name
|
:title keypair-name
|
||||||
:derivation-path derivation-path
|
:derivation-path derivation-path
|
||||||
:customization-color customization-color})}]]))
|
:customization-color customization-color})}]]))
|
||||||
@ -229,20 +230,37 @@
|
|||||||
set-derivation-path #(reset! derivation-path %)]
|
set-derivation-path #(reset! derivation-path %)]
|
||||||
(fn [{:keys [on-change-text set-account-color set-emoji customization-color error]}]
|
(fn [{:keys [on-change-text set-account-color set-emoji customization-color error]}]
|
||||||
(let [{:keys [derived-from
|
(let [{:keys [derived-from
|
||||||
key-uid]} (rf/sub [:wallet/selected-keypair])
|
key-uid keycards]} (rf/sub [:wallet/selected-keypair])
|
||||||
on-auth-success (rn/use-callback
|
keycard? (boolean (seq keycards))
|
||||||
(fn [password]
|
on-auth-success (rn/use-callback
|
||||||
(let [preferences {:account-name @account-name
|
(fn [password]
|
||||||
:color @account-color
|
(let [preferences {:account-name @account-name
|
||||||
:emoji @emoji}]
|
:color @account-color
|
||||||
(rf/dispatch
|
:emoji @emoji}]
|
||||||
[:wallet/derive-address-and-add-account
|
(rf/dispatch
|
||||||
{:password password
|
[:wallet/derive-address-and-add-account
|
||||||
:derived-from-address derived-from
|
{:password password
|
||||||
:key-uid key-uid
|
:derived-from-address derived-from
|
||||||
:derivation-path @derivation-path
|
:key-uid key-uid
|
||||||
:account-preferences preferences}])))
|
:derivation-path @derivation-path
|
||||||
[derived-from])]
|
:account-preferences preferences}])))
|
||||||
|
[derived-from])
|
||||||
|
on-complete (rn/use-callback
|
||||||
|
(fn []
|
||||||
|
(let [preferences {:account-name @account-name
|
||||||
|
:color @account-color
|
||||||
|
:emoji @emoji}]
|
||||||
|
(rf/dispatch
|
||||||
|
[:standard-auth/authorize-with-keycard
|
||||||
|
{:on-complete
|
||||||
|
#(rf/dispatch
|
||||||
|
[:keycard/connect-derive-address-and-add-account
|
||||||
|
{:pin %
|
||||||
|
:derived-from-address derived-from
|
||||||
|
:key-uid key-uid
|
||||||
|
:derivation-path @derivation-path
|
||||||
|
:account-preferences preferences}])}])))
|
||||||
|
[derived-from])]
|
||||||
(rn/use-effect
|
(rn/use-effect
|
||||||
#(rf/dispatch
|
#(rf/dispatch
|
||||||
[:wallet/next-derivation-path
|
[:wallet/next-derivation-path
|
||||||
@ -252,10 +270,13 @@
|
|||||||
|
|
||||||
[floating-button
|
[floating-button
|
||||||
{:account-color @account-color
|
{:account-color @account-color
|
||||||
:slide-button-props {:on-auth-success on-auth-success
|
:slide-button-props {:on-auth-success (when-not keycard? on-auth-success)
|
||||||
:disabled? (or (empty? @account-name)
|
:on-complete
|
||||||
(string/blank? @derivation-path)
|
(when keycard? on-complete)
|
||||||
(some? error))}}
|
:disabled?
|
||||||
|
(or (empty? @account-name)
|
||||||
|
(string/blank? @derivation-path)
|
||||||
|
(some? error))}}
|
||||||
[avatar
|
[avatar
|
||||||
{:account-color @account-color
|
{:account-color @account-color
|
||||||
:emoji @emoji
|
:emoji @emoji
|
||||||
@ -269,7 +290,8 @@
|
|||||||
{:account-color @account-color
|
{:account-color @account-color
|
||||||
:set-account-color set-account-color}]
|
:set-account-color set-account-color}]
|
||||||
[new-account-origin
|
[new-account-origin
|
||||||
{:derivation-path @derivation-path
|
{:keycard? keycard?
|
||||||
|
:derivation-path @derivation-path
|
||||||
:customization-color customization-color}]]))))
|
:customization-color customization-color}]]))))
|
||||||
|
|
||||||
(defn view
|
(defn view
|
||||||
|
@ -307,9 +307,8 @@
|
|||||||
|
|
||||||
(rf/reg-event-fx :wallet/add-account
|
(rf/reg-event-fx :wallet/add-account
|
||||||
(fn [_
|
(fn [_
|
||||||
[{:keys [key-uid password account-name emoji color type]
|
[{:keys [key-uid password account-name emoji color type] :or {type :generated}}
|
||||||
:or {type :generated}}
|
{:keys [public-key address path]}]]
|
||||||
{:keys [public-key address path] :as _derived-account}]]
|
|
||||||
(let [lowercase-address (some-> address
|
(let [lowercase-address (some-> address
|
||||||
string/lower-case)
|
string/lower-case)
|
||||||
account-config {:key-uid (when (= type :generated) key-uid)
|
account-config {:key-uid (when (= type :generated) key-uid)
|
||||||
|
@ -248,7 +248,9 @@
|
|||||||
account))}
|
account))}
|
||||||
user-props {:full-name to-address
|
user-props {:full-name to-address
|
||||||
:address (utils/get-shortened-address
|
:address (utils/get-shortened-address
|
||||||
to-address)}]
|
to-address)}
|
||||||
|
sign-on-keycard? (get-in transaction-for-signing
|
||||||
|
[:signingDetails :signOnKeycard])]
|
||||||
;; In token send flow we already have transaction built when
|
;; In token send flow we already have transaction built when
|
||||||
;; we reach confirmation screen. But in send collectible flow
|
;; we reach confirmation screen. But in send collectible flow
|
||||||
;; routes request happens at the same time with navigation to
|
;; routes request happens at the same time with navigation to
|
||||||
@ -279,20 +281,24 @@
|
|||||||
:transaction-type transaction-type}]
|
:transaction-type transaction-type}]
|
||||||
(when (and (not loading-suggested-routes?) route (seq route))
|
(when (and (not loading-suggested-routes?) route (seq route))
|
||||||
[standard-auth/slide-button
|
[standard-auth/slide-button
|
||||||
{:keycard-supported? true
|
{:size :size-48
|
||||||
:size :size-48
|
|
||||||
:track-text (if (= transaction-type :tx/bridge)
|
:track-text (if (= transaction-type :tx/bridge)
|
||||||
(i18n/label :t/slide-to-bridge)
|
(i18n/label :t/slide-to-bridge)
|
||||||
(i18n/label :t/slide-to-send))
|
(i18n/label :t/slide-to-send))
|
||||||
:container-style {:z-index 2}
|
:container-style {:z-index 2}
|
||||||
:disabled? (not transaction-for-signing)
|
:disabled? (not transaction-for-signing)
|
||||||
:customization-color account-color
|
:customization-color account-color
|
||||||
|
:auth-button-label (i18n/label :t/confirm)
|
||||||
|
:on-complete (when sign-on-keycard?
|
||||||
|
#(rf/dispatch
|
||||||
|
[:wallet/prepare-signatures-for-transactions
|
||||||
|
:send
|
||||||
|
""]))
|
||||||
:on-auth-success
|
:on-auth-success
|
||||||
(fn [data]
|
(fn [psw]
|
||||||
(rf/dispatch
|
(rf/dispatch
|
||||||
[:wallet/prepare-signatures-for-transactions
|
[:wallet/prepare-signatures-for-transactions :send
|
||||||
:send data]))
|
psw]))}])]
|
||||||
:auth-button-label (i18n/label :t/confirm)}])]
|
|
||||||
:gradient-cover? true
|
:gradient-cover? true
|
||||||
:customization-color (:color account)}
|
:customization-color (:color account)}
|
||||||
[rn/view
|
[rn/view
|
||||||
|
@ -217,18 +217,23 @@
|
|||||||
|
|
||||||
(defn- slide-button
|
(defn- slide-button
|
||||||
[]
|
[]
|
||||||
(let [loading-swap-proposal? (rf/sub [:wallet/swap-loading-swap-proposal?])
|
(let [loading-swap-proposal? (rf/sub [:wallet/swap-loading-swap-proposal?])
|
||||||
swap-proposal (rf/sub [:wallet/swap-proposal-without-fees])
|
swap-proposal (rf/sub [:wallet/swap-proposal-without-fees])
|
||||||
account (rf/sub [:wallet/current-viewing-account])
|
account (rf/sub [:wallet/current-viewing-account])
|
||||||
on-auth-success (rn/use-callback
|
transaction-for-signing (rf/sub [:wallet/swap-transaction-for-signing])
|
||||||
#(rf/dispatch [:wallet/prepare-signatures-for-transactions :swap %]))]
|
sign-on-keycard? (get-in transaction-for-signing
|
||||||
|
[:signingDetails :signOnKeycard])
|
||||||
|
on-auth-success (rn/use-callback
|
||||||
|
#(rf/dispatch [:wallet/prepare-signatures-for-transactions :swap %]))
|
||||||
|
on-complete (rn/use-callback
|
||||||
|
#(rf/dispatch [:wallet/prepare-signatures-for-transactions :swap ""]))]
|
||||||
[standard-auth/slide-button
|
[standard-auth/slide-button
|
||||||
{:size :size-48
|
{:size :size-48
|
||||||
:track-text (i18n/label :t/slide-to-sign)
|
:track-text (i18n/label :t/slide-to-sign)
|
||||||
:container-style {:z-index 2}
|
:container-style {:z-index 2}
|
||||||
:customization-color (:color account)
|
:customization-color (:color account)
|
||||||
:disabled? (or loading-swap-proposal? (not swap-proposal))
|
:disabled? (or loading-swap-proposal? (not swap-proposal))
|
||||||
:keycard-supported? true
|
:on-complete (when sign-on-keycard? on-complete)
|
||||||
:on-auth-success on-auth-success
|
:on-auth-success on-auth-success
|
||||||
:auth-button-label (i18n/label :t/confirm)}]))
|
:auth-button-label (i18n/label :t/confirm)}]))
|
||||||
|
|
||||||
|
@ -168,7 +168,9 @@
|
|||||||
transaction-for-signing (rf/sub [:wallet/swap-transaction-for-signing])
|
transaction-for-signing (rf/sub [:wallet/swap-transaction-for-signing])
|
||||||
swap-proposal (rf/sub [:wallet/swap-proposal-without-fees])
|
swap-proposal (rf/sub [:wallet/swap-proposal-without-fees])
|
||||||
account (rf/sub [:wallet/current-viewing-account])
|
account (rf/sub [:wallet/current-viewing-account])
|
||||||
account-color (:color account)]
|
account-color (:color account)
|
||||||
|
sign-on-keycard? (get-in transaction-for-signing
|
||||||
|
[:signingDetails :signOnKeycard])]
|
||||||
[standard-auth/slide-button
|
[standard-auth/slide-button
|
||||||
{:size :size-48
|
{:size :size-48
|
||||||
:track-text (i18n/label :t/slide-to-swap)
|
:track-text (i18n/label :t/slide-to-swap)
|
||||||
@ -178,7 +180,11 @@
|
|||||||
(not swap-proposal)
|
(not swap-proposal)
|
||||||
(not transaction-for-signing))
|
(not transaction-for-signing))
|
||||||
:auth-button-label (i18n/label :t/confirm)
|
:auth-button-label (i18n/label :t/confirm)
|
||||||
:keycard-supported? true
|
:on-complete (when sign-on-keycard?
|
||||||
|
#(rf/dispatch
|
||||||
|
[:wallet/prepare-signatures-for-transactions
|
||||||
|
:swap
|
||||||
|
""]))
|
||||||
:on-auth-success (fn [data]
|
:on-auth-success (fn [data]
|
||||||
(rf/dispatch [:wallet/stop-get-swap-proposal])
|
(rf/dispatch [:wallet/stop-get-swap-proposal])
|
||||||
(rf/dispatch [:wallet/prepare-signatures-for-transactions :swap data]))}]))
|
(rf/dispatch [:wallet/prepare-signatures-for-transactions :swap data]))}]))
|
||||||
|
@ -25,16 +25,15 @@
|
|||||||
|
|
||||||
(defn root-options
|
(defn root-options
|
||||||
[{:keys [background-color theme status-bar-theme nav-bar-color]}]
|
[{:keys [background-color theme status-bar-theme nav-bar-color]}]
|
||||||
(merge
|
(let [layout-background (or background-color
|
||||||
(statusbar-and-navbar-options theme status-bar-theme nav-bar-color)
|
(colors/theme-colors colors/white colors/neutral-100 theme))
|
||||||
{:topBar {:visible false}
|
component-background (or background-color
|
||||||
:layout {:componentBackgroundColor (or background-color
|
(colors/theme-colors colors/white colors/neutral-100 theme))]
|
||||||
(colors/theme-colors colors/white colors/neutral-100 theme))
|
(assoc (statusbar-and-navbar-options theme status-bar-theme nav-bar-color)
|
||||||
:orientation ["portrait"]
|
:topBar {:visible false}
|
||||||
:backgroundColor (or background-color
|
:layout {:componentBackgroundColor component-background
|
||||||
(colors/theme-colors colors/white
|
:orientation ["portrait"]
|
||||||
colors/neutral-100
|
:backgroundColor layout-background})))
|
||||||
theme))}}))
|
|
||||||
|
|
||||||
(defn dark-root-options
|
(defn dark-root-options
|
||||||
[]
|
[]
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
[status-im.common.enter-seed-phrase.view :as enter-seed-phrase]
|
[status-im.common.enter-seed-phrase.view :as enter-seed-phrase]
|
||||||
[status-im.common.lightbox.view :as lightbox]
|
[status-im.common.lightbox.view :as lightbox]
|
||||||
[status-im.common.pdf-viewer.view :as pdf-viewer]
|
[status-im.common.pdf-viewer.view :as pdf-viewer]
|
||||||
|
[status-im.common.privacy.view :as privacy-policy]
|
||||||
|
[status-im.common.terms.view :as terms-of-use]
|
||||||
[status-im.config :as config]
|
[status-im.config :as config]
|
||||||
[status-im.contexts.chat.group.create.view :as group.create]
|
[status-im.contexts.chat.group.create.view :as group.create]
|
||||||
[status-im.contexts.chat.group.details.view :as group.details]
|
[status-im.contexts.chat.group.details.view :as group.details]
|
||||||
@ -73,6 +75,7 @@
|
|||||||
[status-im.contexts.profile.settings.screens.password.view :as settings-password]
|
[status-im.contexts.profile.settings.screens.password.view :as settings-password]
|
||||||
[status-im.contexts.profile.settings.screens.syncing.view :as settings.syncing]
|
[status-im.contexts.profile.settings.screens.syncing.view :as settings.syncing]
|
||||||
[status-im.contexts.profile.settings.view :as settings]
|
[status-im.contexts.profile.settings.view :as settings]
|
||||||
|
[status-im.contexts.settings.about.view :as settings.about]
|
||||||
[status-im.contexts.settings.keycard.view :as settings.keycard]
|
[status-im.contexts.settings.keycard.view :as settings.keycard]
|
||||||
[status-im.contexts.settings.language-and-currency.currency.view :as settings.currency-selection]
|
[status-im.contexts.settings.language-and-currency.currency.view :as settings.currency-selection]
|
||||||
[status-im.contexts.settings.language-and-currency.view :as settings.language-and-currency]
|
[status-im.contexts.settings.language-and-currency.view :as settings.language-and-currency]
|
||||||
@ -153,39 +156,39 @@
|
|||||||
|
|
||||||
(def chat-screens
|
(def chat-screens
|
||||||
[{:name :start-a-new-chat
|
[{:name :start-a-new-chat
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :messenger.new-chat}
|
:alias-id :messenger.new-chat}
|
||||||
:options {:sheet? true}
|
:options {:sheet? true}
|
||||||
:component new-chat/view}
|
:component new-chat/view}
|
||||||
|
|
||||||
{:name :chat
|
{:name :chat
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :messenger.chat}
|
:alias-id :messenger.chat}
|
||||||
:options {:popGesture false
|
:options {:popGesture false
|
||||||
:animations transitions/stack-transition-from-bottom}
|
:animations transitions/stack-transition-from-bottom}
|
||||||
:component chat/chat}
|
:component chat/chat}
|
||||||
|
|
||||||
{:name :screen/group-create
|
{:name :screen/group-create
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :messenger.new-group}
|
:alias-id :messenger.new-group}
|
||||||
:options {:sheet? true
|
:options {:sheet? true
|
||||||
:skip-background? true}
|
:skip-background? true}
|
||||||
:component group.create/view}
|
:component group.create/view}
|
||||||
|
|
||||||
{:name :screen/group-details
|
{:name :screen/group-details
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :messenger.group-details}
|
:alias-id :messenger.group-details}
|
||||||
:component group.details/view}
|
:component group.details/view}
|
||||||
|
|
||||||
{:name :screen/group-update
|
{:name :screen/group-update
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :messenger.group-update}
|
:alias-id :messenger.group-update}
|
||||||
:options {:sheet? true
|
:options {:sheet? true
|
||||||
:skip-background? true}
|
:skip-background? true}
|
||||||
:component group.update/view}
|
:component group.update/view}
|
||||||
|
|
||||||
{:name :screen/group-add-manage-members
|
{:name :screen/group-add-manage-members
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:flow :messenger
|
:flow :messenger
|
||||||
:alias-id :messenger.group-manage-members}
|
:alias-id :messenger.group-manage-members}
|
||||||
:options {:sheet? true}
|
:options {:sheet? true}
|
||||||
@ -193,12 +196,12 @@
|
|||||||
|
|
||||||
(def community-screens
|
(def community-screens
|
||||||
[{:name :discover-communities
|
[{:name :discover-communities
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.discover}
|
:alias-id :community.discover}
|
||||||
:component communities.discover/view}
|
:component communities.discover/view}
|
||||||
|
|
||||||
{:name :community-overview
|
{:name :community-overview
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.overview}
|
:alias-id :community.overview}
|
||||||
:options {:animations transitions/stack-transition-from-bottom}
|
:options {:animations transitions/stack-transition-from-bottom}
|
||||||
:component communities.overview/view}
|
:component communities.overview/view}
|
||||||
@ -207,79 +210,79 @@
|
|||||||
;; joining a community. The non-sheet screen is used when editing shared
|
;; joining a community. The non-sheet screen is used when editing shared
|
||||||
;; addresses after the join request was sent.
|
;; addresses after the join request was sent.
|
||||||
{:name :community-account-selection-sheet
|
{:name :community-account-selection-sheet
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.select-addresses-for-joining-community}
|
:alias-id :community.select-addresses-for-joining-community}
|
||||||
:options {:sheet? true}
|
:options {:sheet? true}
|
||||||
:component communities.accounts-selection/view}
|
:component communities.accounts-selection/view}
|
||||||
{:name :community-account-selection
|
{:name :community-account-selection
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.select-addresses-for-community}
|
:alias-id :community.select-addresses-for-community}
|
||||||
:options {:insets {:top? true}}
|
:options {:insets {:top? true}}
|
||||||
:component communities.accounts-selection/view}
|
:component communities.accounts-selection/view}
|
||||||
|
|
||||||
{:name :community-requests-to-join
|
{:name :community-requests-to-join
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.request-to-join}
|
:alias-id :community.request-to-join}
|
||||||
:options {:sheet? true}
|
:options {:sheet? true}
|
||||||
:component join-menu/view}
|
:component join-menu/view}
|
||||||
|
|
||||||
{:name :screen/share-community
|
{:name :screen/share-community
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.share-community}
|
:alias-id :community.share-community}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component share-community/view}
|
:component share-community/view}
|
||||||
|
|
||||||
{:name :invite-people-community
|
{:name :invite-people-community
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.invite-people}
|
:alias-id :community.invite-people}
|
||||||
:options {:sheet? true}
|
:options {:sheet? true}
|
||||||
:component communities.invite/view}
|
:component communities.invite/view}
|
||||||
|
|
||||||
{:name :share-community-channel
|
{:name :share-community-channel
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.share-channel}
|
:alias-id :community.share-channel}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component share-community-channel/view}
|
:component share-community-channel/view}
|
||||||
|
|
||||||
{:name :screen/chat.view-channel-members-and-details
|
{:name :screen/chat.view-channel-members-and-details
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.view-channel-members-and-details}
|
:alias-id :community.view-channel-members-and-details}
|
||||||
:options {:insets {:top? true}}
|
:options {:insets {:top? true}}
|
||||||
:component channel-view-channel-members-and-details/view}
|
:component channel-view-channel-members-and-details/view}
|
||||||
|
|
||||||
{:name :addresses-for-permissions
|
{:name :addresses-for-permissions
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.choose-addresses-for-permissions}
|
:alias-id :community.choose-addresses-for-permissions}
|
||||||
:options {:insets {:top? true}}
|
:options {:insets {:top? true}}
|
||||||
:component addresses-for-permissions/view}
|
:component addresses-for-permissions/view}
|
||||||
|
|
||||||
{:name :address-for-airdrop
|
{:name :address-for-airdrop
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :community.choose-addresses-for-airdrop}
|
:alias-id :community.choose-addresses-for-airdrop}
|
||||||
:options {:insets {:top? true}}
|
:options {:insets {:top? true}}
|
||||||
:component airdrop-addresses/view}])
|
:component airdrop-addresses/view}])
|
||||||
|
|
||||||
(def contact-screens
|
(def contact-screens
|
||||||
[{:name :new-contact
|
[{:name :new-contact
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :contact.new-contact}
|
:alias-id :contact.new-contact}
|
||||||
:options {:sheet? true}
|
:options {:sheet? true}
|
||||||
:component add-new-contact/new-contact}
|
:component add-new-contact/new-contact}
|
||||||
|
|
||||||
{:name :scan-profile-qr-code
|
{:name :scan-profile-qr-code
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :contact.scan-profile-qr-code}
|
:alias-id :contact.scan-profile-qr-code}
|
||||||
:options options/dark-screen
|
:options options/dark-screen
|
||||||
:component scan-profile-qr-page/view}
|
:component scan-profile-qr-page/view}
|
||||||
|
|
||||||
{:name :contact-profile
|
{:name :contact-profile
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :contact.contact-profile}
|
:alias-id :contact.contact-profile}
|
||||||
:options {:modalPresentationStyle :overCurrentContext}
|
:options {:modalPresentationStyle :overCurrentContext}
|
||||||
:component contact-profile/view}
|
:component contact-profile/view}
|
||||||
|
|
||||||
{:name :share-contact
|
{:name :share-contact
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :contact.share-profile}
|
:alias-id :contact.share-profile}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component share-contact/view}])
|
:component share-contact/view}])
|
||||||
@ -311,56 +314,56 @@
|
|||||||
|
|
||||||
(def settings-screens
|
(def settings-screens
|
||||||
[{:name :settings
|
[{:name :settings
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.profile-settings}
|
:alias-id :settings.profile-settings}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component settings/view}
|
:component settings/view}
|
||||||
|
|
||||||
{:name :screen/settings.keycard
|
{:name :screen/settings.keycard
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.keycard}
|
:alias-id :settings.keycard}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component settings.keycard/view}
|
:component settings.keycard/view}
|
||||||
|
|
||||||
{:name :edit-profile
|
{:name :edit-profile
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.edit-profile}
|
:alias-id :settings.edit-profile}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component edit-profile/view}
|
:component edit-profile/view}
|
||||||
|
|
||||||
{:name :edit-accent-colour
|
{:name :edit-accent-colour
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.edit-profile-accent-colour}
|
:alias-id :settings.edit-profile-accent-colour}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component edit-accent-colour/view}
|
:component edit-accent-colour/view}
|
||||||
|
|
||||||
{:name :edit-name
|
{:name :edit-name
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.edit-profile-name}
|
:alias-id :settings.edit-profile-name}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component edit-name/view}
|
:component edit-name/view}
|
||||||
|
|
||||||
{:name :edit-bio
|
{:name :edit-bio
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.edit-profile-bio}
|
:alias-id :settings.edit-profile-bio}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component edit-bio/view}
|
:component edit-bio/view}
|
||||||
|
|
||||||
{:name :screen/settings-password
|
{:name :screen/settings-password
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.password}
|
:alias-id :settings.password}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component settings-password/view}
|
:component settings-password/view}
|
||||||
|
|
||||||
{:name :screen/change-password
|
{:name :screen/change-password
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.change-password}
|
:alias-id :settings.change-password}
|
||||||
:options (assoc options/transparent-modal-screen-options :theme :dark)
|
:options (assoc options/transparent-modal-screen-options :theme :dark)
|
||||||
:component change-password/view}
|
:component change-password/view}
|
||||||
|
|
||||||
{:name :screen/change-password-loading
|
{:name :screen/change-password-loading
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.change-password-loading}
|
:alias-id :settings.change-password-loading}
|
||||||
:options (assoc
|
:options (assoc
|
||||||
options/transparent-modal-screen-options
|
options/transparent-modal-screen-options
|
||||||
@ -371,25 +374,25 @@
|
|||||||
:component change-password-loading/view}
|
:component change-password-loading/view}
|
||||||
|
|
||||||
{:name :screen/settings-messages
|
{:name :screen/settings-messages
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.messages}
|
:alias-id :settings.messages}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component settings.messages/view}
|
:component settings.messages/view}
|
||||||
|
|
||||||
{:name :screen/settings-blocked-users
|
{:name :screen/settings-blocked-users
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.blocked-users}
|
:alias-id :settings.blocked-users}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component settings.blocked-users/view}
|
:component settings.blocked-users/view}
|
||||||
|
|
||||||
{:name :screen/settings-privacy-and-security
|
{:name :screen/settings-privacy-and-security
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.private-and-security}
|
:alias-id :settings.private-and-security}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component settings.privacy-and-security/view}
|
:component settings.privacy-and-security/view}
|
||||||
|
|
||||||
{:name :screen/settings.share-usage-data
|
{:name :screen/settings.share-usage-data
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component settings.share-usage/view}
|
:component settings.share-usage/view}
|
||||||
|
|
||||||
@ -405,89 +408,104 @@
|
|||||||
:component syncing-devices-list/view}
|
:component syncing-devices-list/view}
|
||||||
|
|
||||||
{:name :screen/settings.language-and-currency
|
{:name :screen/settings.language-and-currency
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component settings.language-and-currency/view}
|
:component settings.language-and-currency/view}
|
||||||
|
|
||||||
{:name :screen/settings.currency-selection
|
{:name :screen/settings.currency-selection
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component settings.currency-selection/view}])
|
:component settings.currency-selection/view}
|
||||||
|
|
||||||
|
{:name :screen/settings.about
|
||||||
|
:metrics {:track? true}
|
||||||
|
:options options/transparent-modal-screen-options
|
||||||
|
:component settings.about/view}
|
||||||
|
|
||||||
|
{:name :screen/settings.privacy-policy
|
||||||
|
:metrics {:track? true}
|
||||||
|
:options options/transparent-modal-screen-options
|
||||||
|
:component privacy-policy/view}
|
||||||
|
|
||||||
|
{:name :screen/settings.terms-of-use
|
||||||
|
:metrics {:track? true}
|
||||||
|
:options options/transparent-modal-screen-options
|
||||||
|
:component terms-of-use/view}])
|
||||||
|
|
||||||
(def wallet-settings-screens
|
(def wallet-settings-screens
|
||||||
[{:name :screen/settings.wallet
|
[{:name :screen/settings.wallet
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component wallet-options/view}
|
:component wallet-options/view}
|
||||||
|
|
||||||
{:name :screen/settings.rename-keypair
|
{:name :screen/settings.rename-keypair
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-rename-keypair}
|
:alias-id :settings.wallet-rename-keypair}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component keypair-rename/view}
|
:component keypair-rename/view}
|
||||||
|
|
||||||
{:name :screen/settings.encrypted-keypair-qr
|
{:name :screen/settings.encrypted-keypair-qr
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-encrypted-keypair-qr}
|
:alias-id :settings.wallet-encrypted-keypair-qr}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component encrypted-keypair-qr/view}
|
:component encrypted-keypair-qr/view}
|
||||||
|
|
||||||
{:name :screen/settings.saved-addresses
|
{:name :screen/settings.saved-addresses
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-saved-addresses}
|
:alias-id :settings.wallet-saved-addresses}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component saved-addresses-settings/view}
|
:component saved-addresses-settings/view}
|
||||||
|
|
||||||
{:name :screen/settings.keypairs-and-accounts
|
{:name :screen/settings.keypairs-and-accounts
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-keypairs-and-accounts}
|
:alias-id :settings.wallet-keypairs-and-accounts}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component keypairs-and-accounts/view}
|
:component keypairs-and-accounts/view}
|
||||||
|
|
||||||
{:name :screen/settings.scan-keypair-qr
|
{:name :screen/settings.scan-keypair-qr
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-scan-keypair-qr}
|
:alias-id :settings.wallet-scan-keypair-qr}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component scan-keypair-qr/view}
|
:component scan-keypair-qr/view}
|
||||||
|
|
||||||
{:name :screen/settings.missing-keypair.import-seed-phrase
|
{:name :screen/settings.missing-keypair.import-seed-phrase
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-missing-keypair-import-seed-phrase}
|
:alias-id :settings.wallet-missing-keypair-import-seed-phrase}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component missing-keypairs.import-seed-phrase/view}
|
:component missing-keypairs.import-seed-phrase/view}
|
||||||
|
|
||||||
{:name :screen/settings.missing-keypair-import-private-key
|
{:name :screen/settings.missing-keypair-import-private-key
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-missing-keypair-import-private-key}
|
:alias-id :settings.wallet-missing-keypair-import-private-key}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component missing-keypairs.import-private-key/view}
|
:component missing-keypairs.import-private-key/view}
|
||||||
|
|
||||||
{:name :screen/settings.network-settings
|
{:name :screen/settings.network-settings
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-network-settings}
|
:alias-id :settings.wallet-network-settings}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component network-settings/view}
|
:component network-settings/view}
|
||||||
|
|
||||||
{:name :screen/settings.save-address
|
{:name :screen/settings.save-address
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-saved-addresses}
|
:alias-id :settings.wallet-saved-addresses}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component wallet-save-address/view}
|
:component wallet-save-address/view}
|
||||||
|
|
||||||
{:name :screen/settings.edit-saved-address
|
{:name :screen/settings.edit-saved-address
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-edit-saved-addresses}
|
:alias-id :settings.wallet-edit-saved-addresses}
|
||||||
:options (assoc options/dark-screen :sheet? true)
|
:options (assoc options/dark-screen :sheet? true)
|
||||||
:component wallet-save-address/view}
|
:component wallet-save-address/view}
|
||||||
|
|
||||||
{:name :screen/settings.add-address-to-save
|
{:name :screen/settings.add-address-to-save
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-add-saved-address}
|
:alias-id :settings.wallet-add-saved-address}
|
||||||
:options options/transparent-modal-screen-options
|
:options options/transparent-modal-screen-options
|
||||||
:component wallet-add-address-to-save/view}
|
:component wallet-add-address-to-save/view}
|
||||||
|
|
||||||
{:name :screen/settings.share-saved-address
|
{:name :screen/settings.share-saved-address
|
||||||
:metrics {:track? :true
|
:metrics {:track? true
|
||||||
:alias-id :settings.wallet-share-saved-address}
|
:alias-id :settings.wallet-share-saved-address}
|
||||||
:options options/transparent-screen-options
|
:options options/transparent-screen-options
|
||||||
:component share-saved-address/view}])
|
:component share-saved-address/view}])
|
||||||
@ -757,9 +775,7 @@
|
|||||||
:metrics {:track? true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:layout options/onboarding-transparent-layout
|
:layout options/onboarding-transparent-layout
|
||||||
:animations (merge
|
:animations transitions/modal-animations-vertical
|
||||||
transitions/new-to-status-modal-animations
|
|
||||||
transitions/push-animations-for-transparent-background)
|
|
||||||
:popGesture false
|
:popGesture false
|
||||||
:modalPresentationStyle :overCurrentContext}
|
:modalPresentationStyle :overCurrentContext}
|
||||||
:component onboarding.share-usage/view})
|
:component onboarding.share-usage/view})
|
||||||
@ -876,48 +892,48 @@
|
|||||||
|
|
||||||
(def keycard-screens
|
(def keycard-screens
|
||||||
[{:name :screen/keycard.check
|
[{:name :screen/keycard.check
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.check/view}
|
:component keycard.check/view}
|
||||||
|
|
||||||
{:name :screen/keycard.empty
|
{:name :screen/keycard.empty
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.empty/view}
|
:component keycard.empty/view}
|
||||||
|
|
||||||
{:name :screen/keycard.empty-create
|
{:name :screen/keycard.empty-create
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:insets {:top? true :bottom? true}}
|
:options {:insets {:top? true :bottom? true}}
|
||||||
:component keycard.empty/create}
|
:component keycard.empty/create}
|
||||||
|
|
||||||
{:name :screen/keycard.error
|
{:name :screen/keycard.error
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.error/view}
|
:component keycard.error/view}
|
||||||
|
|
||||||
{:name :screen/keycard.not-keycard
|
{:name :screen/keycard.not-keycard
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.not-keycard/view}
|
:component keycard.not-keycard/view}
|
||||||
|
|
||||||
{:name :screen/keycard.authorise
|
{:name :screen/keycard.authorise
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.authorise/view}
|
:component keycard.authorise/view}
|
||||||
|
|
||||||
{:name :screen/keycard.migrate
|
{:name :screen/keycard.migrate
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.migrate/view}
|
:component keycard.migrate/view}
|
||||||
|
|
||||||
{:name :screen/keycard.re-encrypting
|
{:name :screen/keycard.re-encrypting
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}
|
:insets {:top? true :bottom? true}
|
||||||
:popGesture false
|
:popGesture false
|
||||||
@ -926,7 +942,7 @@
|
|||||||
:component keycard.re-encrypting/view}
|
:component keycard.re-encrypting/view}
|
||||||
|
|
||||||
{:name :screen/keycard.migrate.success
|
{:name :screen/keycard.migrate.success
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}
|
:insets {:top? true :bottom? true}
|
||||||
:popGesture false
|
:popGesture false
|
||||||
@ -935,7 +951,7 @@
|
|||||||
:component keycard.migrate.success/view}
|
:component keycard.migrate.success/view}
|
||||||
|
|
||||||
{:name :screen/keycard.migrate.fail
|
{:name :screen/keycard.migrate.fail
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}
|
:insets {:top? true :bottom? true}
|
||||||
:popGesture false
|
:popGesture false
|
||||||
@ -944,30 +960,30 @@
|
|||||||
:component keycard.migrate.fail/view}
|
:component keycard.migrate.fail/view}
|
||||||
|
|
||||||
{:name :screen/keycard.pin.create
|
{:name :screen/keycard.pin.create
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.pin.create/view}
|
:component keycard.pin.create/view}
|
||||||
|
|
||||||
{:name :screen/keycard.pin.enter
|
{:name :screen/keycard.pin.enter
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.pin.enter/view}
|
:component keycard.pin.enter/view}
|
||||||
|
|
||||||
{:name :screen/keycard.profile-keys
|
{:name :screen/keycard.profile-keys
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:theme :dark
|
:options {:theme :dark
|
||||||
:insets {:top? true :bottom? true}}
|
:insets {:top? true :bottom? true}}
|
||||||
:component keycard.migrate.profile-keys/view}
|
:component keycard.migrate.profile-keys/view}
|
||||||
|
|
||||||
{:name :screen/keycard.create-profile
|
{:name :screen/keycard.create-profile
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:insets {:top? true :bottom? true}}
|
:options {:insets {:top? true :bottom? true}}
|
||||||
:component keycard.create/view}
|
:component keycard.create/view}
|
||||||
|
|
||||||
{:name :screen/keycard.create.ready-to-add
|
{:name :screen/keycard.create.ready-to-add
|
||||||
:metrics {:track? :true}
|
:metrics {:track? true}
|
||||||
:options {:insets {:top? true :bottom? true}}
|
:options {:insets {:top? true :bottom? true}}
|
||||||
:component keycard.create/ready-to-add}])
|
:component keycard.create/ready-to-add}])
|
||||||
|
|
||||||
|
@ -40,6 +40,14 @@
|
|||||||
:to (:width (rn/get-window))
|
:to (:width (rn/get-window))
|
||||||
:duration constants/onboarding-modal-animation-duration}}})
|
:duration constants/onboarding-modal-animation-duration}}})
|
||||||
|
|
||||||
|
(def modal-animations-vertical
|
||||||
|
{:showModal {:translationY {:from (:height (rn/get-window))
|
||||||
|
:to 0
|
||||||
|
:duration constants/onboarding-modal-animation-duration}}
|
||||||
|
:dismissModal {:translationY {:from 0
|
||||||
|
:to (:height (rn/get-window))
|
||||||
|
:duration constants/onboarding-modal-animation-duration}}})
|
||||||
|
|
||||||
;;;; Stack Transitions
|
;;;; Stack Transitions
|
||||||
(def stack-slide-transition
|
(def stack-slide-transition
|
||||||
{:push {:content {:translationX {:from (:width (rn/get-window))
|
{:push {:content {:translationX {:from (:width (rn/get-window))
|
||||||
|
@ -349,12 +349,13 @@
|
|||||||
:<- [:wallet/keypairs-list]
|
:<- [:wallet/keypairs-list]
|
||||||
(fn [keypairs [_ format-options]]
|
(fn [keypairs [_ format-options]]
|
||||||
(reduce
|
(reduce
|
||||||
(fn [acc {:keys [accounts name type key-uid lowest-operability]}]
|
(fn [acc {:keys [accounts name type key-uid lowest-operability keycards]}]
|
||||||
(if (= lowest-operability :no)
|
(if (= lowest-operability :no)
|
||||||
(update acc
|
(update acc
|
||||||
:missing
|
:missing
|
||||||
conj
|
conj
|
||||||
{:type type
|
{:type type
|
||||||
|
:keycard? (boolean (seq keycards))
|
||||||
:name name
|
:name name
|
||||||
:key-uid key-uid
|
:key-uid key-uid
|
||||||
:accounts (format-settings-missing-keypair-accounts accounts)})
|
:accounts (format-settings-missing-keypair-accounts accounts)})
|
||||||
@ -362,6 +363,7 @@
|
|||||||
:operable
|
:operable
|
||||||
conj
|
conj
|
||||||
{:type type
|
{:type type
|
||||||
|
:keycard? (boolean (seq keycards))
|
||||||
:name name
|
:name name
|
||||||
:key-uid key-uid
|
:key-uid key-uid
|
||||||
:accounts (format-settings-keypair-accounts accounts format-options)})))
|
:accounts (format-settings-keypair-accounts accounts format-options)})))
|
||||||
|
@ -141,3 +141,14 @@
|
|||||||
(defn zero-address?
|
(defn zero-address?
|
||||||
[address]
|
[address]
|
||||||
(= address zero-address))
|
(= address zero-address))
|
||||||
|
|
||||||
|
(defn public-key->address
|
||||||
|
[public-key]
|
||||||
|
(let [length (count public-key)
|
||||||
|
normalized-key (case length
|
||||||
|
132 (str "0x" (subs public-key 4))
|
||||||
|
130 public-key
|
||||||
|
128 (str "0x" public-key)
|
||||||
|
nil)]
|
||||||
|
(when normalized-key
|
||||||
|
(subs (native-module/sha3 normalized-key) 26))))
|
||||||
|
@ -148,14 +148,6 @@ class TestActivityCenterContactRequestMultipleDevicePR(MultipleSharedDeviceTestC
|
|||||||
|
|
||||||
@marks.testrail_id(702777)
|
@marks.testrail_id(702777)
|
||||||
def test_add_contact_field_validation(self):
|
def test_add_contact_field_validation(self):
|
||||||
# Profile link encoded data validation
|
|
||||||
encoded_data = re.findall("u/(.*)#", self.profile_link_2)[0]
|
|
||||||
decoded_string = base64.b64decode(encoded_data).decode("utf-8", "ignore")
|
|
||||||
decoded_username = re.sub('[^A-Za-z0-9]+', '', decoded_string)
|
|
||||||
if decoded_username != self.username_2:
|
|
||||||
self.errors.append(
|
|
||||||
"Can't find username '%s' in data which profile link '%s' contains. String '%s' is found instead" % (
|
|
||||||
self.username_2, self.profile_link_2, decoded_username))
|
|
||||||
public_key_2 = self.profile_link_2.split("#")[-1]
|
public_key_2 = self.profile_link_2.split("#")[-1]
|
||||||
|
|
||||||
def _device_1_creates_user():
|
def _device_1_creates_user():
|
||||||
|
@ -453,7 +453,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
|||||||
current_time = datetime.datetime.strptime(device_time, "%Y-%m-%dT%H:%M:%S%z")
|
current_time = datetime.datetime.strptime(device_time, "%Y-%m-%dT%H:%M:%S%z")
|
||||||
expected_times = [current_time + datetime.timedelta(minutes=i) for i in range(479, 482)]
|
expected_times = [current_time + datetime.timedelta(minutes=i) for i in range(479, 482)]
|
||||||
expected_texts = [
|
expected_texts = [
|
||||||
"Muted until %s %s" % (exp_time.strftime('%H:%M'), "today" if current_time.hour < 23 else "tomorrow") for
|
"Muted until %s %s" % (exp_time.strftime('%H:%M'), "today" if current_time.hour < 16 else "tomorrow") for
|
||||||
exp_time in expected_times]
|
exp_time in expected_times]
|
||||||
chat = self.homes[1].get_chat(self.chat_name)
|
chat = self.homes[1].get_chat(self.chat_name)
|
||||||
chat.long_press_element()
|
chat.long_press_element()
|
||||||
@ -483,7 +483,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase):
|
|||||||
if after_mute_counter > initial_counter:
|
if after_mute_counter > initial_counter:
|
||||||
self.errors.append("New messages counter near chats tab button is %s after mute, but should be %s" % (
|
self.errors.append("New messages counter near chats tab button is %s after mute, but should be %s" % (
|
||||||
after_mute_counter, initial_counter))
|
after_mute_counter, initial_counter))
|
||||||
if not chat.chat_preview.text.startswith("%s: %s" % (self.usernames[0], muted_message)):
|
if not chat.chat_preview.text.startswith("%s: %s" % (self.usernames[0], muted_message[:25])):
|
||||||
self.errors.append("Message text '%s' is not shown in chat preview after mute" % muted_message)
|
self.errors.append("Message text '%s' is not shown in chat preview after mute" % muted_message)
|
||||||
chat.click()
|
chat.click()
|
||||||
if not self.chats[1].chat_element_by_text(muted_message).is_element_displayed(30):
|
if not self.chats[1].chat_element_by_text(muted_message).is_element_displayed(30):
|
||||||
|
@ -1021,6 +1021,8 @@ class TestCommunityMultipleDeviceMergedTwo(MultipleSharedDeviceTestCase):
|
|||||||
self.errors.append('Community is still shown in the list after leave')
|
self.errors.append('Community is still shown in the list after leave')
|
||||||
self.errors.verify_no_errors()
|
self.errors.verify_no_errors()
|
||||||
|
|
||||||
|
@marks.xfail(reason="Can't navigate to a community channel before joining the community, "
|
||||||
|
"https://github.com/status-im/status-mobile/issues/21776")
|
||||||
@marks.testrail_id(702948)
|
@marks.testrail_id(702948)
|
||||||
def test_community_hashtag_links_to_community_channels(self):
|
def test_community_hashtag_links_to_community_channels(self):
|
||||||
for home in self.homes:
|
for home in self.homes:
|
||||||
@ -1121,6 +1123,8 @@ class TestCommunityMultipleDeviceMergedTwo(MultipleSharedDeviceTestCase):
|
|||||||
|
|
||||||
self.errors.verify_no_errors()
|
self.errors.verify_no_errors()
|
||||||
|
|
||||||
|
@marks.xfail(reason="Can't navigate to a community channel before joining the community, "
|
||||||
|
"https://github.com/status-im/status-mobile/issues/21776")
|
||||||
@marks.testrail_id(703629)
|
@marks.testrail_id(703629)
|
||||||
def test_community_join_when_node_owner_offline(self):
|
def test_community_join_when_node_owner_offline(self):
|
||||||
for home in self.homes:
|
for home in self.homes:
|
||||||
|
@ -89,7 +89,7 @@ class TestDeepLinksOneDevice(MultipleSharedDeviceTestCase):
|
|||||||
self.home.get_chat(snt_community_name, community=True).click()
|
self.home.get_chat(snt_community_name, community=True).click()
|
||||||
snt_community_url = self.community_view.copy_community_link()
|
snt_community_url = self.community_view.copy_community_link()
|
||||||
self.home.reopen_app(sign_in=False)
|
self.home.reopen_app(sign_in=False)
|
||||||
self.sign_in.create_user(username="second user", first_user=False)
|
self.sign_in.create_user(first_user=False)
|
||||||
self.home.browser_tab.click()
|
self.home.browser_tab.click()
|
||||||
|
|
||||||
old, new = "https://status.app/", "status-app://"
|
old, new = "https://status.app/", "status-app://"
|
||||||
|
@ -269,7 +269,7 @@ class TestFallbackMultipleDevice(MultipleSharedDeviceTestCase):
|
|||||||
self.sign_in_2.passphrase_edit_box.clear()
|
self.sign_in_2.passphrase_edit_box.clear()
|
||||||
self.sign_in_2.passphrase_edit_box.send_keys(transaction_senders['A']['passphrase'])
|
self.sign_in_2.passphrase_edit_box.send_keys(transaction_senders['A']['passphrase'])
|
||||||
self.sign_in_2.continue_button.click()
|
self.sign_in_2.continue_button.click()
|
||||||
if not self.sign_in_2.profile_title_input.is_element_displayed():
|
if not self.sign_in_2.password_input.is_element_displayed():
|
||||||
self.errors.append("Can't recover an access with a valid passphrase")
|
self.errors.append("Can't recover an access with a valid passphrase")
|
||||||
self.sign_in_2.click_system_back_button()
|
self.sign_in_2.click_system_back_button()
|
||||||
|
|
||||||
|
@ -59,19 +59,19 @@ class TestWalletMultipleDevice(MultipleSharedDeviceTestCase):
|
|||||||
|
|
||||||
def wait_for_wallet_balance_to_update(wallet_view, user_name, initial_eth_amount):
|
def wait_for_wallet_balance_to_update(wallet_view, user_name, initial_eth_amount):
|
||||||
wallet_view.just_fyi("Getting ETH amount in the wallet of the %s after transaction" % user_name)
|
wallet_view.just_fyi("Getting ETH amount in the wallet of the %s after transaction" % user_name)
|
||||||
if user_name == 'sender':
|
if user_name == self.sender_username:
|
||||||
exp_amount = round(initial_eth_amount - amount_to_send, 4)
|
exp_amount = round(initial_eth_amount - amount_to_send, 4)
|
||||||
else:
|
else:
|
||||||
exp_amount = round(initial_eth_amount + amount_to_send, 4)
|
exp_amount = round(initial_eth_amount + amount_to_send, 4)
|
||||||
|
|
||||||
# for _ in range(12): # ToDo: 120 sec wait time, enable when autoupdate feature is ready
|
# for _ in range(12): # ToDo: 120 sec wait time, enable when autoupdate feature is ready
|
||||||
new_eth_amount = round(wallet_view.get_asset(asset_name='Ether').get_amount(), 4)
|
new_eth_amount = round(wallet_view.get_asset(asset_name='Ether').get_amount(), 4)
|
||||||
if user_name == 'sender' and new_eth_amount <= exp_amount:
|
if user_name == self.sender_username and new_eth_amount <= exp_amount:
|
||||||
return
|
return
|
||||||
if user_name == 'receiver' and new_eth_amount >= exp_amount:
|
if user_name == self.receiver_username and new_eth_amount >= exp_amount:
|
||||||
return
|
return
|
||||||
self.errors.append(
|
self.errors.append(
|
||||||
"Eth amount in the %ss wallet is %s but should be %s" % (user_name, new_eth_amount, exp_amount))
|
"Eth amount in the %s's wallet is %s but should be %s" % (user_name, new_eth_amount, exp_amount))
|
||||||
|
|
||||||
# ToDo: disable relogin when autoupdate feature is ready
|
# ToDo: disable relogin when autoupdate feature is ready
|
||||||
self.home_1.just_fyi("Relogin for getting an updated balance")
|
self.home_1.just_fyi("Relogin for getting an updated balance")
|
||||||
|
@ -626,6 +626,7 @@ class HomeView(BaseView):
|
|||||||
return element.text
|
return element.text
|
||||||
|
|
||||||
def get_username(self):
|
def get_username(self):
|
||||||
|
self.toast_content_element.wait_for_invisibility_of_element()
|
||||||
profile_view = self.get_profile_view()
|
profile_view = self.get_profile_view()
|
||||||
profile_view = self.profile_button.click_until_presence_of_element(profile_view.default_username_text)
|
profile_view = self.profile_button.click_until_presence_of_element(profile_view.default_username_text)
|
||||||
profile_view.default_username_text.wait_for_element(3)
|
profile_view.default_username_text.wait_for_element(3)
|
||||||
|
@ -361,8 +361,10 @@ class SignInView(BaseView):
|
|||||||
def get_user_profile_by_name(self, username: str):
|
def get_user_profile_by_name(self, username: str):
|
||||||
self.driver.info("Getting username card by '%s'" % username)
|
self.driver.info("Getting username card by '%s'" % username)
|
||||||
expected_element = UserProfileElement(self.driver, username=username)
|
expected_element = UserProfileElement(self.driver, username=username)
|
||||||
return expected_element if expected_element.is_element_displayed(10) else self.driver.fail(
|
if expected_element.is_element_displayed(10):
|
||||||
"User %s is not found!" % username)
|
return expected_element
|
||||||
|
else:
|
||||||
|
raise NoSuchElementException(msg="User %s is not found!" % username)
|
||||||
|
|
||||||
def get_user_profile_by_index(self, index: int):
|
def get_user_profile_by_index(self, index: int):
|
||||||
self.driver.info("Getting username card by index %s" % index)
|
self.driver.info("Getting username card by index %s" % index)
|
||||||
|
@ -801,6 +801,7 @@
|
|||||||
"do-not-quit": "Do not quit the application or turn off your device. Doing so will lead to data corruption, loss of your Status profile and the inability to use Status.",
|
"do-not-quit": "Do not quit the application or turn off your device. Doing so will lead to data corruption, loss of your Status profile and the inability to use Status.",
|
||||||
|
|
||||||
"do-not-share": "Do not share",
|
"do-not-share": "Do not share",
|
||||||
|
"documents": "Documents",
|
||||||
"done": "Done",
|
"done": "Done",
|
||||||
"dont-ask": "Don't ask me again",
|
"dont-ask": "Don't ask me again",
|
||||||
"dont-auto-recalculate-network": "Don't auto recalculate {{network}}",
|
"dont-auto-recalculate-network": "Don't auto recalculate {{network}}",
|
||||||
@ -1116,6 +1117,7 @@
|
|||||||
"getting-started-generate-keys-on-keycard-description": "A Keycard is a physical card (similar to a credit card) that securely stores your Status keys. Using a Keycard adds an extra layer of security to your digital assets and identity. This option creates a new Ethereum address.",
|
"getting-started-generate-keys-on-keycard-description": "A Keycard is a physical card (similar to a credit card) that securely stores your Status keys. Using a Keycard adds an extra layer of security to your digital assets and identity. This option creates a new Ethereum address.",
|
||||||
"getting-started-with-status": "Getting started with Status",
|
"getting-started-with-status": "Getting started with Status",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
|
"github-repos": "GitHub repos",
|
||||||
"give-a-short-description": "Give a short description",
|
"give-a-short-description": "Give a short description",
|
||||||
"give-a-short-description-community": "Give it a short description",
|
"give-a-short-description-community": "Give it a short description",
|
||||||
"give-permissions-camera": "Give permission\nto access camera",
|
"give-permissions-camera": "Give permission\nto access camera",
|
||||||
@ -2872,6 +2874,7 @@
|
|||||||
"we-will-receive-from-all-profiles": "We will receive from all profiles:",
|
"we-will-receive-from-all-profiles": "We will receive from all profiles:",
|
||||||
"we-will-receive-from-the-current-profile": "We will receive from the current profile:",
|
"we-will-receive-from-the-current-profile": "We will receive from the current profile:",
|
||||||
"web-view-error": "Unable to load page",
|
"web-view-error": "Unable to load page",
|
||||||
|
"website": "Website",
|
||||||
"websites": "Websites",
|
"websites": "Websites",
|
||||||
"webview-camera-permission-requests": "Webview camera permission requests",
|
"webview-camera-permission-requests": "Webview camera permission requests",
|
||||||
"webview-camera-permission-requests-subtitle": "When enabled, websites and dapps can ask to use your camera",
|
"webview-camera-permission-requests-subtitle": "When enabled, websites and dapps can ask to use your camera",
|
||||||
|