- 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