- Fix error popup showing multiple times (#1987)
- Improve/generalize error handling
Omar Hatem committed
Jan 30, 2025 at 04:29 UTC
1c07048808db94f1d3caeb7f566d3bc92dedd74f
4 files changed
+79
-30
cw_core/lib/exceptions.dart
+10
@@ -56,3 +56,13 @@ class CreateAssociatedTokenAccountException implements Exception {
56
class SignSPLTokenTransactionRentException implements Exception {}
57
58
class NoAssociatedTokenAccountException implements Exception {}
59
+
60
+
61
+/// ==============================================================================
62
+/// ==============================================================================
63
+
64
+class RestoreFromSeedException implements Exception {
65
+ final String message;
66
+
67
+ RestoreFromSeedException(this.message);
68
+}
cw_zano/lib/zano_wallet_exceptions.dart
+3
-1
@@ -1,3 +1,5 @@
1
+import 'package:cw_core/exceptions.dart';
2
+
3
class ZanoWalletException implements Exception {
4
final String message;
5
@@ -6,7 +8,7 @@ class ZanoWalletException implements Exception {
8
String toString() => '${this.runtimeType} (message: $message)';
9
}
10
9
-class RestoreFromSeedsException extends ZanoWalletException {
11
+class RestoreFromSeedsException extends RestoreFromSeedException {
12
RestoreFromSeedsException(String message) : super(message);
13
}
14
lib/src/screens/restore/wallet_restore_page.dart
+60
-28
@@ -23,7 +23,51 @@ import 'package:mobx/mobx.dart';
23
import 'package:smooth_page_indicator/smooth_page_indicator.dart';
24
25
class WalletRestorePage extends BasePage {
26
- WalletRestorePage(this.walletRestoreViewModel, this.seedSettingsViewModel)
26
+ WalletRestorePage(this.walletRestoreViewModel, this.seedSettingsViewModel);
27
+
28
+ @override
29
+ Widget middle(BuildContext context) => Observer(
30
+ builder: (_) => Text(
31
+ walletRestoreViewModel.mode == WalletRestoreMode.seed
32
+ ? S.current.restore_title_from_seed
33
+ : S.current.restore_title_from_keys,
34
+ style: TextStyle(
35
+ fontSize: 18.0,
36
+ fontWeight: FontWeight.bold,
37
+ fontFamily: 'Lato',
38
+ color: titleColor(context)),
39
+ ));
40
+
41
+ final WalletRestoreViewModel walletRestoreViewModel;
42
+ final SeedSettingsViewModel seedSettingsViewModel;
43
+
44
+ @override
45
+ Function(BuildContext)? get pushToNextWidget => (context) {
46
+ FocusScopeNode currentFocus = FocusScope.of(context);
47
+ if (!currentFocus.hasPrimaryFocus) {
48
+ currentFocus.focusedChild?.unfocus();
49
+ }
50
+ };
51
+
52
+ @override
53
+ Widget body(BuildContext context) {
54
+ return WalletRestorePageBody(walletRestoreViewModel, seedSettingsViewModel);
55
+ }
56
+}
57
+
58
+class WalletRestorePageBody extends StatefulWidget {
59
+ WalletRestorePageBody(this.walletRestoreViewModel, this.seedSettingsViewModel);
60
+
61
+ final WalletRestoreViewModel walletRestoreViewModel;
62
+ final SeedSettingsViewModel seedSettingsViewModel;
63
+
64
+ @override
65
+ State<WalletRestorePageBody> createState() =>
66
+ _WalletRestorePageBodyState(walletRestoreViewModel, seedSettingsViewModel);
67
+}
68
+
69
+class _WalletRestorePageBodyState extends State<WalletRestorePageBody> {
70
+ _WalletRestorePageBodyState(this.walletRestoreViewModel, this.seedSettingsViewModel)
71
: walletRestoreFromSeedFormKey = GlobalKey<WalletRestoreFromSeedFormState>(),
72
walletRestoreFromKeysFormKey = GlobalKey<WalletRestoreFromKeysFromState>(),
73
_pages = [],
@@ -54,8 +98,10 @@ class WalletRestorePage extends BasePage {
98
_validateOnChange(isPolyseed: isPolyseed);
99
},
100
displayWalletPassword: walletRestoreViewModel.hasWalletPassword,
57
- onPasswordChange: (String password) => walletRestoreViewModel.walletPassword = password,
58
- onRepeatedPasswordChange: (String repeatedPassword) => walletRestoreViewModel.repeatedWalletPassword = repeatedPassword));
101
+ onPasswordChange: (String password) =>
102
+ walletRestoreViewModel.walletPassword = password,
103
+ onRepeatedPasswordChange: (String repeatedPassword) =>
104
+ walletRestoreViewModel.repeatedWalletPassword = repeatedPassword));
105
break;
106
case WalletRestoreMode.keys:
107
_pages.add(WalletRestoreFromKeysFrom(
@@ -69,8 +115,10 @@ class WalletRestorePage extends BasePage {
115
},
116
displayPrivateKeyField: walletRestoreViewModel.hasRestoreFromPrivateKey,
117
displayWalletPassword: walletRestoreViewModel.hasWalletPassword,
72
- onPasswordChange: (String password) => walletRestoreViewModel.walletPassword = password,
73
- onRepeatedPasswordChange: (String repeatedPassword) => walletRestoreViewModel.repeatedWalletPassword = repeatedPassword,
118
+ onPasswordChange: (String password) =>
119
+ walletRestoreViewModel.walletPassword = password,
120
+ onRepeatedPasswordChange: (String repeatedPassword) =>
121
+ walletRestoreViewModel.repeatedWalletPassword = repeatedPassword,
122
onHeightOrDateEntered: (value) => walletRestoreViewModel.isButtonEnabled = value));
123
break;
124
default:
@@ -79,21 +127,6 @@ class WalletRestorePage extends BasePage {
127
});
128
}
129
82
- bool _formProcessing = false;
83
-
84
- @override
85
- Widget middle(BuildContext context) => Observer(
86
- builder: (_) => Text(
87
- walletRestoreViewModel.mode == WalletRestoreMode.seed
88
- ? S.current.restore_title_from_seed
89
- : S.current.restore_title_from_keys,
90
- style: TextStyle(
91
- fontSize: 18.0,
92
- fontWeight: FontWeight.bold,
93
- fontFamily: 'Lato',
94
- color: titleColor(context)),
95
- ));
96
-
130
final WalletRestoreViewModel walletRestoreViewModel;
131
final SeedSettingsViewModel seedSettingsViewModel;
132
final PageController _controller;
@@ -102,20 +135,16 @@ class WalletRestorePage extends BasePage {
135
final GlobalKey<WalletRestoreFromKeysFromState> walletRestoreFromKeysFormKey;
136
final FocusNode _blockHeightFocusNode;
137
138
+ bool _formProcessing = false;
139
+
140
// DerivationType derivationType = DerivationType.unknown;
141
// String? derivationPath = null;
142
DerivationInfo? derivationInfo;
143
144
@override
110
- Function(BuildContext)? get pushToNextWidget => (context) {
111
- FocusScopeNode currentFocus = FocusScope.of(context);
112
- if (!currentFocus.hasPrimaryFocus) {
113
- currentFocus.focusedChild?.unfocus();
114
- }
115
- };
145
+ void initState() {
146
+ super.initState();
147
117
- @override
118
- Widget body(BuildContext context) {
148
reaction((_) => walletRestoreViewModel.state, (ExecutionState state) {
149
if (state is FailureState) {
150
WidgetsBinding.instance.addPostFrameCallback((_) {
@@ -149,7 +178,10 @@ class WalletRestorePage extends BasePage {
178
.currentState!.blockchainHeightKey.currentState!.dateController.text = '';
179
walletRestoreFromKeysFormKey.currentState!.nameTextEditingController.text = '';
180
});
181
+ }
182
183
+ @override
184
+ Widget build(BuildContext context) {
185
return KeyboardActions(
186
config: KeyboardActionsConfig(
187
keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
lib/view_model/wallet_creation_vm.dart
+6
-1
@@ -10,6 +10,7 @@ import 'package:cake_wallet/store/app_store.dart';
10
import 'package:cake_wallet/store/settings_store.dart';
11
import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
12
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
13
+import 'package:cw_core/exceptions.dart';
14
import 'package:cw_core/pathForWallet.dart';
15
import 'package:cw_core/utils/print_verbose.dart';
16
import 'package:cw_core/wallet_base.dart';
@@ -118,7 +119,11 @@ abstract class WalletCreationVMBase with Store {
119
} catch (e, s) {
120
printV("error: $e");
121
printV("stack: $s");
121
- state = FailureState(e.toString());
122
+ String message = e.toString();
123
+ if (e is RestoreFromSeedException) {
124
+ message = e.message;
125
+ }
126
+ state = FailureState(message);
127
}
128
}
129