CAKE-279 | removed find_order_by_id.dart; added and applied wyre_service.dart to the app

OleksandrSobol committed Mar 23, 2021 at 19:19 UTC 08efc52f71ed49b0cf058131d43280f736051cbc
7 files changed +160 -117
lib/di.dart
+8 -6
@@ -496,9 +496,6 @@ Future setup(
496 getIt.registerFactoryParam<TradeDetailsViewModel, Trade, void>((trade, _) =>
497 TradeDetailsViewModel(tradeForDetails: trade, trades: _tradesSource));
498
499 - getIt.registerFactoryParam<OrderDetailsViewModel, Order, void>(
500 - (order, _) => OrderDetailsViewModel(orderForDetails: order));
501 -
499 getIt.registerFactory(() => BackupService(
500 getIt.get<FlutterSecureStorage>(),
501 _walletInfoSource,
@@ -528,9 +525,6 @@ Future setup(
525 getIt.registerFactoryParam<TradeDetailsPage, Trade, void>((Trade trade, _) =>
526 TradeDetailsPage(getIt.get<TradeDetailsViewModel>(param1: trade)));
527
531 - getIt.registerFactoryParam<OrderDetailsPage, Order, void>((Order order, _) =>
532 - OrderDetailsPage(getIt.get<OrderDetailsViewModel>(param1: order)));
533 -
528 getIt.registerFactory(() {
529 final wallet = getIt.get<AppStore>().wallet;
530 return WyreViewModel(ordersSource, getIt.get<OrdersStore>(),
@@ -541,6 +535,14 @@ Future setup(
535 WyrePage(getIt.get<WyreViewModel>(),
536 ordersStore: getIt.get<OrdersStore>(), url: url));
537
538 + getIt.registerFactoryParam<OrderDetailsViewModel, Order, void>(
539 + (order, _) => OrderDetailsViewModel(
540 + wyreViewModel: getIt.get<WyreViewModel>(),
541 + orderForDetails: order));
542 +
543 + getIt.registerFactoryParam<OrderDetailsPage, Order, void>((Order order, _) =>
544 + OrderDetailsPage(getIt.get<OrderDetailsViewModel>(param1: order)));
545 +
546 getIt.registerFactory(() => SupportViewModel());
547
548 getIt.registerFactory(() => SupportPage(getIt.get<SupportViewModel>()));
lib/entities/find_order_by_id.dart deleted
-40
@@ -1,40 +0,0 @@
1 -import 'dart:convert';
2 -import 'package:cake_wallet/entities/order.dart';
3 -import 'package:cake_wallet/exchange/trade_state.dart';
4 -import 'package:http/http.dart';
5 -
6 -Future<Order> findOrderById(String id) async {
7 - final orderUrl = 'https://api.sendwyre.com/v3/orders/' + id;
8 -
9 - final orderResponse = await get(orderUrl);
10 -
11 - final orderResponseJSON =
12 - json.decode(orderResponse.body) as Map<String, dynamic>;
13 - final transferId = orderResponseJSON['transferId'] as String;
14 - final from = orderResponseJSON['sourceCurrency'] as String;
15 - final to = orderResponseJSON['destCurrency'] as String;
16 - final status = orderResponseJSON['status'] as String;
17 - final state = TradeState.deserialize(raw: status.toLowerCase());
18 - final createdAtRaw = orderResponseJSON['createdAt'] as int;
19 - final createdAt =
20 - DateTime.fromMillisecondsSinceEpoch(createdAtRaw).toLocal();
21 -
22 - final transferUrl =
23 - 'https://api.sendwyre.com/v2/transfer/' + transferId + '/track';
24 -
25 - final transferResponse = await get(transferUrl);
26 -
27 - final transferResponseJSON =
28 - json.decode(transferResponse.body) as Map<String, dynamic>;
29 - final amount = transferResponseJSON['destAmount'] as double;
30 -
31 - return Order(
32 - id: id,
33 - transferId: transferId,
34 - from: from,
35 - to: to,
36 - state: state,
37 - createdAt: createdAt,
38 - amount: amount.toString()
39 - );
40 -}
\ No newline at end of file
lib/entities/wyre_service.dart new
+115
@@ -0,0 +1,115 @@
1 +import 'dart:convert';
2 +import 'package:cake_wallet/exchange/trade_state.dart';
3 +import 'package:flutter/foundation.dart';
4 +import 'package:http/http.dart';
5 +import 'package:cake_wallet/.secrets.g.dart' as secrets;
6 +import 'package:cake_wallet/entities/order.dart';
7 +import 'package:cake_wallet/entities/wallet_type.dart';
8 +
9 +class WyreService {
10 + WyreService({
11 + @required this.walletType,
12 + @required this.walletAddress,
13 + this.isTestEnvironment = false}) {
14 + baseApiUrl = isTestEnvironment
15 + ? 'https://api.testwyre.com'
16 + : 'https://api.sendwyre.com';
17 + trackUrl = isTestEnvironment
18 + ? 'https://dash.testwyre.com/track/'
19 + : 'https://dash.sendwyre.com/track/';
20 + }
21 +
22 + static const _ordersSuffix = '/v3/orders';
23 + static const _reserveSuffix = '/reserve';
24 + static const _timeStampSuffix = '?timestamp=';
25 + static const _transferSuffix = '/v2/transfer/';
26 + static const _trackSuffix = '/track';
27 +
28 + final bool isTestEnvironment;
29 + final WalletType walletType;
30 + final String walletAddress;
31 +
32 + String baseApiUrl;
33 + String trackUrl;
34 +
35 + Future<String> getWyreUrl() async {
36 + final timestamp = DateTime.now().millisecondsSinceEpoch.toString();
37 + final url = baseApiUrl + _ordersSuffix + _reserveSuffix +
38 + _timeStampSuffix + timestamp;
39 + final secretKey = secrets.wyreSecretKey;
40 + final accountId = secrets.wyreAccountId;
41 + final body = {
42 + 'destCurrency': walletTypeToCryptoCurrency(walletType).title,
43 + 'dest': walletTypeToString(walletType).toLowerCase() + ':' + walletAddress,
44 + 'referrerAccountId': accountId,
45 + 'lockFields': ['destCurrency', 'dest']
46 + };
47 +
48 + final response = await post(url,
49 + headers: {
50 + 'Authorization': 'Bearer $secretKey',
51 + 'Content-Type': 'application/json',
52 + 'cache-control': 'no-cache'
53 + },
54 + body: json.encode(body));
55 +
56 + if (response.statusCode != 200) {
57 + throw WyreException('Url $url is not found!');
58 + }
59 +
60 + final responseJSON = json.decode(response.body) as Map<String, dynamic>;
61 + final urlFromResponse = responseJSON['url'] as String;
62 + return urlFromResponse;
63 + }
64 +
65 + Future<Order> findOrderById(String id) async {
66 + final orderUrl = baseApiUrl + _ordersSuffix + id;
67 + final orderResponse = await get(orderUrl);
68 +
69 + if (orderResponse.statusCode != 200) {
70 + throw WyreException('Order $id is not found!');
71 + }
72 +
73 + final orderResponseJSON =
74 + json.decode(orderResponse.body) as Map<String, dynamic>;
75 + final transferId = orderResponseJSON['transferId'] as String;
76 + final from = orderResponseJSON['sourceCurrency'] as String;
77 + final to = orderResponseJSON['destCurrency'] as String;
78 + final status = orderResponseJSON['status'] as String;
79 + final state = TradeState.deserialize(raw: status.toLowerCase());
80 + final createdAtRaw = orderResponseJSON['createdAt'] as int;
81 + final createdAt =
82 + DateTime.fromMillisecondsSinceEpoch(createdAtRaw).toLocal();
83 +
84 + final transferUrl =
85 + baseApiUrl + _transferSuffix + transferId + _trackSuffix;
86 + final transferResponse = await get(transferUrl);
87 +
88 + if (transferResponse.statusCode != 200) {
89 + throw WyreException('Transfer $transferId is not found!');
90 + }
91 +
92 + final transferResponseJSON =
93 + json.decode(transferResponse.body) as Map<String, dynamic>;
94 + final amount = transferResponseJSON['destAmount'] as double;
95 +
96 + return Order(
97 + id: id,
98 + transferId: transferId,
99 + from: from,
100 + to: to,
101 + state: state,
102 + createdAt: createdAt,
103 + amount: amount.toString()
104 + );
105 + }
106 +}
107 +
108 +class WyreException implements Exception {
109 + WyreException(this.description);
110 +
111 + String description;
112 +
113 + @override
114 + String toString() => description;
115 +}
\ No newline at end of file
lib/src/screens/dashboard/dashboard_page.dart
+4 -5
@@ -146,11 +146,10 @@ class DashboardPage extends BasePage {
146 : () async {
147 try {
148 walletViewModel.isRunningWebView = true;
149 - final url = await walletViewModel.wyreViewModel.getWyreUrl();
150 - if (url.isNotEmpty) {
151 - await Navigator.of(context)
152 - .pushNamed(Routes.wyre, arguments: url);
153 - }
149 + final url =
150 + await walletViewModel.wyreViewModel.wyreUrl;
151 + await Navigator.of(context)
152 + .pushNamed(Routes.wyre, arguments: url);
153 walletViewModel.isRunningWebView = false;
154 } catch(e) {
155 print(e.toString());
lib/view_model/dashboard/dashboard_view_model.dart
-20
@@ -4,7 +4,6 @@ import 'dart:io';
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';
7 -import 'package:cake_wallet/entities/find_order_by_id.dart';
7 import 'package:cake_wallet/entities/order.dart';
8 import 'package:cake_wallet/entities/transaction_history.dart';
9 import 'package:cake_wallet/exchange/trade_state.dart';
@@ -147,27 +146,8 @@ abstract class DashboardViewModelBase with Store {
146
147 return true;
148 });
150 -
151 - dataChannel.setMessageHandler((ByteData message) async {
152 - final type = ByteData.view(message.buffer, 0, 4).getInt32(0);
153 -
154 - switch (type) {
155 - case _dataExists:
156 - print('Wyre: Data exists');
157 - break;
158 - case _dataNotExists:
159 - print('Wyre: Data not exists');
160 - break;
161 - }
162 -
163 - return ByteData(0);
164 - });
149 }
150
167 - static const dataChannel = BasicMessageChannel('data_change', BinaryCodec());
168 - static const _dataExists = 1;
169 - static const _dataNotExists = 0;
170 -
151 @observable
152 WalletType type;
153
lib/view_model/order_details_view_model.dart
+7 -4
@@ -1,7 +1,7 @@
1 import 'dart:async';
2 -import 'package:cake_wallet/entities/find_order_by_id.dart';
2 import 'package:cake_wallet/entities/order.dart';
3 import 'package:cake_wallet/utils/date_formatter.dart';
4 +import 'package:cake_wallet/view_model/wyre_view_model.dart';
5 import 'package:mobx/mobx.dart';
6 import 'package:cake_wallet/generated/i18n.dart';
7 import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
@@ -14,7 +14,7 @@ class OrderDetailsViewModel = OrderDetailsViewModelBase
14 with _$OrderDetailsViewModel;
15
16 abstract class OrderDetailsViewModelBase with Store {
17 - OrderDetailsViewModelBase({Order orderForDetails}) {
17 + OrderDetailsViewModelBase({this.wyreViewModel, Order orderForDetails}) {
18 order = orderForDetails;
19
20 items = ObservableList<StandartListItem>();
@@ -32,12 +32,15 @@ abstract class OrderDetailsViewModelBase with Store {
32 @observable
33 ObservableList<StandartListItem> items;
34
35 + WyreViewModel wyreViewModel;
36 +
37 Timer _timer;
38
39 @action
40 Future<void> _updateOrder() async {
41 try {
40 - final updatedOrder = await findOrderById(order.id);
42 + final updatedOrder =
43 + await wyreViewModel.wyreService.findOrderById(order.id);
44
45 updatedOrder.receiveAddress = order.receiveAddress;
46 updatedOrder.walletId = order.walletId;
@@ -52,7 +55,7 @@ abstract class OrderDetailsViewModelBase with Store {
55 void _updateItems() {
56 final dateFormat = DateFormatter.withCurrentLocal();
57 final buildURL =
55 - 'https://dash.sendwyre.com/track/${order.transferId}';
58 + wyreViewModel.trackUrl + '${order.transferId}';
59
60 items?.clear();
61
lib/view_model/wyre_view_model.dart
+26 -42
@@ -1,16 +1,23 @@
1 -import 'dart:convert';
1 +import 'package:cake_wallet/entities/wyre_service.dart';
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';
4 import 'package:cake_wallet/entities/order.dart';
5 import 'package:cake_wallet/entities/wallet_type.dart';
6 import 'package:cake_wallet/store/dashboard/orders_store.dart';
7 +import 'package:mobx/mobx.dart';
8
11 -class WyreViewModel {
12 - WyreViewModel(this.ordersSource, this.ordersStore,
13 - {@required this.walletId, @required this.address, @required this.type});
9 +part 'wyre_view_model.g.dart';
10 +
11 +class WyreViewModel = WyreViewModelBase with _$WyreViewModel;
12 +
13 +abstract class WyreViewModelBase with Store {
14 + WyreViewModelBase(this.ordersSource, this.ordersStore,
15 + {@required this.walletId, @required this.address, @required this.type})
16 + : wyreService = WyreService(walletType: type, walletAddress: address);
17 +
18 + Future<String> get wyreUrl => wyreService.getWyreUrl();
19 +
20 + String get trackUrl => wyreService.trackUrl;
21
22 final Box<Order> ordersSource;
23 final OrdersStore ordersStore;
@@ -19,42 +26,19 @@ class WyreViewModel {
26 final WalletType type;
27 final String address;
28
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 + WyreService wyreService;
30
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 '';
31 + Future<void> saveOrder(String orderId) async {
32 + try {
33 + final order = await wyreService.findOrderById(orderId);
34 + order.receiveAddress = address;
35 + order.walletId = walletId;
36 + await ordersSource.add(order);
37 + ordersStore.setOrder(order);
38 + } catch (e) {
39 + print(e.toString());
40 }
41 }
42 +
43 +
44 }