5
import 'package:cake_wallet/src/screens/restore/wallet_restore_from_keys_form.dart';
6
import 'package:cake_wallet/src/screens/restore/wallet_restore_from_seed_form.dart';
7
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
8
+import 'package:cake_wallet/src/widgets/bottom_sheet/add_passphrase_bottom_sheet_widget.dart';
9
import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
10
import 'package:cake_wallet/src/widgets/primary_button.dart';
11
+import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
12
+import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
13
+import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
14
import 'package:cake_wallet/themes/extensions/keyboard_theme.dart';
11
-import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
15
+import 'package:cake_wallet/themes/theme_base.dart';
16
import 'package:cake_wallet/utils/responsive_layout_util.dart';
17
import 'package:cake_wallet/utils/show_pop_up.dart';
18
import 'package:cake_wallet/view_model/restore/restore_mode.dart';
56
// String? derivationPath = null;
57
DerivationInfo? derivationInfo;
58
55
-
59
@override
60
Function(BuildContext)? get popWidget => (context) => seedSettingsViewModel.setPassphrase(null);
61
105
padding: EdgeInsets.only(top: 20, bottom: 24, left: 24, right: 24),
106
child: Column(
107
children: [
108
+ Observer(
109
+ builder: (context) {
110
+ return walletRestoreViewModel.mode == WalletRestoreMode.seed
111
+ ? StandardCheckbox(
112
+ value: walletRestoreViewModel.hasPassphrase,
113
+ caption: S.of(context).wallet_has_passphrase,
114
+ onChanged: (value) {
115
+ walletRestoreViewModel.hasPassphrase = value;
116
+ },
117
+ )
118
+ : SizedBox.shrink();
119
+ },
120
+ ),
121
+ SizedBox(height: 16),
122
+ PrimaryButton(
123
+ key: ValueKey('wallet_restore_advanced_settings_button_key'),
124
+ onPressed: () {
125
+ Navigator.of(context).pushNamed(
126
+ Routes.advancedPrivacySettings,
127
+ arguments: {
128
+ 'isFromRestore': true,
129
+ 'type': walletRestoreViewModel.type,
130
+ 'useTestnet': walletRestoreViewModel.useTestnet,
131
+ 'toggleTestnet': walletRestoreViewModel.toggleUseTestnet
132
+ },
133
+ );
134
+ },
135
+ text: S.of(context).advanced_settings,
136
+ color: Theme.of(context).cardColor,
137
+ textColor: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor,
138
+ ),
139
+ SizedBox(height: 8),
140
Observer(
141
builder: (context) {
142
return LoadingPrimaryButton(
143
key: ValueKey('wallet_restore_seed_or_key_restore_button_key'),
109
- onPressed: () async => await _confirmForm(context),
110
- text: S.of(context).restore_recover,
111
- color: Theme.of(context)
112
- .extension<WalletListTheme>()!
113
- .createNewWalletButtonBackgroundColor,
114
- textColor: Theme.of(context)
115
- .extension<WalletListTheme>()!
116
- .restoreWalletButtonTextColor,
144
+ onPressed: () async {
145
+ if (walletRestoreViewModel.hasPassphrase) {
146
+ await showModalBottomSheet<void>(
147
+ context: context,
148
+ isDismissible: false,
149
+ isScrollControlled: true,
150
+ builder: (BuildContext bottomSheetContext) {
151
+ return Padding(
152
+ padding: EdgeInsets.only(
153
+ bottom: MediaQuery.of(bottomSheetContext).viewInsets.bottom,
154
+ ),
155
+ child: AddPassphraseBottomSheet(
156
+ currentTheme: currentTheme,
157
+ titleText: S.of(context).add_passphrase,
158
+ onRestoreButtonPressed: (passphrase) async {
159
+ await _onPassphraseBottomSheetRestoreButtonPressed(
160
+ passphrase,
161
+ context,
162
+ );
163
+ },
164
+ ),
165
+ );
166
+ },
167
+ );
168
+ } else {
169
+ await _confirmForm(context);
170
+ }
171
+ },
172
+ text: walletRestoreViewModel.hasPassphrase
173
+ ? S.of(context).add_passphrase
174
+ : S.of(context).restore_recover,
175
+ color: Theme.of(context).primaryColor,
176
+ textColor: Colors.white,
177
isLoading: walletRestoreViewModel.state is IsExecutingState,
178
isDisabled: !walletRestoreViewModel.isButtonEnabled,
179
);
180
},
181
),
122
- const SizedBox(height: 25),
123
- GestureDetector(
124
- key: ValueKey('wallet_restore_advanced_settings_button_key'),
125
- onTap: () {
126
- Navigator.of(context)
127
- .pushNamed(Routes.advancedPrivacySettings, arguments: {
128
- 'isFromRestore': true,
129
- 'type': walletRestoreViewModel.type,
130
- 'useTestnet': walletRestoreViewModel.useTestnet,
131
- 'toggleTestnet': walletRestoreViewModel.toggleUseTestnet
132
- });
133
- },
134
- child: Text(S.of(context).advanced_settings),
135
- ),
182
+ const SizedBox(height: 24),
183
],
184
),
185
)
191
);
192
}
193
194
+ Future<void> _onPassphraseBottomSheetRestoreButtonPressed(
195
+ String passphrase,
196
+ BuildContext context,
197
+ ) async {
198
+ walletRestoreViewModel.seedSettingsViewModel.setPassphrase(passphrase);
199
+ await _confirmForm(context);
200
+ }
201
+
202
Map<String, dynamic> _credentials() {
203
final credentials = <String, dynamic>{};
204
227
walletRestoreFromKeysFormKey.currentState!.nameTextEditingController.text;
228
credentials['viewKey'] = walletRestoreFromKeysFormKey.currentState!.viewKeyController.text;
229
if (walletRestoreViewModel.type != WalletType.decred) {
175
- credentials['address'] = walletRestoreFromKeysFormKey.currentState!.addressController.text;
230
+ credentials['address'] =
231
+ walletRestoreFromKeysFormKey.currentState!.addressController.text;
232
credentials['spendKey'] =
177
- walletRestoreFromKeysFormKey.currentState!.spendKeyController.text;
233
+ walletRestoreFromKeysFormKey.currentState!.spendKeyController.text;
234
credentials['height'] =
235
walletRestoreFromKeysFormKey.currentState!.blockchainHeightKey.currentState!.height;
236
}
391
final initialIndex = walletRestoreViewModel.mode == WalletRestoreMode.seed
392
? 0
393
: _hasKeysTab
338
- ? 1
339
- : 0;
394
+ ? 1
395
+ : 0;
396
397
_tabController = TabController(length: tabCount, vsync: this, initialIndex: initialIndex);
398
485
padding: EdgeInsets.zero,
486
tabs: [
487
Tab(text: S.of(context).widgets_seed),
432
- if (_hasKeysTab) Tab(text: S.of(context).keys),
488
+ if (_hasKeysTab) Tab(text: S.of(context).keys),
489
],
490
),
491
),
583
}
584
585
bool _isValidSeed() {
530
- final seedPhrase = walletRestoreFromSeedFormKey
531
- .currentState!.seedWidgetStateKey.currentState!.text;
586
+ final seedPhrase =
587
+ walletRestoreFromSeedFormKey.currentState!.seedWidgetStateKey.currentState!.text;
588
if (walletRestoreViewModel.isPolyseed(seedPhrase)) return true;
589
590
final seedWords = seedPhrase.split(' ');
591
536
- if (seedWords.length == 14 &&
537
- walletRestoreViewModel.type == WalletType.wownero) return true;
538
- if (seedWords.length == 26 &&
539
- walletRestoreViewModel.type == WalletType.zano) return true;
540
-
541
- if (seedWords.length == 12 &&
542
- walletRestoreViewModel.type == WalletType.monero) {
543
- return walletRestoreFromSeedFormKey
544
- .currentState
545
- ?.blockchainHeightKey
546
- .currentState
547
- ?.restoreHeightController
548
- .text
549
- .isNotEmpty == true;
592
+ if (seedWords.length == 14 && walletRestoreViewModel.type == WalletType.wownero) return true;
593
+ if (seedWords.length == 26 && walletRestoreViewModel.type == WalletType.zano) return true;
594
+
595
+ if (seedWords.length == 12 && walletRestoreViewModel.type == WalletType.monero) {
596
+ return walletRestoreFromSeedFormKey.currentState?.blockchainHeightKey.currentState
597
+ ?.restoreHeightController.text.isNotEmpty ==
598
+ true;
599
}
600
601
if ([WalletType.monero, WalletType.wownero, WalletType.haven]
602
.contains(walletRestoreViewModel.type) &&
554
- seedWords.length ==
555
- WalletRestoreViewModelBase.moneroSeedMnemonicLength) {
603
+ seedWords.length == WalletRestoreViewModelBase.moneroSeedMnemonicLength) {
604
return true;
605
}
606
607
// bip39:
608
final validBip39SeedLengths = [12, 18, 24];
561
- final nonBip39WalletTypes = [
562
- WalletType.wownero,
563
- WalletType.haven,
564
- WalletType.decred
565
- ];
609
+ final nonBip39WalletTypes = [WalletType.wownero, WalletType.haven, WalletType.decred];
610
// if it's a bip39 wallet and the length is not valid return false
611
if (!nonBip39WalletTypes.contains(walletRestoreViewModel.type) &&
612
!(validBip39SeedLengths.contains(seedWords.length))) {
614
}
615
616
if ((walletRestoreViewModel.type == WalletType.decred) &&
573
- seedWords.length !=
574
- WalletRestoreViewModelBase.decredSeedMnemonicLength) {
617
+ seedWords.length != WalletRestoreViewModelBase.decredSeedMnemonicLength) {
618
return false;
619
}
620
578
- final words = walletRestoreFromSeedFormKey
579
- .currentState!.seedWidgetStateKey.currentState!.words
580
- .toSet();
621
+ final words =
622
+ walletRestoreFromSeedFormKey.currentState!.seedWidgetStateKey.currentState!.words.toSet();
623
return seedWords.toSet().difference(words).toSet().isEmpty;
624
}
625