@@ -135,6 +135,44 @@ class _SendViewState extends ConsumerState<SendView> {
135135
136136 Set <UTXO > selectedUTXOs = {};
137137
138+ void _applyUri (PaymentUriData paymentData) {
139+ try {
140+ // auto fill address
141+ _address = paymentData.address.trim ();
142+ sendToController.text = _address! ;
143+
144+ // autofill notes field
145+ if (paymentData.message != null ) {
146+ noteController.text = paymentData.message! ;
147+ } else if (paymentData.label != null ) {
148+ noteController.text = paymentData.label! ;
149+ }
150+
151+ // autofill amount field
152+ if (paymentData.amount != null ) {
153+ final Amount amount = Decimal .parse (paymentData.amount! ).toAmount (
154+ fractionDigits: coin.fractionDigits,
155+ );
156+ cryptoAmountController.text = ref.read (pAmountFormatter (coin)).format (
157+ amount,
158+ withUnitName: false ,
159+ );
160+ ref.read (pSendAmount.notifier).state = amount;
161+ }
162+
163+ _setValidAddressProviders (_address);
164+ setState (() {
165+ _addressToggleFlag = sendToController.text.isNotEmpty;
166+ });
167+ } catch (e, s) {
168+ Logging .instance.e (
169+ "Failed to apply uri in SendView: " ,
170+ error: e,
171+ stackTrace: s,
172+ );
173+ }
174+ }
175+
138176 Future <void > _scanQr () async {
139177 try {
140178 // ref
@@ -167,35 +205,7 @@ class _SendViewState extends ConsumerState<SendView> {
167205
168206 if (paymentData != null &&
169207 paymentData.coin? .uriScheme == coin.uriScheme) {
170- // auto fill address
171- _address = paymentData.address.trim ();
172- sendToController.text = _address! ;
173-
174- // autofill notes field
175- if (paymentData.message != null ) {
176- noteController.text = paymentData.message! ;
177- } else if (paymentData.label != null ) {
178- noteController.text = paymentData.label! ;
179- }
180-
181- // autofill amount field
182- if (paymentData.amount != null ) {
183- final Amount amount = Decimal .parse (paymentData.amount! ).toAmount (
184- fractionDigits: coin.fractionDigits,
185- );
186- cryptoAmountController.text = ref.read (pAmountFormatter (coin)).format (
187- amount,
188- withUnitName: false ,
189- );
190- ref.read (pSendAmount.notifier).state = amount;
191- }
192-
193- _setValidAddressProviders (_address);
194- setState (() {
195- _addressToggleFlag = sendToController.text.isNotEmpty;
196- });
197-
198- // now check for non standard encoded basic address
208+ _applyUri (paymentData);
199209 } else {
200210 _address = qrResult.rawContent.split ("\n " ).first.trim ();
201211 sendToController.text = _address ?? "" ;
@@ -1353,27 +1363,24 @@ class _SendViewState extends ConsumerState<SendView> {
13531363 final trimmed = newValue.trim ();
13541364
13551365 if ((trimmed.length - (_address? .length ?? 0 )).abs () > 1 ) {
1356- if (coin is Monero && Uri .parse (trimmed).scheme == "monero" ) {
1357- final parsedUri = Uri .parse (trimmed);
1358- final addr = parsedUri.path;
1359- sendToController.text = addr;
1360- _address = addr;
1361- cryptoAmountController.text = parsedUri.queryParameters["tx_amount" ] ?? "" ;
1362- } else if (coin is Bitcoin && Uri .parse (trimmed).scheme == "bitcoin" ) {
1363- final parsedUri = Uri .parse (trimmed);
1364- final addr = parsedUri.path;
1365- sendToController.text = addr;
1366- _address = addr;
1367- cryptoAmountController.text = parsedUri.queryParameters["amount" ] ?? "" ;
1366+ final parsed = AddressUtils .parsePaymentUri (
1367+ trimmed,
1368+ logging: Logging .instance,
1369+ );
1370+ if (parsed != null ) {
1371+ _applyUri (parsed);
1372+ } else {
1373+ _address = newValue;
1374+ sendToController.text = newValue;
13681375 }
13691376 } else {
1370- _address = trimmed ;
1377+ _address = newValue ;
13711378 }
13721379
13731380 _setValidAddressProviders (_address);
13741381
13751382 setState (() {
1376- _addressToggleFlag = trimmed .isNotEmpty;
1383+ _addressToggleFlag = newValue .isNotEmpty;
13771384 });
13781385 },
13791386 focusNode: _addressFocusNode,
@@ -1454,32 +1461,26 @@ class _SendViewState extends ConsumerState<SendView> {
14541461 }
14551462
14561463 final trimmed = content.trim ();
1457-
1458- if (coin is Monero && Uri .parse (trimmed).scheme == "monero" ) {
1459- final parsedUri = Uri .parse (trimmed);
1460- final addr = parsedUri.path;
1461- sendToController.text = addr;
1462- _address = addr;
1463- cryptoAmountController.text = parsedUri.queryParameters["tx_amount" ] ?? "" ;
1464- } else if (coin is Bitcoin && Uri .parse (trimmed).scheme == "bitcoin" ) {
1465- final parsedUri = Uri .parse (trimmed);
1466- final addr = parsedUri.path;
1467- sendToController.text = addr;
1468- _address = addr;
1469- cryptoAmountController.text = parsedUri.queryParameters["amount" ] ?? "" ;
1464+ final parsed = AddressUtils .parsePaymentUri (
1465+ trimmed,
1466+ logging: Logging .instance,
1467+ );
1468+ if (parsed != null ) {
1469+ _applyUri (parsed);
14701470 } else {
1471- sendToController.text = trimmed;
1472- _address = trimmed;
1471+ sendToController.text =
1472+ content;
1473+ _address = content;
1474+
1475+ _setValidAddressProviders (_address,);
1476+
1477+ setState (() {
1478+ _addressToggleFlag =
1479+ sendToController
1480+ .text
1481+ .isNotEmpty;
1482+ });
14731483 }
1474-
1475- _setValidAddressProviders (_address,);
1476-
1477- setState (() {
1478- _addressToggleFlag =
1479- sendToController
1480- .text
1481- .isNotEmpty;
1482- });
14831484 }
14841485 },
14851486 child: sendToController
0 commit comments