diff --git a/lib/src/screens/restore/restore_from_backup_page.dart b/lib/src/screens/restore/restore_from_backup_page.dart index 7eaf08a9f..58638b48a 100644 --- a/lib/src/screens/restore/restore_from_backup_page.dart +++ b/lib/src/screens/restore/restore_from_backup_page.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; @@ -7,6 +8,8 @@ import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/view_model/restore_from_backup_view_model.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:file_picker/file_picker.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:mobx/mobx.dart'; class RestoreFromBackupPage extends BasePage { RestoreFromBackupPage(this.restoreFromBackupViewModel) @@ -20,6 +23,22 @@ class RestoreFromBackupPage extends BasePage { @override Widget body(BuildContext context) { + reaction((_) => restoreFromBackupViewModel.state, (ExecutionState state) { + if (state is FailureState) { + WidgetsBinding.instance.addPostFrameCallback((_) { + showPopUp( + context: context, + builder: (BuildContext context) { + return AlertWithOneAction( + alertTitle: S.of(context).error, + alertContent: state.error, + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop()); + }); + }); + } + }); + return Container( padding: EdgeInsets.only(bottom: 30, left: 25, right: 25), child: Column(children: [ @@ -46,12 +65,15 @@ class RestoreFromBackupPage extends BasePage { color: Colors.grey, textColor: Colors.white)), SizedBox(width: 20), - Expanded( - child: PrimaryButton( - onPressed: () => onImportHandler(context), - text: 'Import', - color: Theme.of(context).accentTextTheme.body2.color, - textColor: Colors.white)) + Expanded(child: Observer(builder: (_) { + return LoadingPrimaryButton( + isLoading: + restoreFromBackupViewModel.state is IsExecutingState, + onPressed: () => onImportHandler(context), + text: 'Import', + color: Theme.of(context).accentTextTheme.body2.color, + textColor: Colors.white); + })) ])), ])); } diff --git a/lib/view_model/restore_from_backup_view_model.dart b/lib/view_model/restore_from_backup_view_model.dart index c73ffb271..1c0915fe7 100644 --- a/lib/view_model/restore_from_backup_view_model.dart +++ b/lib/view_model/restore_from_backup_view_model.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:cake_wallet/core/execution_state.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/main.dart'; @@ -19,15 +20,21 @@ abstract class RestoreFromBackupViewModelBase with Store { @observable String filePath; + @observable + ExecutionState state; + final BackupService backupService; @action void reset() => filePath = ''; + @action Future import(String password) async { try { + state = IsExecutingState(); + if (filePath?.isEmpty ?? true) { - // FIXME: throw exception; + state = FailureState('Backup file is not selected.'); return; } @@ -49,8 +56,16 @@ abstract class RestoreFromBackupViewModelBase with Store { reaction?.reaction?.dispose(); } }); + + state = ExecutedSuccessfullyState(); } catch (e) { - print(e.toString()); + var msg = e.toString(); + + if (msg == 'Message authentication code (MAC) is invalid') { + msg = 'Incorrect backup password'; + } + + state = FailureState(msg); } } }