19
19
import $ from 'jquery'
20
20
import { attachBusyListener } from './../iotaClient'
21
21
import {
22
+ decrypt ,
22
23
getWallets ,
23
24
walletExists ,
24
25
isValidSeed ,
25
26
addWallet ,
26
- editWallet ,
27
27
updateWallet ,
28
28
deleteWallet
29
29
} from './../walletManager'
@@ -32,7 +32,9 @@ const $page = $('section[data-page="settings"]')
32
32
const $newWalletModal = $ ( '.modal-new-wallet' )
33
33
const $importWalletModal = $ ( '.modal-import-wallet' )
34
34
const $editWalletModal = $ ( '.modal-edit-wallet' )
35
+ const $exportWalletModal = $ ( '.modal-export-wallet' )
35
36
const $deleteWalletModal = $ ( '.modal-delete-wallet' )
37
+ const $viewSeedModal = $ ( '.modal-view-seed' )
36
38
37
39
38
40
/**
@@ -42,6 +44,7 @@ function renderWalletList() {
42
44
const wallets = getWallets ( )
43
45
let colRight = '<div class="col-auto align-self-center">'
44
46
colRight += '<button type="button" class="btn btn-outline-primary btn-sm mr-1 btn-edit-wallet">Edit</button>'
47
+ colRight += '<button type="button" class="btn btn-outline-secondary btn-sm mr-1 btn-export-wallet">Export</button>'
45
48
colRight += '<button type="button" class="btn btn-outline-danger btn-sm btn-delete-wallet">Delete</button>'
46
49
colRight += '</div>'
47
50
@@ -94,14 +97,37 @@ function regenerateSeedTable() {
94
97
for ( let i in numbers ) seed += dict [ numbers [ i ] % dict . length ]
95
98
96
99
// Generate table HTML
100
+ const tHTML = getSeedTableHTML ( seed )
101
+ $newWalletModal . find ( '.seed-table' ) . html ( tHTML ) . data ( 'seed' , seed )
102
+ }
103
+
104
+
105
+ /**
106
+ * Get seed table HTML
107
+ * @param {string } seed Decrypted seed
108
+ * @return {string } Seed table HTML
109
+ */
110
+ function getSeedTableHTML ( seed ) {
97
111
let tHTML = ''
98
112
const dim = 9
99
113
for ( let col = 0 ; col < dim ; col ++ ) {
100
114
tHTML += '<tr>'
101
115
for ( let row = 0 ; row < dim ; row ++ ) tHTML += '<td>' + seed [ col * dim + row ] + '</td>'
102
116
tHTML += '</tr>'
103
117
}
104
- $newWalletModal . find ( '.seed-table' ) . html ( tHTML ) . data ( 'seed' , seed )
118
+ return tHTML
119
+ }
120
+
121
+
122
+ /**
123
+ * Show seed dialog
124
+ * @param {string } seed Decrypted seed
125
+ */
126
+ function showSeedDialog ( seed ) {
127
+ const tHTML = getSeedTableHTML ( seed )
128
+ $viewSeedModal . find ( '.seed-table' ) . html ( tHTML )
129
+ $viewSeedModal . find ( '.seed-input' ) . val ( seed )
130
+ $viewSeedModal . modal ( 'show' )
105
131
}
106
132
107
133
@@ -125,6 +151,9 @@ $newWalletModal.find('.btn-continue').click(function() {
125
151
showImportWalletModal ( )
126
152
$ ( '.modal-import-wallet [name="seed"]' ) . val ( seed )
127
153
} )
154
+ $newWalletModal . on ( 'hidden.bs.modal' , function ( ) {
155
+ $newWalletModal . find ( '.seed-table' ) . data ( 'seed' , '' ) . html ( '' )
156
+ } )
128
157
129
158
$importWalletModal . find ( '.btn-import' ) . click ( function ( ) {
130
159
const $form = $importWalletModal . find ( 'form' )
@@ -154,6 +183,12 @@ $importWalletModal.find('.btn-import').click(function() {
154
183
$importWalletModal . modal ( 'hide' )
155
184
}
156
185
} )
186
+ $importWalletModal . find ( '.btn-new-wallet' ) . click ( function ( e ) {
187
+ e . preventDefault ( )
188
+ regenerateSeedTable ( )
189
+ $importWalletModal . modal ( 'hide' )
190
+ $newWalletModal . modal ( 'show' )
191
+ } )
157
192
158
193
159
194
/* EDIT AND DELETE WALLET LISTENERS */
@@ -164,6 +199,17 @@ $page.find('.wallet-list').on('click', '.btn-edit-wallet', function() {
164
199
. val ( $row . find ( '.wallet-name' ) . text ( ) )
165
200
. data ( 'index' , $row . data ( 'index' ) )
166
201
$editWalletModal . modal ( 'show' )
202
+ } ) . on ( 'click' , '.btn-export-wallet' , function ( ) {
203
+ const $row = $ ( this ) . closest ( '.row' )
204
+ const wallet = getWallets ( ) [ $row . data ( 'index' ) ]
205
+ const seed = decrypt ( wallet . seed , '' )
206
+ if ( seed === null ) {
207
+ $exportWalletModal . find ( '.wallet-name' ) . text ( $row . find ( '.wallet-name' ) . text ( ) )
208
+ $exportWalletModal . data ( 'index' , $row . data ( 'index' ) )
209
+ $exportWalletModal . modal ( 'show' )
210
+ } else {
211
+ showSeedDialog ( seed )
212
+ }
167
213
} ) . on ( 'click' , '.btn-delete-wallet' , function ( ) {
168
214
const $row = $ ( this ) . closest ( '.row' )
169
215
$deleteWalletModal . find ( '.wallet-name' )
@@ -189,12 +235,37 @@ $editWalletModal.find('.btn-continue').click(function() {
189
235
$editWalletModal . modal ( 'hide' )
190
236
} )
191
237
238
+ $exportWalletModal . find ( '.btn-continue' ) . click ( function ( ) {
239
+ const $pass = $exportWalletModal . find ( 'input[name="passphrase"]' )
240
+ const index = $exportWalletModal . data ( 'index' )
241
+
242
+ // Try to decrypt seed
243
+ const wallet = getWallets ( ) [ index ]
244
+ const seed = decrypt ( wallet . seed , $pass . val ( ) )
245
+ if ( seed === null ) {
246
+ $pass . addClass ( 'is-invalid' )
247
+ return
248
+ }
249
+
250
+ // Show wallet seed
251
+ $exportWalletModal . modal ( 'hide' )
252
+ showSeedDialog ( seed )
253
+ } )
254
+ $exportWalletModal . on ( 'hidden.bs.modal' , function ( ) {
255
+ $exportWalletModal . find ( 'input[name="passphrase"]' ) . val ( '' )
256
+ } )
257
+
192
258
$deleteWalletModal . find ( '.btn-continue' ) . click ( function ( ) {
193
259
deleteWallet ( $deleteWalletModal . find ( '.wallet-name' ) . data ( 'index' ) )
194
260
renderWalletList ( )
195
261
$deleteWalletModal . modal ( 'hide' )
196
262
} )
197
263
264
+ $viewSeedModal . on ( 'hidden.bs.modal' , function ( ) {
265
+ $viewSeedModal . find ( '.seed-table' ) . html ( '' )
266
+ $viewSeedModal . find ( '.seed-input' ) . val ( '' )
267
+ } )
268
+
198
269
199
270
/* BUSY LISTENER */
200
271
attachBusyListener ( function ( isBusy ) {
0 commit comments