1
1
import analytics from '@segment/analytics-react-native' ;
2
+ import { captureMessage } from '@sentry/react-native' ;
2
3
import PropTypes from 'prop-types' ;
3
4
import React , { useCallback , useState } from 'react' ;
4
5
import FastImage from 'react-native-fast-image' ;
5
6
import styled from 'styled-components' ;
6
7
import SeedPhraseImageSource from '../../assets/seed-phrase-icon.png' ;
7
8
import { useWallets } from '../../hooks' ;
8
- import { loadSeedPhraseAndMigrateIfNeeded } from '../../model/wallet' ;
9
+ import {
10
+ getAllWallets ,
11
+ getSelectedWallet ,
12
+ loadAddress ,
13
+ loadSeedPhraseAndMigrateIfNeeded ,
14
+ } from '../../model/wallet' ;
15
+ import store from '../../redux/store' ;
16
+ import { walletsLoadState , walletsUpdate } from '../../redux/wallets' ;
17
+ import { logger } from '../../utils' ;
9
18
import { Button } from '../buttons' ;
10
19
import CopyTooltip from '../copy-tooltip' ;
11
20
import { Centered , Column } from '../layout' ;
@@ -28,21 +37,107 @@ const ToggleSeedPhraseButton = styled(Button)`
28
37
const BackupSection = ( { navigation } ) => {
29
38
const [ seedPhrase , setSeedPhrase ] = useState ( null ) ;
30
39
const { selectedWallet } = useWallets ( ) ;
40
+ const [ shouldRetry , setShouldRetry ] = useState ( true ) ;
31
41
32
42
const hideSeedPhrase = ( ) => setSeedPhrase ( null ) ;
33
43
44
+ const logAndAttemptRestore = useCallback (
45
+ async error => {
46
+ if ( ! shouldRetry ) {
47
+ hideSeedPhrase ( ) ;
48
+ return ;
49
+ }
50
+
51
+ setShouldRetry ( false ) ;
52
+
53
+ // 1 - Log the error if exists
54
+ if ( error ) {
55
+ logger . sentry (
56
+ '[logAndAttemptRestore]: Error while revealing seed' ,
57
+ error
58
+ ) ;
59
+ }
60
+
61
+ // 2 - Log redux and public keychain entries
62
+ logger . sentry ( '[logAndAttemptRestore]: REDUX DATA:' , store . getState ( ) ) ;
63
+ try {
64
+ logger . sentry (
65
+ '[logAndAttemptRestore]: Keychain allWallets:' ,
66
+ await getAllWallets ( )
67
+ ) ;
68
+ // eslint-disable-next-line no-empty
69
+ } catch ( e ) { }
70
+
71
+ try {
72
+ logger . sentry (
73
+ '[logAndAttemptRestore]: Keychain selectedWallet:' ,
74
+ await getSelectedWallet ( )
75
+ ) ;
76
+ // eslint-disable-next-line no-empty
77
+ } catch ( e ) { }
78
+
79
+ try {
80
+ logger . sentry (
81
+ '[logAndAttemptRestore]: Keychain address:' ,
82
+ await loadAddress ( )
83
+ ) ;
84
+ // eslint-disable-next-line no-empty
85
+ } catch ( e ) { }
86
+
87
+ // 3 - Send message to sentry
88
+ captureMessage ( `Error while revealing seed` ) ;
89
+ logger . sentry ( '[logAndAttemptRestore] message sent to sentry' ) ;
90
+
91
+ // 4 - Attempt to restore
92
+ try {
93
+ // eslint-disable-next-line no-unused-vars
94
+ const { wallets } = await getAllWallets ( ) ;
95
+ logger . sentry ( '[logAndAttemptRestore] Got all wallets' ) ;
96
+ } catch ( e ) {
97
+ logger . sentry (
98
+ '[logAndAttemptRestore] Got error getting all wallets' ,
99
+ e
100
+ ) ;
101
+ // if we don't have all wallets, let's see if we have a selected wallet
102
+ const selected = await getSelectedWallet ( ) ;
103
+ logger . sentry ( '[logAndAttemptRestore] Got selected wallet' ) ;
104
+ if ( selected ?. wallet ?. id ) {
105
+ const { wallet } = selected ;
106
+ // We can recover it based in the selected wallet
107
+ await store . dispatch ( walletsUpdate ( { [ wallet . id ] : wallet } ) ) ;
108
+ logger . sentry ( '[logAndAttemptRestore] Updated wallets' ) ;
109
+ await store . dispatch ( walletsLoadState ( ) ) ;
110
+ logger . sentry ( '[logAndAttemptRestore] Reloaded wallets state' ) ;
111
+ // Retrying one more time
112
+ const keychainValue = await loadSeedPhraseAndMigrateIfNeeded (
113
+ wallet . id
114
+ ) ;
115
+ if ( keychainValue ) {
116
+ setSeedPhrase ( keychainValue ) ;
117
+ captureMessage ( `Restore from selected wallet successful` ) ;
118
+ }
119
+ }
120
+ }
121
+ } ,
122
+ [ shouldRetry ]
123
+ ) ;
124
+
34
125
const handlePressToggleSeedPhrase = useCallback ( ( ) => {
35
126
if ( ! seedPhrase ) {
36
127
loadSeedPhraseAndMigrateIfNeeded ( selectedWallet . id )
37
128
. then ( keychainValue => {
38
- setSeedPhrase ( keychainValue ) ;
39
- analytics . track ( 'Viewed backup seed phrase text' ) ;
129
+ if ( ! keychainValue ) {
130
+ logAndAttemptRestore ( ) ;
131
+ } else {
132
+ setSeedPhrase ( keychainValue ) ;
133
+ analytics . track ( 'Viewed backup seed phrase text' ) ;
134
+ }
40
135
} )
41
- . catch ( hideSeedPhrase ) ;
136
+ . catch ( e => logAndAttemptRestore ( e ) ) ;
42
137
} else {
43
138
hideSeedPhrase ( ) ;
44
139
}
45
- } , [ seedPhrase , selectedWallet . id ] ) ;
140
+ } , [ logAndAttemptRestore , seedPhrase , selectedWallet . id ] ) ;
46
141
47
142
return (
48
143
< Column align = "center" css = { padding ( 80 , 40 , 0 ) } flex = { 1 } >
0 commit comments