CAKE-216 | added trade_details_view_model.dart to the app; applied TradeDetailsViewModel to the trade_details_page.dart; added _updateItems() method to the exchange_trade_view_model.dart; reworked content in the exchange_trade_page.dart
OleksandrSobol committed
Dec 18, 2020 at 14:42 UTC
837f639129b31741baea3126c33de1386c55c4ec
6 files changed
+152
-80
lib/di.dart
+8
@@ -27,6 +27,7 @@ import 'package:cake_wallet/src/screens/send/send_template_page.dart';
27
import 'package:cake_wallet/src/screens/settings/change_language.dart';
28
import 'package:cake_wallet/src/screens/settings/settings.dart';
29
import 'package:cake_wallet/src/screens/setup_pin_code/setup_pin_code.dart';
30
+import 'package:cake_wallet/src/screens/trade_details/trade_details_page.dart';
31
import 'package:cake_wallet/src/screens/transaction_details/transaction_details_page.dart';
32
import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
33
import 'package:cake_wallet/src/screens/exchange/exchange_page.dart';
@@ -54,6 +55,7 @@ import 'package:cake_wallet/view_model/node_list/node_list_view_model.dart';
55
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
56
import 'package:cake_wallet/view_model/rescan_view_model.dart';
57
import 'package:cake_wallet/view_model/setup_pin_code_view_model.dart';
58
+import 'package:cake_wallet/view_model/trade_details_view_model.dart';
59
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart';
60
import 'package:cake_wallet/view_model/auth_view_model.dart';
61
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
@@ -422,4 +424,10 @@ Future setup(
424
transactionDescriptionBox));
425
426
getIt.registerFactory(() => PreSeedPage());
427
+
428
+ getIt.registerFactoryParam<TradeDetailsViewModel, Trade, void>((trade, _) =>
429
+ TradeDetailsViewModel(tradeForDetails: trade, trades: tradesSource));
430
+
431
+ getIt.registerFactoryParam<TradeDetailsPage, Trade, void>((Trade trade, _) =>
432
+ TradeDetailsPage(getIt.get<TradeDetailsViewModel>(param1: trade)));
433
}
lib/router.dart
+2
-1
@@ -293,7 +293,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
293
294
case Routes.tradeDetails:
295
return MaterialPageRoute<void>(
296
- builder: (_) => TradeDetailsPage(settings.arguments as Trade));
296
+ builder: (_) =>
297
+ getIt.get<TradeDetailsPage>(param1: settings.arguments as Trade));
298
299
case Routes.restoreWalletFromSeedDetails:
300
final args = settings.arguments as List;
lib/src/screens/exchange_trade/exchange_trade_page.dart
+8
-30
@@ -172,36 +172,14 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
172
),
173
itemBuilder: (context, index) {
174
final item = widget.exchangeTradeViewModel.items[index];
175
- String value;
176
-
177
- final content = Observer(builder: (_) {
178
- switch (index) {
179
- case 0:
180
- value =
181
- '${widget.exchangeTradeViewModel.trade.id ?? fetchingLabel}';
182
- break;
183
- case 1:
184
- value =
185
- '${widget.exchangeTradeViewModel.trade.amount ?? fetchingLabel}';
186
- break;
187
- case 2:
188
- value =
189
- '${widget.exchangeTradeViewModel.trade.state ?? fetchingLabel}';
190
- break;
191
- case 3:
192
- value = widget.exchangeTradeViewModel.trade
193
- .inputAddress ??
194
- fetchingLabel;
195
- break;
196
- }
197
-
198
- return StandartListRow(
199
- title: item.title,
200
- value: value,
201
- valueFontSize: 14,
202
- image: item.isCopied ? copyImage : null,
203
- );
204
- });
175
+ final value = item.data ?? fetchingLabel;
176
+
177
+ final content = StandartListRow(
178
+ title: item.title,
179
+ value: value,
180
+ valueFontSize: 14,
181
+ image: item.isCopied ? copyImage : null,
182
+ );
183
184
return item.isCopied
185
? Builder(
lib/src/screens/trade_details/trade_details_page.dart
+7
-37
@@ -1,51 +1,20 @@
1
import 'package:cake_wallet/utils/show_bar.dart';
2
+import 'package:cake_wallet/view_model/trade_details_view_model.dart';
3
import 'package:flutter/material.dart';
4
import 'package:flutter/cupertino.dart';
5
import 'package:flutter/services.dart';
6
import 'package:flutter_mobx/flutter_mobx.dart';
6
-import 'package:cake_wallet/exchange/trade.dart';
7
import 'package:cake_wallet/generated/i18n.dart';
8
-import 'package:cake_wallet/utils/date_formatter.dart';
8
import 'package:cake_wallet/src/screens/base_page.dart';
10
-import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
9
import 'package:cake_wallet/src/widgets/standart_list_row.dart';
10
11
class TradeDetailsPage extends BasePage {
14
- TradeDetailsPage(this.trade) : _items = [] {
15
- final dateFormat = DateFormatter.withCurrentLocal();
16
- _items.addAll([
17
- StandartListItem(title: S.current.trade_details_id, value: trade.id),
18
- StandartListItem(
19
- title: S.current.trade_details_state,
20
- value: trade.state != null
21
- ? trade.state.toString()
22
- : S.current.trade_details_fetching)
23
- ]);
24
-
25
- if (trade.provider != null) {
26
- _items.add(StandartListItem(
27
- title: S.current.trade_details_provider,
28
- value: trade.provider.toString()));
29
- }
30
-
31
- if (trade.createdAt != null) {
32
- _items.add(StandartListItem(
33
- title: S.current.trade_details_created_at,
34
- value: dateFormat.format(trade.createdAt).toString()));
35
- }
36
-
37
- if (trade.from != null && trade.to != null) {
38
- _items.add(StandartListItem(
39
- title: S.current.trade_details_pair,
40
- value: '${trade.from.toString()} → ${trade.to.toString()}'));
41
- }
42
- }
12
+ TradeDetailsPage(this.tradeDetailsViewModel);
13
14
@override
15
String get title => S.current.trade_details_title;
16
47
- final Trade trade;
48
- final List<StandartListItem> _items;
17
+ final TradeDetailsViewModel tradeDetailsViewModel;
18
19
@override
20
Widget body(BuildContext context) {
@@ -61,10 +30,11 @@ class TradeDetailsPage extends BasePage {
30
.primaryTextTheme
31
.title
32
.backgroundColor)),
64
- itemCount: _items.length,
33
+ itemCount: tradeDetailsViewModel.items.length,
34
itemBuilder: (BuildContext context, int index) {
66
- final item = _items[index];
67
- final isDrawBottom = index == _items.length - 1 ? true : false;
35
+ final item = tradeDetailsViewModel.items[index];
36
+ final isDrawBottom =
37
+ index == tradeDetailsViewModel.items.length - 1 ? true : false;
38
39
return GestureDetector(
40
onTap: () {
lib/view_model/exchange/exchange_trade_view_model.dart
+22
-12
@@ -39,20 +39,11 @@ abstract class ExchangeTradeViewModelBase with Store {
39
}
40
41
items = ObservableList<ExchangeTradeItem>();
42
- items.addAll([
43
- ExchangeTradeItem(
44
- title: S.current.id, data: '${trade.id}', isCopied: true),
45
- ExchangeTradeItem(
46
- title: S.current.amount, data: '${trade.amount}', isCopied: false),
47
- ExchangeTradeItem(
48
- title: S.current.status, data: '${trade.state}', isCopied: false),
49
- ExchangeTradeItem(
50
- title: S.current.widgets_address + ':',
51
- data: trade.inputAddress,
52
- isCopied: true),
53
- ]);
42
+
43
+ _updateItems();
44
45
_updateTrade();
46
+
47
_timer = Timer.periodic(Duration(seconds: 20), (_) async => _updateTrade());
48
}
49
@@ -95,8 +86,27 @@ abstract class ExchangeTradeViewModelBase with Store {
86
}
87
88
trade = updatedTrade;
89
+
90
+ _updateItems();
91
} catch (e) {
92
print(e.toString());
93
}
94
}
95
+
96
+ void _updateItems() {
97
+ items?.clear();
98
+
99
+ items.addAll([
100
+ ExchangeTradeItem(
101
+ title: S.current.id, data: '${trade.id}', isCopied: true),
102
+ ExchangeTradeItem(
103
+ title: S.current.amount, data: '${trade.amount}', isCopied: false),
104
+ ExchangeTradeItem(
105
+ title: S.current.status, data: '${trade.state}', isCopied: false),
106
+ ExchangeTradeItem(
107
+ title: S.current.widgets_address + ':',
108
+ data: trade.inputAddress,
109
+ isCopied: true),
110
+ ]);
111
+ }
112
}
lib/view_model/trade_details_view_model.dart
new
+105
@@ -0,0 +1,105 @@
1
+import 'dart:async';
2
+import 'package:cake_wallet/exchange/changenow/changenow_exchange_provider.dart';
3
+import 'package:cake_wallet/exchange/exchange_provider.dart';
4
+import 'package:cake_wallet/exchange/exchange_provider_description.dart';
5
+import 'package:cake_wallet/exchange/morphtoken/morphtoken_exchange_provider.dart';
6
+import 'package:cake_wallet/exchange/trade.dart';
7
+import 'package:cake_wallet/exchange/xmrto/xmrto_exchange_provider.dart';
8
+import 'package:cake_wallet/utils/date_formatter.dart';
9
+import 'package:hive/hive.dart';
10
+import 'package:mobx/mobx.dart';
11
+import 'package:cake_wallet/generated/i18n.dart';
12
+import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
13
+
14
+part 'trade_details_view_model.g.dart';
15
+
16
+class TradeDetailsViewModel = TradeDetailsViewModelBase
17
+ with _$TradeDetailsViewModel;
18
+
19
+abstract class TradeDetailsViewModelBase with Store {
20
+ TradeDetailsViewModelBase({Trade tradeForDetails, this.trades}) {
21
+ trade = tradeForDetails;
22
+
23
+ switch (trade.provider) {
24
+ case ExchangeProviderDescription.xmrto:
25
+ _provider = XMRTOExchangeProvider();
26
+ break;
27
+ case ExchangeProviderDescription.changeNow:
28
+ _provider = ChangeNowExchangeProvider();
29
+ break;
30
+ case ExchangeProviderDescription.morphToken:
31
+ _provider = MorphTokenExchangeProvider(trades: trades);
32
+ break;
33
+ }
34
+
35
+ items = ObservableList<StandartListItem>();
36
+
37
+ _updateItems();
38
+
39
+ _updateTrade();
40
+
41
+ _timer = Timer.periodic(Duration(seconds: 20), (_) async => _updateTrade());
42
+ }
43
+
44
+ final Box<Trade> trades;
45
+
46
+ @observable
47
+ Trade trade;
48
+
49
+ @observable
50
+ ObservableList<StandartListItem> items;
51
+
52
+ ExchangeProvider _provider;
53
+
54
+ Timer _timer;
55
+
56
+ @action
57
+ Future<void> _updateTrade() async {
58
+ try {
59
+ final updatedTrade = await _provider.findTradeById(id: trade.id);
60
+
61
+ if (updatedTrade.createdAt == null && trade.createdAt != null) {
62
+ updatedTrade.createdAt = trade.createdAt;
63
+ }
64
+
65
+ trade = updatedTrade;
66
+
67
+ _updateItems();
68
+ } catch (e) {
69
+ print(e.toString());
70
+ }
71
+ }
72
+
73
+ void _updateItems() {
74
+ final dateFormat = DateFormatter.withCurrentLocal();
75
+
76
+ items?.clear();
77
+
78
+ items.addAll([
79
+ StandartListItem(title: S.current.trade_details_id, value: trade.id),
80
+ StandartListItem(
81
+ title: S.current.trade_details_state,
82
+ value: trade.state != null
83
+ ? trade.state.toString()
84
+ : S.current.trade_details_fetching)
85
+ ]);
86
+
87
+ if (trade.provider != null) {
88
+ items.add(StandartListItem(
89
+ title: S.current.trade_details_provider,
90
+ value: trade.provider.toString()));
91
+ }
92
+
93
+ if (trade.createdAt != null) {
94
+ items.add(StandartListItem(
95
+ title: S.current.trade_details_created_at,
96
+ value: dateFormat.format(trade.createdAt).toString()));
97
+ }
98
+
99
+ if (trade.from != null && trade.to != null) {
100
+ items.add(StandartListItem(
101
+ title: S.current.trade_details_pair,
102
+ value: '${trade.from.toString()} → ${trade.to.toString()}'));
103
+ }
104
+ }
105
+}
\ No newline at end of file