Ensure that keycard flows continue when card is already connected
This commit ensures that a user can flawlessly interact with a keycard, regardless of the moment when the card was tapped to the device. To make it so: - in case if the card was tapped before the interaction the user doesn't need to re-connect card to continue - in case if the connection with the card was lost during the interaction the application restarts that interaction as soon as the card was connected again (unless the user canceled the flow)
This commit is contained in:
parent
947b1c2b2e
commit
61d465a343
|
@ -37,7 +37,7 @@
|
|||
[{:keys [db] :as cofx}]
|
||||
(fx/merge cofx
|
||||
(common/clear-pin)
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(if (get-in db [:hardwallet :pin :puk-restore?])
|
||||
(navigation/navigate-to-cofx :multiaccounts nil)
|
||||
(navigation/navigate-to-cofx :keycard-settings nil))))
|
||||
|
@ -45,22 +45,30 @@
|
|||
(fx/defn change-pin
|
||||
{:events [:hardwallet/change-pin]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [pairing (common/get-pairing db)
|
||||
new-pin (common/vector->string (get-in db [:hardwallet :pin :original]))
|
||||
current-pin (common/vector->string (get-in db [:hardwallet :pin :current]))
|
||||
setup-step (get-in db [:hardwallet :setup-step])
|
||||
card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(let [setup-step (get-in db [:hardwallet :setup-step])]
|
||||
(log/debug "[hardwallet] change-pin"
|
||||
"setup-step" setup-step)
|
||||
(if (= setup-step :pin)
|
||||
(onboarding/load-preparing-screen cofx)
|
||||
(if card-connected?
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
|
||||
:hardwallet/change-pin {:new-pin new-pin
|
||||
:current-pin current-pin
|
||||
:pairing pairing}})
|
||||
(fx/merge cofx
|
||||
(common/set-on-card-connected :hardwallet/change-pin)
|
||||
(common/show-pair-sheet {:on-cancel [::on-cancel]}))))))
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:sheet-options {:on-cancel [::on-cancel]}
|
||||
:on-card-connected :hardwallet/change-pin
|
||||
:handler
|
||||
(fn [{:keys [db] :as cofx}]
|
||||
(let [pairing (common/get-pairing db)
|
||||
new-pin (common/vector->string
|
||||
(get-in db [:hardwallet :pin :original]))
|
||||
current-pin (common/vector->string
|
||||
(get-in db [:hardwallet :pin :current]))]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
|
||||
|
||||
:hardwallet/change-pin
|
||||
{:new-pin new-pin
|
||||
:current-pin current-pin
|
||||
:pairing pairing}})))}))))
|
||||
|
||||
(fx/defn on-change-pin-success
|
||||
{:events [:hardwallet.callback/on-change-pin-success]}
|
||||
|
@ -74,7 +82,7 @@
|
|||
:error-label nil})
|
||||
:utils/show-popup {:title ""
|
||||
:content (i18n/label :t/pin-changed)}}
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(if puk-restore?
|
||||
(navigation/navigate-to-cofx :multiaccounts nil)
|
||||
(navigation/navigate-to-cofx :keycard-settings nil))
|
||||
|
|
|
@ -104,6 +104,7 @@
|
|||
|
||||
(fx/defn set-on-card-connected
|
||||
[{:keys [db]} on-connect]
|
||||
(log/debug "[hardwallet] set-on-card-connected" on-connect)
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :on-card-connected] on-connect)
|
||||
(assoc-in [:hardwallet :last-on-card-connected] nil))})
|
||||
|
@ -111,6 +112,7 @@
|
|||
(fx/defn stash-on-card-connected
|
||||
[{:keys [db]}]
|
||||
(let [on-connect (get-in db [:hardwallet :on-card-connected])]
|
||||
(log/debug "[hardwallet] stash-on-card-connected" on-connect)
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :last-on-card-connected] on-connect)
|
||||
(assoc-in [:hardwallet :on-card-connected] nil))}))
|
||||
|
@ -120,18 +122,21 @@
|
|||
(let [on-connect (or
|
||||
(get-in db [:hardwallet :on-card-connected])
|
||||
(get-in db [:hardwallet :last-on-card-connected]))]
|
||||
(log/debug "[hardwallet] restore-on-card-connected" on-connect)
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :on-card-connected] on-connect)
|
||||
(assoc-in [:hardwallet :last-on-card-connect] nil))}))
|
||||
|
||||
(fx/defn clear-on-card-connected
|
||||
[{:keys [db]}]
|
||||
(log/debug "[hardwallet] clear-on-card-connected")
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :on-card-connected] nil)
|
||||
(assoc-in [:hardwallet :last-on-card-connected] nil))})
|
||||
|
||||
(fx/defn set-on-card-read
|
||||
[{:keys [db]} on-connect]
|
||||
(log/debug "[hardwallet] set-on-card-read" on-connect)
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :on-card-read] on-connect)
|
||||
(assoc-in [:hardwallet :last-on-card-read] nil))})
|
||||
|
@ -139,6 +144,7 @@
|
|||
(fx/defn stash-on-card-read
|
||||
[{:keys [db]}]
|
||||
(let [on-connect (get-in db [:hardwallet :on-card-read])]
|
||||
(log/debug "[hardwallet] stash-on-card-read" on-connect)
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :last-on-card-read] on-connect)
|
||||
(assoc-in [:hardwallet :on-card-read] nil))}))
|
||||
|
@ -148,12 +154,14 @@
|
|||
(let [on-connect (or
|
||||
(get-in db [:hardwallet :on-card-read])
|
||||
(get-in db [:hardwallet :last-on-card-read]))]
|
||||
(log/debug "[hardwallet] restore-on-card-read" on-connect)
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :on-card-read] on-connect)
|
||||
(assoc-in [:hardwallet :last-on-card-connect] nil))}))
|
||||
|
||||
(fx/defn clear-on-card-read
|
||||
[{:keys [db]}]
|
||||
(log/debug "[hardwallet] clear-on-card-read")
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :on-card-read] nil)
|
||||
(assoc-in [:hardwallet :last-on-card-read] nil))})
|
||||
|
@ -166,26 +174,36 @@
|
|||
:on-connect ::on-card-connected
|
||||
:on-disconnect ::on-card-disconnected})))
|
||||
|
||||
(fx/defn show-pair-sheet
|
||||
[cofx {:keys [on-cancel]
|
||||
:or {on-cancel [::cancel-sheet-confirm]}}]
|
||||
(log/debug "[hardwallet] show-pair-sheet")
|
||||
(let [connected? (get-in cofx [:db :hardwallet :card-connected?])]
|
||||
(fx/merge cofx
|
||||
{:dismiss-keyboard true}
|
||||
(bottom-sheet/show-bottom-sheet
|
||||
{:view {:show-handle? false
|
||||
:backdrop-dismiss? false
|
||||
:disable-drag? true
|
||||
:content (keycard-sheet-content on-cancel
|
||||
connected?)}}))))
|
||||
(fx/defn show-connection-sheet
|
||||
[{:keys [db] :as cofx} {:keys [on-card-connected on-card-read handler]
|
||||
{:keys [on-cancel]
|
||||
:or {on-cancel [::cancel-sheet-confirm]}}
|
||||
:sheet-options}]
|
||||
(assert (keyword? on-card-connected))
|
||||
(assert (fn? handler))
|
||||
(let [connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(log/debug "[hardwallet] show-sheet-with-connection-check"
|
||||
"card-connected?" connected?)
|
||||
(fx/merge
|
||||
cofx
|
||||
{:dismiss-keyboard true}
|
||||
(bottom-sheet/show-bottom-sheet
|
||||
{:view {:show-handle? false
|
||||
:backdrop-dismiss? false
|
||||
:disable-drag? true
|
||||
:content (keycard-sheet-content on-cancel connected?)}})
|
||||
(when on-card-read
|
||||
(set-on-card-read on-card-read))
|
||||
(set-on-card-connected on-card-connected)
|
||||
(when connected?
|
||||
(stash-on-card-connected))
|
||||
(when connected?
|
||||
handler))))
|
||||
|
||||
(fx/defn hide-pair-sheet
|
||||
(fx/defn hide-connection-sheet
|
||||
[{:keys [db] :as cofx}]
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :card-connected?] false)
|
||||
(assoc-in [:hardwallet :card-read-in-progress?] false))}
|
||||
{:db (assoc-in db [:hardwallet :card-read-in-progress?] false)}
|
||||
(restore-on-card-connected)
|
||||
(restore-on-card-read)
|
||||
(bottom-sheet/hide-bottom-sheet)))
|
||||
|
@ -211,7 +229,7 @@
|
|||
:hardwallet/back-button-pressed]}
|
||||
[cofx]
|
||||
(fx/merge cofx
|
||||
(hide-pair-sheet)
|
||||
(hide-connection-sheet)
|
||||
(clear-pin)))
|
||||
|
||||
(fx/defn cancel-sheet
|
||||
|
@ -320,7 +338,7 @@
|
|||
(keychain/save-hardwallet-keys key-uid encryption-public-key whisper-private-key))
|
||||
(clear-on-card-connected)
|
||||
(clear-on-card-read)
|
||||
(hide-pair-sheet))))
|
||||
(hide-connection-sheet))))
|
||||
|
||||
(fx/defn on-get-keys-error
|
||||
{:events [:hardwallet.callback/on-get-keys-error]}
|
||||
|
@ -338,7 +356,7 @@
|
|||
:login []
|
||||
:import-multiaccount []
|
||||
:error-label :t/pin-mismatch})}
|
||||
(hide-pair-sheet)
|
||||
(hide-connection-sheet)
|
||||
(when (= flow :import)
|
||||
(navigation/navigate-to-cofx :keycard-recovery-pin nil)))
|
||||
(show-wrong-keycard-alert true)))))
|
||||
|
@ -350,6 +368,8 @@
|
|||
[{:keys [db]} pairing on-card-read]
|
||||
(let [key-uid (get-in db [:hardwallet :application-info :key-uid])
|
||||
pairing' (or pairing (some->> key-uid (get-pairing db)))]
|
||||
(log/debug "[hardwallet] get-application-info"
|
||||
"pairing" pairing')
|
||||
{:hardwallet/get-application-info {:pairing pairing'
|
||||
:on-success on-card-read}}))
|
||||
|
||||
|
@ -410,7 +430,6 @@
|
|||
(fx/defn on-card-connected
|
||||
{:events [::on-card-connected]}
|
||||
[{:keys [db] :as cofx} _]
|
||||
(log/debug "[hardwallet] card connected")
|
||||
(let [instance-uid (get-in db [:hardwallet :application-info :instance-uid])
|
||||
key-uid (get-in db [:hardwallet :application-info :key-uid])
|
||||
should-read-instance-uid? (nil? instance-uid)
|
||||
|
@ -419,23 +438,23 @@
|
|||
should-read-instance-uid? :hardwallet/get-application-info
|
||||
:else (get-in db [:hardwallet :on-card-read]))
|
||||
pairing (get-pairing db key-uid)]
|
||||
(log/debug "[hardwallet] on-card-connected"
|
||||
"on-card-connected" on-card-connected
|
||||
(log/debug "[hardwallet] on-card-connected" on-card-connected
|
||||
"on-card-read" on-card-read)
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :card-read-in-progress?] (boolean on-card-read)))}
|
||||
(when on-card-connected
|
||||
(dispatch-event on-card-connected))
|
||||
(stash-on-card-connected)
|
||||
(when (and on-card-read
|
||||
(nil? on-card-connected))
|
||||
(get-application-info pairing on-card-read)))))
|
||||
(when on-card-connected
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :card-read-in-progress?] (boolean on-card-read)))}
|
||||
(when on-card-connected
|
||||
(dispatch-event on-card-connected))
|
||||
(stash-on-card-connected)
|
||||
(when (and on-card-read
|
||||
(nil? on-card-connected))
|
||||
(get-application-info pairing on-card-read))))))
|
||||
|
||||
(fx/defn on-card-disconnected
|
||||
{:events [::on-card-disconnected]}
|
||||
[{:keys [db] :as cofx} _]
|
||||
(log/debug "[hardwallet] card disconnected ")
|
||||
(log/debug "[hardwallet] card disconnected")
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :card-read-in-progress?] false))}
|
||||
|
|
|
@ -140,7 +140,7 @@
|
|||
:puk []
|
||||
:puk-restore? true
|
||||
:error-label nil}))}
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(navigation/navigate-to-cofx :enter-pin-settings nil))))
|
||||
|
||||
(fx/defn on-unblock-pin-error
|
||||
|
@ -156,7 +156,7 @@
|
|||
:error-label :t/puk-mismatch
|
||||
:enter-step :puk
|
||||
:puk []})}
|
||||
(common/hide-pair-sheet)))))
|
||||
(common/hide-connection-sheet)))))
|
||||
|
||||
(fx/defn dispatch-on-verified-event
|
||||
[{:keys [db]} event]
|
||||
|
@ -177,7 +177,7 @@
|
|||
;; now for simplicity do not hide bottom sheet when generating key
|
||||
;; but should be refactored.
|
||||
(when-not (= on-verified :hardwallet/generate-and-load-key)
|
||||
(common/hide-pair-sheet))
|
||||
(common/hide-connection-sheet))
|
||||
(when-not (contains? #{:hardwallet/unpair
|
||||
:hardwallet/generate-and-load-key
|
||||
:hardwallet/remove-key-with-unpair
|
||||
|
@ -204,7 +204,7 @@
|
|||
:confirmation []
|
||||
:sign []
|
||||
:error-label :t/pin-mismatch})}
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(when-not setup?
|
||||
(if exporting?
|
||||
(navigation/navigate-back)
|
||||
|
@ -212,39 +212,41 @@
|
|||
(common/get-application-info (common/get-pairing db) nil))
|
||||
|
||||
(fx/merge cofx
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(common/show-wrong-keycard-alert true))))))
|
||||
|
||||
(fx/defn verify-pin
|
||||
{:events [:hardwallet/verify-pin]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [pin (common/vector->string (get-in db [:hardwallet :pin :current]))
|
||||
pairing (common/get-pairing db)
|
||||
card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(if card-connected?
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
|
||||
:hardwallet/verify-pin {:pin pin
|
||||
:pairing pairing}})
|
||||
(fx/merge cofx
|
||||
(common/set-on-card-connected :hardwallet/verify-pin)
|
||||
(common/show-pair-sheet {})))))
|
||||
[cofx]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :hardwallet/verify-pin
|
||||
:handler
|
||||
(fn [{:keys [db] :as cofx}]
|
||||
(let [pin (common/vector->string (get-in db [:hardwallet :pin :current]))
|
||||
pairing (common/get-pairing db)]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
|
||||
:hardwallet/verify-pin {:pin pin
|
||||
:pairing pairing}})))}))
|
||||
|
||||
(fx/defn unblock-pin
|
||||
{:events [:hardwallet/unblock-pin]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [puk (common/vector->string (get-in db [:hardwallet :pin :puk]))
|
||||
key-uid (get-in db [:hardwallet :application-info :key-uid])
|
||||
card-connected? (get-in db [:hardwallet :card-connected?])
|
||||
pairing (common/get-pairing db key-uid)]
|
||||
(if card-connected?
|
||||
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
|
||||
:hardwallet/unblock-pin {:puk puk
|
||||
:new-pin common/default-pin
|
||||
:pairing pairing}}
|
||||
(fx/merge cofx
|
||||
(common/set-on-card-connected :hardwallet/unblock-pin)
|
||||
(common/show-pair-sheet {})))))
|
||||
[cofx]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :hardwallet/unblock-pin
|
||||
:handler
|
||||
(fn [{:keys [db]}]
|
||||
(let [puk (common/vector->string (get-in db [:hardwallet :pin :puk]))
|
||||
key-uid (get-in db [:hardwallet :application-info :key-uid])
|
||||
pairing (common/get-pairing db key-uid)]
|
||||
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
|
||||
:hardwallet/unblock-pin
|
||||
{:puk puk
|
||||
:new-pin common/default-pin
|
||||
:pairing pairing}}))}))
|
||||
|
||||
(def pin-code-length 6)
|
||||
(def puk-code-length 12)
|
||||
|
@ -377,7 +379,7 @@
|
|||
(assoc-in [:hardwallet :setup-step] next-step)
|
||||
(assoc-in [:hardwallet :secrets :pairing] pairing)
|
||||
(assoc-in [:hardwallet :secrets :paired-on] paired-on))}
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(when multiaccount
|
||||
(set-multiaccount-pairing multiaccount pairing paired-on))
|
||||
(when (= flow :login)
|
||||
|
@ -405,7 +407,7 @@
|
|||
(common/set-on-card-connected (if (= setup-step :pairing)
|
||||
:hardwallet/load-pairing-screen
|
||||
:hardwallet/pair))
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(when (= flow :import)
|
||||
(navigation/navigate-to-cofx :keycard-recovery-pair nil))
|
||||
(when (not= setup-step :enter-pair-code)
|
||||
|
@ -444,7 +446,7 @@
|
|||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :card-state] card-state)}
|
||||
(set-setup-step card-state)
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
|
||||
(when (and flow
|
||||
(= card-state :init))
|
||||
|
@ -485,7 +487,7 @@
|
|||
(fx/defn on-card-disconnected
|
||||
{:events [:hardwallet.callback/on-card-disconnected]}
|
||||
[{:keys [db]} _]
|
||||
(log/debug "[hardwallet] card disconnected ")
|
||||
(log/debug "[hardwallet] card disconnected")
|
||||
{:db (assoc-in db [:hardwallet :card-connected?] false)})
|
||||
|
||||
(fx/defn on-register-card-events
|
||||
|
|
|
@ -24,14 +24,14 @@
|
|||
:sign []
|
||||
:export-key []
|
||||
:error-label :t/pin-mismatch})}
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(common/get-application-info (common/get-pairing db) nil))
|
||||
|
||||
:else
|
||||
(fx/merge cofx
|
||||
(common/show-wrong-keycard-alert true)
|
||||
(common/clear-pin)
|
||||
(common/hide-pair-sheet)))))
|
||||
(common/hide-connection-sheet)))))
|
||||
|
||||
(fx/defn on-export-key-success
|
||||
{:events [:hardwallet.callback/on-export-key-success]}
|
||||
|
@ -40,4 +40,4 @@
|
|||
(fx/merge cofx
|
||||
{:dispatch (callback-fn pubkey)}
|
||||
(common/clear-pin)
|
||||
(common/hide-pair-sheet))))
|
||||
(common/hide-connection-sheet))))
|
||||
|
|
|
@ -62,36 +62,36 @@
|
|||
(cond
|
||||
(empty? application-info)
|
||||
(fx/merge cofx
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(navigation/navigate-to-cofx :not-keycard nil))
|
||||
|
||||
(empty? key-uid)
|
||||
(fx/merge cofx
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(navigation/navigate-to-cofx :keycard-blank nil))
|
||||
|
||||
multiaccount-mismatch?
|
||||
(fx/merge cofx
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(navigation/navigate-to-cofx :keycard-wrong nil))
|
||||
|
||||
(empty? pairing)
|
||||
(fx/merge cofx
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(navigation/navigate-to-cofx :keycard-unpaired nil))
|
||||
|
||||
:else
|
||||
(common/get-keys-from-keycard cofx))))
|
||||
|
||||
(fx/defn proceed-to-login
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [{:keys [card-connected?]} (:hardwallet db)]
|
||||
(fx/merge cofx
|
||||
(common/set-on-card-connected :hardwallet/get-application-info)
|
||||
(common/set-on-card-read :hardwallet/login-with-keycard)
|
||||
(if card-connected?
|
||||
(login-with-keycard)
|
||||
(common/show-pair-sheet {:on-cancel [::common/cancel-sheet-confirm]})))))
|
||||
[cofx]
|
||||
(log/debug "[hardwallet] proceed-to-login")
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:sheet-options {:on-cancel [::common/cancel-sheet-confirm]}
|
||||
:on-card-connected :hardwallet/get-application-info
|
||||
:on-card-read :hardwallet/login-with-keycard
|
||||
:handler (common/get-application-info nil :hardwallet/login-with-keycard)}))
|
||||
|
||||
(fx/defn on-hardwallet-keychain-keys
|
||||
{:events [:multiaccounts.login.callback/get-hardwallet-keys-success]}
|
||||
|
|
|
@ -53,13 +53,12 @@
|
|||
(fx/defn load-generating-mnemonic-screen
|
||||
{:events [:hardwallet/load-generating-mnemonic-screen]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :generating-mnemonic)}
|
||||
(common/set-on-card-connected :hardwallet/load-generating-mnemonic-screen)
|
||||
(if card-connected?
|
||||
(common/dispatch-event :hardwallet/generate-mnemonic)
|
||||
(common/show-pair-sheet {})))))
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :generating-mnemonic)}
|
||||
(common/show-connection-sheet
|
||||
{:on-card-connected :hardwallet/load-generating-mnemonic-screen
|
||||
:handler (common/dispatch-event :hardwallet/generate-mnemonic)})))
|
||||
|
||||
(fx/defn on-generate-mnemonic-error
|
||||
{:events [:hardwallet.callback/on-generate-mnemonic-error]}
|
||||
|
@ -81,10 +80,9 @@
|
|||
{:events [:hardwallet.ui/recovery-phrase-confirm-pressed
|
||||
:hardwallet/load-loading-keys-screen]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :loading-keys)}
|
||||
(common/set-on-card-connected :hardwallet/load-loading-keys-screen)
|
||||
(if card-connected?
|
||||
(common/dispatch-event :hardwallet/generate-and-load-key)
|
||||
(common/show-pair-sheet {})))))
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :loading-keys)}
|
||||
(common/show-connection-sheet
|
||||
{:on-card-connected :hardwallet/load-loading-keys-screen
|
||||
:handler (common/dispatch-event :hardwallet/generate-and-load-key)})))
|
||||
|
|
|
@ -38,26 +38,24 @@
|
|||
|
||||
(fx/defn load-preparing-screen
|
||||
{:events [:hardwallet/load-preparing-screen]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :preparing)}
|
||||
(common/set-on-card-connected :hardwallet/load-preparing-screen)
|
||||
(if card-connected?
|
||||
(start-installation)
|
||||
(common/show-pair-sheet {:on-cancel [::cancel-pressed]})))))
|
||||
[cofx]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:sheet-options {:on-cancel [::cancel-pressed]}
|
||||
:on-card-connected :hardwallet/load-preparing-screen
|
||||
:handler start-installation}))
|
||||
|
||||
(fx/defn load-pairing-screen
|
||||
{:events [:hardwallet/load-pairing-screen
|
||||
:keycard.onboarding.puk-code.ui/confirm-pressed]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :pairing)}
|
||||
(common/set-on-card-connected :hardwallet/load-pairing-screen)
|
||||
(if card-connected?
|
||||
(common/dispatch-event :hardwallet/pair)
|
||||
(common/show-pair-sheet {:on-cancel [::cancel-pressed]})))))
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :pairing)}
|
||||
(common/show-connection-sheet
|
||||
{:sheet-options {:on-cancel [::cancel-pressed]}
|
||||
:on-card-connected :hardwallet/load-pairing-screen
|
||||
:handler (common/dispatch-event :hardwallet/pair)})))
|
||||
|
||||
(fx/defn puk-code-next-pressed
|
||||
{:events [:keycard.onboarding.puk-code.ui/next-pressed]}
|
||||
|
@ -73,13 +71,13 @@
|
|||
{:events [:keycard.onboarding.recovery-phrase-confirm-word2.ui/next-pressed
|
||||
:hardwallet/load-finishing-screen]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :loading-keys)}
|
||||
(common/set-on-card-connected :hardwallet/load-finishing-screen)
|
||||
(if card-connected?
|
||||
(common/dispatch-event :hardwallet/generate-and-load-key)
|
||||
(common/show-pair-sheet {:on-cancel [::cancel-pressed]})))))
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :setup-step] :loading-keys)}
|
||||
(common/show-connection-sheet
|
||||
{:sheet-options {:on-cancel [::cancel-pressed]}
|
||||
:on-card-connected :hardwallet/load-finishing-screen
|
||||
:handler (common/dispatch-event :hardwallet/generate-and-load-key)})))
|
||||
|
||||
(fx/defn recovery-phrase-learn-more-pressed
|
||||
{:events [:keycard.onboarding.recovery-phrase.ui/learn-more-pressed]}
|
||||
|
@ -254,7 +252,7 @@
|
|||
(assoc-in [:hardwallet :card-state] :init)
|
||||
(assoc-in [:hardwallet :setup-step] :secret-keys)
|
||||
(update-in [:hardwallet :secrets] merge secrets'))}
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(common/listen-to-hardware-back-button)
|
||||
(navigation/navigate-replace-cofx :keycard-onboarding-puk-code nil))))
|
||||
|
||||
|
@ -288,17 +286,19 @@
|
|||
(fx/defn begin-setup-pressed
|
||||
{:events [:keycard.onboarding.intro.ui/begin-setup-pressed]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(update :hardwallet
|
||||
dissoc :secrets :card-state :multiaccount-wallet-address
|
||||
:multiaccount-whisper-public-key
|
||||
:application-info)
|
||||
(assoc-in [:hardwallet :setup-step] :begin)
|
||||
(assoc-in [:hardwallet :pin :on-verified] nil))}
|
||||
(common/set-on-card-connected :hardwallet/get-application-info)
|
||||
(common/set-on-card-read :hardwallet/check-card-state)
|
||||
(common/show-pair-sheet {})))
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (-> db
|
||||
(update :hardwallet
|
||||
dissoc :secrets :card-state :multiaccount-wallet-address
|
||||
:multiaccount-whisper-public-key
|
||||
:application-info)
|
||||
(assoc-in [:hardwallet :setup-step] :begin)
|
||||
(assoc-in [:hardwallet :pin :on-verified] nil))}
|
||||
(common/show-connection-sheet
|
||||
{:on-card-connected :hardwallet/get-application-info
|
||||
:on-card-read :hardwallet/check-card-state
|
||||
:handler (common/get-application-info nil :hardwallet/check-card-state)})))
|
||||
|
||||
(fx/defn cancel-confirm
|
||||
{:events [::cancel-confirm]}
|
||||
|
|
|
@ -18,14 +18,12 @@
|
|||
|
||||
(fx/defn pair
|
||||
{:events [:hardwallet/pair]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [{:keys [password]} (get-in cofx [:db :hardwallet :secrets])
|
||||
card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(fx/merge cofx
|
||||
(common/set-on-card-connected :hardwallet/pair)
|
||||
(if card-connected?
|
||||
(pair* password)
|
||||
(common/show-pair-sheet {})))))
|
||||
[cofx]
|
||||
(let [{:keys [password]} (get-in cofx [:db :hardwallet :secrets])]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :hardwallet/pair
|
||||
:handler (pair* password)})))
|
||||
|
||||
(fx/defn pair-code-next-button-pressed
|
||||
{:events [:keycard.onboarding.pair.ui/input-submitted
|
||||
|
@ -100,17 +98,20 @@
|
|||
(fx/defn begin-setup-pressed
|
||||
{:events [:keycard.recovery.intro.ui/begin-recovery-pressed]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(fx/merge cofx
|
||||
{:db (-> db
|
||||
(update :hardwallet
|
||||
dissoc :secrets :card-state :multiaccount-wallet-address
|
||||
:multiaccount-whisper-public-key
|
||||
:application-info)
|
||||
(assoc-in [:hardwallet :setup-step] :begin)
|
||||
(assoc-in [:hardwallet :pin :on-verified] nil))}
|
||||
(common/set-on-card-connected :hardwallet/get-application-info)
|
||||
(common/set-on-card-read :hardwallet/check-card-state)
|
||||
(common/show-pair-sheet {:on-cancel [::cancel-pressed]})))
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (-> db
|
||||
(update :hardwallet
|
||||
dissoc :secrets :card-state :multiaccount-wallet-address
|
||||
:multiaccount-whisper-public-key
|
||||
:application-info)
|
||||
(assoc-in [:hardwallet :setup-step] :begin)
|
||||
(assoc-in [:hardwallet :pin :on-verified] nil))}
|
||||
(common/show-connection-sheet
|
||||
{:on-card-connected :hardwallet/get-application-info
|
||||
:on-card-read :hardwallet/check-card-state
|
||||
:sheet-options {:on-cancel [::cancel-pressed]}
|
||||
:handler (common/get-application-info nil :hardwallet/check-card-state)})))
|
||||
|
||||
(fx/defn recovery-success-finish-pressed
|
||||
{:events [:keycard.recovery.success/finish-pressed]}
|
||||
|
@ -215,7 +216,7 @@
|
|||
(assoc :multiaccounts/new-installation-id (random-guid-generator))
|
||||
(update-in [:hardwallet :secrets] dissoc :mnemonic))}
|
||||
(common/remove-listener-to-hardware-back-button)
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(create-keycard-multiaccount))))
|
||||
|
||||
(fx/defn on-generate-and-load-key-error
|
||||
|
@ -247,13 +248,11 @@
|
|||
|
||||
(fx/defn load-recovering-key-screen
|
||||
{:events [:hardwallet/load-recovering-key-screen]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [card-connected? (get-in db [:hardwallet :card-connected?])]
|
||||
(fx/merge cofx
|
||||
(common/set-on-card-connected :hardwallet/load-recovering-key-screen)
|
||||
(if card-connected?
|
||||
(common/dispatch-event :hardwallet/import-multiaccount)
|
||||
(common/show-pair-sheet {})))))
|
||||
[cofx]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :hardwallet/load-recovering-key-screen
|
||||
:handler (common/dispatch-event :hardwallet/import-multiaccount)}))
|
||||
|
||||
(fx/defn on-name-and-photo-generated
|
||||
{:events [::on-name-and-photo-generated]
|
||||
|
|
|
@ -34,15 +34,11 @@
|
|||
(fx/defn prepare-to-sign
|
||||
{:events [:hardwallet/prepare-to-sign]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [card-connected? (get-in db [:hardwallet :card-connected?])
|
||||
pairing (common/get-pairing db)]
|
||||
(fx/merge cofx
|
||||
(if card-connected?
|
||||
(common/get-application-info pairing :hardwallet/sign)
|
||||
(fn [cofx]
|
||||
(fx/merge cofx
|
||||
(common/set-on-card-connected :hardwallet/prepare-to-sign)
|
||||
(common/show-pair-sheet {})))))))
|
||||
(let [pairing (common/get-pairing db)]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :hardwallet/prepare-to-sign
|
||||
:handler (common/get-application-info pairing :hardwallet/sign)})))
|
||||
|
||||
(fx/defn sign-message-completed
|
||||
[_ signature]
|
||||
|
@ -73,7 +69,7 @@
|
|||
(assoc-in [:hardwallet :transaction] nil))}
|
||||
(common/clear-on-card-connected)
|
||||
(common/get-application-info (common/get-pairing db) nil)
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(if transaction
|
||||
(send-transaction-with-signature {:transaction (types/clj->json transaction)
|
||||
:signature signature
|
||||
|
@ -93,8 +89,8 @@
|
|||
:sign []
|
||||
:error-label :t/pin-mismatch})
|
||||
(assoc-in [:signing/sign :keycard-step] :pin))}
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(common/get-application-info (common/get-pairing db) nil))
|
||||
(fx/merge cofx
|
||||
(common/hide-pair-sheet)
|
||||
(common/hide-connection-sheet)
|
||||
(common/show-wrong-keycard-alert true))))))
|
||||
|
|
|
@ -94,16 +94,17 @@
|
|||
|
||||
(fx/defn remove-key-with-unpair
|
||||
{:events [:hardwallet/remove-key-with-unpair]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [pin (common/vector->string (get-in db [:hardwallet :pin :current]))
|
||||
pairing (common/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
|
||||
(common/set-on-card-connected :hardwallet/remove-key-with-unpair)
|
||||
(common/show-pair-sheet {})))))
|
||||
[cofx]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :hardwallet/remove-key-with-unpair
|
||||
:handler
|
||||
(fn [{:keys [db]}]
|
||||
(let [pin (common/vector->string (get-in db [:hardwallet :pin :current]))
|
||||
pairing (common/get-pairing db)]
|
||||
{:hardwallet/remove-key-with-unpair
|
||||
{:pin pin
|
||||
:pairing pairing}}))}))
|
||||
|
||||
(fx/defn on-remove-key-success
|
||||
{:events [:hardwallet.callback/on-remove-key-success]}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
(ns status-im.hardwallet.wallet
|
||||
(:require [status-im.ethereum.core :as ethereum]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[status-im.utils.fx :as fx]
|
||||
[status-im.hardwallet.common :as common]
|
||||
[status-im.constants :as constants]
|
||||
|
@ -9,21 +8,25 @@
|
|||
(fx/defn generate-new-keycard-account
|
||||
{:events [:wallet.accounts/generate-new-keycard-account]}
|
||||
[{:keys [db] :as cofx}]
|
||||
(let [path-num (inc (get-in db [:multiaccount :latest-derived-path]))
|
||||
path (str constants/path-wallet-root "/" path-num)
|
||||
card-connected? (get-in db [:hardwallet :card-connected?])
|
||||
pin (common/vector->string (get-in db [:hardwallet :pin :export-key]))
|
||||
pairing (common/get-pairing db)]
|
||||
(if card-connected?
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:hardwallet :on-export-success]
|
||||
#(vector :wallet.accounts/account-stored
|
||||
{;; Strip leading 04 prefix denoting uncompressed key format
|
||||
:address (eip55/address->checksum (str "0x" (ethereum/public-key->address (subs % 2))))
|
||||
:public-key (str "0x" %)
|
||||
:path path}))
|
||||
:hardwallet/export-key {:pin pin :pairing pairing :path path}}
|
||||
(common/set-on-card-connected :wallet.accounts/generate-new-keycard-account))
|
||||
(fx/merge cofx
|
||||
(common/set-on-card-connected :wallet.accounts/generate-new-keycard-account)
|
||||
(common/show-pair-sheet {})))))
|
||||
(let [path-num (inc (get-in db [:multiaccount :latest-derived-path]))
|
||||
path (str constants/path-wallet-root "/" path-num)
|
||||
pin (common/vector->string (get-in db [:hardwallet :pin :export-key]))
|
||||
pairing (common/get-pairing db)]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :hardwallet/load-loading-keys-screen
|
||||
:handler
|
||||
(fn [cofx]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db
|
||||
(assoc-in
|
||||
db [:hardwallet :on-export-success]
|
||||
#(vector :wallet.accounts/account-stored
|
||||
{;; Strip leading 04 prefix denoting uncompressed key format
|
||||
:address (eip55/address->checksum (str "0x" (ethereum/public-key->address (subs % 2))))
|
||||
:public-key (str "0x" %)
|
||||
:path path}))
|
||||
|
||||
:hardwallet/export-key {:pin pin :pairing pairing :path path}}
|
||||
(common/set-on-card-connected :wallet.accounts/generate-new-keycard-account)))})))
|
||||
|
|
|
@ -310,7 +310,7 @@
|
|||
(assoc-in [:hardwallet :pin :status] nil)
|
||||
(dissoc :signing/tx :signing/in-progress? :signing/sign))}
|
||||
(check-queue)
|
||||
(hardwallet.common/hide-pair-sheet)
|
||||
(hardwallet.common/hide-connection-sheet)
|
||||
(hardwallet.common/clear-pin)
|
||||
#(when on-error
|
||||
{:dispatch (conj on-error "transaction was cancelled by user")}))))
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
[status-im.ui.components.animation :as animation]
|
||||
[status-im.hardwallet.card :as keycard-nfc]
|
||||
[status-im.react-native.resources :as resources]
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
(defn circle [{:keys [animation-value color size]}]
|
||||
[react/animated-view
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
(ns status-im.test.hardwallet.common
|
||||
(:require [cljs.test :refer-macros [deftest is testing]]
|
||||
[status-im.hardwallet.common :as common]))
|
||||
|
||||
(deftest test-show-connection-sheet
|
||||
(testing "the card is not connected yet"
|
||||
(let [db {:hardwallet {:card-connected? false}}
|
||||
res (common/show-connection-sheet
|
||||
{:db db}
|
||||
{:on-card-connected :do-something
|
||||
:handler (fn [{:keys [db]}]
|
||||
{:db (assoc db :some-key :some-value)})})]
|
||||
(is (= :do-something
|
||||
(get-in res [:db :hardwallet :on-card-connected])))
|
||||
(is (nil? (get-in res [:db :some-key])))
|
||||
(is (true? (get-in res [:db :bottom-sheet/show?])))))
|
||||
(testing "the card is connected before the interaction"
|
||||
(let [db {:hardwallet {:card-connected? true}}
|
||||
res (common/show-connection-sheet
|
||||
{:db db}
|
||||
{:on-card-connected :do-something
|
||||
:handler (fn [{:keys [db]}]
|
||||
{:db (assoc db :some-key :some-value)})})]
|
||||
(is (nil? (get-in res [:db :hardwallet :on-card-connected])))
|
||||
(is (= :do-something
|
||||
(get-in res [:db :hardwallet :last-on-card-connected])))
|
||||
(is (= :some-value (get-in res [:db :some-key])))
|
||||
(is (true? (get-in res [:db :bottom-sheet/show?])))))
|
||||
(testing "on-card-connected is not specified"
|
||||
(is
|
||||
(thrown?
|
||||
js/Error
|
||||
(common/show-connection-sheet
|
||||
{:db {}}
|
||||
{:handler (fn [_])}))))
|
||||
(testing "handler is not specified"
|
||||
(is
|
||||
(thrown?
|
||||
js/Error
|
||||
(common/show-connection-sheet
|
||||
{:db {}}
|
||||
{:on-card-connected :do-something})))))
|
||||
|
|
@ -21,6 +21,7 @@
|
|||
[status-im.test.ethereum.stateofus]
|
||||
[status-im.test.fleet.core]
|
||||
[status-im.test.hardwallet.core]
|
||||
[status-im.test.hardwallet.common]
|
||||
[status-im.test.i18n]
|
||||
[status-im.test.mailserver.core]
|
||||
[status-im.test.mailserver.topics]
|
||||
|
@ -92,6 +93,7 @@
|
|||
'status-im.test.ethereum.stateofus
|
||||
'status-im.test.fleet.core
|
||||
'status-im.test.hardwallet.core
|
||||
'status-im.test.hardwallet.common
|
||||
'status-im.test.i18n
|
||||
'status-im.test.mailserver.core
|
||||
'status-im.test.mailserver.topics
|
||||
|
|
Loading…
Reference in New Issue