cake_wallet/lib/view_model/dashboard/balance_view_model.dart

316 lines
8.2 KiB
Dart
Raw Normal View History

import 'package:cake_wallet/entities/fiat_api_mode.dart';
2021-12-24 12:37:24 +00:00
import 'package:cw_core/transaction_history.dart';
import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/balance.dart';
import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/transaction_info.dart';
import 'package:cw_core/wallet_type.dart';
2021-01-11 17:15:27 +00:00
import 'package:cake_wallet/generated/i18n.dart';
2020-09-21 11:50:26 +00:00
import 'package:cake_wallet/entities/balance_display_mode.dart';
import 'package:cake_wallet/entities/calculate_fiat_amount.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/store/settings_store.dart';
2020-09-21 11:50:26 +00:00
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
import 'package:mobx/mobx.dart';
part 'balance_view_model.g.dart';
2022-03-30 15:57:04 +00:00
class BalanceRecord {
2022-10-12 17:09:57 +00:00
const BalanceRecord({
required this.availableBalance,
required this.additionalBalance,
required this.fiatAvailableBalance,
required this.fiatAdditionalBalance,
required this.asset,
required this.formattedAssetTitle});
2022-03-30 15:57:04 +00:00
final String fiatAdditionalBalance;
final String fiatAvailableBalance;
final String additionalBalance;
final String availableBalance;
final CryptoCurrency asset;
final String formattedAssetTitle;
}
class BalanceViewModel = BalanceViewModelBase with _$BalanceViewModel;
abstract class BalanceViewModelBase with Store {
BalanceViewModelBase(
2022-10-12 17:09:57 +00:00
{required this.appStore,
required this.settingsStore,
required this.fiatConvertationStore})
: isReversing = false,
isShowCard = appStore.wallet!.walletInfo.isShowIntroCakePayCard,
wallet = appStore.wallet! {
reaction((_) => appStore.wallet, _onWalletChange);
}
final AppStore appStore;
final SettingsStore settingsStore;
2020-09-21 11:50:26 +00:00
final FiatConversionStore fiatConvertationStore;
2021-01-11 17:15:27 +00:00
bool get canReverse => false;
@observable
bool isReversing;
@observable
WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo>
wallet;
@computed
2022-10-12 17:09:57 +00:00
double get price {
final price = fiatConvertationStore.prices[appStore.wallet!.currency];
if (price == null) {
throw Exception('No price for ${appStore.wallet!.currency} (current wallet)');
}
return price;
}
@computed
BalanceDisplayMode get savedDisplayMode => settingsStore.balanceDisplayMode;
2022-11-04 11:58:04 +00:00
@computed
bool get isFiatDisabled => settingsStore.fiatApiMode == FiatApiMode.disabled;
2022-11-04 11:58:04 +00:00
2022-03-30 15:57:04 +00:00
@computed
String get asset {
2022-10-12 17:09:57 +00:00
final typeFormatted = walletTypeToString(appStore.wallet!.type);
2022-03-30 15:57:04 +00:00
switch(wallet.type) {
case WalletType.haven:
return '$typeFormatted Assets';
default:
2022-03-30 15:57:04 +00:00
return typeFormatted;
}
}
@computed
2022-03-30 15:57:04 +00:00
BalanceDisplayMode get displayMode {
if (isReversing) {
if (savedDisplayMode == BalanceDisplayMode.hiddenBalance) {
return BalanceDisplayMode.displayableBalance;
} else {
return BalanceDisplayMode.hiddenBalance;
}
}
return savedDisplayMode;
}
@computed
2021-01-11 17:15:27 +00:00
String get availableBalanceLabel {
2022-03-30 15:57:04 +00:00
switch(wallet.type) {
case WalletType.monero:
case WalletType.haven:
return S.current.xmr_available_balance;
default:
return S.current.confirmed;
}
2021-01-11 17:15:27 +00:00
}
@computed
String get additionalBalanceLabel {
2022-03-30 15:57:04 +00:00
switch(wallet.type) {
case WalletType.monero:
case WalletType.haven:
return S.current.xmr_full_balance;
default:
return S.current.unconfirmed;
}
}
2022-03-30 15:57:04 +00:00
@computed
2022-10-12 17:09:57 +00:00
bool get hasMultiBalance => appStore.wallet!.type == WalletType.haven;
2022-03-30 15:57:04 +00:00
@computed
2021-01-11 17:15:27 +00:00
String get availableBalance {
final walletBalance = _walletBalance;
if (displayMode == BalanceDisplayMode.hiddenBalance) {
2021-01-11 17:15:27 +00:00
return '---';
}
2021-01-11 17:15:27 +00:00
return walletBalance.formattedAvailableBalance;
}
2021-01-11 17:15:27 +00:00
@computed
String get additionalBalance {
final walletBalance = _walletBalance;
if (displayMode == BalanceDisplayMode.hiddenBalance) {
2021-01-11 17:15:27 +00:00
return '---';
}
2021-01-11 17:15:27 +00:00
return walletBalance.formattedAdditionalBalance;
}
@computed
2021-01-11 17:15:27 +00:00
String get availableFiatBalance {
final walletBalance = _walletBalance;
final fiatCurrency = settingsStore.fiatCurrency;
if (displayMode == BalanceDisplayMode.hiddenBalance) {
2021-01-11 17:15:27 +00:00
return '---';
}
return _getFiatBalance(
2021-01-11 17:15:27 +00:00
price: price,
cryptoAmount: walletBalance.formattedAvailableBalance) + ' ' + fiatCurrency.toString();
2021-01-11 17:15:27 +00:00
}
@computed
String get additionalFiatBalance {
final walletBalance = _walletBalance;
final fiatCurrency = settingsStore.fiatCurrency;
if (displayMode == BalanceDisplayMode.hiddenBalance) {
2021-01-11 17:15:27 +00:00
return '---';
}
return _getFiatBalance(
2021-01-11 17:15:27 +00:00
price: price,
cryptoAmount: walletBalance.formattedAdditionalBalance) + ' ' + fiatCurrency.toString();
}
2021-01-11 17:15:27 +00:00
@computed
2022-03-30 15:57:04 +00:00
Map<CryptoCurrency, BalanceRecord> get balances {
return wallet.balance.map((key, value) {
if (displayMode == BalanceDisplayMode.hiddenBalance) {
return MapEntry(key, BalanceRecord(
availableBalance: '---',
additionalBalance: '---',
fiatAdditionalBalance: isFiatDisabled ? '' : '---',
fiatAvailableBalance: isFiatDisabled ? '' : '---',
2022-03-30 15:57:04 +00:00
asset: key,
formattedAssetTitle: _formatterAsset(key)));
}
final fiatCurrency = settingsStore.fiatCurrency;
2022-10-12 17:09:57 +00:00
final price = fiatConvertationStore.prices[key] ?? 0;
// if (price == null) {
// throw Exception('Price is null for: $key');
// }
final additionalFiatBalance = isFiatDisabled ? '' : (fiatCurrency.toString()
2022-11-04 11:58:04 +00:00
+ ' '
2022-03-30 15:57:04 +00:00
+ _getFiatBalance(
2022-10-12 17:09:57 +00:00
price: price,
2022-11-04 11:58:04 +00:00
cryptoAmount: value.formattedAdditionalBalance));
2022-03-30 15:57:04 +00:00
final availableFiatBalance = isFiatDisabled ? '' : (fiatCurrency.toString()
2022-11-04 11:58:04 +00:00
+ ' '
2022-03-30 15:57:04 +00:00
+ _getFiatBalance(
2022-10-12 17:09:57 +00:00
price: price,
2022-11-04 11:58:04 +00:00
cryptoAmount: value.formattedAvailableBalance));
2022-03-30 15:57:04 +00:00
return MapEntry(key, BalanceRecord(
availableBalance: value.formattedAvailableBalance,
additionalBalance: value.formattedAdditionalBalance,
fiatAdditionalBalance: additionalFiatBalance,
fiatAvailableBalance: availableFiatBalance,
asset: key,
formattedAssetTitle: _formatterAsset(key)));
});
}
@computed
List<BalanceRecord> get formattedBalances {
final balance = balances.values.toList();
balance.sort((BalanceRecord a, BalanceRecord b) {
if (b.asset == CryptoCurrency.xhv) {
return 1;
}
if (b.asset == CryptoCurrency.xusd) {
if (a.asset == CryptoCurrency.xhv) {
return -1;
}
return 1;
}
if (b.asset == CryptoCurrency.xbtc) {
return 1;
}
if (b.asset == CryptoCurrency.xeur) {
return 1;
}
return 0;
});
return balance;
}
@computed
2022-10-12 17:09:57 +00:00
Balance get _walletBalance {
final balance = wallet.balance[wallet.currency];
if (balance == null) {
throw Exception('No balance for ${wallet.currency}');
}
return balance;
}
2021-01-11 17:15:27 +00:00
2020-09-26 12:19:33 +00:00
@computed
2022-10-12 17:09:57 +00:00
CryptoCurrency get currency => appStore.wallet!.currency;
2020-09-26 12:19:33 +00:00
@observable
bool isShowCard;
2022-10-12 17:09:57 +00:00
ReactionDisposer? _onCurrentWalletChangeReaction;
2021-01-05 19:49:14 +00:00
@action
void _onWalletChange(
WalletBase<Balance, TransactionHistoryBase<TransactionInfo>,
2022-10-12 17:09:57 +00:00
TransactionInfo>?
wallet) {
2022-10-12 17:09:57 +00:00
if (wallet == null) {
return;
}
this.wallet = wallet;
_onCurrentWalletChangeReaction?.reaction.dispose();
isShowCard = wallet.walletInfo.isShowIntroCakePayCard;
}
@action
Future<void> disableIntroCakePayCard () async {
const cardDisplayStatus = false;
wallet.walletInfo.showIntroCakePayCard = cardDisplayStatus;
await wallet.walletInfo.save();
isShowCard = cardDisplayStatus;
2021-01-05 19:49:14 +00:00
}
2022-10-12 17:09:57 +00:00
String _getFiatBalance({required double price, String? cryptoAmount}) {
if (cryptoAmount == null) {
return '0.00';
}
return calculateFiatAmount(price: price, cryptoAmount: cryptoAmount);
}
2022-03-30 15:57:04 +00:00
String _formatterAsset(CryptoCurrency asset) {
switch (wallet.type) {
case WalletType.haven:
final assetStringified = asset.toString();
if (asset != CryptoCurrency.xhv && assetStringified[0].toUpperCase() == 'X') {
return assetStringified.replaceFirst('X', 'x');
}
return asset.toString();
default:
return asset.toString();
}
}
2021-01-05 19:49:14 +00:00
}