CAKE-356 | applied yat record to parse_address_from_domain.dart and parse_address_from_domain_alert.dart; fixed yat_record.dart, yat_view_model.dart and yat_webview_page.dart

OleksandrSobol committed Aug 27, 2021 at 20:46 UTC af356bd8f108cd02a9c2a4cc03fe0f2a619f9c6c
6 files changed +108 -29
lib/entities/parse_address_from_domain.dart
+15 -1
@@ -1,6 +1,7 @@
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';
4 +import 'package:cake_wallet/yat/yat_record.dart';
5
6 const unstoppableDomains = [
7 'crypto',
@@ -22,7 +23,20 @@ Future<ParsedAddress> parseAddressFromDomain(
23 final name = domainParts.last;
24
25 if (domainParts.length <= 1 || domainParts.first.isEmpty || name.isEmpty) {
25 - return ParsedAddress(address: domain);
26 + try {
27 + final address = await fetchYatAddress(domain);
28 +
29 + if (address?.isEmpty ?? true) {
30 + return ParsedAddress(address: domain);
31 + }
32 +
33 + return ParsedAddress(
34 + address: address,
35 + name: domain,
36 + parseFrom: ParseFrom.yatRecord);
37 + } catch (e) {
38 + return ParsedAddress(address: domain);
39 + }
40 }
41
42 if (unstoppableDomains.any((domain) => name.contains(domain))) {
lib/entities/parsed_address.dart
+1 -1
@@ -1,4 +1,4 @@
1 -enum ParseFrom {unstoppableDomains, openAlias, notParsed}
1 +enum ParseFrom {unstoppableDomains, openAlias, yatRecord, notParsed}
2
3 class ParsedAddress {
4 ParsedAddress({
lib/src/screens/send/widgets/parse_address_from_domain_alert.dart
+4
@@ -17,6 +17,10 @@ void showAddressAlert(BuildContext context, ParsedAddress parsedAddress) async {
17 title = S.of(context).openalias_alert_title;
18 content = S.of(context).openalias_alert_content(parsedAddress.name);
19 break;
20 + case ParseFrom.yatRecord:
21 + title = 'Address detected';
22 + content = 'This address is from ${parsedAddress.name} on Yat';
23 + break;
24 case ParseFrom.notParsed:
25 return;
26 }
lib/src/screens/yat/yat_webview_page.dart
+76 -9
@@ -1,3 +1,5 @@
1 +import 'dart:async';
2 +import 'dart:io';
3 import 'package:cake_wallet/palette.dart';
4 import 'package:cake_wallet/src/screens/base_page.dart';
5 import 'package:cake_wallet/view_model/yat_view_model.dart';
@@ -7,7 +9,37 @@ import 'package:webview_flutter/webview_flutter.dart';
9 enum YatMode {create, connect}
10
11 class YatWebViewPage extends BasePage {
10 - YatWebViewPage({this.yatViewModel, this.mode}) {
12 + YatWebViewPage({this.yatViewModel, this.mode});
13 +
14 + final YatMode mode;
15 + final YatViewModel yatViewModel;
16 +
17 + @override
18 + String get title => 'Yat';
19 +
20 + @override
21 + Color get backgroundDarkColor => Colors.white;
22 +
23 + @override
24 + Color get titleColor => Palette.darkBlueCraiola;
25 +
26 + @override
27 + Widget body(BuildContext context) => YatWebViewPageBody(yatViewModel, mode);
28 +}
29 +
30 +class YatWebViewPageBody extends StatefulWidget{
31 + YatWebViewPageBody(this.yatViewModel, this.mode);
32 +
33 + final YatMode mode;
34 + final YatViewModel yatViewModel;
35 +
36 + @override
37 + YatWebViewPageBodyState createState() =>
38 + YatWebViewPageBodyState(yatViewModel, mode);
39 +}
40 +
41 +class YatWebViewPageBodyState extends State<YatWebViewPageBody> {
42 + YatWebViewPageBodyState(this.yatViewModel, this.mode) {
43 switch (mode) {
44 case YatMode.create:
45 url = _baseUrl + _createSuffix;
@@ -20,7 +52,7 @@ class YatWebViewPage extends BasePage {
52 }
53 }
54
23 - static const _baseUrl = 'https://y.at';
55 + static const _baseUrl = 'https://yat.fyi';
56 static const _signInSuffix = '/sign-in';
57 static const _createSuffix = '/create';
58
@@ -28,18 +60,53 @@ class YatWebViewPage extends BasePage {
60 final YatViewModel yatViewModel;
61
62 String url;
63 + WebViewController _webViewController;
64 + GlobalKey _webViewkey;
65 + Timer _timer;
66
67 @override
33 - String get title => 'Yat';
68 + void initState() {
69 + super.initState();
70 + _webViewkey = GlobalKey();
71 + if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
72 + _fetchYatInfo();
73 + }
74
75 @override
36 - Color get backgroundDarkColor => Colors.white;
76 + void dispose() {
77 + super.dispose();
78 + _timer?.cancel();
79 + }
80
81 @override
39 - Color get titleColor => Palette.darkBlueCraiola;
82 + Widget build(BuildContext context) {
83 + return WebView(
84 + key: _webViewkey,
85 + initialUrl: url,
86 + javascriptMode: JavascriptMode.unrestricted,
87 + onWebViewCreated: (WebViewController controller) =>
88 + setState(() => _webViewController = controller));
89 + }
90
41 - @override
42 - Widget body(BuildContext context) => WebView(
43 - initialUrl: url,
44 - javascriptMode: JavascriptMode.unrestricted);
91 + void _fetchYatInfo() {
92 + final keyword = 'dashboard';
93 + _timer?.cancel();
94 + _timer = Timer.periodic(Duration(seconds: 1), (timer) async {
95 +
96 + try {
97 + if (_webViewController == null) {
98 + return;
99 + }
100 +
101 + final url = await _webViewController.currentUrl();
102 + print('URL = $url');
103 + if (url.contains(keyword)) {
104 + timer.cancel();
105 + await yatViewModel.fetchCartInfo();
106 + }
107 + } catch (e) {
108 + print(e);
109 + }
110 + });
111 + }
112 }
\ No newline at end of file
lib/view_model/yat_view_model.dart
+9 -7
@@ -4,6 +4,7 @@ import 'package:mobx/mobx.dart';
4 import 'dart:convert';
5 import 'package:cake_wallet/yat/yat_exception.dart';
6 import 'package:http/http.dart';
7 +import 'package:cake_wallet/.secrets.g.dart' as secrets;
8
9 part 'yat_view_model.g.dart';
10
@@ -15,23 +16,24 @@ abstract class YatViewModelBase with Store {
16 final YatStore yatStore;
17
18 Future<void> fetchCartInfo() async {
18 - const _apiKey = ''; // FIXME
19 -
20 - final url = 'https://api.y.at/cart';
19 + final url = 'https://a.y.at/cart';
20 + final _apiKey = secrets.yatApiToken;
21
22 final response = await get(
23 url,
24 headers: {
25 - 'Accept': '*/*',
26 - 'Authorization,X-Api-Key': _apiKey
25 + 'Accept':'*/*',
26 + 'X-Api-Key': _apiKey
27 }
28 );
29
30 - if (response.statusCode != 200) {
30 + print('RESPONSE = ${response.body.toString()}');
31 +
32 + /*if (response.statusCode != 200) {
33 throw YatException(text: response.body.toString());
34 }
35
36 final responseJSON = json.decode(response.body) as Map<String, dynamic>;
35 - yatStore.yatAddress = responseJSON[''] as String; // FIXME
37 + yatStore.yatAddress = responseJSON[''] as String;*/ // FIXME
38 }
39 }
\ No newline at end of file
lib/yat/yat_record.dart
+3 -11
@@ -3,24 +3,16 @@ import 'package:cake_wallet/yat/yat_exception.dart';
3 import 'package:http/http.dart';
4
5 Future<String> fetchYatAddress(String emojiId) async {
6 - const _apiKey = ''; // FIXME
7 - const _requestURL = 'https://api.y.at/emoji_id/';
6 + const _requestURL = 'https://a.y.at/emoji_id/';
7
8 final url = _requestURL + emojiId;
10 -
11 - final response = await get(
12 - url,
13 - headers: {
14 - 'Accept': '*/*',
15 - 'Authorization': 'Bearer $_apiKey'
16 - }
17 - );
9 + final response = await get(url);
10
11 if (response.statusCode != 200) {
12 throw YatException(text: response.body.toString());
13 }
14
15 final responseJSON = json.decode(response.body) as Map<String, dynamic>;
24 - final yatAddress = responseJSON[''] as String; // FIXME
16 + final yatAddress = responseJSON['result'][2]['data'] as String;
17 return yatAddress;
18 }
\ No newline at end of file