diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index 1e6f33970..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<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 @@ -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 ?? ""; @@ -1353,27 +1363,24 @@ class _SendViewState extends ConsumerState<SendView> { final trimmed = newValue.trim(); if ((trimmed.length - (_address?.length ?? 0)).abs() > 1) { - if (coin is Monero && Uri.parse(trimmed).scheme == "monero") { - final parsedUri = Uri.parse(trimmed); - final addr = parsedUri.path; - sendToController.text = addr; - _address = addr; - cryptoAmountController.text = parsedUri.queryParameters["tx_amount"] ?? ""; - } else if (coin is Bitcoin && Uri.parse(trimmed).scheme == "bitcoin") { - final parsedUri = Uri.parse(trimmed); - final addr = parsedUri.path; - sendToController.text = addr; - _address = addr; - cryptoAmountController.text = parsedUri.queryParameters["amount"] ?? ""; + final parsed = AddressUtils.parsePaymentUri( + trimmed, + logging: Logging.instance, + ); + if (parsed != null) { + _applyUri(parsed); + } else { + _address = newValue; + sendToController.text = newValue; } } else { - _address = trimmed; + _address = newValue; } _setValidAddressProviders(_address); setState(() { - _addressToggleFlag = trimmed.isNotEmpty; + _addressToggleFlag = newValue.isNotEmpty; }); }, focusNode: _addressFocusNode, @@ -1454,32 +1461,26 @@ class _SendViewState extends ConsumerState<SendView> { } final trimmed = content.trim(); - - if (coin is Monero && Uri.parse(trimmed).scheme == "monero") { - final parsedUri = Uri.parse(trimmed); - final addr = parsedUri.path; - sendToController.text = addr; - _address = addr; - cryptoAmountController.text = parsedUri.queryParameters["tx_amount"] ?? ""; - } else if (coin is Bitcoin && Uri.parse(trimmed).scheme == "bitcoin") { - final parsedUri = Uri.parse(trimmed); - final addr = parsedUri.path; - sendToController.text = addr; - _address = addr; - cryptoAmountController.text = parsedUri.queryParameters["amount"] ?? ""; + final parsed = AddressUtils.parsePaymentUri( + trimmed, + logging: Logging.instance, + ); + if (parsed != null) { + _applyUri(parsed); } else { - sendToController.text = trimmed; - _address = trimmed; + sendToController.text = + content; + _address = content; + + _setValidAddressProviders(_address,); + + setState(() { + _addressToggleFlag = + sendToController + .text + .isNotEmpty; + }); } - - _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<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 ?? ""; @@ -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) { @@ -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) { @@ -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(() {