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 +}