CAKE-293 | applied webview to the app

OleksandrSobol committed Mar 17, 2021 at 12:32 UTC 76c7108bd7430f27460a54facde957fbf8cc9b32
7 files changed +84 -4
lib/di.dart
+4
@@ -41,6 +41,7 @@ import 'package:cake_wallet/src/screens/transaction_details/transaction_details_
41 import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
42 import 'package:cake_wallet/src/screens/exchange/exchange_page.dart';
43 import 'package:cake_wallet/src/screens/exchange/exchange_template_page.dart';
44 +import 'package:cake_wallet/src/screens/web_view/web_view_page.dart';
45 import 'package:cake_wallet/store/dashboard/orders_store.dart';
46 import 'package:cake_wallet/store/node_list_store.dart';
47 import 'package:cake_wallet/store/secret_store.dart';
@@ -528,6 +529,9 @@ Future setup(
529 getIt.registerFactoryParam<OrderDetailsPage, Order, void>((Order order, _) =>
530 OrderDetailsPage(getIt.get<OrderDetailsViewModel>(param1: order)));
531
532 + getIt.registerFactoryParam<WebViewPage, String, void>((String url, _) =>
533 + WebViewPage(url: url));
534 +
535 getIt.registerFactory(() => SupportViewModel());
536
537 getIt.registerFactory(() => SupportPage(getIt.get<SupportViewModel>()));
lib/router.dart
+6
@@ -9,6 +9,7 @@ import 'package:cake_wallet/src/screens/restore/restore_from_backup_page.dart';
9 import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart';
10 import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart';
11 import 'package:cake_wallet/src/screens/support/support_page.dart';
12 +import 'package:cake_wallet/src/screens/web_view/web_view_page.dart';
13 import 'package:cake_wallet/store/settings_store.dart';
14 import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart';
15 import 'package:flutter/cupertino.dart';
@@ -292,6 +293,11 @@ Route<dynamic> createRoute(RouteSettings settings) {
293 builder: (_) =>
294 getIt.get<OrderDetailsPage>(param1: settings.arguments as Order));
295
296 + case Routes.webView:
297 + return MaterialPageRoute<void>(
298 + builder: (_) =>
299 + getIt.get<WebViewPage>(param1: settings.arguments as String));
300 +
301 case Routes.restoreWalletFromSeedDetails:
302 final args = settings.arguments as List;
303 final walletRestorationFromSeedVM =
lib/routes.dart
+1
@@ -53,4 +53,5 @@ class Routes {
53 static const restoreFromBackup = '/restore_from_backup';
54 static const support = '/support';
55 static const orderDetails = '/order_details';
56 + static const webView = '/web_view';
57 }
\ No newline at end of file
lib/src/screens/dashboard/dashboard_page.dart
+7 -1
@@ -127,7 +127,13 @@ class DashboardPage extends BasePage {
127 if (walletViewModel.type == WalletType.bitcoin) ActionButton(
128 image: buyImage,
129 title: S.of(context).buy,
130 - onClick: () => walletViewModel.buyCryptoCurrency()),
130 + onClick: () async {
131 + final url = await walletViewModel.getWyreUrl();
132 + if (url.isNotEmpty) {
133 + await Navigator.of(context)
134 + .pushNamed(Routes.webView, arguments: url);
135 + }
136 + }),
137 ],
138 )),
139 )
lib/src/screens/web_view/web_view_page.dart new
+59
@@ -0,0 +1,59 @@
1 +import 'dart:async';
2 +import 'dart:io';
3 +import 'package:cake_wallet/generated/i18n.dart';
4 +import 'package:cake_wallet/src/screens/base_page.dart';
5 +import 'package:flutter/material.dart';
6 +import 'package:webview_flutter/webview_flutter.dart';
7 +
8 +class WebViewPage extends BasePage {
9 + WebViewPage({@required this.url});
10 +
11 + final String url;
12 +
13 + @override
14 + String get title => S.current.buy;
15 +
16 + @override
17 + Widget body(BuildContext context) => WebViewPageBody(url: url);
18 +}
19 +
20 +class WebViewPageBody extends StatefulWidget {
21 + WebViewPageBody({this.url});
22 +
23 + final String url;
24 +
25 + @override
26 + WebViewPageBodyState createState() => WebViewPageBodyState();
27 +}
28 +
29 +class WebViewPageBodyState extends State<WebViewPageBody> {
30 + WebViewController webViewController;
31 +
32 + @override
33 + void initState() {
34 + super.initState();
35 + if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
36 + }
37 +
38 + @override
39 + Widget build(BuildContext context) {
40 + return WebView(
41 + initialUrl: widget.url,
42 + javascriptMode: JavascriptMode.unrestricted,
43 + onWebViewCreated: (WebViewController controller) {
44 + setState(() => webViewController = controller);
45 + },
46 + javascriptChannels: <JavascriptChannel>{
47 + JavascriptChannel(
48 + name: 'Echo',
49 + onMessageReceived: (JavascriptMessage message) {
50 + webViewController.evaluateJavascript("console.log('test callback');");
51 + },
52 + ),
53 + },
54 + /*onPageFinished: (url) {
55 + webViewController.evaluateJavascript("alert('Test alert');");
56 + },*/
57 + );
58 + }
59 +}
\ No newline at end of file
lib/view_model/dashboard/dashboard_view_model.dart
+6 -3
@@ -326,7 +326,7 @@ abstract class DashboardViewModelBase with Store {
326 settingsStore: appStore.settingsStore)));
327 }
328
329 - void buyCryptoCurrency() async {
329 + Future<String> getWyreUrl() async {
330 final timestamp = DateTime.now().millisecondsSinceEpoch.toString();
331 final url = 'https://api.testwyre.com/v3/orders/reserve' + '?timestamp=' +
332 timestamp;
@@ -337,7 +337,7 @@ abstract class DashboardViewModelBase with Store {
337 //'destCurrency' : walletTypeToCryptoCurrency(type).title,
338 //'dest' : walletTypeToString(type).toLowerCase() + ':' + address,
339 'referrerAccountId' : accountId,
340 - 'redirectUrl' : 'http://google.com'
340 + //'redirectUrl' : 'http://google.com'
341 //'redirectUrl' : 'cakewallet://wyre-trade-success'
342 //'lockFields' : ['destCurrency', 'dest']
343 };
@@ -354,7 +354,8 @@ abstract class DashboardViewModelBase with Store {
354 if (response.statusCode == 200) {
355 final responseJSON = json.decode(response.body) as Map<String, dynamic>;
356 final urlFromResponse = responseJSON['url'] as String;
357 - if (await canLaunch(urlFromResponse)) await launch(urlFromResponse);
357 + return urlFromResponse;
358 + //if (await canLaunch(urlFromResponse)) await launch(urlFromResponse);
359
360 /*final orderId = '';
361 final order = await findOrderById(orderId);
@@ -362,6 +363,8 @@ abstract class DashboardViewModelBase with Store {
363 order.walletId = wallet.id;
364 await ordersSource.add(order);
365 ordersStore.setOrder(order);*/
366 + } else {
367 + return '';
368 }
369 }
370 }
pubspec.yaml
+1
@@ -55,6 +55,7 @@ dependencies:
55 auto_size_text: ^2.1.0
56 dotted_border: ^1.0.5
57 smooth_page_indicator: ^0.2.0
58 + webview_flutter: ^1.0.7
59
60 # The following adds the Cupertino Icons font to your application.
61 # Use with the CupertinoIcons class for iOS style icons.