Updates wyre.
M committed
Mar 23, 2021 at 13:05 UTC
5cad3a9612b80f25e87d4a7bdac54363665f6ff0
6 files changed
+91
-56
lib/di.dart
+14
-5
@@ -88,6 +88,7 @@ import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart';
88
import 'package:cake_wallet/view_model/wallet_restore_view_model.dart';
89
import 'package:cake_wallet/view_model/wallet_seed_view_model.dart';
90
import 'package:cake_wallet/view_model/exchange/exchange_view_model.dart';
91
+import 'package:cake_wallet/view_model/wyre_view_model.dart';
92
import 'package:flutter/widgets.dart';
93
import 'package:get_it/get_it.dart';
94
import 'package:hive/hive.dart';
@@ -142,7 +143,7 @@ Future setup(
143
144
if (!_isSetupFinished) {
145
getIt.registerSingletonAsync<SharedPreferences>(
145
- () => SharedPreferences.getInstance());
146
+ () => SharedPreferences.getInstance());
147
}
148
149
final settingsStore = await SettingsStoreBase.load(nodeSource: _nodeSource);
@@ -231,7 +232,8 @@ Future setup(
232
tradeFilterStore: getIt.get<TradeFilterStore>(),
233
transactionFilterStore: getIt.get<TransactionFilterStore>(),
234
ordersSource: _ordersSource,
234
- ordersStore: getIt.get<OrdersStore>()));
235
+ ordersStore: getIt.get<OrdersStore>(),
236
+ wyreViewModel: getIt.get<WyreViewModel>()));
237
238
getIt.registerFactory<AuthService>(() => AuthService(
239
secureStorage: getIt.get<FlutterSecureStorage>(),
@@ -494,8 +496,8 @@ Future setup(
496
getIt.registerFactoryParam<TradeDetailsViewModel, Trade, void>((trade, _) =>
497
TradeDetailsViewModel(tradeForDetails: trade, trades: _tradesSource));
498
497
- getIt.registerFactoryParam<OrderDetailsViewModel, Order, void>((order, _) =>
498
- OrderDetailsViewModel(orderForDetails: order));
499
+ getIt.registerFactoryParam<OrderDetailsViewModel, Order, void>(
500
+ (order, _) => OrderDetailsViewModel(orderForDetails: order));
501
502
getIt.registerFactory(() => BackupService(
503
getIt.get<FlutterSecureStorage>(),
@@ -529,8 +531,15 @@ Future setup(
531
getIt.registerFactoryParam<OrderDetailsPage, Order, void>((Order order, _) =>
532
OrderDetailsPage(getIt.get<OrderDetailsViewModel>(param1: order)));
533
534
+ getIt.registerFactory(() {
535
+ final wallet = getIt.get<AppStore>().wallet;
536
+ return WyreViewModel(ordersSource, getIt.get<OrdersStore>(),
537
+ walletId: wallet.id, address: wallet.address, type: wallet.type);
538
+ });
539
+
540
getIt.registerFactoryParam<WyrePage, String, void>((String url, _) =>
533
- WyrePage(ordersStore: getIt.get<OrdersStore>(), url: url));
541
+ WyrePage(getIt.get<WyreViewModel>(),
542
+ ordersStore: getIt.get<OrdersStore>(), url: url));
543
544
getIt.registerFactory(() => SupportViewModel());
545
lib/src/screens/dashboard/dashboard_page.dart
+1
-8
@@ -146,17 +146,10 @@ class DashboardPage extends BasePage {
146
: () async {
147
try {
148
walletViewModel.isRunningWebView = true;
149
- final url = await walletViewModel.getWyreUrl();
149
+ final url = await walletViewModel.wyreViewModel.getWyreUrl();
150
if (url.isNotEmpty) {
151
await Navigator.of(context)
152
.pushNamed(Routes.wyre, arguments: url);
153
-
154
- final orderId = walletViewModel.ordersStore
155
- .orderId;
156
-
157
- if (orderId.isNotEmpty) {
158
- await walletViewModel.saveOrder(orderId);
159
- }
153
}
154
walletViewModel.isRunningWebView = false;
155
} catch(e) {
lib/src/screens/wyre/wyre_page.dart
+10
-3
@@ -3,14 +3,16 @@ import 'package:cake_wallet/generated/i18n.dart';
3
import 'package:cake_wallet/palette.dart';
4
import 'package:cake_wallet/src/screens/base_page.dart';
5
import 'package:cake_wallet/store/dashboard/orders_store.dart';
6
+import 'package:cake_wallet/view_model/wyre_view_model.dart';
7
import 'package:flutter/material.dart';
8
import 'package:webview_flutter/webview_flutter.dart';
9
10
class WyrePage extends BasePage {
10
- WyrePage({@required this.ordersStore, @required this.url});
11
+ WyrePage(this.wyreViewModel, {@required this.ordersStore, @required this.url});
12
13
final OrdersStore ordersStore;
14
final String url;
15
+ final WyreViewModel wyreViewModel;
16
17
@override
18
String get title => S.current.buy;
@@ -23,14 +25,15 @@ class WyrePage extends BasePage {
25
26
@override
27
Widget body(BuildContext context) =>
26
- WyrePageBody(ordersStore: ordersStore,url: url);
28
+ WyrePageBody(wyreViewModel, ordersStore: ordersStore,url: url);
29
}
30
31
class WyrePageBody extends StatefulWidget {
30
- WyrePageBody({this.ordersStore, this.url});
32
+ WyrePageBody(this.wyreViewModel, {this.ordersStore, this.url});
33
34
final OrdersStore ordersStore;
35
final String url;
36
+ final WyreViewModel wyreViewModel;
37
38
@override
39
WyrePageBodyState createState() => WyrePageBodyState();
@@ -66,6 +69,10 @@ class WyrePageBodyState extends State<WyrePageBody> {
69
final urlParts = currentUrl.split('/');
70
orderId = urlParts.last;
71
widget.ordersStore.orderId = orderId;
72
+
73
+ if (orderId.isNotEmpty) {
74
+ await widget.wyreViewModel.saveOrder(orderId);
75
+ }
76
}
77
78
return NavigationDecision.navigate;
lib/view_model/dashboard/dashboard_view_model.dart
+5
-39
@@ -28,6 +28,7 @@ import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart';
28
import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart';
29
import 'package:cake_wallet/view_model/dashboard/action_list_item.dart';
30
import 'package:cake_wallet/view_model/dashboard/action_list_display_mode.dart';
31
+import 'package:cake_wallet/view_model/wyre_view_model.dart';
32
import 'package:crypto/crypto.dart';
33
import 'package:flutter/services.dart';
34
import 'package:hive/hive.dart';
@@ -43,7 +44,6 @@ import 'package:cake_wallet/store/dashboard/trade_filter_store.dart';
44
import 'package:cake_wallet/store/dashboard/transaction_filter_store.dart';
45
import 'package:cake_wallet/view_model/dashboard/formatted_item_list.dart';
46
import 'package:url_launcher/url_launcher.dart';
46
-import 'package:cake_wallet/.secrets.g.dart' as secrets;
47
import 'package:convert/convert.dart';
48
49
part 'dashboard_view_model.g.dart';
@@ -58,7 +58,8 @@ abstract class DashboardViewModelBase with Store {
58
this.tradeFilterStore,
59
this.transactionFilterStore,
60
this.ordersSource,
61
- this.ordersStore}) {
61
+ this.ordersStore,
62
+ this.wyreViewModel}) {
63
filterItems = {
64
S.current.transactions: [
65
FilterItem(
@@ -250,6 +251,8 @@ abstract class DashboardViewModelBase with Store {
251
252
TransactionFilterStore transactionFilterStore;
253
254
+ WyreViewModel wyreViewModel;
255
+
256
Map<String, List<FilterItem>> filterItems;
257
258
ReactionDisposer _reaction;
@@ -331,42 +334,5 @@ abstract class DashboardViewModelBase with Store {
334
settingsStore: appStore.settingsStore)));
335
}
336
334
- Future<String> getWyreUrl() async {
335
- final timestamp = DateTime.now().millisecondsSinceEpoch.toString();
336
- final url = 'https://api.sendwyre.com/v3/orders/reserve' + '?timestamp=' +
337
- timestamp;
338
- final secretKey = secrets.wyreSecretKey;
339
- final accountId = secrets.wyreAccountId;
340
- final body = {
341
- 'destCurrency' : walletTypeToCryptoCurrency(type).title,
342
- 'dest' : walletTypeToString(type).toLowerCase() + ':' + address,
343
- 'referrerAccountId' : accountId,
344
- 'lockFields' : ['destCurrency', 'dest']
345
- };
337
347
- final response = await post(url,
348
- headers: {
349
- 'Authorization': 'Bearer $secretKey',
350
- 'Content-Type': 'application/json',
351
- 'cache-control': 'no-cache'
352
- },
353
- body: json.encode(body)
354
- );
355
-
356
- if (response.statusCode == 200) {
357
- final responseJSON = json.decode(response.body) as Map<String, dynamic>;
358
- final urlFromResponse = responseJSON['url'] as String;
359
- return urlFromResponse;
360
- } else {
361
- return '';
362
- }
363
- }
364
-
365
- Future<void> saveOrder(String orderId) async {
366
- final order = await findOrderById(orderId);
367
- order.receiveAddress = address;
368
- order.walletId = wallet.id;
369
- await ordersSource.add(order);
370
- ordersStore.setOrder(order);
371
- }
338
}
lib/view_model/order_details_view_model.dart
+1
-1
@@ -52,7 +52,7 @@ abstract class OrderDetailsViewModelBase with Store {
52
void _updateItems() {
53
final dateFormat = DateFormatter.withCurrentLocal();
54
final buildURL =
55
- 'https://api.sendwyre.com/v2/transfer/${order.transferId}/track';
55
+ 'https://dash.sendwyre.com/track/${order.transferId}';
56
57
items?.clear();
58
lib/view_model/wyre_view_model.dart
new
+60
@@ -0,0 +1,60 @@
1
+import 'dart:convert';
2
+import 'package:flutter/foundation.dart';
3
+import 'package:hive/hive.dart';
4
+import 'package:http/http.dart';
5
+import 'package:cake_wallet/.secrets.g.dart' as secrets;
6
+import 'package:cake_wallet/entities/find_order_by_id.dart';
7
+import 'package:cake_wallet/entities/order.dart';
8
+import 'package:cake_wallet/entities/wallet_type.dart';
9
+import 'package:cake_wallet/store/dashboard/orders_store.dart';
10
+
11
+class WyreViewModel {
12
+ WyreViewModel(this.ordersSource, this.ordersStore,
13
+ {@required this.walletId, @required this.address, @required this.type});
14
+
15
+ final Box<Order> ordersSource;
16
+ final OrdersStore ordersStore;
17
+
18
+ final String walletId;
19
+ final WalletType type;
20
+ final String address;
21
+
22
+ Future<void> saveOrder(String orderId) async {
23
+ final order = await findOrderById(orderId);
24
+ order.receiveAddress = address;
25
+ order.walletId = walletId;
26
+ await ordersSource.add(order);
27
+ ordersStore.setOrder(order);
28
+ }
29
+
30
+ Future<String> getWyreUrl() async {
31
+ final timestamp = DateTime.now().millisecondsSinceEpoch.toString();
32
+ final url = 'https://api.sendwyre.com/v3/orders/reserve' +
33
+ '?timestamp=' +
34
+ timestamp;
35
+ final secretKey = secrets.wyreSecretKey;
36
+ final accountId = secrets.wyreAccountId;
37
+ final body = {
38
+ 'destCurrency': walletTypeToCryptoCurrency(type).title,
39
+ 'dest': walletTypeToString(type).toLowerCase() + ':' + address,
40
+ 'referrerAccountId': accountId,
41
+ 'lockFields': ['destCurrency', 'dest']
42
+ };
43
+
44
+ final response = await post(url,
45
+ headers: {
46
+ 'Authorization': 'Bearer $secretKey',
47
+ 'Content-Type': 'application/json',
48
+ 'cache-control': 'no-cache'
49
+ },
50
+ body: json.encode(body));
51
+
52
+ if (response.statusCode == 200) {
53
+ final responseJSON = json.decode(response.body) as Map<String, dynamic>;
54
+ final urlFromResponse = responseJSON['url'] as String;
55
+ return urlFromResponse;
56
+ } else {
57
+ return '';
58
+ }
59
+ }
60
+}