Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 76 additions & 41 deletions lib/pages/send_view/send_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,44 @@ class _SendViewState extends ConsumerState<SendView> {

Set<UTXO> selectedUTXOs = {};

void _applyUri(PaymentUriData paymentData) {
try {
// auto fill address
_address = paymentData.address.trim();
sendToController.text = _address!;

// autofill notes field
if (paymentData.message != null) {
noteController.text = paymentData.message!;
} else if (paymentData.label != null) {
noteController.text = paymentData.label!;
}

// autofill amount field
if (paymentData.amount != null) {
final Amount amount = Decimal.parse(paymentData.amount!).toAmount(
fractionDigits: coin.fractionDigits,
);
cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format(
amount,
withUnitName: false,
);
ref.read(pSendAmount.notifier).state = amount;
}

_setValidAddressProviders(_address);
setState(() {
_addressToggleFlag = sendToController.text.isNotEmpty;
});
} catch (e, s) {
Logging.instance.e(
"Failed to apply uri in SendView: ",
error: e,
stackTrace: s,
);
}
}

Future<void> _scanQr() async {
try {
// ref
Expand Down Expand Up @@ -167,35 +205,7 @@ class _SendViewState extends ConsumerState<SendView> {

if (paymentData != null &&
paymentData.coin?.uriScheme == coin.uriScheme) {
// auto fill address
_address = paymentData.address.trim();
sendToController.text = _address!;

// autofill notes field
if (paymentData.message != null) {
noteController.text = paymentData.message!;
} else if (paymentData.label != null) {
noteController.text = paymentData.label!;
}

// autofill amount field
if (paymentData.amount != null) {
final Amount amount = Decimal.parse(paymentData.amount!).toAmount(
fractionDigits: coin.fractionDigits,
);
cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format(
amount,
withUnitName: false,
);
ref.read(pSendAmount.notifier).state = amount;
}

_setValidAddressProviders(_address);
setState(() {
_addressToggleFlag = sendToController.text.isNotEmpty;
});

// now check for non standard encoded basic address
_applyUri(paymentData);
} else {
_address = qrResult.rawContent.split("\n").first.trim();
sendToController.text = _address ?? "";
Expand Down Expand Up @@ -1350,7 +1360,23 @@ class _SendViewState extends ConsumerState<SendView> {
selectAll: false,
),
onChanged: (newValue) {
_address = newValue.trim();
final trimmed = newValue.trim();

if ((trimmed.length - (_address?.length ?? 0)).abs() > 1) {
final parsed = AddressUtils.parsePaymentUri(
trimmed,
logging: Logging.instance,
);
if (parsed != null) {
_applyUri(parsed);
} else {
_address = newValue;
sendToController.text = newValue;
}
} else {
_address = newValue;
}

_setValidAddressProviders(_address);

setState(() {
Expand Down Expand Up @@ -1433,19 +1459,28 @@ class _SendViewState extends ConsumerState<SendView> {
content,
);
}
sendToController.text =
content.trim();
_address = content.trim();

_setValidAddressProviders(
_address,
final trimmed = content.trim();
final parsed = AddressUtils.parsePaymentUri(
trimmed,
logging: Logging.instance,
);
setState(() {
_addressToggleFlag =
sendToController
.text
.isNotEmpty;
});
if (parsed != null) {
_applyUri(parsed);
} else {
sendToController.text =
content;
_address = content;

_setValidAddressProviders(_address,);

setState(() {
_addressToggleFlag =
sendToController
.text
.isNotEmpty;
});
}
}
},
child: sendToController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -660,33 +660,7 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {

if (paymentData != null &&
paymentData.coin?.uriScheme == coin.uriScheme) {
// Auto fill address.
_address = paymentData.address.trim();
sendToController.text = _address!;

// Amount.
if (paymentData.amount != null) {
final Amount amount = Decimal.parse(paymentData.amount!).toAmount(
fractionDigits: coin.fractionDigits,
);
cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format(
amount,
withUnitName: false,
);
ref.read(pSendAmount.notifier).state = amount;
}

// Note/message.
if (paymentData.message != null) {
_note = paymentData.message;
} else if (paymentData.label != null) {
_note = paymentData.label;
}

_setValidAddressProviders(_address);
setState(() {
_addressToggleFlag = sendToController.text.isNotEmpty;
});
_applyUri(paymentData);
} else {
_address = qrCodeData.split("\n").first.trim();
sendToController.text = _address ?? "";
Expand Down Expand Up @@ -736,6 +710,40 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
}
}

void _applyUri(PaymentUriData paymentData) {
try {
// auto fill address
_address = paymentData.address;
sendToController.text = _address!;

// autofill notes field.
if (paymentData.message != null) {
_note = paymentData.message;
} else if (paymentData.label != null) {
_note = paymentData.label;
}

// autofill amount field
if (paymentData.amount != null) {
final amount = Decimal.parse(paymentData.amount!).toAmount(
fractionDigits: coin.fractionDigits,
);
cryptoAmountController.text = ref
.read(pAmountFormatter(coin))
.format(amount, withUnitName: false);
ref.read(pSendAmount.notifier).state = amount;
}

// Trigger validation after pasting.
_setValidAddressProviders(_address);
setState(() {
_addressToggleFlag = sendToController.text.isNotEmpty;
});
} catch (e, s) {
Logging.instance.e("Error applying URI", error: e, stackTrace: s);
}
}

Future<void> pasteAddress() async {
final ClipboardData? data = await clipboard.getData(Clipboard.kTextPlain);
if (data?.text != null && data!.text!.isNotEmpty) {
Expand All @@ -751,33 +759,7 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
);
if (paymentData != null &&
paymentData.coin?.uriScheme == coin.uriScheme) {
// auto fill address
_address = paymentData.address;
sendToController.text = _address!;

// autofill notes field.
if (paymentData.message != null) {
_note = paymentData.message;
} else if (paymentData.label != null) {
_note = paymentData.label;
}

// autofill amoutn field
if (paymentData.amount != null) {
final amount = Decimal.parse(paymentData.amount!).toAmount(
fractionDigits: coin.fractionDigits,
);
cryptoAmountController.text = ref
.read(pAmountFormatter(coin))
.format(amount, withUnitName: false);
ref.read(pSendAmount.notifier).state = amount;
}

// Trigger validation after pasting.
_setValidAddressProviders(_address);
setState(() {
_addressToggleFlag = sendToController.text.isNotEmpty;
});
_applyUri(paymentData);
} else {
content = content.split("\n").first.trim();
if (coin is Epiccash) {
Expand Down Expand Up @@ -1439,7 +1421,20 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
selectAll: false,
),
onChanged: (newValue) {
_address = newValue;
final trimmed = newValue;

if ((trimmed.length - (_address?.length ?? 0)).abs() > 1) {
final parsed = AddressUtils.parsePaymentUri(trimmed, logging: Logging.instance);
if (parsed != null) {
_applyUri(parsed);
} else {
_address = newValue;
sendToController.text = newValue;
}
} else {
_address = newValue;
}

_setValidAddressProviders(_address);

setState(() {
Expand Down
Loading