|
| 1 | +(ns status-im.contexts.keycard.unblock.events |
| 2 | + (:require [utils.re-frame :as rf] |
| 3 | + [utils.security.core :as security])) |
| 4 | + |
| 5 | +(rf/reg-event-fx :keycard/unblock.pin-created |
| 6 | + (fn [{:keys [db]} [pin]] |
| 7 | + {:db (assoc-in db [:keycard :unblock :pin] pin) |
| 8 | + :fx [[:dispatch [:navigate-back]] |
| 9 | + [:dispatch [:open-modal :screen/keycard.unblock.ready-to-unblock]]]})) |
| 10 | + |
| 11 | +(rf/reg-event-fx :keycard/unblock.phrase-entered |
| 12 | + (fn [{:keys [db]} [{:keys [phrase]}]] |
| 13 | + {:db (assoc-in db [:keycard :unblock :masked-phrase] phrase) |
| 14 | + :fx [[:dispatch [:navigate-back]] |
| 15 | + [:dispatch |
| 16 | + [:open-modal :screen/keycard.pin.create |
| 17 | + {:on-complete #(rf/dispatch [:keycard/unblock.pin-created %])}]]]})) |
| 18 | + |
| 19 | +(rf/reg-event-fx :keycard/unblock.generate-and-load-key |
| 20 | + (fn [{:keys [db]}] |
| 21 | + (let [{:keys [masked-phrase pin]} (get-in db [:keycard :unblock])] |
| 22 | + {:fx [[:effects.keycard/generate-and-load-key |
| 23 | + {:mnemonic (security/safe-unmask-data masked-phrase) |
| 24 | + :pin pin |
| 25 | + :on-success (fn [] |
| 26 | + (rf/dispatch [:keycard/disconnect]) |
| 27 | + (rf/dispatch [:navigate-back]) |
| 28 | + (rf/dispatch [:open-modal :screen/keycard.unblock.success]))}]]}))) |
| 29 | + |
| 30 | +;; third stage, import keys |
| 31 | +(rf/reg-event-fx :keycard/unblock.import-keys |
| 32 | + (fn [] |
| 33 | + {:fx [[:dispatch |
| 34 | + [:keycard/connect.next-stage |
| 35 | + {:on-error (fn [error] |
| 36 | + (if (= error :keycard/error.keycard-empty) |
| 37 | + (rf/dispatch [:keycard/unblock.generate-and-load-key]) |
| 38 | + (do |
| 39 | + (rf/dispatch [:navigate-back]) |
| 40 | + (rf/dispatch [:keycard/on-application-info-error error]))))}]]]})) |
| 41 | + |
| 42 | +;; second stage, check if card initialized |
| 43 | +(rf/reg-event-fx :keycard/unblock.init-card-or-import-keys |
| 44 | + (fn [{:keys [db]}] |
| 45 | + (let [pin (get-in db [:keycard :unblock :pin]) |
| 46 | + {:keys [initialized?]} (get-in db [:keycard :application-info])] |
| 47 | + {:fx [(if initialized? |
| 48 | + [:dispatch [:keycard/unblock.import-keys]] |
| 49 | + [:effects.keycard/init-card |
| 50 | + {:pin pin |
| 51 | + :on-success #(rf/dispatch [:keycard/unblock.import-keys])}])]}))) |
| 52 | + |
| 53 | +;; second stage, init card with pin |
| 54 | +(defn init-with-pin |
| 55 | + [] |
| 56 | + (rf/dispatch |
| 57 | + [:keycard/connect.next-stage |
| 58 | + {:on-error (fn [error] |
| 59 | + (if (= error :keycard/error.keycard-empty) |
| 60 | + (rf/dispatch [:keycard/unblock.init-card-or-import-keys]) |
| 61 | + (do |
| 62 | + (rf/dispatch [:navigate-back]) |
| 63 | + (rf/dispatch [:keycard/on-application-info-error error]))))}])) |
| 64 | + |
| 65 | +;; first stage, reset card |
| 66 | +(rf/reg-event-fx :keycard/unblock |
| 67 | + (fn [{:keys [db]}] |
| 68 | + {:fx [[:dispatch |
| 69 | + [:keycard/connect |
| 70 | + {:key-uid (get-in db [:keycard :application-info :key-uid]) |
| 71 | + :on-error (fn [error] |
| 72 | + (cond |
| 73 | + (or (= error :keycard/error.keycard-frozen) |
| 74 | + (= error :keycard/error.keycard-locked)) |
| 75 | + (rf/dispatch [:keycard/factory-reset {:on-success init-with-pin}]) |
| 76 | + |
| 77 | + (= error :keycard/error.keycard-empty) |
| 78 | + (init-with-pin) |
| 79 | + |
| 80 | + :else |
| 81 | + (do |
| 82 | + (rf/dispatch [:navigate-back]) |
| 83 | + (if (= error :keycard/error.keycard-wrong-profile) |
| 84 | + (do |
| 85 | + (rf/dispatch [:keycard/disconnect]) |
| 86 | + (rf/dispatch [:open-modal :screen/keycard.different-card])) |
| 87 | + (rf/dispatch [:keycard/on-application-info-error error])))))}]]]})) |
0 commit comments