From 19cae77e2b8755e8d10a5a05bdce01db1e4157eb Mon Sep 17 00:00:00 2001 From: sneurlax <sneurlax@gmail.com> Date: Tue, 27 Aug 2024 16:55:19 -0500 Subject: [PATCH] use AddressUtils where appropriate instead of duplicating logic --- lib/pages/send_view/send_view.dart | 44 ++++-------- .../wallet_view/sub_widgets/desktop_send.dart | 71 +++++++++++-------- lib/utilities/address_utils.dart | 20 ++++++ 3 files changed, 74 insertions(+), 61 deletions(-) diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index 0eb6f8881..004b02af1 100644 --- a/lib/pages/send_view/send_view.dart +++ b/lib/pages/send_view/send_view.dart @@ -163,25 +163,23 @@ class _SendViewState extends ConsumerState<SendView> { level: LogLevel.Info, ); - final results = AddressUtils.parseUri(qrResult.rawContent); + final paymentData = AddressUtils.parsePaymentUri(qrResult.rawContent); - Logging.instance.log("qrResult parsed: $results", level: LogLevel.Info); - - if (results.isNotEmpty && results["scheme"] == coin.uriScheme) { + if (paymentData.coin.uriScheme == coin.uriScheme) { // auto fill address - _address = (results["address"] ?? "").trim(); + _address = paymentData.address.trim(); sendToController.text = _address!; // autofill notes field - if (results["message"] != null) { - noteController.text = results["message"]!; - } else if (results["label"] != null) { - noteController.text = results["label"]!; + if (paymentData.message != null) { + noteController.text = paymentData.message!; + } else if (paymentData.label != null) { + noteController.text = paymentData.label!; } // autofill amount field - if (results["amount"] != null) { - final Amount amount = Decimal.parse(results["amount"]!).toAmount( + if (paymentData.amount != null) { + final Amount amount = Decimal.parse(paymentData.amount!).toAmount( fractionDigits: coin.fractionDigits, ); cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format( @@ -1071,7 +1069,7 @@ class _SendViewState extends ConsumerState<SendView> { _address = _address!.substring(0, _address!.indexOf("\n")); } - sendToController.text = formatAddress(_address!); + sendToController.text = AddressUtils().formatAddress(_address!); } }); } @@ -1402,7 +1400,8 @@ class _SendViewState extends ConsumerState<SendView> { if (coin is Epiccash) { // strip http:// and https:// if content contains @ - content = formatAddress( + content = AddressUtils() + .formatAddress( content, ); } @@ -2421,22 +2420,3 @@ class _SendViewState extends ConsumerState<SendView> { ); } } - -String formatAddress(String epicAddress) { - // strip http:// or https:// prefixes if the address contains an @ symbol (and is thus an epicbox address) - if ((epicAddress.startsWith("http://") || - epicAddress.startsWith("https://")) && - epicAddress.contains("@")) { - epicAddress = epicAddress.replaceAll("http://", ""); - epicAddress = epicAddress.replaceAll("https://", ""); - } - // strip mailto: prefix - if (epicAddress.startsWith("mailto:")) { - epicAddress = epicAddress.replaceAll("mailto:", ""); - } - // strip / suffix if the address contains an @ symbol (and is thus an epicbox address) - if (epicAddress.endsWith("/") && epicAddress.contains("@")) { - epicAddress = epicAddress.substring(0, epicAddress.length - 1); - } - return epicAddress; -} 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 c9c887fee..8d87eb35e 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 @@ -743,13 +743,15 @@ class _DesktopSendState extends ConsumerState<DesktopSend> { void _processQrCodeData(String qrCodeData) { try { - var results = AddressUtils.parseUri(qrCodeData); - if (results.isNotEmpty && results["scheme"] == coin.uriScheme) { - _address = (results["address"] ?? "").trim(); + final paymentData = AddressUtils.parsePaymentUri(qrCodeData); + if (paymentData.coin.uriScheme == coin.uriScheme) { + // Auto fill address. + _address = paymentData.address.trim(); sendToController.text = _address!; - if (results["amount"] != null) { - final Amount amount = Decimal.parse(results["amount"]!).toAmount( + // Amount. + if (paymentData.amount != null) { + final Amount amount = Decimal.parse(paymentData.amount!).toAmount( fractionDigits: coin.fractionDigits, ); cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format( @@ -759,6 +761,13 @@ class _DesktopSendState extends ConsumerState<DesktopSend> { 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; @@ -809,30 +818,23 @@ class _DesktopSendState extends ConsumerState<DesktopSend> { content = content.substring(0, content.indexOf("\n")); } - // Check if the pasted value is a URI: - final results = AddressUtils.parseUri(content); - if (results.isNotEmpty) { - if (results["scheme"] == coin.uriScheme) { + try { + final paymentData = AddressUtils.parsePaymentUri(content); + if (paymentData.coin.uriScheme == coin.uriScheme) { // auto fill address - _address = results["address"] ?? ""; - if (coin is Bitcoincash || coin is Ecash) { - sendToController.text = results["scheme"] != null - ? results["scheme"]! + ":" + _address! - : _address!; - } else { - sendToController.text = _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 notes field - if (results["message"] != null) { - _note = results["message"]!; - } else if (results["label"] != null) { - _note = results["label"]!; - } - - // autofill amount field - if (results["amount"] != null) { - final amount = Decimal.parse(results["amount"]!).toAmount( + // autofill amoutn field + if (paymentData.amount != null) { + final amount = Decimal.parse(paymentData.amount!).toAmount( fractionDigits: coin.fractionDigits, ); cryptoAmountController.text = ref @@ -846,13 +848,24 @@ class _DesktopSendState extends ConsumerState<DesktopSend> { setState(() { _addressToggleFlag = sendToController.text.isNotEmpty; }); + } else { + if (coin is Epiccash) { + content = AddressUtils().formatAddress(content); + } - return; + sendToController.text = content; + _address = content; + + _setValidAddressProviders(_address); + setState(() { + _addressToggleFlag = sendToController.text.isNotEmpty; + }); } - } else { + } catch (e) { + // If parsing fails, treat it as a plain address. if (coin is Epiccash) { // strip http:// and https:// if content contains @ - content = formatAddress(content); + content = AddressUtils().formatAddress(content); } sendToController.text = content; diff --git a/lib/utilities/address_utils.dart b/lib/utilities/address_utils.dart index 7b00c242a..85ec784a6 100644 --- a/lib/utilities/address_utils.dart +++ b/lib/utilities/address_utils.dart @@ -359,6 +359,26 @@ class AddressUtils { throw UnsupportedError('Unsupported URI scheme: $scheme'); } } + + /// Formats an address string to remove any unnecessary prefixes or suffixes. + String formatAddress(String epicAddress) { + // strip http:// or https:// prefixes if the address contains an @ symbol (and is thus an epicbox address) + if ((epicAddress.startsWith("http://") || + epicAddress.startsWith("https://")) && + epicAddress.contains("@")) { + epicAddress = epicAddress.replaceAll("http://", ""); + epicAddress = epicAddress.replaceAll("https://", ""); + } + // strip mailto: prefix + if (epicAddress.startsWith("mailto:")) { + epicAddress = epicAddress.replaceAll("mailto:", ""); + } + // strip / suffix if the address contains an @ symbol (and is thus an epicbox address) + if (epicAddress.endsWith("/") && epicAddress.contains("@")) { + epicAddress = epicAddress.substring(0, epicAddress.length - 1); + } + return epicAddress; + } } class PaymentUriData {