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
}