mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-03-22 07:08:49 +00:00
feat: delete silent addresses
This commit is contained in:
parent
ddbb63ae46
commit
fa5effd0cc
5 changed files with 89 additions and 28 deletions
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue