mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-17 05:41:29 +02:00
CW-997 coin control enhancements / send ALL fixes (#2114)
* computed sending balance value * files that didnt get added before * monero + move unspent calc to view model * working * remove old code * Update lib/view_model/send/send_view_model.dart --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
This commit is contained in:
co-authored by
Omar Hatem
parent
7831b421b1
commit
40a0989956
@@ -244,7 +244,7 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
|
||||
currencyValueValidator: output.sendAll
|
||||
? sendViewModel.allAmountValidator
|
||||
: sendViewModel.amountValidator,
|
||||
allAmountCallback: () async => output.setSendAll(sendViewModel.balance)),
|
||||
allAmountCallback: () async => output.setSendAll(sendViewModel.sendingBalance)),
|
||||
Divider(
|
||||
height: 1,
|
||||
color: Theme.of(context).extension<SendPageTheme>()!.textFieldHintColor),
|
||||
@@ -266,7 +266,7 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
|
||||
),
|
||||
),
|
||||
Text(
|
||||
sendViewModel.balance,
|
||||
sendViewModel.sendingBalance,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
@@ -384,10 +384,16 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
|
||||
padding: EdgeInsets.only(top: 6),
|
||||
child: GestureDetector(
|
||||
key: ValueKey('send_page_unspent_coin_button_key'),
|
||||
onTap: () => Navigator.of(context).pushNamed(
|
||||
Routes.unspentCoinsList,
|
||||
arguments: widget.sendViewModel.coinTypeToSpendFrom,
|
||||
),
|
||||
onTap: () async {
|
||||
await Navigator.of(context).pushNamed(
|
||||
Routes.unspentCoinsList,
|
||||
arguments: widget.sendViewModel.coinTypeToSpendFrom,
|
||||
);
|
||||
if (mounted) {
|
||||
// we just got back from the unspent coins list screen, so we need to recompute the sending balance:
|
||||
sendViewModel.updateSendingBalance();
|
||||
}
|
||||
},
|
||||
child: Container(
|
||||
color: Colors.transparent,
|
||||
child: Row(
|
||||
@@ -505,7 +511,7 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
|
||||
|
||||
reaction((_) => sendViewModel.selectedCryptoCurrency, (Currency currency) {
|
||||
if (output.sendAll) {
|
||||
output.setSendAll(sendViewModel.balance);
|
||||
output.setSendAll(sendViewModel.sendingBalance);
|
||||
}
|
||||
|
||||
output.setCryptoAmount(cryptoAmountController.text);
|
||||
|
||||
@@ -225,6 +225,42 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
||||
return wallet.balance[selectedCryptoCurrency]!.formattedFullAvailableBalance;
|
||||
}
|
||||
|
||||
@action
|
||||
Future<void> updateSendingBalance() async {
|
||||
// force the sendingBalance to recompute since unspent coins aren't observable
|
||||
// or at least mobx can't detect the changes
|
||||
|
||||
final currentType = coinTypeToSpendFrom;
|
||||
|
||||
if (currentType == UnspentCoinType.any) {
|
||||
coinTypeToSpendFrom = UnspentCoinType.nonMweb;
|
||||
} else if (currentType == UnspentCoinType.nonMweb) {
|
||||
coinTypeToSpendFrom = UnspentCoinType.any;
|
||||
} else if (currentType == UnspentCoinType.mweb) {
|
||||
coinTypeToSpendFrom = UnspentCoinType.nonMweb;
|
||||
}
|
||||
|
||||
// set it back to the original value:
|
||||
coinTypeToSpendFrom = currentType;
|
||||
}
|
||||
|
||||
@computed
|
||||
String get sendingBalance {
|
||||
// only for electrum, monero, wownero, decred wallets atm:
|
||||
switch (wallet.type) {
|
||||
case WalletType.bitcoin:
|
||||
case WalletType.litecoin:
|
||||
case WalletType.bitcoinCash:
|
||||
case WalletType.monero:
|
||||
case WalletType.wownero:
|
||||
case WalletType.decred:
|
||||
return wallet.formatCryptoAmount(
|
||||
unspentCoinsListViewModel.getSendingBalance(coinTypeToSpendFrom).toString());
|
||||
default:
|
||||
return balance;
|
||||
}
|
||||
}
|
||||
|
||||
@computed
|
||||
bool get isFiatDisabled => balanceViewModel.isFiatDisabled;
|
||||
|
||||
@@ -502,14 +538,14 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
||||
return bitcoin!.createBitcoinTransactionCredentials(
|
||||
outputs,
|
||||
priority: priority!,
|
||||
feeRate:feesViewModel. customBitcoinFeeRate,
|
||||
feeRate: feesViewModel.customBitcoinFeeRate,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
case WalletType.litecoin:
|
||||
return bitcoin!.createBitcoinTransactionCredentials(
|
||||
outputs,
|
||||
priority: priority!,
|
||||
feeRate:feesViewModel. customBitcoinFeeRate,
|
||||
feeRate: feesViewModel.customBitcoinFeeRate,
|
||||
// if it's an exchange flow then disable sending from mweb coins
|
||||
coinTypeToSpendFrom: provider != null ? UnspentCoinType.nonMweb : coinTypeToSpendFrom,
|
||||
);
|
||||
|
||||
@@ -131,6 +131,36 @@ abstract class UnspentCoinsListViewModelBase with Store {
|
||||
}
|
||||
}
|
||||
|
||||
List<Unspent> _getSpecificUnspents(UnspentCoinType overrideCoinTypeToSpendFrom) {
|
||||
switch (wallet.type) {
|
||||
case WalletType.monero:
|
||||
return monero!.getUnspents(wallet);
|
||||
case WalletType.wownero:
|
||||
return wownero!.getUnspents(wallet);
|
||||
case WalletType.bitcoin:
|
||||
case WalletType.litecoin:
|
||||
case WalletType.bitcoinCash:
|
||||
return bitcoin!.getUnspents(wallet, coinTypeToSpendFrom: overrideCoinTypeToSpendFrom);
|
||||
case WalletType.decred:
|
||||
return decred!.getUnspents(wallet);
|
||||
default:
|
||||
return List.empty();
|
||||
}
|
||||
}
|
||||
|
||||
@action
|
||||
int getSendingBalance(UnspentCoinType overrideCoinTypeToSpendFrom) {
|
||||
// return items.where((element) => element.isSending).fold(0, (previousValue, element) => previousValue + element.value);
|
||||
// go through all unspent coins and add up the value minus frozen and non sending:
|
||||
int total = 0;
|
||||
|
||||
for (final item in _getSpecificUnspents(overrideCoinTypeToSpendFrom)) {
|
||||
if (item.isFrozen || !item.isSending) continue;
|
||||
total += item.value;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
@action
|
||||
void _updateUnspentCoinsInfo() {
|
||||
items.clear();
|
||||
|
||||
Reference in New Issue
Block a user