Files
hash-wallet/lib/view_model/payment/payment_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

140 lines
4.3 KiB
Dart

import 'dart:async';
import 'package:cake_wallet/core/universal_address_detector.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart';
part 'payment_view_model.g.dart';
class PaymentViewModel = PaymentViewModelBase with _$PaymentViewModel;
abstract class PaymentViewModelBase with Store {
PaymentViewModelBase({
required this.appStore,
});
final AppStore appStore;
@observable
WalletType? detectedWalletType;
@observable
bool isProcessing = false;
@computed
WalletType get currentWalletType => appStore.wallet!.type;
/// Main entry point - detect address type and check compatibility
@action
Future<PaymentFlowResult> processAddress(String addressData) async {
try {
detectedWalletType = null;
isProcessing = true;
// Detect address type
final detectionResult = UniversalAddressDetector.detectAddress(addressData);
if (!detectionResult.isValid || detectionResult.detectedWalletType == null) {
return PaymentFlowResult.incompatible('Unable to detect address type');
}
detectedWalletType = detectionResult.detectedWalletType;
// Check if current wallet is compatible
final currentWallet = appStore.wallet;
if (currentWallet != null && currentWallet.type == detectedWalletType) {
return PaymentFlowResult.currentWalletCompatible();
}
final compatibleWallets = await getWalletsByType(detectedWalletType!);
switch (compatibleWallets.length) {
case 0:
return PaymentFlowResult.noWallets(detectedWalletType!, detectionResult);
case 1:
return PaymentFlowResult.singleWallet(compatibleWallets.first, detectionResult);
default:
return PaymentFlowResult.multipleWallets(compatibleWallets, detectionResult);
}
} catch (e) {
printV('PaymentViewModel error: $e');
return PaymentFlowResult.error('Payment processing failed: $e');
} finally {
isProcessing = false;
}
}
Future<List<WalletInfo>> getWalletsByType(WalletType walletType) async {
return (await WalletInfo.getAll()).where((wallet) => wallet.type == walletType).toList();
}
}
class PaymentFlowResult {
final PaymentFlowType type;
final String? message;
final WalletInfo? wallet;
final List<WalletInfo> wallets;
final WalletType? walletType;
final AddressDetectionResult? addressDetectionResult;
PaymentFlowResult._({
required this.type,
this.message,
this.wallet,
this.wallets = const [],
this.walletType,
this.addressDetectionResult,
});
/// Current wallet is compatible
factory PaymentFlowResult.currentWalletCompatible() =>
PaymentFlowResult._(type: PaymentFlowType.currentWalletCompatible);
/// Single compatible wallet available
factory PaymentFlowResult.singleWallet(
WalletInfo wallet, AddressDetectionResult addressDetectionResult) =>
PaymentFlowResult._(
type: PaymentFlowType.singleWallet,
wallet: wallet,
walletType: wallet.type,
addressDetectionResult: addressDetectionResult);
/// Multiple compatible wallets available
factory PaymentFlowResult.multipleWallets(
List<WalletInfo> wallets, AddressDetectionResult addressDetectionResult) =>
PaymentFlowResult._(
type: PaymentFlowType.multipleWallets,
wallets: wallets,
walletType: wallets.first.type,
addressDetectionResult: addressDetectionResult);
/// No compatible wallets available
factory PaymentFlowResult.noWallets(
WalletType walletType, AddressDetectionResult addressDetectionResult) =>
PaymentFlowResult._(
type: PaymentFlowType.noWallets,
walletType: walletType,
addressDetectionResult: addressDetectionResult);
/// Error occurred
factory PaymentFlowResult.error(String message) =>
PaymentFlowResult._(type: PaymentFlowType.error, message: message);
/// Incompatible address
factory PaymentFlowResult.incompatible(String message) =>
PaymentFlowResult._(type: PaymentFlowType.incompatible, message: message);
}
enum PaymentFlowType {
currentWalletCompatible,
singleWallet,
multipleWallets,
noWallets,
error,
incompatible,
}