cake_wallet/lib/view_model/backup_view_model.dart

102 lines
3.1 KiB
Dart
Raw Normal View History

import 'dart:io';
2021-01-15 17:41:30 +00:00
import 'package:cake_wallet/core/backup_service.dart';
2021-01-13 16:43:34 +00:00
import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/core/secure_storage.dart';
2021-01-13 16:43:34 +00:00
import 'package:cake_wallet/entities/secret_store_key.dart';
import 'package:cake_wallet/store/secret_store.dart';
import 'package:cw_core/root_dir.dart';
2021-01-13 16:43:34 +00:00
import 'package:flutter/foundation.dart';
import 'package:mobx/mobx.dart';
import 'package:intl/intl.dart';
2022-02-02 12:40:40 +00:00
import 'package:cake_wallet/wallet_type_utils.dart';
import 'package:path_provider/path_provider.dart';
2021-01-13 16:43:34 +00:00
part 'backup_view_model.g.dart';
class BackupExportFile {
2022-10-12 17:09:57 +00:00
BackupExportFile(this.content, {required this.name});
2021-01-13 16:43:34 +00:00
final String name;
final List<int> content;
}
class BackupViewModel = BackupViewModelBase with _$BackupViewModel;
abstract class BackupViewModelBase with Store {
BackupViewModelBase(this.secureStorage, this.secretStore, this.backupService)
2022-10-12 17:09:57 +00:00
: isBackupPasswordVisible = false,
backupPassword = '',
state = InitialExecutionState() {
2021-01-13 16:43:34 +00:00
final key = generateStoreKeyFor(key: SecretStoreKey.backupPassword);
secretStore.values.observe((change) {
if (change.key == key) {
backupPassword = secretStore.read(key);
}
}, fireImmediately: true);
}
final SecureStorage secureStorage;
2021-01-13 16:43:34 +00:00
final SecretStore secretStore;
final BackupService backupService;
@observable
ExecutionState state;
@observable
bool isBackupPasswordVisible;
@observable
String backupPassword;
@action
Future<void> init() async {
final key = generateStoreKeyFor(key: SecretStoreKey.backupPassword);
2022-10-12 17:09:57 +00:00
backupPassword = (await secureStorage.read(key: key))!;
2021-01-13 16:43:34 +00:00
}
@action
2022-10-12 17:09:57 +00:00
Future<BackupExportFile?> exportBackup() async {
2021-01-13 16:43:34 +00:00
try {
state = IsExecutingState();
2021-01-15 17:41:30 +00:00
final backupContent = await backupService.exportBackup(backupPassword);
2021-01-13 16:43:34 +00:00
state = ExecutedSuccessfullyState();
final now = DateTime.now();
final formatter = DateFormat('yyyy-MM-dd_Hm');
2022-02-02 12:40:40 +00:00
final snakeAppName = approximatedAppName.replaceAll(' ', '_').toLowerCase();
final fileName = '${snakeAppName}_backup_${formatter.format(now)}';
2021-01-13 16:43:34 +00:00
2022-02-02 12:40:40 +00:00
return BackupExportFile(backupContent.toList(), name: fileName);
2021-01-13 16:43:34 +00:00
} catch (e) {
print(e.toString());
state = FailureState(e.toString());
2021-01-15 17:41:30 +00:00
return null;
2021-01-13 16:43:34 +00:00
}
}
Future<String> saveBackupFileLocally(BackupExportFile backup) async {
final appDir = await getAppDir();
final path = '${appDir.path}/${backup.name}';
final backupFile = File(path);
await backupFile.writeAsBytes(backup.content);
return path;
}
Future<void> removeBackupFileLocally(BackupExportFile backup) async {
final appDir = await getAppDir();
final path = '${appDir.path}/${backup.name}';
final backupFile = File(path);
await backupFile.delete();
}
2021-01-13 16:43:34 +00:00
@action
void showMasterPassword() => isBackupPasswordVisible = true;
@action
Future<void> saveToDownload(String name, List<int> content) async {
const downloadDirPath = '/storage/emulated/0/Download'; // For Android
final filePath = '$downloadDirPath/${name}';
final file = File(filePath);
await file.writeAsBytes(content);
}
2021-01-13 16:43:34 +00:00
}