mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-25 05:58:42 +01:00
* 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
140 lines
4.3 KiB
Dart
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,
|
|
}
|