CAKE-279 | integrated Wyre to the app; added buy button to dashboard page for btc wallet; added buyCryptoCurrency() method to dashboard_view_model.dart

OleksandrSobol committed Mar 3, 2021 at 20:54 UTC 313f829689ef98aa9fd0567abd4f9653a879e679
3 files changed +56 -8
lib/src/screens/dashboard/dashboard_page.dart
+9 -3
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/entities/wallet_type.dart';
2 import 'package:cake_wallet/generated/i18n.dart';
3 import 'package:cake_wallet/routes.dart';
4 import 'package:cake_wallet/themes/theme_base.dart';
@@ -12,6 +13,7 @@ import 'package:cake_wallet/src/screens/dashboard/widgets/address_page.dart';
13 import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart';
14 import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
15 import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart';
16 +import 'package:flutter_mobx/flutter_mobx.dart';
17 import 'package:smooth_page_indicator/smooth_page_indicator.dart';
18
19 class DashboardPage extends BasePage {
@@ -81,7 +83,7 @@ class DashboardPage extends BasePage {
83 final exchangeImage = Image.asset('assets/images/transfer.png',
84 height: 24.27, width: 22.25,
85 color: Theme.of(context).accentTextTheme.display3.backgroundColor);
84 - final receiveImage = Image.asset('assets/images/download.png',
86 + final buyImage = Image.asset('assets/images/coins.png',
87 height: 22.24, width: 24,
88 color: Theme.of(context).accentTextTheme.display3.backgroundColor);
89 _setEffects();
@@ -111,7 +113,7 @@ class DashboardPage extends BasePage {
113 )),
114 Container(
115 padding: EdgeInsets.only(left: 45, right: 45, bottom: 24),
114 - child: Row(
116 + child: Observer(builder: (_) => Row(
117 mainAxisAlignment: MainAxisAlignment.spaceAround,
118 children: <Widget>[
119 ActionButton(
@@ -122,8 +124,12 @@ class DashboardPage extends BasePage {
124 image: exchangeImage,
125 title: S.of(context).exchange,
126 route: Routes.exchange),
127 + if (walletViewModel.type == WalletType.bitcoin) ActionButton(
128 + image: buyImage,
129 + title: S.of(context).buy,
130 + onClick: () => walletViewModel.buyCryptoCurrency()),
131 ],
126 - ),
132 + )),
133 )
134 ],
135 ));
lib/src/screens/dashboard/widgets/action_button.dart
+9 -5
@@ -3,14 +3,16 @@ import 'package:flutter/material.dart';
3 class ActionButton extends StatelessWidget {
4 ActionButton(
5 {@required this.image,
6 - @required this.title,
7 - @required this.route,
8 - this.alignment = Alignment.center});
6 + @required this.title,
7 + this.route,
8 + this.onClick,
9 + this.alignment = Alignment.center});
10
11 final Image image;
12 final String title;
13 final String route;
14 final Alignment alignment;
15 + final void Function() onClick;
16
17 @override
18 Widget build(BuildContext context) {
@@ -23,8 +25,10 @@ class ActionButton extends StatelessWidget {
25 children: <Widget>[
26 GestureDetector(
27 onTap: () {
26 - if (route.isNotEmpty) {
28 + if (route?.isNotEmpty ?? false) {
29 Navigator.of(context, rootNavigator: true).pushNamed(route);
30 + } else {
31 + onClick?.call();
32 }
33 },
34 child: Container(
@@ -48,4 +52,4 @@ class ActionButton extends StatelessWidget {
52 ),
53 );
54 }
51 -}
55 +}
\ No newline at end of file
lib/view_model/dashboard/dashboard_view_model.dart
+38
@@ -1,3 +1,6 @@
1 +import 'dart:convert';
2 +import 'dart:io';
3 +
4 import 'package:cake_wallet/bitcoin/bitcoin_transaction_info.dart';
5 import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart';
6 import 'package:cake_wallet/entities/balance.dart';
@@ -20,6 +23,8 @@ import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart';
23 import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart';
24 import 'package:cake_wallet/view_model/dashboard/action_list_item.dart';
25 import 'package:cake_wallet/view_model/dashboard/action_list_display_mode.dart';
26 +import 'package:crypto/crypto.dart';
27 +import 'package:http/http.dart';
28 import 'package:mobx/mobx.dart';
29 import 'package:cake_wallet/core/wallet_base.dart';
30 import 'package:cake_wallet/entities/sync_status.dart';
@@ -30,6 +35,9 @@ import 'package:cake_wallet/store/dashboard/trades_store.dart';
35 import 'package:cake_wallet/store/dashboard/trade_filter_store.dart';
36 import 'package:cake_wallet/store/dashboard/transaction_filter_store.dart';
37 import 'package:cake_wallet/view_model/dashboard/formatted_item_list.dart';
38 +import 'package:url_launcher/url_launcher.dart';
39 +import 'package:cake_wallet/.secrets.g.dart' as secrets;
40 +import 'package:convert/convert.dart';
41
42 part 'dashboard_view_model.g.dart';
43
@@ -279,4 +287,34 @@ abstract class DashboardViewModelBase with Store {
287 balanceViewModel: balanceViewModel,
288 settingsStore: appStore.settingsStore)));
289 }
290 +
291 + void buyCryptoCurrency() async {
292 + final timestamp = DateTime.now().millisecondsSinceEpoch.toString();
293 + final url = 'https://api.testwyre.com/v3/orders/reserve' + '?timestamp=' +
294 + timestamp;
295 + final apiKey = secrets.wyre_api_key;
296 + final secretKey = secrets.wyre_secret_key;
297 + final accountId = secrets.wyre_account_id;
298 + final body = {
299 + 'destCurrency' : walletTypeToCryptoCurrency(type).title,
300 + 'dest' : walletTypeToString(type).toLowerCase() + ':' + address,
301 + 'referrerAccountId' : accountId,
302 + 'lockFields' : ['destCurrency', 'dest']
303 + };
304 +
305 + final response = await post(url,
306 + headers: {
307 + 'Authorization': 'Bearer $secretKey',
308 + 'Content-Type': 'application/json',
309 + 'cache-control': 'no-cache'
310 + },
311 + body: json.encode(body)
312 + );
313 +
314 + if (response.statusCode == 200) {
315 + final responseJSON = json.decode(response.body) as Map<String, dynamic>;
316 + final urlFromResponse = responseJSON['url'] as String;
317 + if (await canLaunch(urlFromResponse)) await launch(urlFromResponse);
318 + }
319 + }
320 }