From 76c7108bd7430f27460a54facde957fbf8cc9b32 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Wed, 17 Mar 2021 12:32:22 +0200 Subject: [PATCH] CAKE-293 | applied webview to the app --- lib/di.dart | 4 ++ lib/router.dart | 6 ++ lib/routes.dart | 1 + lib/src/screens/dashboard/dashboard_page.dart | 8 ++- lib/src/screens/web_view/web_view_page.dart | 59 +++++++++++++++++++ .../dashboard/dashboard_view_model.dart | 9 ++- pubspec.yaml | 1 + 7 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 lib/src/screens/web_view/web_view_page.dart diff --git a/lib/di.dart b/lib/di.dart index 3b80b7d0a..16328fb5b 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -41,6 +41,7 @@ import 'package:cake_wallet/src/screens/transaction_details/transaction_details_ import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart'; import 'package:cake_wallet/src/screens/exchange/exchange_page.dart'; import 'package:cake_wallet/src/screens/exchange/exchange_template_page.dart'; +import 'package:cake_wallet/src/screens/web_view/web_view_page.dart'; import 'package:cake_wallet/store/dashboard/orders_store.dart'; import 'package:cake_wallet/store/node_list_store.dart'; import 'package:cake_wallet/store/secret_store.dart'; @@ -528,6 +529,9 @@ Future setup( getIt.registerFactoryParam((Order order, _) => OrderDetailsPage(getIt.get(param1: order))); + getIt.registerFactoryParam((String url, _) => + WebViewPage(url: url)); + getIt.registerFactory(() => SupportViewModel()); getIt.registerFactory(() => SupportPage(getIt.get())); diff --git a/lib/router.dart b/lib/router.dart index 8268b0714..72218492d 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -9,6 +9,7 @@ import 'package:cake_wallet/src/screens/restore/restore_from_backup_page.dart'; import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart'; import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart'; import 'package:cake_wallet/src/screens/support/support_page.dart'; +import 'package:cake_wallet/src/screens/web_view/web_view_page.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart'; import 'package:flutter/cupertino.dart'; @@ -292,6 +293,11 @@ Route createRoute(RouteSettings settings) { builder: (_) => getIt.get(param1: settings.arguments as Order)); + case Routes.webView: + return MaterialPageRoute( + builder: (_) => + getIt.get(param1: settings.arguments as String)); + case Routes.restoreWalletFromSeedDetails: final args = settings.arguments as List; final walletRestorationFromSeedVM = diff --git a/lib/routes.dart b/lib/routes.dart index aea839e9c..9ce92eec3 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -53,4 +53,5 @@ class Routes { static const restoreFromBackup = '/restore_from_backup'; static const support = '/support'; static const orderDetails = '/order_details'; + static const webView = '/web_view'; } \ No newline at end of file diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index 657602ad5..d73f26b75 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -127,7 +127,13 @@ class DashboardPage extends BasePage { if (walletViewModel.type == WalletType.bitcoin) ActionButton( image: buyImage, title: S.of(context).buy, - onClick: () => walletViewModel.buyCryptoCurrency()), + onClick: () async { + final url = await walletViewModel.getWyreUrl(); + if (url.isNotEmpty) { + await Navigator.of(context) + .pushNamed(Routes.webView, arguments: url); + } + }), ], )), ) diff --git a/lib/src/screens/web_view/web_view_page.dart b/lib/src/screens/web_view/web_view_page.dart new file mode 100644 index 000000000..3672cb20e --- /dev/null +++ b/lib/src/screens/web_view/web_view_page.dart @@ -0,0 +1,59 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:flutter/material.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +class WebViewPage extends BasePage { + WebViewPage({@required this.url}); + + final String url; + + @override + String get title => S.current.buy; + + @override + Widget body(BuildContext context) => WebViewPageBody(url: url); +} + +class WebViewPageBody extends StatefulWidget { + WebViewPageBody({this.url}); + + final String url; + + @override + WebViewPageBodyState createState() => WebViewPageBodyState(); +} + +class WebViewPageBodyState extends State { + WebViewController webViewController; + + @override + void initState() { + super.initState(); + if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); + } + + @override + Widget build(BuildContext context) { + return WebView( + initialUrl: widget.url, + javascriptMode: JavascriptMode.unrestricted, + onWebViewCreated: (WebViewController controller) { + setState(() => webViewController = controller); + }, + javascriptChannels: { + JavascriptChannel( + name: 'Echo', + onMessageReceived: (JavascriptMessage message) { + webViewController.evaluateJavascript("console.log('test callback');"); + }, + ), + }, + /*onPageFinished: (url) { + webViewController.evaluateJavascript("alert('Test alert');"); + },*/ + ); + } +} \ No newline at end of file diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 419f149e5..5f97cd299 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -326,7 +326,7 @@ abstract class DashboardViewModelBase with Store { settingsStore: appStore.settingsStore))); } - void buyCryptoCurrency() async { + Future getWyreUrl() async { final timestamp = DateTime.now().millisecondsSinceEpoch.toString(); final url = 'https://api.testwyre.com/v3/orders/reserve' + '?timestamp=' + timestamp; @@ -337,7 +337,7 @@ abstract class DashboardViewModelBase with Store { //'destCurrency' : walletTypeToCryptoCurrency(type).title, //'dest' : walletTypeToString(type).toLowerCase() + ':' + address, 'referrerAccountId' : accountId, - 'redirectUrl' : 'http://google.com' + //'redirectUrl' : 'http://google.com' //'redirectUrl' : 'cakewallet://wyre-trade-success' //'lockFields' : ['destCurrency', 'dest'] }; @@ -354,7 +354,8 @@ abstract class DashboardViewModelBase with Store { if (response.statusCode == 200) { final responseJSON = json.decode(response.body) as Map; final urlFromResponse = responseJSON['url'] as String; - if (await canLaunch(urlFromResponse)) await launch(urlFromResponse); + return urlFromResponse; + //if (await canLaunch(urlFromResponse)) await launch(urlFromResponse); /*final orderId = ''; final order = await findOrderById(orderId); @@ -362,6 +363,8 @@ abstract class DashboardViewModelBase with Store { order.walletId = wallet.id; await ordersSource.add(order); ordersStore.setOrder(order);*/ + } else { + return ''; } } } diff --git a/pubspec.yaml b/pubspec.yaml index 9498bf387..515c2c839 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: auto_size_text: ^2.1.0 dotted_border: ^1.0.5 smooth_page_indicator: ^0.2.0 + webview_flutter: ^1.0.7 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons.