diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index 7d063ba6f..4bdcef6e2 100644 --- a/lib/pages/send_view/send_view.dart +++ b/lib/pages/send_view/send_view.dart @@ -135,6 +135,44 @@ class _SendViewState extends ConsumerState { Set 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 _scanQr() async { try { // ref @@ -167,35 +205,7 @@ class _SendViewState extends ConsumerState { 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 ?? ""; @@ -1350,7 +1360,23 @@ class _SendViewState extends ConsumerState { 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(() { @@ -1433,19 +1459,28 @@ class _SendViewState extends ConsumerState { 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 diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart index 0c8b9034c..009893e7e 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart @@ -660,33 +660,7 @@ class _DesktopSendState extends ConsumerState { 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 ?? ""; @@ -736,6 +710,40 @@ class _DesktopSendState extends ConsumerState { } } + 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 pasteAddress() async { final ClipboardData? data = await clipboard.getData(Clipboard.kTextPlain); if (data?.text != null && data!.text!.isNotEmpty) { @@ -751,33 +759,7 @@ class _DesktopSendState extends ConsumerState { ); 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) { @@ -1439,7 +1421,20 @@ class _DesktopSendState extends ConsumerState { 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(() {