Skip to content

Commit 6a3bd99

Browse files
committed
[#21366] Backup profile recovery
[#21367] Enter profile recovery phrase
1 parent a9e0b3d commit 6a3bd99

File tree

16 files changed

+135
-121
lines changed

16 files changed

+135
-121
lines changed

src/status_im/common/enter_seed_phrase/view.cljs

+29-22
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
(take 7)))
9797

9898
(defn recovery-phrase-screen
99-
[{:keys [banner-offset initial-insets keypair title recovering-keypair? render-controls]}]
99+
[{:keys [banner-offset initial-insets keypair title on-success render-controls]}]
100100
(reagent/with-let [keyboard-shown? (reagent/atom false)
101101
keyboard-show-listener (.addListener rn/keyboard
102102
"keyboardDidShow"
@@ -120,14 +120,20 @@
120120
(reset! seed-phrase new-phrase))
121121
on-submit (fn []
122122
(swap! seed-phrase clean-seed-phrase)
123-
(if recovering-keypair?
124-
(rf/dispatch [:wallet/seed-phrase-entered
125-
(security/mask-data
126-
@seed-phrase)
127-
set-invalid-seed-phrase])
128-
(rf/dispatch [:onboarding/seed-phrase-entered
129-
(security/mask-data @seed-phrase)
130-
set-invalid-seed-phrase])))]
123+
(rf/dispatch
124+
[:profile.recover/validate-recovery-phrase
125+
(security/mask-data @seed-phrase)
126+
{:on-success (fn [mnemonic key-uid]
127+
(if on-success
128+
(on-success
129+
{:key-uid key-uid
130+
:phrase mnemonic
131+
:on-error
132+
set-invalid-seed-phrase})
133+
(rf/dispatch
134+
[:onboarding/seed-phrase-validated
135+
mnemonic key-uid])))
136+
:on-error set-invalid-seed-phrase}]))]
131137
(let [words-coll (mnemonic/passphrase->words @seed-phrase)
132138
last-word (peek words-coll)
133139
pick-suggested-word (fn [pressed-word]
@@ -191,7 +197,7 @@
191197
[rn/view {:style style/keyboard-container}
192198
[quo/predictive-keyboard
193199
{:type suggestions-state
194-
:blur? (not recovering-keypair?)
200+
:blur? (not on-success)
195201
:text suggestions-text
196202
:words (keyboard-suggestions last-word)
197203
:on-press pick-suggested-word}]])])
@@ -200,7 +206,7 @@
200206
(.remove keyboard-hide-listener))))
201207

202208
(defn screen
203-
[{:keys [title keypair navigation-icon recovering-keypair? render-controls]}]
209+
[{:keys [title keypair navigation-icon on-success render-controls]}]
204210
(let [[insets _] (rn/use-state (safe-area/get-insets))
205211
banner-offset (rf/sub [:alert-banners/top-margin])]
206212
[rn/view {:style style/full-layout}
@@ -209,21 +215,22 @@
209215
{:margin-top (:top insets)
210216
:background :blur
211217
:icon-name (or navigation-icon
212-
(if recovering-keypair? :i/close :i/arrow-left))
218+
(if on-success :i/close :i/arrow-left))
213219
:on-press #(rf/dispatch [:navigate-back])}]
214220
[recovery-phrase-screen
215-
{:title title
216-
:keypair keypair
217-
:render-controls render-controls
218-
:banner-offset banner-offset
219-
:initial-insets insets
220-
:recovering-keypair? recovering-keypair?}]]]))
221+
{:title title
222+
:keypair keypair
223+
:render-controls render-controls
224+
:banner-offset banner-offset
225+
:initial-insets insets
226+
:on-success on-success}]]]))
221227

222228
(defn view
223229
[]
224-
(let [{:keys [recovering-keypair?]} (rf/sub [:get-screen-params])]
230+
(let [{:keys [on-success]} (rf/sub [:get-screen-params])]
225231
(rn/use-unmount
226-
#(rf/dispatch [:onboarding/clear-navigated-to-enter-seed-phrase-from-screen]))
232+
(when-not on-success
233+
#(rf/dispatch [:onboarding/clear-navigated-to-enter-seed-phrase-from-screen])))
227234
[screen
228-
{:title (i18n/label :t/use-recovery-phrase)
229-
:recovering-keypair? recovering-keypair?}]))
235+
{:title (i18n/label :t/use-recovery-phrase)
236+
:on-success on-success}]))

src/status_im/contexts/keycard/events.cljs

+15-16
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,21 @@
7272

7373
(rf/reg-event-fx :keycard/on-get-application-info-success
7474
(fn [{:keys [db]} [application-info {:keys [key-uid on-success-fx]}]]
75-
(let [error (keycard.utils/validate-application-info key-uid application-info)]
76-
(if error
77-
(case error
78-
:keycard/error.not-keycard
79-
{:fx [[:dispatch [:keycard/disconnect]]
80-
[:dispatch [:open-modal :screen/keycard.not-keycard]]]}
81-
:keycard/error.keycard-blank
82-
{:fx [[:dispatch [:keycard/disconnect]]
83-
[:dispatch [:open-modal :screen/keycard.empty]]]}
84-
{:db (assoc-in db [:keycard :application-info-error] error)
85-
:fx [[:dispatch [:keycard/disconnect]]
86-
[:dispatch [:open-modal :screen/keycard.error]]]})
87-
{:db (-> db
88-
(assoc-in [:keycard :application-info] application-info)
89-
(assoc-in [:keycard :pin :status] :verifying))
90-
:fx on-success-fx}))))
75+
(if-let [error (keycard.utils/validate-application-info key-uid application-info)]
76+
(case error
77+
:keycard/error.not-keycard
78+
{:fx [[:dispatch [:keycard/disconnect]]
79+
[:dispatch [:open-modal :screen/keycard.not-keycard]]]}
80+
:keycard/error.keycard-blank
81+
{:fx [[:dispatch [:keycard/disconnect]]
82+
[:dispatch [:open-modal :screen/keycard.empty]]]}
83+
{:db (assoc-in db [:keycard :application-info-error] error)
84+
:fx [[:dispatch [:keycard/disconnect]]
85+
[:dispatch [:open-modal :screen/keycard.error]]]})
86+
{:db (-> db
87+
(assoc-in [:keycard :application-info] application-info)
88+
(assoc-in [:keycard :pin :status] :verifying))
89+
:fx on-success-fx})))
9190

9291
(rf/reg-event-fx :keycard/get-application-info
9392
(fn [_ [{:keys [on-success on-failure]}]]

src/status_im/contexts/keycard/sheets/migrate/view.cljs

+11-4
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66

77
(defn view
88
[]
9-
(let [profile-name (rf/sub [:profile/name])
10-
profile-picture (rf/sub [:profile/image])
11-
customization-color (rf/sub [:profile/customization-color])]
9+
(let [profile-name (rf/sub [:profile/name])
10+
profile-picture (rf/sub [:profile/image])
11+
customization-color (rf/sub [:profile/customization-color])
12+
recovery-phrase-backed-up? (rf/sub [:profile/recovery-phrase-backed-up?])]
1213
[:<>
1314
[quo/drawer-top
1415
{:type :context-tag
@@ -27,7 +28,13 @@
2728
[quo/bottom-actions
2829
{:actions :two-actions
2930
:button-one-label (i18n/label :t/continue)
30-
:button-one-props {:on-press #()}
31+
:button-one-props {:on-press #(if recovery-phrase-backed-up?
32+
(rf/dispatch [:open-modal :screen/use-recovery-phrase
33+
{:on-success (fn [{:keys [key-uid phrase
34+
on-error]}])}])
35+
(rf/dispatch [:open-modal :screen/backup-recovery-phrase
36+
{:on-success (fn [{:keys [masked-seed-phrase
37+
random-phrase]}])}]))}
3138
:button-two-label (i18n/label :t/cancel)
3239
:button-two-props {:type :grey
3340
:on-press #(rf/dispatch [:hide-bottom-sheet])}}]]))

src/status_im/contexts/onboarding/events.cljs

-9
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,6 @@
131131
[:open-modal :screen/onboarding.enable-biometrics]
132132
[:open-modal :screen/onboarding.enable-notifications])}))
133133

134-
(rf/defn seed-phrase-entered
135-
{:events [:onboarding/seed-phrase-entered]}
136-
[_ seed-phrase on-error]
137-
{:multiaccount/validate-mnemonic [seed-phrase
138-
(fn [mnemonic key-uid]
139-
(re-frame/dispatch [:onboarding/seed-phrase-validated
140-
mnemonic key-uid]))
141-
on-error]})
142-
143134
(rf/defn seed-phrase-validated
144135
{:events [:onboarding/seed-phrase-validated]}
145136
[{:keys [db]} seed-phrase key-uid]
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
(ns status-im.contexts.wallet.add-account.create-account.new-keypair.backup-recovery-phrase.style
1+
(ns status-im.contexts.profile.backup-recovery-phrase.style
22
(:require
33
[quo.foundations.colors :as colors]
44
[react-native.platform :as platform]))
+18-19
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
(ns status-im.contexts.wallet.add-account.create-account.new-keypair.backup-recovery-phrase.view
1+
(ns status-im.contexts.profile.backup-recovery-phrase.view
22
(:require
33
[clojure.string :as string]
44
[native-module.core :as native-module]
55
[quo.core :as quo]
66
[quo.theme :as quo.theme]
77
[react-native.core :as rn]
88
[reagent.core :as reagent]
9-
[status-im.contexts.wallet.add-account.create-account.new-keypair.backup-recovery-phrase.style :as
10-
style]
9+
[status-im.contexts.profile.backup-recovery-phrase.style :as style]
1110
[utils.i18n :as i18n]
1211
[utils.re-frame :as rf]
1312
[utils.security.core :as security]))
@@ -45,20 +44,20 @@
4544

4645
(defn view
4746
[]
48-
(let [step-labels [:t/backup-step-1 :t/backup-step-2 :t/backup-step-3
49-
:t/backup-step-4]
50-
checked? (reagent/atom
51-
{:0 false
52-
:1 false
53-
:2 false
54-
:3 false})
55-
revealed? (reagent/atom false)
56-
customization-color (rf/sub [:profile/customization-color])
57-
seed-phrase (reagent/atom [])
58-
random-phrase (reagent/atom [])]
47+
(let [step-labels [:t/backup-step-1 :t/backup-step-2 :t/backup-step-3
48+
:t/backup-step-4]
49+
checked? (reagent/atom
50+
{:0 false
51+
:1 false
52+
:2 false
53+
:3 false})
54+
revealed? (reagent/atom false)
55+
customization-color (rf/sub [:profile/customization-color])
56+
{:keys [on-success]} (rf/sub [:get-screen-params])
57+
seed-phrase (reagent/atom [])
58+
random-phrase (reagent/atom [])]
5959
(fn []
6060
(let [theme (quo.theme/use-theme)]
61-
6261
(rn/use-mount
6362
(fn []
6463
(native-module/get-random-mnemonic #(reset! seed-phrase (string/split % #"\s")))
@@ -107,10 +106,10 @@
107106
:button-one-label (i18n/label :t/i-have-written)
108107
:button-one-props {:disabled? (some false? (vals @checked?))
109108
:customization-color customization-color
110-
:on-press #(rf/dispatch [:wallet/store-new-seed-phrase
111-
{:seed-phrase (security/mask-data
112-
@seed-phrase)
113-
:random-phrase @random-phrase}])}}]
109+
:on-press #(on-success {:masked-seed-phrase
110+
(security/mask-data
111+
@seed-phrase)
112+
:random-phrase @random-phrase})}}]
114113
[quo/text
115114
{:size :paragraph-2
116115
:style (style/description-text theme)}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,31 @@
11
(ns status-im.contexts.profile.recover.effects
22
(:require
33
[native-module.core :as native-module]
4-
[utils.re-frame :as rf]))
4+
[promesa.core :as promesa]
5+
[utils.re-frame :as rf]
6+
[utils.security.core :as security]
7+
[utils.transforms :as transforms]))
58

69
(rf/reg-fx :effects.profile/restore-and-login
710
(fn [request]
811
;;"node.login" signal will be triggered as a callback
912
(native-module/restore-account-and-login request)))
13+
14+
(defn validate-mnemonic
15+
[mnemonic]
16+
(-> mnemonic
17+
(security/safe-unmask-data)
18+
(native-module/validate-mnemonic)
19+
(promesa/then (fn [result]
20+
(let [{:keys [keyUID]} (transforms/json->clj result)]
21+
{:key-uid keyUID})))))
22+
23+
(rf/reg-fx :effects.profile/validate-recovery-phrase
24+
(fn [[mnemonic on-success on-error]]
25+
(-> (validate-mnemonic mnemonic)
26+
(promesa/then (fn [{:keys [key-uid]}]
27+
(when (fn? on-success)
28+
(on-success mnemonic key-uid))))
29+
(promesa/catch (fn [error]
30+
(when (and error (fn? on-error))
31+
(on-error error)))))))

src/status_im/contexts/profile/recover/events.cljs

+4
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,7 @@
2424
:imagePath (profile.config/strip-file-prefix image-path)
2525
:customizationColor (or color constants/profile-default-color)
2626
:fetchBackup true)}))
27+
28+
(rf/reg-event-fx :profile.recover/validate-recovery-phrase
29+
(fn [_ [phrase {:keys [on-success on-error]}]]
30+
{:effects.profile/validate-recovery-phrase [phrase on-success on-error]}))

src/status_im/contexts/profile/settings/view.cljs

+9-8
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,14 @@
4949

5050
(defn view
5151
[]
52-
(let [theme (quo.theme/use-theme)
53-
insets (safe-area/get-insets)
54-
customization-color (rf/sub [:profile/customization-color])
55-
scroll-y (reanimated/use-shared-value 0)
56-
profile (rf/sub [:profile/profile])
57-
full-name (profile.utils/displayed-name profile)
58-
on-scroll (rn/use-callback #(scroll-handler % scroll-y))]
52+
(let [theme (quo.theme/use-theme)
53+
insets (safe-area/get-insets)
54+
customization-color (rf/sub [:profile/customization-color])
55+
scroll-y (reanimated/use-shared-value 0)
56+
profile (rf/sub [:profile/profile])
57+
recovery-phrase-backed-up? (rf/sub [:profile/recovery-phrase-backed-up?])
58+
full-name (profile.utils/displayed-name profile)
59+
on-scroll (rn/use-callback #(scroll-handler % scroll-y))]
5960
[quo/overlay {:type :shell}
6061
[rn/view
6162
{:style (style/navigation-wrapper {:customization-color customization-color
@@ -79,7 +80,7 @@
7980
profile)}}])}]}]]
8081
[rn/flat-list
8182
{:header [settings.header/view {:scroll-y scroll-y}]
82-
:data (settings.items/items (boolean (seq (:mnemonic profile))))
83+
:data (settings.items/items (not recovery-phrase-backed-up?))
8384
:shows-vertical-scroll-indicator false
8485
:render-fn settings-category-view
8586
:get-item-layout get-item-layout

src/status_im/contexts/settings/wallet/events.cljs

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@
160160

161161
(defn wallet-validate-seed-phrase
162162
[_ [seed-phrase on-success on-error]]
163-
{:fx [[:multiaccount/validate-mnemonic [seed-phrase on-success on-error]]]})
163+
{:fx [[:effects.profile/validate-recovery-phrase [seed-phrase on-success on-error]]]})
164164

165165
(rf/reg-event-fx :wallet/validate-seed-phrase wallet-validate-seed-phrase)
166166

src/status_im/contexts/settings/wallet/events_test.cljs

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
seed-phrase-masked (security/mask-data "seed phrase")
102102
on-success #(prn "success")
103103
on-error #(prn "error")
104-
expected {:fx [[:multiaccount/validate-mnemonic
104+
expected {:fx [[:effects.profile/validate-recovery-phrase
105105
[seed-phrase-masked on-success on-error]]]}]
106106
(is (= expected
107107
(sut/wallet-validate-seed-phrase

src/status_im/contexts/wallet/add_account/create_account/events.cljs

-10
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,6 @@
6161

6262
(rf/reg-event-fx :wallet/seed-phrase-validated seed-phrase-validated)
6363

64-
(defn seed-phrase-entered
65-
[_ [seed-phrase on-error]]
66-
{:fx [[:multiaccount/validate-mnemonic
67-
[seed-phrase
68-
(fn [mnemonic key-uid]
69-
(rf/dispatch [:wallet/seed-phrase-validated mnemonic key-uid on-error]))
70-
on-error]]]})
71-
72-
(rf/reg-event-fx :wallet/seed-phrase-entered seed-phrase-entered)
73-
7464
(defn store-account-generated-with-mnemonic
7565
[{:keys [db]} [{:keys [new-account-data keypair-name]}]]
7666
(let [new-account (update new-account-data :mnemonic security/mask-data)]

src/status_im/contexts/wallet/add_account/create_account/select_keypair/view.cljs

+11-3
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,21 @@
1616
[[{:icon :i/add
1717
:accessibility-label :generate-new-keypair
1818
:label (i18n/label :t/generate-new-keypair)
19-
:on-press #(rf/dispatch [:navigate-to :screen/wallet.backup-recovery-phrase])}
19+
:on-press #(rf/dispatch [:navigate-to :screen/backup-recovery-phrase
20+
{:on-success (fn [{:keys [masked-seed-phrase random-phrase]}]
21+
(rf/dispatch [:wallet/store-new-seed-phrase
22+
{:seed-phrase masked-seed-phrase
23+
:random-phrase
24+
random-phrase}]))}])}
2025
{:icon :i/seed
2126
:accessibility-label :import-using-phrase
2227
:label (i18n/label :t/import-using-phrase)
2328
:add-divider? true
24-
:on-press #(rf/dispatch [:navigate-to :screen/wallet.enter-seed-phrase
25-
{:recovering-keypair? true}])}
29+
:on-press (fn []
30+
(rf/dispatch [:navigate-to :screen/use-recovery-phrase
31+
{:on-success (fn [{:keys [key-uid phrase on-error]}]
32+
(rf/dispatch [:wallet/seed-phrase-validated
33+
phrase key-uid on-error]))}]))}
2634
(when (ff/enabled? ::ff/wallet.import-private-key)
2735
{:icon :i/key
2836
:accessibility-label :import-private-key

0 commit comments

Comments
 (0)