diff --git a/resources/images/ui2/login-syncing@2x.png b/resources/images/ui2/login-syncing@2x.png new file mode 100644 index 0000000000..5e292e5561 Binary files /dev/null and b/resources/images/ui2/login-syncing@2x.png differ diff --git a/resources/images/ui2/login-syncing@3x.png b/resources/images/ui2/login-syncing@3x.png new file mode 100644 index 0000000000..c6ad028a0d Binary files /dev/null and b/resources/images/ui2/login-syncing@3x.png differ diff --git a/resources/images/ui2/recovery-phrase@2x.png b/resources/images/ui2/recovery-phrase@2x.png index 382d213c18..5e09d4553d 100644 Binary files a/resources/images/ui2/recovery-phrase@2x.png and b/resources/images/ui2/recovery-phrase@2x.png differ diff --git a/resources/images/ui2/recovery-phrase@3x.png b/resources/images/ui2/recovery-phrase@3x.png index 7d74055619..0d4e8b7bcf 100644 Binary files a/resources/images/ui2/recovery-phrase@3x.png and b/resources/images/ui2/recovery-phrase@3x.png differ diff --git a/resources/images/ui2/usage-data@2x.png b/resources/images/ui2/usage-data@2x.png new file mode 100644 index 0000000000..a808bca364 Binary files /dev/null and b/resources/images/ui2/usage-data@2x.png differ diff --git a/resources/images/ui2/usage-data@3x.png b/resources/images/ui2/usage-data@3x.png new file mode 100644 index 0000000000..54c10eaaae Binary files /dev/null and b/resources/images/ui2/usage-data@3x.png differ diff --git a/src/legacy/status_im/ui/screens/about_app/views.cljs b/src/legacy/status_im/ui/screens/about_app/views.cljs deleted file mode 100644 index 93baa92475..0000000000 --- a/src/legacy/status_im/ui/screens/about_app/views.cljs +++ /dev/null @@ -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}) diff --git a/src/legacy/status_im/ui/screens/screens.cljs b/src/legacy/status_im/ui/screens/screens.cljs index 251bd30f38..2d75645e56 100644 --- a/src/legacy/status_im/ui/screens/screens.cljs +++ b/src/legacy/status_im/ui/screens/screens.cljs @@ -1,7 +1,6 @@ (ns legacy.status-im.ui.screens.screens (:require [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.appearance.views :as appearance] [legacy.status-im.ui.screens.backup-settings.view :as backup-settings] @@ -93,12 +92,6 @@ :insets {:top? platform/android?}} :component sync-settings/sync-settings} - ;; ABOUT - {:name :about-app - :options {:topBar {:visible false} - :insets {:top? platform/android?}} - :component about-app/about-app} - ;; STATUS HELP {:name :help-center :options {:topBar {:visible false} diff --git a/src/quo/components/settings/data_item/view.cljs b/src/quo/components/settings/data_item/view.cljs index 88eecc460c..016c661815 100644 --- a/src/quo/components/settings/data_item/view.cljs +++ b/src/quo/components/settings/data_item/view.cljs @@ -16,7 +16,8 @@ [rn/view {:style (style/loading-container size blur? theme)}])) (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] :or {subtitle-type :default}}] (let [theme (quo.theme/use-theme)] @@ -39,9 +40,10 @@ :style style/image}] nil)]) [text/text - {:weight :medium - :size :paragraph-2 - :style (style/description subtitle-color blur? theme)} + (merge {:weight :medium + :size :paragraph-2 + :style (style/description subtitle-color blur? theme)} + subtitle-text-props) subtitle] (when (= subtitle-type :editable) [icons/icon :i/edit @@ -75,7 +77,8 @@ (defn- left-side "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] :as props}] (let [theme (quo.theme/use-theme)] @@ -94,6 +97,7 @@ [custom-subtitle props] [left-subtitle {:theme theme + :subtitle-text-props subtitle-text-props :size size :subtitle-type subtitle-type :subtitle-color subtitle-color @@ -140,6 +144,7 @@ [:size {:optional true} [:maybe [:enum :default :small :large]]] [:title :string] [:subtitle {:optional true} [:maybe [:or :string :double]]] + [:subtitle-text-props {:optional true} [:maybe :map]] [:custom-subtitle {:optional true} [:maybe fn?]] [:icon {:optional true} [:maybe :keyword]] [:title-icon {:optional true} [:maybe :keyword]] diff --git a/src/quo/components/text_combinations/page_top/view.cljs b/src/quo/components/text_combinations/page_top/view.cljs index d10109a8fe..f243aa8497 100644 --- a/src/quo/components/text_combinations/page_top/view.cljs +++ b/src/quo/components/text_combinations/page_top/view.cljs @@ -79,11 +79,11 @@ [rn/view {:style style/community-logo-ring}]]) (defn- description-container - [{:keys [description description-text collection-text community-text - collection-image community-image blur?] + [{:keys [description description-text collection-text community-text blur? + collection-image community-image description-accessibility-label] context-tag-props :context-tag summary-props :summary}] - [rn/view + [rn/view {:accessibility-label description-accessibility-label} (cond (and (= description :text) (not (string/blank? description-text))) [text/text diff --git a/src/status_im/common/privacy/view.cljs b/src/status_im/common/privacy/view.cljs index 378a3c0bcc..e181e2317e 100644 --- a/src/status_im/common/privacy/view.cljs +++ b/src/status_im/common/privacy/view.cljs @@ -1,11 +1,20 @@ (ns status-im.common.privacy.view (:require-macros [legacy.status-im.utils.slurp :refer [slurp]]) (: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")) (defn privacy-statement [] - [gesture/scroll-view {:margin 20} + [gesture/scroll-view {:style {:margin 20}} [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]]]) diff --git a/src/status_im/common/resources.cljs b/src/status_im/common/resources.cljs index 05628ab48d..fc248082db 100644 --- a/src/status_im/common/resources.cljs +++ b/src/status_im/common/resources.cljs @@ -3,6 +3,8 @@ (def ui {:add-new-contact (js/require "../resources/images/ui2/add-contact.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") :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 diff --git a/src/status_im/common/standard_authentication/events.cljs b/src/status_im/common/standard_authentication/events.cljs index 9f9b44d62e..88b5ecf55a 100644 --- a/src/status_im/common/standard_authentication/events.cljs +++ b/src/status_im/common/standard_authentication/events.cljs @@ -10,19 +10,43 @@ [utils.re-frame :as rf] [utils.security.core :as security])) -(rf/reg-fx :effects.keycard/call-on-auth-success - (fn [on-auth-success] - (when on-auth-success (on-auth-success "")))) +(defn- handle-password-success + [has-partially-operable-accounts? on-auth-success masked-password] + (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 - [{:keys [db]} [{:keys [on-auth-success keycard-supported?] :as args}]] - (let [key-uid (get-in db [:profile/profile :key-uid]) - keycard? (get-in db [:profile/profile :keycard-pairing])] + [{:keys [db]} [{:keys [on-auth-success] :as args}]] + (let [key-uid (get-in db [:profile/profile :key-uid]) + keycard-profile? (get-in db [:profile/profile :keycard-pairing])] {:fx - [(if keycard? - (if keycard-supported? - [:effects.keycard/call-on-auth-success on-auth-success] - [:dispatch [:keycard/feature-unavailable-show]]) + [(if keycard-profile? + [:dispatch + [:standard-auth/authorize-with-keycard + {: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 {:key-uid key-uid :on-success #(rf/dispatch [:standard-auth/authorize-with-biometric args]) @@ -84,21 +108,12 @@ (defn- bottom-sheet-password-view [{:keys [on-press-biometric on-auth-success auth-button-icon-left auth-button-label]}] (fn [] - (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))))] + (let [has-partially-operable-accounts? (rf/sub [:wallet/has-partially-operable-accounts?])] [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 :button-icon-left auth-button-icon-left :button-label auth-button-label}]))) diff --git a/src/status_im/common/standard_authentication/standard_auth/slide_button/view.cljs b/src/status_im/common/standard_authentication/standard_auth/slide_button/view.cljs index 4c4ce5c9ec..222dfa21b3 100644 --- a/src/status_im/common/standard_authentication/standard_auth/slide_button/view.cljs +++ b/src/status_im/common/standard_authentication/standard_auth/slide_button/view.cljs @@ -9,26 +9,25 @@ (defn view [{: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}}}] - (let [theme (quo.theme/use-theme) - auth-method (rf/sub [:auth-method]) - biometric-auth? (= auth-method constants/auth-method-biometric) - on-complete (rn/use-callback - (fn [reset-slider-fn] - (js/setTimeout #(reset-slider-fn false) 500) - (rf/dispatch - [:standard-auth/authorize - {:auth-button-icon-left auth-button-icon-left - :theme theme - :blur? blur? - :keycard-supported? keycard-supported? - :biometric-auth? biometric-auth? - :on-auth-success on-auth-success - :on-auth-fail on-auth-fail - :auth-button-label auth-button-label}])) - (vec (conj dependencies on-auth-success on-auth-fail))) - biometric-type (rf/sub [:biometrics/supported-type])] + (let [theme (quo.theme/use-theme) + auth-method (rf/sub [:auth-method]) + biometric-auth? (= auth-method constants/auth-method-biometric) + on-complete-callback (rn/use-callback + (fn [reset-slider-fn] + (js/setTimeout #(reset-slider-fn false) 500) + (rf/dispatch [:standard-auth/authorize + {:auth-button-icon-left auth-button-icon-left + :theme theme + :blur? blur? + :biometric-auth? biometric-auth? + :on-auth-success on-auth-success + :on-auth-fail on-auth-fail + :auth-button-label auth-button-label}])) + (vec (conj dependencies on-auth-success on-auth-fail))) + on-complete (or on-complete on-complete-callback) + biometric-type (rf/sub [:biometrics/supported-type])] [quo/slide-button {:container-style container-style :size size diff --git a/src/status_im/common/terms/view.cljs b/src/status_im/common/terms/view.cljs index cc1389534c..362e31933d 100644 --- a/src/status_im/common/terms/view.cljs +++ b/src/status_im/common/terms/view.cljs @@ -1,11 +1,20 @@ (ns status-im.common.terms.view (:require-macros [legacy.status-im.utils.slurp :refer [slurp]]) (: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")) (defn terms-of-use [] - [gesture/scroll-view {:margin 20} + [gesture/scroll-view {:style {:margin 20}} [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]]]) diff --git a/src/status_im/constants.cljs b/src/status_im/constants.cljs index fb30f0e4c6..100fcdac76 100644 --- a/src/status_im/constants.cljs +++ b/src/status_im/constants.cljs @@ -642,3 +642,9 @@ (def ^:const wallet-connect-transaction-refresh-interval-ms 10000) (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") diff --git a/src/status_im/contexts/chat/messenger/messages/contact_requests/bottom_drawer/view.cljs b/src/status_im/contexts/chat/messenger/messages/contact_requests/bottom_drawer/view.cljs index 87bb6cda38..7ab290d521 100644 --- a/src/status_im/contexts/chat/messenger/messages/contact_requests/bottom_drawer/view.cljs +++ b/src/status_im/contexts/chat/messenger/messages/contact_requests/bottom_drawer/view.cljs @@ -11,30 +11,35 @@ [{:keys [contact-id]}] (let [{:keys [contact-request-state community-id - chat-name]} (rf/sub [:chats/current-chat-chat-view]) - chat-type (rf/sub [:chats/chat-type]) - [primary-name _] (if (= chat-type :public-chat) - [(str "#" chat-name) ""] - (rf/sub [:contacts/contact-two-names-by-identity contact-id])) - community-chat? (= chat-type :community-chat) - joined (when community-chat? - (rf/sub [:communities/community-joined community-id])) - pending? (when community-chat? - (rf/sub [:communities/my-pending-request-to-join community-id])) - contact-request-send? (or (not contact-request-state) - (= contact-request-state - constants/contact-request-state-none)) - contact-request-received? (= contact-request-state - constants/contact-request-state-received) - contact-request-pending? (= contact-request-state - constants/contact-request-state-sent)] + chat-name]} (rf/sub [:chats/current-chat-chat-view]) + chat-type (rf/sub [:chats/chat-type]) + [primary-name _] (if (= chat-type :public-chat) + [(str "#" chat-name) ""] + (rf/sub [:contacts/contact-two-names-by-identity contact-id])) + community-chat? (= chat-type :community-chat) + joined (when community-chat? + (rf/sub [:communities/community-joined community-id])) + pending? (when community-chat? + (rf/sub [:communities/my-pending-request-to-join community-id])) + contact-request-send? (or (not contact-request-state) + (= contact-request-state + constants/contact-request-state-none)) + contact-request-received? (= contact-request-state + constants/contact-request-state-received) + contact-request-pending? (= contact-request-state + 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} [quo/permission-context {:blur? true :on-press (cond (and community-chat? (not pending?) (not joined)) - #(rf/dispatch [:open-modal :community-account-selection-sheet - {:community-id community-id}]) + (if keycard? + keycard-feature-unavailable + #(rf/dispatch [:open-modal :community-account-selection-sheet + {:community-id community-id}])) (not community-chat?) #(rf/dispatch [:chat.ui/show-profile contact-id])) diff --git a/src/status_im/contexts/communities/actions/request_to_join/view.cljs b/src/status_im/contexts/communities/actions/request_to_join/view.cljs index b8511c9999..41f4feb401 100644 --- a/src/status_im/contexts/communities/actions/request_to_join/view.cljs +++ b/src/status_im/contexts/communities/actions/request_to_join/view.cljs @@ -27,7 +27,10 @@ (fn [] (let [theme (quo.theme/use-theme) {: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} [gesture/scroll-view {:style style/container} [rn/view style/page-container @@ -59,7 +62,9 @@ (i18n/label :t/cancel)] [quo/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} :inner-style {:background-color (colors/resolve-color color theme)}} (i18n/label :t/request-to-join)]] diff --git a/src/status_im/contexts/communities/overview/view.cljs b/src/status_im/contexts/communities/overview/view.cljs index 9d6a88553d..8fb4275ed1 100644 --- a/src/status_im/contexts/communities/overview/view.cljs +++ b/src/status_im/contexts/communities/overview/view.cljs @@ -106,12 +106,14 @@ [quo/text (i18n/label :t/network-not-supported)]) (defn- request-access-button - [id color] + [id color keycard? keycard-feature-unavailable] [quo/button - {:on-press (if config/community-accounts-selection-enabled? - #(rf/dispatch [:open-modal :community-account-selection-sheet - {:community-id id}]) - #(rf/dispatch [:open-modal :community-requests-to-join {:id id}])) + {:on-press (if keycard? + keycard-feature-unavailable + (if config/community-accounts-selection-enabled? + #(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 :customization-color color :container-style {:margin-bottom 12} @@ -126,27 +128,33 @@ (defn- token-requirements [{:keys [id color role-permissions?]}] - (let [{:keys [can-request-access? no-member-permission? networks-not-supported? - highest-permission-role - tokens]} (rf/sub [:community/token-gated-overview id]) - highest-role-text (i18n/label - (communities.utils/role->translation-key highest-permission-role :t/member)) - on-press (rn/use-callback - (fn [] - (if config/community-accounts-selection-enabled? - (rf/dispatch [:open-modal :community-account-selection-sheet - {:community-id id}]) - (rf/dispatch [:open-modal :community-requests-to-join - {:id id}]))) - [id]) - on-press-info #(rf/dispatch - [:show-bottom-sheet {:content token-gated-communities-info}])] + (let + [{:keys [can-request-access? no-member-permission? networks-not-supported? + highest-permission-role + tokens]} (rf/sub [:community/token-gated-overview id]) + highest-role-text (i18n/label + (communities.utils/role->translation-key highest-permission-role + :t/member)) + on-press (rn/use-callback + (fn [] + (if config/community-accounts-selection-enabled? + (rf/dispatch [:open-modal :community-account-selection-sheet + {:community-id id}]) + (rf/dispatch [:open-modal :community-requests-to-join + {:id id}]))) + [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 networks-not-supported? [network-not-supported] (or (not role-permissions?) no-member-permission?) - [request-access-button id color] + [request-access-button id color keycard? keycard-feature-unavailable] :else [quo/community-token-gating @@ -154,7 +162,7 @@ :tokens tokens :community-color color :satisfied? can-request-access? - :on-press on-press + :on-press (if keycard? keycard-feature-unavailable on-press) :on-press-info on-press-info}]))) (defn- join-community diff --git a/src/status_im/contexts/keycard/events.cljs b/src/status_im/contexts/keycard/events.cljs index 4ad871b8c0..5d894b7f0d 100644 --- a/src/status_im/contexts/keycard/events.cljs +++ b/src/status_im/contexts/keycard/events.cljs @@ -9,7 +9,9 @@ status-im.contexts.keycard.pin.events status-im.contexts.keycard.sign.events [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 (fn [{:keys [db]} _] @@ -65,6 +67,30 @@ (fn [_ [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 (fn [{:keys [db]}] {:db (update db diff --git a/src/status_im/contexts/keycard/feature_unavailable/events.cljs b/src/status_im/contexts/keycard/feature_unavailable/events.cljs index 091c60348c..48dc7752b8 100644 --- a/src/status_im/contexts/keycard/feature_unavailable/events.cljs +++ b/src/status_im/contexts/keycard/feature_unavailable/events.cljs @@ -5,5 +5,8 @@ (rf/reg-event-fx :keycard/feature-unavailable-show - (fn [_] - {:fx [[:dispatch [:show-bottom-sheet {:content feature-unavailable/view}]]]})) + (fn [_ [options]] + {:fx [[:dispatch + [:show-bottom-sheet + {:theme (:theme options) + :content feature-unavailable/view}]]]})) diff --git a/src/status_im/contexts/onboarding/create_or_sync_profile/view.cljs b/src/status_im/contexts/onboarding/create_or_sync_profile/view.cljs index 0d25b3b1c3..800295191e 100644 --- a/src/status_im/contexts/onboarding/create_or_sync_profile/view.cljs +++ b/src/status_im/contexts/onboarding/create_or_sync_profile/view.cljs @@ -91,7 +91,7 @@ :title (i18n/label :t/log-in-by-syncing) :subtitle (i18n/label :t/log-in-by-syncing-subtitle) :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}]) (defn- use-empty-keycard-icon-card diff --git a/src/status_im/contexts/onboarding/share_usage/style.cljs b/src/status_im/contexts/onboarding/share_usage/style.cljs index c32258759f..1f8d4012c8 100644 --- a/src/status_im/contexts/onboarding/share_usage/style.cljs +++ b/src/status_im/contexts/onboarding/share_usage/style.cljs @@ -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 {:margin-horizontal 20 @@ -16,3 +17,7 @@ [insets] {:margin 20 :margin-bottom (+ 12 (:bottom insets))}) + +(def page + {:flex 1 + :background-color colors/neutral-100}) diff --git a/src/status_im/contexts/onboarding/share_usage/view.cljs b/src/status_im/contexts/onboarding/share_usage/view.cljs index 4987656e94..7a02b3b292 100644 --- a/src/status_im/contexts/onboarding/share_usage/view.cljs +++ b/src/status_im/contexts/onboarding/share_usage/view.cljs @@ -17,35 +17,38 @@ (rf/dispatch [:navigate-to-within-stack [next-screen :screen/onboarding.share-usage]]) ;; Onboarding (rf/dispatch [:navigate-back]))) ;; Login Screen +(defn- learn-more + [] + (rf/dispatch [:show-bottom-sheet + {:content learn-more-sheet/view + :shell? true}])) + (defn view [] (let [insets (safe-area/get-insets) 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)) - maybe-later (rn/use-callback #(share-usage-data-fn false next-screen)) - learn-more (rn/use-callback #(rf/dispatch [:show-bottom-sheet - {:content learn-more-sheet/view - :shell? true}]))] - [:<> + maybe-later (rn/use-callback #(share-usage-data-fn false next-screen))] + [rn/view {:style style/page} [quo/page-nav {:margin-top (:top insets) :background :blur - :icon-name :i/arrow-left + :icon-name :i/close :on-press events-helper/navigate-back :right-side [{:icon-left :i/info :accessibility-label :learn-more :label (i18n/label :t/learn-more) :on-press learn-more}]}] - [quo/text-combinations - {:container-style style/title-container - :title (i18n/label :t/help-us-improve-status) + [quo/page-top + {:title (i18n/label :t/help-us-improve-status) :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}] [rn/image {:resize-mode :contain :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)} [quo/button {:size 40 diff --git a/src/status_im/contexts/profile/settings/list_items.cljs b/src/status_im/contexts/profile/settings/list_items.cljs index f7ec70d71b..e17b63465e 100644 --- a/src/status_im/contexts/profile/settings/list_items.cljs +++ b/src/status_im/contexts/profile/settings/list_items.cljs @@ -125,7 +125,7 @@ :blur? true :image-props :i/light})] [{:title (i18n/label :t/about) - :on-press #(rf/dispatch [:open-modal :about-app]) + :on-press #(rf/dispatch [:open-modal :screen/settings.about]) :action :arrow :blur? true} {:title (i18n/label :t/status-help) diff --git a/src/status_im/contexts/profile/settings/screens/password/view.cljs b/src/status_im/contexts/profile/settings/screens/password/view.cljs index 499e788e45..6988dc52c5 100644 --- a/src/status_im/contexts/profile/settings/screens/password/view.cljs +++ b/src/status_im/contexts/profile/settings/screens/password/view.cljs @@ -7,33 +7,37 @@ [utils.re-frame :as rf])) (defn- on-press-biometric-enable - [button-label theme] + [button-label theme keycard-profile?] (fn [] - (rf/dispatch - [:standard-auth/authorize-with-password - {:blur? true - :theme theme - :auth-button-label (i18n/label :t/biometric-enable-button {:bio-type-label button-label}) - :on-auth-success (fn [password] - (rf/dispatch [:hide-bottom-sheet]) - (rf/dispatch - [:biometric/authenticate - {:on-success #(rf/dispatch [:biometric/enable password]) - :on-fail #(rf/dispatch [:biometric/show-message (ex-cause %)])}]))}]))) + (if keycard-profile? + (rf/dispatch [:keycard/feature-unavailable-show {:theme :dark}]) + (rf/dispatch + [:standard-auth/authorize-with-password + {:blur? true + :theme theme + :auth-button-label (i18n/label :t/biometric-enable-button {:bio-type-label button-label}) + :on-auth-success (fn [password] + (rf/dispatch [:hide-bottom-sheet]) + (rf/dispatch + [:biometric/authenticate + {:on-success #(rf/dispatch [:biometric/enable password]) + :on-fail #(rf/dispatch [:biometric/show-message + (ex-cause %)])}]))}])))) (defn- get-biometric-item [theme] - (let [auth-method (rf/sub [:auth-method]) - biometric-type (rf/sub [:biometrics/supported-type]) - label (biometric/get-label-by-type biometric-type) - icon (biometric/get-icon-by-type biometric-type) - supported? (boolean biometric-type) - enabled? (= auth-method constants/auth-method-biometric) - biometric-on? (and supported? enabled?) - press-handler (when supported? - (if biometric-on? - (fn [] (rf/dispatch [:biometric/disable])) - (on-press-biometric-enable label theme)))] + (let [auth-method (rf/sub [:auth-method]) + biometric-type (rf/sub [:biometrics/supported-type]) + keycard-profile? (rf/sub [:keycard/keycard-profile?]) + label (biometric/get-label-by-type biometric-type) + icon (biometric/get-icon-by-type biometric-type) + supported? (boolean biometric-type) + enabled? (= auth-method constants/auth-method-biometric) + biometric-on? (and supported? enabled?) + press-handler (when supported? + (if biometric-on? + (fn [] (rf/dispatch [:biometric/disable])) + (on-press-biometric-enable label theme keycard-profile?)))] {:title label :image-props icon :image :icon @@ -58,7 +62,8 @@ (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/page-nav {:background :blur @@ -68,6 +73,7 @@ [quo/category {:key :category :data [(get-biometric-item theme) - (get-change-password-item)] + (when-not keycard-profile? + (get-change-password-item))] :blur? true :list-type :settings}]])) diff --git a/src/status_im/contexts/settings/about/style.cljs b/src/status_im/contexts/settings/about/style.cljs new file mode 100644 index 0000000000..649c46a426 --- /dev/null +++ b/src/status_im/contexts/settings/about/style.cljs @@ -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}) diff --git a/src/status_im/contexts/settings/about/view.cljs b/src/status_im/contexts/settings/about/view.cljs new file mode 100644 index 0000000000..f5ddd176a7 --- /dev/null +++ b/src/status_im/contexts/settings/about/view.cljs @@ -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}]]) diff --git a/src/status_im/contexts/settings/common/header.cljs b/src/status_im/contexts/settings/common/header.cljs new file mode 100644 index 0000000000..76d21ef27d --- /dev/null +++ b/src/status_im/contexts/settings/common/header.cljs @@ -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}]]) diff --git a/src/status_im/contexts/settings/wallet/keypairs_and_accounts/view.cljs b/src/status_im/contexts/settings/wallet/keypairs_and_accounts/view.cljs index 97a159a2f7..4dbf020cb0 100644 --- a/src/status_im/contexts/settings/wallet/keypairs_and_accounts/view.cljs +++ b/src/status_im/contexts/settings/wallet/keypairs_and_accounts/view.cljs @@ -41,7 +41,7 @@ (defn- keypair [{keypair-type :type - :keys [accounts name] + :keys [accounts name keycard?] :as item} _ _ {:keys [profile-picture compressed-key customization-color]}] @@ -59,7 +59,7 @@ :type (if default-keypair? :default-keypair :keypair) - :stored :on-device + :stored (if keycard? :on-keycard :on-device) :shortened-key shortened-key :customization-color customization-color :profile-picture profile-picture})})) @@ -68,7 +68,7 @@ [quo/keypair {:blur? true :status-indicator false - :stored :on-device + :stored (if keycard? :on-keycard :on-device) :action (if default-keypair? :none :options) :accounts accounts :customization-color customization-color diff --git a/src/status_im/contexts/syncing/syncing_devices_list/view.cljs b/src/status_im/contexts/syncing/syncing_devices_list/view.cljs index 59c29df88e..74fb9219d4 100644 --- a/src/status_im/contexts/syncing/syncing_devices_list/view.cljs +++ b/src/status_im/contexts/syncing/syncing_devices_list/view.cljs @@ -38,7 +38,11 @@ #(if (:enabled? %) :paired-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/page-nav {:type :no-title @@ -60,7 +64,9 @@ :type :primary :customization-color profile-color :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]] [device/view (merge user-device {:this-device? true})] (when (seq paired-devices) diff --git a/src/status_im/contexts/wallet/account/tabs/about/view.cljs b/src/status_im/contexts/wallet/account/tabs/about/view.cljs index 5996b9ee3e..b5c3adb09c 100644 --- a/src/status_im/contexts/wallet/account/tabs/about/view.cljs +++ b/src/status_im/contexts/wallet/account/tabs/about/view.cljs @@ -69,7 +69,9 @@ (let [{:keys [customization-color] :as profile} (rf/sub [:profile/profile-with-image]) {:keys [address path watch-only?]} (rf/sub [:wallet/current-viewing-account]) {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]) origin-type (case keypair-type :seed @@ -98,7 +100,7 @@ (when (not watch-only?) [quo/account-origin {:type origin-type - :stored :on-device + :stored (if keypair-keycard? :on-keycard :on-device) :profile-picture (profile.utils/photo profile) :customization-color customization-color :derivation-path path diff --git a/src/status_im/contexts/wallet/add_account/create_account/select_keypair/view.cljs b/src/status_im/contexts/wallet/add_account/create_account/select_keypair/view.cljs index fd9c32fbdc..4a0525a437 100644 --- a/src/status_im/contexts/wallet/add_account/create_account/select_keypair/view.cljs +++ b/src/status_im/contexts/wallet/add_account/create_account/select_keypair/view.cljs @@ -58,13 +58,14 @@ [item _ _ {:keys [profile-picture compressed-key selected-key-uid set-selected-key-uid customization-color]}] (let [profile-keypair? (= (:type item) :profile) + keycard? (boolean (seq (:keycards item))) accounts (parse-accounts (:accounts item))] [quo/keypair {:customization-color customization-color :profile-picture (when profile-keypair? profile-picture) :status-indicator false :type (if profile-keypair? :default-keypair :other) - :stored :on-device + :stored (if keycard? :on-keycard :on-device) :on-options-press #(js/alert "Options pressed") :action :selector :blur? false diff --git a/src/status_im/contexts/wallet/add_account/create_account/view.cljs b/src/status_im/contexts/wallet/add_account/create_account/view.cljs index 4fca1cca93..8c0ab7472d 100644 --- a/src/status_im/contexts/wallet/add_account/create_account/view.cljs +++ b/src/status_im/contexts/wallet/add_account/create_account/view.cljs @@ -22,7 +22,7 @@ [utils.string])) (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 :image (if primary-keypair? :avatar :icon) :image-props (if primary-keypair? @@ -35,7 +35,7 @@ :button-text (i18n/label :t/edit) :alignment :flex-start} :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) (let [formatted-path (string/replace derivation-path #"/" " / ") on-auth-success (fn [password] @@ -123,7 +123,7 @@ :container-style color-picker-style}]])]))) (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]) primary? (rf/sub [:wallet/selected-primary-keypair?]) keypair-name (or keypair-title @@ -135,7 +135,8 @@ [quo/category {:list-type :settings :label (i18n/label :t/origin) - :data (get-keypair-data {:primary-keypair? primary? + :data (get-keypair-data {:keycard? keycard? + :primary-keypair? primary? :title keypair-name :derivation-path derivation-path :customization-color customization-color})}]])) @@ -229,20 +230,37 @@ set-derivation-path #(reset! derivation-path %)] (fn [{:keys [on-change-text set-account-color set-emoji customization-color error]}] (let [{:keys [derived-from - key-uid]} (rf/sub [:wallet/selected-keypair]) - on-auth-success (rn/use-callback - (fn [password] - (let [preferences {:account-name @account-name - :color @account-color - :emoji @emoji}] - (rf/dispatch - [:wallet/derive-address-and-add-account - {:password password - :derived-from-address derived-from - :key-uid key-uid - :derivation-path @derivation-path - :account-preferences preferences}]))) - [derived-from])] + key-uid keycards]} (rf/sub [:wallet/selected-keypair]) + keycard? (boolean (seq keycards)) + on-auth-success (rn/use-callback + (fn [password] + (let [preferences {:account-name @account-name + :color @account-color + :emoji @emoji}] + (rf/dispatch + [:wallet/derive-address-and-add-account + {:password password + :derived-from-address derived-from + :key-uid key-uid + :derivation-path @derivation-path + :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 #(rf/dispatch [:wallet/next-derivation-path @@ -252,10 +270,13 @@ [floating-button {:account-color @account-color - :slide-button-props {:on-auth-success on-auth-success - :disabled? (or (empty? @account-name) - (string/blank? @derivation-path) - (some? error))}} + :slide-button-props {:on-auth-success (when-not keycard? on-auth-success) + :on-complete + (when keycard? on-complete) + :disabled? + (or (empty? @account-name) + (string/blank? @derivation-path) + (some? error))}} [avatar {:account-color @account-color :emoji @emoji @@ -269,7 +290,8 @@ {:account-color @account-color :set-account-color set-account-color}] [new-account-origin - {:derivation-path @derivation-path + {:keycard? keycard? + :derivation-path @derivation-path :customization-color customization-color}]])))) (defn view diff --git a/src/status_im/contexts/wallet/events.cljs b/src/status_im/contexts/wallet/events.cljs index 6f69066ba6..eba0f274a9 100644 --- a/src/status_im/contexts/wallet/events.cljs +++ b/src/status_im/contexts/wallet/events.cljs @@ -307,9 +307,8 @@ (rf/reg-event-fx :wallet/add-account (fn [_ - [{:keys [key-uid password account-name emoji color type] - :or {type :generated}} - {:keys [public-key address path] :as _derived-account}]] + [{:keys [key-uid password account-name emoji color type] :or {type :generated}} + {:keys [public-key address path]}]] (let [lowercase-address (some-> address string/lower-case) account-config {:key-uid (when (= type :generated) key-uid) diff --git a/src/status_im/contexts/wallet/send/transaction_confirmation/view.cljs b/src/status_im/contexts/wallet/send/transaction_confirmation/view.cljs index efd93650f3..6401225091 100644 --- a/src/status_im/contexts/wallet/send/transaction_confirmation/view.cljs +++ b/src/status_im/contexts/wallet/send/transaction_confirmation/view.cljs @@ -248,7 +248,9 @@ account))} user-props {:full-name to-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 ;; we reach confirmation screen. But in send collectible flow ;; routes request happens at the same time with navigation to @@ -279,20 +281,24 @@ :transaction-type transaction-type}] (when (and (not loading-suggested-routes?) route (seq route)) [standard-auth/slide-button - {:keycard-supported? true - :size :size-48 + {:size :size-48 :track-text (if (= transaction-type :tx/bridge) (i18n/label :t/slide-to-bridge) (i18n/label :t/slide-to-send)) :container-style {:z-index 2} :disabled? (not transaction-for-signing) :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 - (fn [data] + (fn [psw] (rf/dispatch - [:wallet/prepare-signatures-for-transactions - :send data])) - :auth-button-label (i18n/label :t/confirm)}])] + [:wallet/prepare-signatures-for-transactions :send + psw]))}])] :gradient-cover? true :customization-color (:color account)} [rn/view diff --git a/src/status_im/contexts/wallet/swap/set_spending_cap/view.cljs b/src/status_im/contexts/wallet/swap/set_spending_cap/view.cljs index 33fe5e81aa..7eae016dc7 100644 --- a/src/status_im/contexts/wallet/swap/set_spending_cap/view.cljs +++ b/src/status_im/contexts/wallet/swap/set_spending_cap/view.cljs @@ -217,18 +217,23 @@ (defn- slide-button [] - (let [loading-swap-proposal? (rf/sub [:wallet/swap-loading-swap-proposal?]) - swap-proposal (rf/sub [:wallet/swap-proposal-without-fees]) - account (rf/sub [:wallet/current-viewing-account]) - on-auth-success (rn/use-callback - #(rf/dispatch [:wallet/prepare-signatures-for-transactions :swap %]))] + (let [loading-swap-proposal? (rf/sub [:wallet/swap-loading-swap-proposal?]) + swap-proposal (rf/sub [:wallet/swap-proposal-without-fees]) + account (rf/sub [:wallet/current-viewing-account]) + transaction-for-signing (rf/sub [:wallet/swap-transaction-for-signing]) + 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 {:size :size-48 :track-text (i18n/label :t/slide-to-sign) :container-style {:z-index 2} :customization-color (:color account) :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 :auth-button-label (i18n/label :t/confirm)}])) diff --git a/src/status_im/contexts/wallet/swap/swap_confirmation/view.cljs b/src/status_im/contexts/wallet/swap/swap_confirmation/view.cljs index 80706a124a..be4089a4db 100644 --- a/src/status_im/contexts/wallet/swap/swap_confirmation/view.cljs +++ b/src/status_im/contexts/wallet/swap/swap_confirmation/view.cljs @@ -168,7 +168,9 @@ transaction-for-signing (rf/sub [:wallet/swap-transaction-for-signing]) swap-proposal (rf/sub [:wallet/swap-proposal-without-fees]) 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 {:size :size-48 :track-text (i18n/label :t/slide-to-swap) @@ -178,7 +180,11 @@ (not swap-proposal) (not transaction-for-signing)) :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] (rf/dispatch [:wallet/stop-get-swap-proposal]) (rf/dispatch [:wallet/prepare-signatures-for-transactions :swap data]))}])) diff --git a/src/status_im/navigation/options.cljs b/src/status_im/navigation/options.cljs index 1d7f3faee9..229548975d 100644 --- a/src/status_im/navigation/options.cljs +++ b/src/status_im/navigation/options.cljs @@ -25,16 +25,15 @@ (defn root-options [{:keys [background-color theme status-bar-theme nav-bar-color]}] - (merge - (statusbar-and-navbar-options theme status-bar-theme nav-bar-color) - {:topBar {:visible false} - :layout {:componentBackgroundColor (or background-color - (colors/theme-colors colors/white colors/neutral-100 theme)) - :orientation ["portrait"] - :backgroundColor (or background-color - (colors/theme-colors colors/white - colors/neutral-100 - theme))}})) + (let [layout-background (or background-color + (colors/theme-colors colors/white colors/neutral-100 theme)) + component-background (or background-color + (colors/theme-colors colors/white colors/neutral-100 theme))] + (assoc (statusbar-and-navbar-options theme status-bar-theme nav-bar-color) + :topBar {:visible false} + :layout {:componentBackgroundColor component-background + :orientation ["portrait"] + :backgroundColor layout-background}))) (defn dark-root-options [] diff --git a/src/status_im/navigation/screens.cljs b/src/status_im/navigation/screens.cljs index 30c2d46a5b..b039a5d014 100644 --- a/src/status_im/navigation/screens.cljs +++ b/src/status_im/navigation/screens.cljs @@ -6,6 +6,8 @@ [status-im.common.enter-seed-phrase.view :as enter-seed-phrase] [status-im.common.lightbox.view :as lightbox] [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.contexts.chat.group.create.view :as group.create] [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.syncing.view :as settings.syncing] [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.language-and-currency.currency.view :as settings.currency-selection] [status-im.contexts.settings.language-and-currency.view :as settings.language-and-currency] @@ -153,39 +156,39 @@ (def chat-screens [{:name :start-a-new-chat - :metrics {:track? :true + :metrics {:track? true :alias-id :messenger.new-chat} :options {:sheet? true} :component new-chat/view} {:name :chat - :metrics {:track? :true + :metrics {:track? true :alias-id :messenger.chat} :options {:popGesture false :animations transitions/stack-transition-from-bottom} :component chat/chat} {:name :screen/group-create - :metrics {:track? :true + :metrics {:track? true :alias-id :messenger.new-group} :options {:sheet? true :skip-background? true} :component group.create/view} {:name :screen/group-details - :metrics {:track? :true + :metrics {:track? true :alias-id :messenger.group-details} :component group.details/view} {:name :screen/group-update - :metrics {:track? :true + :metrics {:track? true :alias-id :messenger.group-update} :options {:sheet? true :skip-background? true} :component group.update/view} {:name :screen/group-add-manage-members - :metrics {:track? :true + :metrics {:track? true :flow :messenger :alias-id :messenger.group-manage-members} :options {:sheet? true} @@ -193,12 +196,12 @@ (def community-screens [{:name :discover-communities - :metrics {:track? :true + :metrics {:track? true :alias-id :community.discover} :component communities.discover/view} {:name :community-overview - :metrics {:track? :true + :metrics {:track? true :alias-id :community.overview} :options {:animations transitions/stack-transition-from-bottom} :component communities.overview/view} @@ -207,79 +210,79 @@ ;; joining a community. The non-sheet screen is used when editing shared ;; addresses after the join request was sent. {:name :community-account-selection-sheet - :metrics {:track? :true + :metrics {:track? true :alias-id :community.select-addresses-for-joining-community} :options {:sheet? true} :component communities.accounts-selection/view} {:name :community-account-selection - :metrics {:track? :true + :metrics {:track? true :alias-id :community.select-addresses-for-community} :options {:insets {:top? true}} :component communities.accounts-selection/view} {:name :community-requests-to-join - :metrics {:track? :true + :metrics {:track? true :alias-id :community.request-to-join} :options {:sheet? true} :component join-menu/view} {:name :screen/share-community - :metrics {:track? :true + :metrics {:track? true :alias-id :community.share-community} :options options/transparent-screen-options :component share-community/view} {:name :invite-people-community - :metrics {:track? :true + :metrics {:track? true :alias-id :community.invite-people} :options {:sheet? true} :component communities.invite/view} {:name :share-community-channel - :metrics {:track? :true + :metrics {:track? true :alias-id :community.share-channel} :options options/transparent-screen-options :component share-community-channel/view} {:name :screen/chat.view-channel-members-and-details - :metrics {:track? :true + :metrics {:track? true :alias-id :community.view-channel-members-and-details} :options {:insets {:top? true}} :component channel-view-channel-members-and-details/view} {:name :addresses-for-permissions - :metrics {:track? :true + :metrics {:track? true :alias-id :community.choose-addresses-for-permissions} :options {:insets {:top? true}} :component addresses-for-permissions/view} {:name :address-for-airdrop - :metrics {:track? :true + :metrics {:track? true :alias-id :community.choose-addresses-for-airdrop} :options {:insets {:top? true}} :component airdrop-addresses/view}]) (def contact-screens [{:name :new-contact - :metrics {:track? :true + :metrics {:track? true :alias-id :contact.new-contact} :options {:sheet? true} :component add-new-contact/new-contact} {:name :scan-profile-qr-code - :metrics {:track? :true + :metrics {:track? true :alias-id :contact.scan-profile-qr-code} :options options/dark-screen :component scan-profile-qr-page/view} {:name :contact-profile - :metrics {:track? :true + :metrics {:track? true :alias-id :contact.contact-profile} :options {:modalPresentationStyle :overCurrentContext} :component contact-profile/view} {:name :share-contact - :metrics {:track? :true + :metrics {:track? true :alias-id :contact.share-profile} :options options/transparent-screen-options :component share-contact/view}]) @@ -311,56 +314,56 @@ (def settings-screens [{:name :settings - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.profile-settings} :options options/transparent-screen-options :component settings/view} {:name :screen/settings.keycard - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.keycard} :options {:theme :dark :insets {:top? true :bottom? true}} :component settings.keycard/view} {:name :edit-profile - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.edit-profile} :options options/transparent-modal-screen-options :component edit-profile/view} {:name :edit-accent-colour - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.edit-profile-accent-colour} :options options/transparent-modal-screen-options :component edit-accent-colour/view} {:name :edit-name - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.edit-profile-name} :options options/transparent-modal-screen-options :component edit-name/view} {:name :edit-bio - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.edit-profile-bio} :options options/transparent-modal-screen-options :component edit-bio/view} {:name :screen/settings-password - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.password} :options options/transparent-modal-screen-options :component settings-password/view} {:name :screen/change-password - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.change-password} :options (assoc options/transparent-modal-screen-options :theme :dark) :component change-password/view} {:name :screen/change-password-loading - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.change-password-loading} :options (assoc options/transparent-modal-screen-options @@ -371,25 +374,25 @@ :component change-password-loading/view} {:name :screen/settings-messages - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.messages} :options options/transparent-modal-screen-options :component settings.messages/view} {:name :screen/settings-blocked-users - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.blocked-users} :options options/transparent-modal-screen-options :component settings.blocked-users/view} {:name :screen/settings-privacy-and-security - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.private-and-security} :options options/transparent-modal-screen-options :component settings.privacy-and-security/view} {:name :screen/settings.share-usage-data - :metrics {:track? :true} + :metrics {:track? true} :options options/transparent-modal-screen-options :component settings.share-usage/view} @@ -405,89 +408,104 @@ :component syncing-devices-list/view} {:name :screen/settings.language-and-currency - :metrics {:track? :true} + :metrics {:track? true} :options options/transparent-modal-screen-options :component settings.language-and-currency/view} {:name :screen/settings.currency-selection - :metrics {:track? :true} + :metrics {:track? true} :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 [{:name :screen/settings.wallet - :metrics {:track? :true} + :metrics {:track? true} :options options/transparent-modal-screen-options :component wallet-options/view} {:name :screen/settings.rename-keypair - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-rename-keypair} :options options/transparent-screen-options :component keypair-rename/view} {:name :screen/settings.encrypted-keypair-qr - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-encrypted-keypair-qr} :options options/transparent-screen-options :component encrypted-keypair-qr/view} {:name :screen/settings.saved-addresses - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-saved-addresses} :options options/transparent-modal-screen-options :component saved-addresses-settings/view} {:name :screen/settings.keypairs-and-accounts - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-keypairs-and-accounts} :options options/transparent-modal-screen-options :component keypairs-and-accounts/view} {:name :screen/settings.scan-keypair-qr - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-scan-keypair-qr} :options options/transparent-screen-options :component scan-keypair-qr/view} {:name :screen/settings.missing-keypair.import-seed-phrase - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-missing-keypair-import-seed-phrase} :options options/transparent-screen-options :component missing-keypairs.import-seed-phrase/view} {:name :screen/settings.missing-keypair-import-private-key - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-missing-keypair-import-private-key} :options options/transparent-screen-options :component missing-keypairs.import-private-key/view} {:name :screen/settings.network-settings - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-network-settings} :options options/transparent-modal-screen-options :component network-settings/view} {:name :screen/settings.save-address - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-saved-addresses} :options options/transparent-modal-screen-options :component wallet-save-address/view} {:name :screen/settings.edit-saved-address - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-edit-saved-addresses} :options (assoc options/dark-screen :sheet? true) :component wallet-save-address/view} {:name :screen/settings.add-address-to-save - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-add-saved-address} :options options/transparent-modal-screen-options :component wallet-add-address-to-save/view} {:name :screen/settings.share-saved-address - :metrics {:track? :true + :metrics {:track? true :alias-id :settings.wallet-share-saved-address} :options options/transparent-screen-options :component share-saved-address/view}]) @@ -757,9 +775,7 @@ :metrics {:track? true} :options {:theme :dark :layout options/onboarding-transparent-layout - :animations (merge - transitions/new-to-status-modal-animations - transitions/push-animations-for-transparent-background) + :animations transitions/modal-animations-vertical :popGesture false :modalPresentationStyle :overCurrentContext} :component onboarding.share-usage/view}) @@ -876,48 +892,48 @@ (def keycard-screens [{:name :screen/keycard.check - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.check/view} {:name :screen/keycard.empty - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.empty/view} {:name :screen/keycard.empty-create - :metrics {:track? :true} + :metrics {:track? true} :options {:insets {:top? true :bottom? true}} :component keycard.empty/create} {:name :screen/keycard.error - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.error/view} {:name :screen/keycard.not-keycard - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.not-keycard/view} {:name :screen/keycard.authorise - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.authorise/view} {:name :screen/keycard.migrate - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.migrate/view} {:name :screen/keycard.re-encrypting - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true} :popGesture false @@ -926,7 +942,7 @@ :component keycard.re-encrypting/view} {:name :screen/keycard.migrate.success - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true} :popGesture false @@ -935,7 +951,7 @@ :component keycard.migrate.success/view} {:name :screen/keycard.migrate.fail - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true} :popGesture false @@ -944,30 +960,30 @@ :component keycard.migrate.fail/view} {:name :screen/keycard.pin.create - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.pin.create/view} {:name :screen/keycard.pin.enter - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.pin.enter/view} {:name :screen/keycard.profile-keys - :metrics {:track? :true} + :metrics {:track? true} :options {:theme :dark :insets {:top? true :bottom? true}} :component keycard.migrate.profile-keys/view} {:name :screen/keycard.create-profile - :metrics {:track? :true} + :metrics {:track? true} :options {:insets {:top? true :bottom? true}} :component keycard.create/view} {:name :screen/keycard.create.ready-to-add - :metrics {:track? :true} + :metrics {:track? true} :options {:insets {:top? true :bottom? true}} :component keycard.create/ready-to-add}]) diff --git a/src/status_im/navigation/transitions.cljs b/src/status_im/navigation/transitions.cljs index b4ef5790c5..d802a2832b 100644 --- a/src/status_im/navigation/transitions.cljs +++ b/src/status_im/navigation/transitions.cljs @@ -40,6 +40,14 @@ :to (:width (rn/get-window)) :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 (def stack-slide-transition {:push {:content {:translationX {:from (:width (rn/get-window)) diff --git a/src/status_im/subs/wallet/wallet.cljs b/src/status_im/subs/wallet/wallet.cljs index 2b56325af5..f9f40ea689 100644 --- a/src/status_im/subs/wallet/wallet.cljs +++ b/src/status_im/subs/wallet/wallet.cljs @@ -349,12 +349,13 @@ :<- [:wallet/keypairs-list] (fn [keypairs [_ format-options]] (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) (update acc :missing conj {:type type + :keycard? (boolean (seq keycards)) :name name :key-uid key-uid :accounts (format-settings-missing-keypair-accounts accounts)}) @@ -362,6 +363,7 @@ :operable conj {:type type + :keycard? (boolean (seq keycards)) :name name :key-uid key-uid :accounts (format-settings-keypair-accounts accounts format-options)}))) diff --git a/src/utils/address.cljs b/src/utils/address.cljs index 7c3535f42e..a51a627f6a 100644 --- a/src/utils/address.cljs +++ b/src/utils/address.cljs @@ -141,3 +141,14 @@ (defn zero-address? [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)))) diff --git a/test/appium/tests/activity_center/test_activity_center.py b/test/appium/tests/activity_center/test_activity_center.py index e7033c7048..c373f3e70e 100644 --- a/test/appium/tests/activity_center/test_activity_center.py +++ b/test/appium/tests/activity_center/test_activity_center.py @@ -148,14 +148,6 @@ class TestActivityCenterContactRequestMultipleDevicePR(MultipleSharedDeviceTestC @marks.testrail_id(702777) 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] def _device_1_creates_user(): diff --git a/test/appium/tests/critical/chats/test_group_chat.py b/test/appium/tests/critical/chats/test_group_chat.py index b02d68be76..e6ca294da7 100644 --- a/test/appium/tests/critical/chats/test_group_chat.py +++ b/test/appium/tests/critical/chats/test_group_chat.py @@ -453,7 +453,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase): 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_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] chat = self.homes[1].get_chat(self.chat_name) chat.long_press_element() @@ -483,7 +483,7 @@ class TestGroupChatMultipleDeviceMergedNewUI(MultipleSharedDeviceTestCase): if after_mute_counter > initial_counter: self.errors.append("New messages counter near chats tab button is %s after mute, but should be %s" % ( 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) chat.click() if not self.chats[1].chat_element_by_text(muted_message).is_element_displayed(30): diff --git a/test/appium/tests/critical/chats/test_public_chat_browsing.py b/test/appium/tests/critical/chats/test_public_chat_browsing.py index 73a2cabb6b..6f34f4e62e 100644 --- a/test/appium/tests/critical/chats/test_public_chat_browsing.py +++ b/test/appium/tests/critical/chats/test_public_chat_browsing.py @@ -1021,6 +1021,8 @@ class TestCommunityMultipleDeviceMergedTwo(MultipleSharedDeviceTestCase): self.errors.append('Community is still shown in the list after leave') 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) def test_community_hashtag_links_to_community_channels(self): for home in self.homes: @@ -1121,6 +1123,8 @@ class TestCommunityMultipleDeviceMergedTwo(MultipleSharedDeviceTestCase): 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) def test_community_join_when_node_owner_offline(self): for home in self.homes: diff --git a/test/appium/tests/critical/test_deep_and_universal_links.py b/test/appium/tests/critical/test_deep_and_universal_links.py index b2880a8af1..a3b166929d 100644 --- a/test/appium/tests/critical/test_deep_and_universal_links.py +++ b/test/appium/tests/critical/test_deep_and_universal_links.py @@ -89,7 +89,7 @@ class TestDeepLinksOneDevice(MultipleSharedDeviceTestCase): self.home.get_chat(snt_community_name, community=True).click() snt_community_url = self.community_view.copy_community_link() 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() old, new = "https://status.app/", "status-app://" diff --git a/test/appium/tests/critical/test_fallback.py b/test/appium/tests/critical/test_fallback.py index e3e7a320c3..dcfa880f9f 100644 --- a/test/appium/tests/critical/test_fallback.py +++ b/test/appium/tests/critical/test_fallback.py @@ -269,7 +269,7 @@ class TestFallbackMultipleDevice(MultipleSharedDeviceTestCase): 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.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.sign_in_2.click_system_back_button() diff --git a/test/appium/tests/critical/test_wallet.py b/test/appium/tests/critical/test_wallet.py index 8ccc9471fc..5c37b7d370 100644 --- a/test/appium/tests/critical/test_wallet.py +++ b/test/appium/tests/critical/test_wallet.py @@ -59,19 +59,19 @@ class TestWalletMultipleDevice(MultipleSharedDeviceTestCase): 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) - if user_name == 'sender': + if user_name == self.sender_username: exp_amount = round(initial_eth_amount - amount_to_send, 4) else: 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 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 - if user_name == 'receiver' and new_eth_amount >= exp_amount: + if user_name == self.receiver_username and new_eth_amount >= exp_amount: return 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 self.home_1.just_fyi("Relogin for getting an updated balance") diff --git a/test/appium/views/home_view.py b/test/appium/views/home_view.py index 8d245191f9..1c8589d0e0 100644 --- a/test/appium/views/home_view.py +++ b/test/appium/views/home_view.py @@ -626,6 +626,7 @@ class HomeView(BaseView): return element.text def get_username(self): + self.toast_content_element.wait_for_invisibility_of_element() profile_view = self.get_profile_view() profile_view = self.profile_button.click_until_presence_of_element(profile_view.default_username_text) profile_view.default_username_text.wait_for_element(3) diff --git a/test/appium/views/sign_in_view.py b/test/appium/views/sign_in_view.py index 914262e2b2..d9193313b7 100644 --- a/test/appium/views/sign_in_view.py +++ b/test/appium/views/sign_in_view.py @@ -361,8 +361,10 @@ class SignInView(BaseView): def get_user_profile_by_name(self, username: str): self.driver.info("Getting username card by '%s'" % username) expected_element = UserProfileElement(self.driver, username=username) - return expected_element if expected_element.is_element_displayed(10) else self.driver.fail( - "User %s is not found!" % username) + if expected_element.is_element_displayed(10): + return expected_element + else: + raise NoSuchElementException(msg="User %s is not found!" % username) def get_user_profile_by_index(self, index: int): self.driver.info("Getting username card by index %s" % index) diff --git a/translations/en.json b/translations/en.json index 14618718c0..0705775fe3 100644 --- a/translations/en.json +++ b/translations/en.json @@ -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-share": "Do not share", + "documents": "Documents", "done": "Done", "dont-ask": "Don't ask me again", "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-with-status": "Getting started with Status", "gif": "GIF", + "github-repos": "GitHub repos", "give-a-short-description": "Give a short description", "give-a-short-description-community": "Give it a short description", "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-the-current-profile": "We will receive from the current profile:", "web-view-error": "Unable to load page", + "website": "Website", "websites": "Websites", "webview-camera-permission-requests": "Webview camera permission requests", "webview-camera-permission-requests-subtitle": "When enabled, websites and dapps can ask to use your camera",