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