cake_wallet/lib/view_model/dashboard/home_settings_view_model.dart

111 lines
3.4 KiB
Dart
Raw Normal View History

import 'package:cake_wallet/core/fiat_conversion_service.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart';
2023-06-21 00:46:58 +00:00
import 'package:cake_wallet/entities/sort_balance_types.dart';
2023-06-22 21:17:54 +00:00
import 'package:cake_wallet/ethereum/ethereum.dart';
2023-06-21 00:46:58 +00:00
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart';
import 'package:cw_core/crypto_currency.dart';
2023-06-22 21:17:54 +00:00
import 'package:cw_core/erc20_token.dart';
2023-06-21 00:46:58 +00:00
import 'package:mobx/mobx.dart';
part 'home_settings_view_model.g.dart';
class HomeSettingsViewModel = HomeSettingsViewModelBase with _$HomeSettingsViewModel;
abstract class HomeSettingsViewModelBase with Store {
HomeSettingsViewModelBase(this._settingsStore, this._balanceViewModel)
: tokens = ObservableSet<Erc20Token>() {
_updateTokensList();
}
2023-06-21 00:46:58 +00:00
final SettingsStore _settingsStore;
final BalanceViewModel _balanceViewModel;
final ObservableSet<Erc20Token> tokens;
2023-07-03 17:18:24 +00:00
@observable
String searchText = '';
2023-06-23 01:47:24 +00:00
2023-06-21 00:46:58 +00:00
@computed
SortBalanceBy get sortBalanceBy => _settingsStore.sortBalanceBy;
@action
2023-07-04 01:41:37 +00:00
void setSortBalanceBy(SortBalanceBy value) {
_settingsStore.sortBalanceBy = value;
_updateTokensList();
}
2023-06-21 00:46:58 +00:00
2023-06-22 21:17:54 +00:00
@computed
bool get pinNativeToken => _settingsStore.pinNativeTokenAtTop;
@action
void setPinNativeToken(bool value) => _settingsStore.pinNativeTokenAtTop = value;
2023-06-21 00:46:58 +00:00
2023-06-23 01:47:24 +00:00
Future<void> addErc20Token(Erc20Token token) async {
await ethereum!.addErc20Token(_balanceViewModel.wallet, token);
2023-07-04 01:41:37 +00:00
_updateTokensList();
_updateFiatPrices(token);
2023-06-23 01:47:24 +00:00
}
Future<void> deleteErc20Token(Erc20Token token) async {
await ethereum!.deleteErc20Token(_balanceViewModel.wallet, token);
2023-07-04 01:41:37 +00:00
_updateTokensList();
2023-06-23 01:47:24 +00:00
}
2023-06-22 21:17:54 +00:00
Future<Erc20Token?> getErc20Token(String contractAddress) async =>
await ethereum!.getErc20Token(_balanceViewModel.wallet, contractAddress);
CryptoCurrency get nativeToken => _balanceViewModel.wallet.currency;
void _updateFiatPrices(Erc20Token token) async {
try {
_balanceViewModel.fiatConvertationStore.prices[token] =
await FiatConversionService.fetchPrice(
crypto: token,
fiat: _settingsStore.fiatCurrency,
torOnly: _settingsStore.fiatApiMode == FiatApiMode.torOnly);
} catch (_) {}
}
void changeTokenAvailability(Erc20Token token, bool value) async {
token.enabled = value;
ethereum!.addErc20Token(_balanceViewModel.wallet, token);
_refreshTokensList();
}
@action
void _updateTokensList() {
2023-07-04 01:41:37 +00:00
int _sortFunc(e1, e2) {
int index1 = _balanceViewModel.formattedBalances.indexWhere((element) => element.asset == e1);
int index2 = _balanceViewModel.formattedBalances.indexWhere((element) => element.asset == e2);
return index1.compareTo(index2);
}
2023-07-04 01:41:37 +00:00
tokens.clear();
tokens.addAll(ethereum!
.getERC20Currencies(_balanceViewModel.wallet)
2023-07-04 01:41:37 +00:00
.where((element) => _matchesSearchText(element))
.toList()
..sort(_sortFunc));
}
2023-07-03 17:18:24 +00:00
@action
void _refreshTokensList() {
final _tokens = Set.of(tokens);
tokens.clear();
tokens.addAll(_tokens);
2023-07-03 17:18:24 +00:00
}
@action
void changeSearchText(String text) => searchText = text;
bool _matchesSearchText(Erc20Token asset) {
return searchText.isEmpty ||
asset.fullName!.toLowerCase().contains(searchText.toLowerCase()) ||
asset.title.toLowerCase().contains(searchText.toLowerCase()) ||
asset.contractAddress == searchText;
}
2023-06-21 00:46:58 +00:00
}