CAKE-192 | created ParsedAddress class; applied this class to parse_address_from_domain.dart, send_page.dart and exchange_page.dart

OleksandrSobol committed Jul 7, 2021 at 17:31 UTC bac491c44f33e6ba0b69fd74dc2fd7bb378b3c5e
4 files changed +70 -29
lib/entities/parse_address_from_domain.dart
+9 -21
@@ -1,52 +1,40 @@
1 import 'package:cake_wallet/entities/openalias_record.dart';
2 +import 'package:cake_wallet/entities/parsed_address.dart';
3 import 'package:cake_wallet/entities/unstoppable_domain_address.dart';
3 -import 'package:cake_wallet/src/screens/send/widgets/parse_address_from_domain_alert.dart';
4 -import 'package:flutter/material.dart';
5 -import 'package:cake_wallet/generated/i18n.dart';
4
5 const topLevelDomain = 'crypto';
6
9 -Future<String> parseAddressFromDomain(
10 - BuildContext context, String domain, String ticker) async {
7 +Future<ParsedAddress> parseAddressFromDomain(
8 + String domain, String ticker) async {
9 try {
10 final domainParts = domain.split('.');
11 final name = domainParts.last;
12
13 if (domainParts.length <= 1 || domainParts.first.isEmpty || name.isEmpty) {
16 - return domain;
14 + return ParsedAddress(domain, ParseFrom.notParsed);
15 }
16
17 if (name.contains(topLevelDomain)) {
18 final address = await fetchUnstoppableDomainAddress(domain, ticker);
19
20 if (address?.isEmpty ?? true) {
23 - return domain;
21 + return ParsedAddress(domain, ParseFrom.notParsed);
22 }
23
26 - showAddressAlert(
27 - context,
28 - S.of(context).address_detected,
29 - S.of(context).address_from_domain(domain));
30 -
31 - return address;
24 + return ParsedAddress(address, ParseFrom.unstoppableDomains);
25 }
26
27 final record = await OpenaliasRecord.fetchAddressAndName(
28 OpenaliasRecord.formatDomainName(domain));
29
30 if (record == null || record.address.contains(domain)) {
38 - return domain;
31 + return ParsedAddress(domain, ParseFrom.notParsed);
32 }
33
41 - showAddressAlert(
42 - context,
43 - S.of(context).openalias_alert_title,
44 - S.of(context).openalias_alert_content(domain));
45 -
46 - return record.address;
34 + return ParsedAddress(record.address, ParseFrom.openAlias);
35 } catch (e) {
36 print(e.toString());
37 }
38
51 - return domain;
39 + return ParsedAddress(domain, ParseFrom.notParsed);
40 }
\ No newline at end of file
lib/entities/parsed_address.dart new
+8
@@ -0,0 +1,8 @@
1 +enum ParseFrom {unstoppableDomains, openAlias, notParsed}
2 +
3 +class ParsedAddress {
4 + ParsedAddress(this.address, this.parseFrom);
5 +
6 + final String address;
7 + final ParseFrom parseFrom;
8 +}
\ No newline at end of file
lib/src/screens/exchange/exchange_page.dart
+32 -6
@@ -1,7 +1,9 @@
1 import 'dart:ui';
2 +import 'package:cake_wallet/entities/parsed_address.dart';
3 import 'package:cake_wallet/entities/sync_status.dart';
4 import 'package:cake_wallet/entities/wallet_type.dart';
5 import 'package:cake_wallet/entities/parse_address_from_domain.dart';
6 +import 'package:cake_wallet/src/screens/send/widgets/parse_address_from_domain_alert.dart';
7 import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
8 import 'package:dotted_border/dotted_border.dart';
9 import 'package:flutter/cupertino.dart';
@@ -229,7 +231,7 @@ class ExchangePage extends BasePage {
231 final ticker = exchangeViewModel
232 .depositCurrency.title.toLowerCase();
233 exchangeViewModel.depositAddress =
232 - await parseAddressFromDomain(
234 + await applyOpenaliasOrUnstoppableDomains(
235 context, domain, ticker);
236 },
237 ),
@@ -284,7 +286,7 @@ class ExchangePage extends BasePage {
286 final ticker = exchangeViewModel
287 .receiveCurrency.title.toLowerCase();
288 exchangeViewModel.receiveAddress =
287 - await parseAddressFromDomain(
289 + await applyOpenaliasOrUnstoppableDomains(
290 context, domain, ticker);
291 },
292 )),
@@ -514,12 +516,12 @@ class ExchangePage extends BasePage {
516 var domain = template.depositAddress;
517 var ticker = template.depositCurrency.toLowerCase();
518 exchangeViewModel.depositAddress =
517 - await parseAddressFromDomain(context, domain, ticker);
519 + await applyOpenaliasOrUnstoppableDomains(context, domain, ticker);
520
521 domain = template.receiveAddress;
522 ticker = template.receiveCurrency.toLowerCase();
523 exchangeViewModel.receiveAddress =
522 - await parseAddressFromDomain(context, domain, ticker);
524 + await applyOpenaliasOrUnstoppableDomains(context, domain, ticker);
525 }
526
527 void _setReactions(
@@ -691,7 +693,7 @@ class ExchangePage extends BasePage {
693 final domain = depositAddressController.text;
694 final ticker = exchangeViewModel.depositCurrency.title.toLowerCase();
695 exchangeViewModel.depositAddress =
694 - await parseAddressFromDomain(context, domain, ticker);
696 + await applyOpenaliasOrUnstoppableDomains(context, domain, ticker);
697 }
698 });
699
@@ -701,7 +703,7 @@ class ExchangePage extends BasePage {
703 final domain = receiveAddressController.text;
704 final ticker = exchangeViewModel.receiveCurrency.title.toLowerCase();
705 exchangeViewModel.receiveAddress =
704 - await parseAddressFromDomain(context, domain, ticker);
706 + await applyOpenaliasOrUnstoppableDomains(context, domain, ticker);
707 }
708 });
709
@@ -775,4 +777,28 @@ class ExchangePage extends BasePage {
777 key.currentState.addressController.text = null;
778 }
779 }
780 +
781 + Future<String> applyOpenaliasOrUnstoppableDomains(
782 + BuildContext context, String domain, String ticker) async {
783 + final parsedAddress = await parseAddressFromDomain(domain, ticker);
784 +
785 + switch (parsedAddress.parseFrom) {
786 + case ParseFrom.unstoppableDomains:
787 + showAddressAlert(
788 + context,
789 + S.of(context).address_detected,
790 + S.of(context).address_from_domain(domain));
791 + break;
792 + case ParseFrom.openAlias:
793 + showAddressAlert(
794 + context,
795 + S.of(context).openalias_alert_title,
796 + S.of(context).openalias_alert_content(domain));
797 + break;
798 + case ParseFrom.notParsed:
799 + break;
800 + }
801 +
802 + return parsedAddress.address;
803 + }
804 }
lib/src/screens/send/send_page.dart
+21 -2
@@ -1,6 +1,8 @@
1 import 'dart:ui';
2 +import 'package:cake_wallet/entities/parsed_address.dart';
3 import 'package:cake_wallet/entities/transaction_priority.dart';
4 import 'package:cake_wallet/entities/parse_address_from_domain.dart';
5 +import 'package:cake_wallet/src/screens/send/widgets/parse_address_from_domain_alert.dart';
6 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
7 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
8 import 'package:cake_wallet/src/widgets/picker.dart';
@@ -757,7 +759,24 @@ class SendPage extends BasePage {
759 void applyOpenaliasOrUnstoppableDomains(BuildContext context) async {
760 final domain = _addressController.text;
761 final ticker = sendViewModel.currency.title.toLowerCase();
760 - _addressController.text =
761 - await parseAddressFromDomain(context, domain, ticker);
762 + final parsedAddress = await parseAddressFromDomain(domain, ticker);
763 + _addressController.text = parsedAddress.address;
764 +
765 + switch (parsedAddress.parseFrom) {
766 + case ParseFrom.unstoppableDomains:
767 + showAddressAlert(
768 + context,
769 + S.of(context).address_detected,
770 + S.of(context).address_from_domain(domain));
771 + break;
772 + case ParseFrom.openAlias:
773 + showAddressAlert(
774 + context,
775 + S.of(context).openalias_alert_title,
776 + S.of(context).openalias_alert_content(domain));
777 + break;
778 + case ParseFrom.notParsed:
779 + break;
780 + }
781 }
782 }