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
}