feat: delete silent addresses

This commit is contained in:
Rafael Saes 2024-04-09 19:27:26 -03:00
parent ddbb63ae46
commit fa5effd0cc
5 changed files with 89 additions and 28 deletions

View file

@ -386,12 +386,31 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
@action @action
void updateAddress(String address, String label) { void updateAddress(String address, String label) {
final addressRecord = BaseBitcoinAddressRecord? foundAddress;
_addresses.firstWhere((addressRecord) => addressRecord.address == address); _addresses.forEach((addressRecord) {
addressRecord.setNewName(label); if (addressRecord.address == address) {
final index = _addresses.indexOf(addressRecord); foundAddress = addressRecord;
_addresses.remove(addressRecord); }
_addresses.insert(index, addressRecord); });
silentAddresses.forEach((addressRecord) {
if (addressRecord.address == address) {
foundAddress = addressRecord;
}
});
if (foundAddress != null) {
foundAddress!.setNewName(label);
if (foundAddress is BitcoinAddressRecord) {
final index = _addresses.indexOf(foundAddress);
_addresses.remove(foundAddress);
_addresses.insert(index, foundAddress as BitcoinAddressRecord);
} else {
final index = silentAddresses.indexOf(foundAddress as BitcoinSilentPaymentAddressRecord);
silentAddresses.remove(foundAddress);
silentAddresses.insert(index, foundAddress as BitcoinSilentPaymentAddressRecord);
}
}
} }
@action @action
@ -537,4 +556,13 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
bool _isAddressByType(BitcoinAddressRecord addr, BitcoinAddressType type) => addr.type == type; bool _isAddressByType(BitcoinAddressRecord addr, BitcoinAddressType type) => addr.type == type;
bool _isUnusedReceiveAddressByType(BitcoinAddressRecord addr, BitcoinAddressType type) => bool _isUnusedReceiveAddressByType(BitcoinAddressRecord addr, BitcoinAddressType type) =>
!addr.isHidden && !addr.isUsed && addr.type == type; !addr.isHidden && !addr.isUsed && addr.type == type;
@action
void deleteSilentPaymentAddress(String address) {
final addressRecord = silentAddresses.firstWhere((addressRecord) =>
addressRecord.type == SilentPaymentsAddresType.p2sp && addressRecord.address == address);
silentAddresses.remove(addressRecord);
updateAddressesByMatch();
}
} }

View file

@ -365,4 +365,9 @@ class CWBitcoin extends Bitcoin {
return node?.uri.host == '198.58.111.154' && node?.uri.port == 50002; return node?.uri.host == '198.58.111.154' && node?.uri.port == 50002;
} }
void deleteSilentPaymentAddress(Object wallet, String address) {
final bitcoinWallet = wallet as ElectrumWallet;
bitcoinWallet.walletAddresses.deleteSilentPaymentAddress(address);
}
} }

View file

@ -206,18 +206,23 @@ class ReceivePage extends BasePage {
.extension<ReceivePageTheme>()! .extension<ReceivePageTheme>()!
.tilesTextColor; .tilesTextColor;
return AddressCell.fromItem(item, return AddressCell.fromItem(
isCurrent: isCurrent, item,
hasBalance: addressListViewModel.isElectrumWallet, isCurrent: isCurrent,
backgroundColor: backgroundColor, hasBalance: addressListViewModel.isElectrumWallet,
textColor: textColor, backgroundColor: backgroundColor,
onTap: item.isOneTimeReceiveAddress == true textColor: textColor,
? null onTap: item.isOneTimeReceiveAddress == true
: (_) => addressListViewModel.setAddress(item), ? null
onEdit: item.isOneTimeReceiveAddress == true : (_) => addressListViewModel.setAddress(item),
? null onEdit: item.isOneTimeReceiveAddress == true || item.isPrimary
: () => Navigator.of(context) ? null
.pushNamed(Routes.newSubaddress, arguments: item)); : () => Navigator.of(context)
.pushNamed(Routes.newSubaddress, arguments: item),
onDelete: !addressListViewModel.isSilentPayments || item.isPrimary
? null
: () => addressListViewModel.deleteAddress(item),
);
}); });
} }

View file

@ -14,18 +14,22 @@ class AddressCell extends StatelessWidget {
required this.textColor, required this.textColor,
this.onTap, this.onTap,
this.onEdit, this.onEdit,
this.onDelete,
this.txCount, this.txCount,
this.balance, this.balance,
this.isChange = false, this.isChange = false,
this.hasBalance = false}); this.hasBalance = false});
factory AddressCell.fromItem(WalletAddressListItem item, factory AddressCell.fromItem(
{required bool isCurrent, WalletAddressListItem item, {
required Color backgroundColor, required bool isCurrent,
required Color textColor, required Color backgroundColor,
Function(String)? onTap, required Color textColor,
bool hasBalance = false, Function(String)? onTap,
Function()? onEdit}) => bool hasBalance = false,
Function()? onEdit,
Function()? onDelete,
}) =>
AddressCell( AddressCell(
address: item.address, address: item.address,
name: item.name ?? '', name: item.name ?? '',
@ -35,6 +39,7 @@ class AddressCell extends StatelessWidget {
textColor: textColor, textColor: textColor,
onTap: onTap, onTap: onTap,
onEdit: onEdit, onEdit: onEdit,
onDelete: onDelete,
txCount: item.txCount, txCount: item.txCount,
balance: item.balance, balance: item.balance,
isChange: item.isChange, isChange: item.isChange,
@ -48,6 +53,7 @@ class AddressCell extends StatelessWidget {
final Color textColor; final Color textColor;
final Function(String)? onTap; final Function(String)? onTap;
final Function()? onEdit; final Function()? onEdit;
final Function()? onDelete;
final int? txCount; final int? txCount;
final String? balance; final String? balance;
final bool isChange; final bool isChange;
@ -63,7 +69,8 @@ class AddressCell extends StatelessWidget {
} else { } else {
return formatIfCashAddr.substring(0, addressPreviewLength) + return formatIfCashAddr.substring(0, addressPreviewLength) +
'...' + '...' +
formatIfCashAddr.substring(formatIfCashAddr.length - addressPreviewLength, formatIfCashAddr.length); formatIfCashAddr.substring(
formatIfCashAddr.length - addressPreviewLength, formatIfCashAddr.length);
} }
} }
@ -175,7 +182,7 @@ class AddressCell extends StatelessWidget {
ActionPane _actionPane(BuildContext context) => ActionPane( ActionPane _actionPane(BuildContext context) => ActionPane(
motion: const ScrollMotion(), motion: const ScrollMotion(),
extentRatio: 0.3, extentRatio: onDelete != null ? 0.4 : 0.3,
children: [ children: [
SlidableAction( SlidableAction(
onPressed: (_) => onEdit?.call(), onPressed: (_) => onEdit?.call(),
@ -184,6 +191,14 @@ class AddressCell extends StatelessWidget {
icon: Icons.edit, icon: Icons.edit,
label: S.of(context).edit, label: S.of(context).edit,
), ),
if (onDelete != null)
SlidableAction(
onPressed: (_) => onDelete!.call(),
backgroundColor: Colors.red,
foregroundColor: Colors.white,
icon: Icons.delete,
label: S.of(context).delete,
),
], ],
); );
} }

View file

@ -320,7 +320,8 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
if (isElectrumWallet) { if (isElectrumWallet) {
if (bitcoin!.hasSelectedSilentPayments(wallet)) { if (bitcoin!.hasSelectedSilentPayments(wallet)) {
final addressItems = bitcoin!.getSilentPaymentAddresses(wallet).map((address) { final addressItems = bitcoin!.getSilentPaymentAddresses(wallet).map((address) {
final isPrimary = address.index == 0; // Silent Payments index 0 is change per BIP
final isPrimary = address.index == 1;
return WalletAddressListItem( return WalletAddressListItem(
id: address.index, id: address.index,
@ -497,4 +498,11 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
amount = ''; amount = '';
} }
} }
@action
void deleteAddress(ListItem item) {
if (wallet.type == WalletType.bitcoin && item is WalletAddressListItem) {
bitcoin!.deleteSilentPaymentAddress(wallet, item.address);
}
}
} }