diff --git a/mobile_files/package.json.orig b/mobile_files/package.json.orig index 262affe486..dd57359d1a 100644 --- a/mobile_files/package.json.orig +++ b/mobile_files/package.json.orig @@ -54,7 +54,7 @@ "react-native-safe-area-view": "0.9.0", "react-native-securerandom": "git+https://github.com/status-im/react-native-securerandom.git#0.1.1-2", "react-native-splash-screen": "3.1.1", - "react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#v2.5.0", + "react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#v2.5.3", "react-native-svg": "^9.2.4", "react-native-svg-transformer": "^0.12.1", "react-native-tcp": "git+https://github.com/status-im/react-native-tcp.git#v3.3.0-1-status", diff --git a/mobile_files/yarn.lock b/mobile_files/yarn.lock index 45d514de9b..7dcf466943 100644 --- a/mobile_files/yarn.lock +++ b/mobile_files/yarn.lock @@ -5582,9 +5582,9 @@ react-native-splash-screen@3.1.1: resolved "https://registry.yarnpkg.com/react-native-splash-screen/-/react-native-splash-screen-3.1.1.tgz#1a4e46c9fdce53ff52af2a2cb4181788c4e30b30" integrity sha512-PU2YocOSGbLjL9Vgcq/cwMNuHHKNjjuPpa1IPMuWo+6EB/fSZ5VOmxSa7+eucQe3631s3NhGuk3eHKahU03a4Q== -"react-native-status-keycard@git+https://github.com/status-im/react-native-status-keycard.git#v2.5.0": - version "2.5.0" - resolved "git+https://github.com/status-im/react-native-status-keycard.git#d9ccdd6a7db0ae6c3d52b8c998529ac5a21ca029" +"react-native-status-keycard@git+https://github.com/status-im/react-native-status-keycard.git#v2.5.3": + version "2.5.3" + resolved "git+https://github.com/status-im/react-native-status-keycard.git#4ba5e8a771e764c449c19180e5eaa8553c789b8d" react-native-svg-transformer@^0.12.1: version "0.12.1" diff --git a/src/status_im/accounts/login/core.cljs b/src/status_im/accounts/login/core.cljs index 5261a5614b..7e1a9ba67a 100644 --- a/src/status_im/accounts/login/core.cljs +++ b/src/status_im/accounts/login/core.cljs @@ -263,12 +263,9 @@ (fx/defn open-keycard-login [{:keys [db] :as cofx}] - (let [navigation-stack (:navigation-stack db)] - (fx/merge cofx - {:db (assoc-in db [:hardwallet :pin :enter-step] :login)} - (if (empty? navigation-stack) - (navigation/navigate-to-cofx :accounts nil) - (navigation/navigate-to-cofx :enter-pin nil))))) + (fx/merge cofx + {:db (assoc-in db [:hardwallet :pin :enter-step] :login)} + (navigation/navigate-to-cofx :enter-pin nil))) (fx/defn get-user-password [_ address] diff --git a/src/status_im/data_store/accounts.cljs b/src/status_im/data_store/accounts.cljs index 7f6b8fc02f..ebf9e65e1b 100644 --- a/src/status_im/data_store/accounts.cljs +++ b/src/status_im/data_store/accounts.cljs @@ -66,6 +66,14 @@ (fn [realm] (core/create realm :account (serialize-account account) true))) +(defn delete-account-tx + "Returns tx function for deleting account" + [address] + (fn [realm] + (let [account (core/single (core/get-by-field realm :account :address address))] + (when account + (core/delete realm account))))) + (re-frame/reg-cofx :data-store/get-all-accounts (fn [coeffects _] diff --git a/src/status_im/events.cljs b/src/status_im/events.cljs index 1a4644c807..62abbd240f 100644 --- a/src/status_im/events.cljs +++ b/src/status_im/events.cljs @@ -1146,6 +1146,16 @@ (fn [cofx [_ error]] (hardwallet/on-delete-error cofx error))) +(handlers/register-handler-fx + :hardwallet.callback/on-remove-key-success + (fn [cofx _] + (hardwallet/on-remove-key-success cofx))) + +(handlers/register-handler-fx + :hardwallet.callback/on-remove-key-error + (fn [cofx [_ error]] + (hardwallet/on-remove-key-error cofx error))) + (handlers/register-handler-fx :hardwallet.callback/on-get-keys-success (fn [cofx [_ data]] @@ -1336,6 +1346,11 @@ (fn [cofx _] (hardwallet/card-ready-next-button-pressed cofx))) +(handlers/register-handler-fx + :hardwallet/proceed-to-generate-mnemonic + (fn [cofx _] + (hardwallet/proceed-to-generate-mnemonic cofx))) + (handlers/register-handler-fx :hardwallet/generate-mnemonic (fn [cofx _] @@ -1383,6 +1398,11 @@ (fn [cofx _] (hardwallet/unpair cofx))) +(handlers/register-handler-fx + :hardwallet/verify-pin + (fn [cofx _] + (hardwallet/verify-pin cofx))) + (handlers/register-handler-fx :keycard-settings.ui/reset-card-pressed (fn [cofx _] @@ -1403,6 +1423,11 @@ (fn [cofx _] (hardwallet/unpair-and-delete cofx))) +(handlers/register-handler-fx + :hardwallet/remove-key-with-unpair + (fn [cofx _] + (hardwallet/remove-key-with-unpair cofx))) + (handlers/register-handler-fx :hardwallet/navigate-to-enter-pin-screen (fn [cofx _] diff --git a/src/status_im/hardwallet/card.cljs b/src/status_im/hardwallet/card.cljs index f8ac8ace19..2641104721 100644 --- a/src/status_im/hardwallet/card.cljs +++ b/src/status_im/hardwallet/card.cljs @@ -140,6 +140,20 @@ (then #(re-frame/dispatch [:hardwallet.callback/on-delete-success %])) (catch #(re-frame/dispatch [:hardwallet.callback/on-delete-error (error-object->map %)])))) +(defn remove-key + [{:keys [pin pairing]}] + (.. keycard + (removeKey pairing pin) + (then #(re-frame/dispatch [:hardwallet.callback/on-remove-key-success %])) + (catch #(re-frame/dispatch [:hardwallet.callback/on-remove-key-error (error-object->map %)])))) + +(defn remove-key-with-unpair + [{:keys [pin pairing]}] + (.. keycard + (removeKeyWithUnpair pairing pin) + (then #(re-frame/dispatch [:hardwallet.callback/on-remove-key-success %])) + (catch #(re-frame/dispatch [:hardwallet.callback/on-remove-key-error (error-object->map %)])))) + (defn unpair-and-delete [{:keys [pin pairing]}] (when (and pairing pin) diff --git a/src/status_im/hardwallet/core.cljs b/src/status_im/hardwallet/core.cljs index 003dff09da..16e69c786a 100644 --- a/src/status_im/hardwallet/core.cljs +++ b/src/status_im/hardwallet/core.cljs @@ -47,14 +47,16 @@ navigate-to-browser? (contains? #{:wallet-sign-message-modal :wallet-send-transaction-modal :wallet-send-modal-stack} screen-before)] - (if navigate-to-browser? - (fx/merge cofx - {:db (assoc-in db [:hardwallet :on-card-connected] nil)} - (models.wallet/discard-transaction) - (navigation/navigate-to-cofx :browser nil)) - (fx/merge cofx - {:db (assoc-in db [:hardwallet :on-card-connected] nil)} - (navigation/navigate-back))))) + (if (nil? screen-before) + (navigation/navigate-to-cofx cofx :accounts nil) + (if navigate-to-browser? + (fx/merge cofx + {:db (assoc-in db [:hardwallet :on-card-connected] nil)} + (models.wallet/discard-transaction) + (navigation/navigate-to-cofx :browser nil)) + (fx/merge cofx + {:db (assoc-in db [:hardwallet :on-card-connected] nil)} + (navigation/navigate-back)))))) (fx/defn remove-pairing-from-account [{:keys [db]} {:keys [remove-instance-uid?]}] @@ -99,6 +101,7 @@ (case state :not-paired :pair :no-pairing-slots :no-slots + :init :card-ready :begin)) (defn- get-card-state @@ -114,7 +117,6 @@ :no-pairing-slots (and (not paired?) - has-master-key? (pos? free-pairing-slots)) :not-paired @@ -144,7 +146,7 @@ (fx/merge cofx {:db db'} (set-setup-step card-state) - (if (= :pre-init card-state) + (if (contains? #{:init :pre-init} card-state) (navigation/navigate-to-cofx :hardwallet-setup nil) (when-not (= :not-paired card-state) (navigation/navigate-to-cofx :hardwallet-authentication-method nil))) @@ -447,20 +449,70 @@ {:hardwallet/unpair-and-delete {:pin pin :pairing pairing}})) +(fx/defn remove-key-with-unpair + [{:keys [db] :as cofx}] + (let [pin (vector->string (get-in db [:hardwallet :pin :current])) + pairing (get-pairing db) + card-connected? (get-in db [:hardwallet :card-connected?])] + (if card-connected? + {:hardwallet/remove-key-with-unpair {:pin pin + :pairing pairing}} + (fx/merge cofx + {:db (assoc-in db [:hardwallet :on-card-connected] :hardwallet/remove-key-with-unpair)} + (navigation/navigate-to-cofx :hardwallet-connect nil))))) + +(fx/defn on-remove-key-success + [{:keys [db] :as cofx}] + (let [account-address (get-in db [:account/account :address]) + pairing (get-in db [:account/account :keycard-pairing])] + (fx/merge cofx + {:db (-> db + (update :accounts/accounts dissoc account-address) + (assoc-in [:hardwallet :whisper-public-key] nil) + (assoc-in [:hardwallet :wallet-address] nil) + (assoc-in [:hardwallet :secrets] {:pairing pairing}) + (assoc-in [:hardwallet :application-info] nil) + (assoc-in [:hardwallet :on-card-connected] nil) + (assoc-in [:hardwallet :pin] {:status nil + :error-label nil + :on-verified nil})) + :data-store/base-tx [(accounts-store/delete-account-tx account-address)] + :utils/show-popup {:title "" + :content (i18n/label :t/card-reseted)}} + (accounts.logout/logout)))) + +(fx/defn on-remove-key-error + [{:keys [db] :as cofx} error] + (log/debug "[hardwallet] remove key error" error) + (let [tag-was-lost? (= "Tag was lost." (:error error))] + (fx/merge cofx + (if tag-was-lost? + (fx/merge cofx + {:db (-> db + (assoc-in [:hardwallet :on-card-connected] :hardwallet/remove-key-with-unpair) + (assoc-in [:hardwallet :pin :status] nil)) + :utils/show-popup {:title (i18n/label :t/error) + :content (i18n/label :t/cannot-read-card)}} + (navigation/navigate-to-cofx :hardwallet-connect nil)) + (show-wrong-keycard-alert cofx true))))) + (fx/defn on-delete-success [{:keys [db] :as cofx}] - (fx/merge cofx - {:db (-> db - (assoc-in [:hardwallet :secrets] nil) - (assoc-in [:hardwallet :application-info] nil) - (assoc-in [:hardwallet :on-card-connected] nil) - (assoc-in [:hardwallet :pin] {:status nil - :error-label nil - :on-verified nil})) - :utils/show-popup {:title "" - :content (i18n/label :t/card-reseted)}} - (remove-pairing-from-account {:remove-instance-uid? true}) - (navigation/navigate-to-cofx :keycard-settings nil))) + (let [account-address (get-in db [:account/account :address])] + (fx/merge cofx + {:db (-> db + (update :accounts/accounts dissoc account-address) + (assoc-in [:hardwallet :secrets] nil) + (assoc-in [:hardwallet :application-info] nil) + (assoc-in [:hardwallet :on-card-connected] nil) + (assoc-in [:hardwallet :pin] {:status nil + :error-label nil + :on-verified nil})) + :data-store/base-tx [(accounts-store/delete-account-tx account-address)] + :utils/show-popup {:title "" + :content (i18n/label :t/card-reseted)}} + + (accounts.logout/logout)))) (fx/defn on-delete-error [{:keys [db] :as cofx} error] @@ -517,7 +569,7 @@ :puk [] :status nil :error-label nil - :on-verified :hardwallet/unpair-and-delete}))} + :on-verified :hardwallet/remove-key-with-unpair}))} (if card-connected? (navigate-to-enter-pin-screen) (navigation/navigate-to-cofx :hardwallet-connect nil))))) @@ -627,7 +679,9 @@ {:db (-> db (update-in [:hardwallet :pin] merge {:status nil :error-label nil}))} - (when-not (contains? #{:hardwallet/unpair :hardwallet/unpair-and-delete} on-verified) + (when-not (contains? #{:hardwallet/unpair + :hardwallet/remove-key-with-unpair + :hardwallet/unpair-and-delete} on-verified) (get-application-info pairing nil)) (when on-verified (dispatch-on-verified-event on-verified))))) @@ -696,12 +750,17 @@ (navigation/navigate-to-cofx :keycard-settings nil))) (defn- verify-pin - [{:keys [db] :as fx}] - (let [pin (vector->string (get-in fx [:db :hardwallet :pin :current])) - pairing (get-pairing db)] - {:db (assoc-in db [:hardwallet :pin :status] :verifying) - :hardwallet/verify-pin {:pin pin - :pairing pairing}})) + [{:keys [db] :as cofx}] + (let [pin (vector->string (get-in cofx [:db :hardwallet :pin :current])) + pairing (get-pairing db) + card-connected? (get-in db [:hardwallet :card-connected?])] + (if card-connected? + {:db (assoc-in db [:hardwallet :pin :status] :verifying) + :hardwallet/verify-pin {:pin pin + :pairing pairing}} + (fx/merge cofx + {:db (assoc-in db [:hardwallet :on-card-connected] :hardwallet/verify-pin)} + (navigation/navigate-to-cofx :hardwallet-connect nil))))) (defn- unblock-pin [{:keys [db] :as cofx}] @@ -1055,6 +1114,22 @@ {:db (assoc-in db [:hardwallet :recovery-phrase :confirm-error] (i18n/label :t/wrong-word))}))) (fx/defn card-ready-next-button-pressed + [{:keys [db] :as cofx}] + (let [pin (get-in db [:hardwallet :secrets :pin]) + pin-already-set? (boolean pin)] + (if pin-already-set? + (if (= (get-in db [:hardwallet :flow]) :create) + (load-generating-mnemonic-screen cofx) + {:db (assoc-in db [:hardwallet :setup-step] :recovery-phrase)}) + (fx/merge cofx + {:db (-> db + (assoc-in [:hardwallet :setup-step] :pin) + (assoc-in [:hardwallet :pin :enter-step] :current) + (assoc-in [:hardwallet :pin :on-verified] :hardwallet/proceed-to-generate-mnemonic) + (assoc-in [:hardwallet :pin :current] []) + (assoc-in [:hardwallet :pin :original] nil))})))) + +(fx/defn proceed-to-generate-mnemonic [{:keys [db] :as cofx}] (if (= (get-in db [:hardwallet :flow]) :create) (load-generating-mnemonic-screen cofx) @@ -1071,12 +1146,12 @@ (fx/defn generate-and-load-key [{:keys [db] :as cofx}] - (let [{:keys [mnemonic pairing]} (get-in db [:hardwallet :secrets]) - pin (vector->string (get-in db [:hardwallet :pin :original]))] + (let [{:keys [mnemonic pairing pin]} (get-in db [:hardwallet :secrets]) + pin' (or pin (vector->string (get-in db [:hardwallet :pin :current])))] (fx/merge cofx {:hardwallet/generate-and-load-key {:mnemonic mnemonic :pairing pairing - :pin pin}}))) + :pin pin'}}))) (fx/defn create-keycard-account [{:keys [db] :as cofx}] diff --git a/src/status_im/hardwallet/fx.cljs b/src/status_im/hardwallet/fx.cljs index c8ef4e9c46..5c0b70d7bc 100644 --- a/src/status_im/hardwallet/fx.cljs +++ b/src/status_im/hardwallet/fx.cljs @@ -69,6 +69,14 @@ :hardwallet/delete card/delete) +(re-frame/reg-fx + :hardwallet/remove-key + card/remove-key) + +(re-frame/reg-fx + :hardwallet/remove-key-with-unpair + card/remove-key-with-unpair) + (re-frame/reg-fx :hardwallet/unpair-and-delete card/unpair-and-delete) diff --git a/src/status_im/init/core.cljs b/src/status_im/init/core.cljs index 5b294a15b4..9d99fd91d3 100644 --- a/src/status_im/init/core.cljs +++ b/src/status_im/init/core.cljs @@ -140,7 +140,7 @@ [cofx] (let [{{:accounts/keys [accounts] :as db} :db} cofx] (if (empty? accounts) - (navigation/navigate-to-clean cofx :intro nil) + (navigation/navigate-to-cofx cofx :intro nil) (let [account-with-notification (when-not platform/desktop? (notifications/lookup-contact-pubkey-from-hash diff --git a/src/status_im/ui/components/bottom_bar/core.cljs b/src/status_im/ui/components/bottom_bar/core.cljs index ac1caba7c4..196ae51532 100644 --- a/src/status_im/ui/components/bottom_bar/core.cljs +++ b/src/status_im/ui/components/bottom_bar/core.cljs @@ -130,17 +130,18 @@ (minimize-bar new-view-id)))) :reagent-render (fn [keyboard-shown? view-id tab] - (if platform/ios? - [tabs-animation-wrapper-ios - [react/animated-view - {:style (tabs.styles/animated-container visible? keyboard-shown?)} - [tabs tab]]] - [tabs-animation-wrapper-android - keyboard-shown? - view-id - [react/animated-view - {:style (tabs.styles/animated-container visible? keyboard-shown?)} - [tabs tab]]]))})) + (when (not= view-id :enter-pin) + (if platform/ios? + [tabs-animation-wrapper-ios + [react/animated-view + {:style (tabs.styles/animated-container visible? keyboard-shown?)} + [tabs tab]]] + [tabs-animation-wrapper-android + keyboard-shown? + view-id + [react/animated-view + {:style (tabs.styles/animated-container visible? keyboard-shown?)} + [tabs tab]]])))})) (def disappearance-duration 150) (def appearance-duration 100) diff --git a/src/status_im/ui/screens/hardwallet/pin/views.cljs b/src/status_im/ui/screens/hardwallet/pin/views.cljs index ae1020cf7a..2be1e0edeb 100644 --- a/src/status_im/ui/screens/hardwallet/pin/views.cljs +++ b/src/status_im/ui/screens/hardwallet/pin/views.cljs @@ -109,8 +109,11 @@ [pin-view {:pin pin :title-label (case step :confirmation :t/repeat-pin + :current :t/current-pin :t/create-a-pin) - :description-label :t/create-pin-description + :description-label (case step + :current :t/current-pin-description + :t/create-pin-description) :step step :status status :error-label error-label}])) diff --git a/src/status_im/ui/screens/hardwallet/success/styles.cljs b/src/status_im/ui/screens/hardwallet/success/styles.cljs index 2841b5f2f8..4041395cdc 100644 --- a/src/status_im/ui/screens/hardwallet/success/styles.cljs +++ b/src/status_im/ui/screens/hardwallet/success/styles.cljs @@ -45,7 +45,7 @@ {:text-align :center :color colors/gray :margin-bottom 21 - :padding-horizontal 80 + :padding-horizontal 70 :padding-top 20}) (def bottom-action-container diff --git a/src/status_im/ui/screens/routing/core.cljs b/src/status_im/ui/screens/routing/core.cljs index 8cb24adef7..0c435b42d3 100644 --- a/src/status_im/ui/screens/routing/core.cljs +++ b/src/status_im/ui/screens/routing/core.cljs @@ -187,7 +187,8 @@ (log/debug :component view-id) (switch-navigator (into {} - [(build-screen (intro-login-stack/intro-login-stack view-id)) + [(build-screen (intro-login-stack/login-stack view-id)) + (build-screen (intro-login-stack/intro-stack)) [:tabs-and-modals {:screen (stack-navigator @@ -206,4 +207,6 @@ {:mode :modal :initialRouteName :tabs :onTransitionStart (fn [])})}]]) - {:initialRouteName :intro-login-stack})) + {:initialRouteName (if (= view-id :intro) + :intro-stack + :login-stack)})) diff --git a/src/status_im/ui/screens/routing/intro_login_stack.cljs b/src/status_im/ui/screens/routing/intro_login_stack.cljs index 007da825c0..5c2a6fdfd7 100644 --- a/src/status_im/ui/screens/routing/intro_login_stack.cljs +++ b/src/status_im/ui/screens/routing/intro_login_stack.cljs @@ -14,15 +14,13 @@ :hardwallet-setup :hardwallet-success}) -(defn intro-login-stack [view-id] - {:name :intro-login-stack +(defn login-stack [view-id] + {:name :login-stack :screens (cond-> [:login :progress :create-account :recover :accounts] - (= :intro view-id) - (conj :intro) config/hardwallet-enabled? (concat [:hardwallet-authentication-method @@ -33,6 +31,12 @@ :config (if ;; add view-id here if you'd like that view to be ;; first view when app is started - (#{:intro :login :progress :accounts} view-id) + (#{:login :progress :accounts :enter-pin} view-id) {:initialRouteName view-id} {:initialRouteName :login})}) + +(defn intro-stack [] + (-> (login-stack :intro) + (update :screens conj :intro) + (assoc :name :intro-stack) + (assoc :config {:initialRouteName :intro})))