Files
hash-wallet/lib/view_model/restore_from_backup_view_model.dart
T
cyanandGitHub 76876181e5 feat: initial hive -> SQLite (#2502)
* feat: initial hive -> SQLite

Includes migration script and initial work done to
remove dependency on hive generators.

Also contains some refactoring to make sync code
async.

Features new dev screen that lists all SQLite tables

Aspects that need testing:
- backups (from this version, and from previous versions as well)
- wallet loading / wallet list
- almost everything else
- renaming
- deletion
- sorting in wallet list
- wallet groups
- wallet seed/keys
- wallet switching
- wallet creation / restore - all methods
- wallet address page
- hardware wallet connection (and prompts from mall screens)
- contacts
- advanced settings in wallet creation
- derivation paths
- some minor wownero fixes
- base, hardware wallets

* fix: build errors

* fix: Bad state: No element in backup restore

* address comments from review

* fix: HardwareWalletType
2025-10-31 22:37:15 +01:00

108 lines
3.4 KiB
Dart

import 'dart:io';
import 'package:cake_wallet/core/backup_service_v3.dart';
import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/utils/exception_handler.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/main.dart';
import 'package:cake_wallet/di.dart';
import 'package:cw_core/node.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/store/authentication_store.dart';
part 'restore_from_backup_view_model.g.dart';
class RestoreFromBackupViewModel = RestoreFromBackupViewModelBase with _$RestoreFromBackupViewModel;
abstract class RestoreFromBackupViewModelBase with Store {
RestoreFromBackupViewModelBase(this.backupService)
: state = InitialExecutionState(),
filePath = '';
final BackupServiceV3 backupService;
@observable
String filePath;
@observable
ExecutionState state;
@action
void reset() => filePath = '';
@action
Future<void> import(String password) async {
try {
state = IsExecutingState();
if (filePath.isEmpty) {
state = FailureState('Backup file is not selected.');
return;
}
final file = File(filePath);
try {
await backupService.importBackupFile(file, password);
} catch (e, s) {
if (e.toString().contains("unknown_backup_version")) {
state = FailureState('This is not a valid backup file, please make sure you have selected the correct one');
} else {
state = FailureState(e.toString() + "\n" + s.toString());
}
}
try {
await initializeAppAtRoot(reInitializing: true);
} catch (e, s) {
state = FailureState('Failed app initialization, please try again');
ExceptionHandler.onError(FlutterErrorDetails(exception: e, stack: s, silent: true));
}
final store = getIt.get<AppStore>();
ReactionDisposer? reaction;
await store.settingsStore.reload(nodeSource: getIt.get<Box<Node>>());
await store.themeStore.loadSavedTheme(isFromBackup: true);
reaction = autorun((_) {
final wallet = store.wallet;
if (wallet != null) {
store.authenticationStore.state = AuthenticationState.allowed;
reaction?.reaction.dispose();
}
});
state = ExecutedSuccessfullyState();
} catch (e, s) {
var msg = e.toString().toLowerCase();
// can't use a switch here because of .contains() / not an exact match
bool shouldBeMadeAware = false;
if (msg.contains("message authentication code (mac)")) {
msg = 'Incorrect backup password';
} else if (msg.contains("faileddecryption")) {
msg = 'Failed to decrypt backup file, please check you entered the right password';
} else if (msg.contains("failed_to_decode")) {
msg = 'Failed to decode backup file, please try again';
shouldBeMadeAware = true;
} else if (msg.contains("failed_app_initialization")) {
msg = 'Failed to initialize app, please try again';
shouldBeMadeAware = true;
} else {
shouldBeMadeAware = true;
}
if (shouldBeMadeAware) {
await ExceptionHandler.onError(FlutterErrorDetails(
exception: e,
stack: s,
library: this.toString(),
));
}
state = FailureState(msg);
}
}
}