dev
dart 132 lines 4.81 KB
Raw
1 import 'package:auto_size_text/auto_size_text.dart';
2 import 'package:cake_wallet/generated/i18n.dart';
3 import 'package:cake_wallet/src/screens/base_page.dart';
4 import 'package:cake_wallet/src/screens/trade_details/track_trade_list_item.dart';
5 import 'package:cake_wallet/src/screens/trade_details/trade_details_list_card.dart';
6 import 'package:cake_wallet/src/screens/trade_details/trade_details_status_item.dart';
7 import 'package:cake_wallet/src/screens/trade_details/trade_provider_unsupported_item.dart';
8 import 'package:cake_wallet/src/widgets/list_row.dart';
9 import 'package:cake_wallet/src/widgets/standard_list.dart';
10 import 'package:cake_wallet/src/widgets/standard_list_card.dart';
11 import 'package:cake_wallet/src/widgets/standard_list_status_row.dart';
12 import 'package:cake_wallet/themes/core/material_base_theme.dart';
13 import 'package:cake_wallet/utils/show_bar.dart';
14 import 'package:cake_wallet/view_model/trade_details_view_model.dart';
15 import 'package:flutter/material.dart';
16 import 'package:flutter/services.dart';
17 import 'package:flutter_mobx/flutter_mobx.dart';
18
19 class TradeDetailsPage extends BasePage {
20 TradeDetailsPage(this.tradeDetailsViewModel);
21
22 @override
23 String get title => S.current.trade_details_title;
24
25 final TradeDetailsViewModel tradeDetailsViewModel;
26
27 @override
28 Widget body(BuildContext context) => TradeDetailsPageBody(tradeDetailsViewModel, currentTheme);
29 }
30
31 class TradeDetailsPageBody extends StatefulWidget {
32 TradeDetailsPageBody(this.tradeDetailsViewModel, this.currentTheme);
33
34 final TradeDetailsViewModel tradeDetailsViewModel;
35 final MaterialThemeBase currentTheme;
36
37 @override
38 TradeDetailsPageBodyState createState() => TradeDetailsPageBodyState(tradeDetailsViewModel);
39 }
40
41 class TradeDetailsPageBodyState extends State<TradeDetailsPageBody> {
42 TradeDetailsPageBodyState(this.tradeDetailsViewModel);
43
44 final TradeDetailsViewModel tradeDetailsViewModel;
45
46 @override
47 void dispose() {
48 super.dispose();
49 tradeDetailsViewModel.timer?.cancel();
50 }
51
52 @override
53 Widget build(BuildContext context) {
54 return Observer(
55 builder: (_) {
56 final itemsCount = tradeDetailsViewModel.items.length;
57
58 return SectionStandardList(
59 sectionCount: 1,
60 itemCounter: (int _) => itemsCount,
61 itemBuilder: (__, index) {
62 final item = tradeDetailsViewModel.items[index];
63
64 if (item is TrackTradeListItem)
65 return ListRow(
66 title: '${item.title}',
67 value: '${item.value}',
68 hintTextColor: Theme.of(context).colorScheme.onSurfaceVariant,
69 textWidget: GestureDetector(
70 onTap: () {
71 Clipboard.setData(ClipboardData(text: '${item.value}'));
72 showBar<void>(context, S.of(context).copied_to_clipboard);
73 },
74 child: Text(
75 '${item.value}',
76 style: Theme.of(context).textTheme.bodyMedium!.copyWith(
77 fontSize: 16,
78 fontWeight: FontWeight.w500,
79 color: Theme.of(context).colorScheme.onSurface,
80 ),
81 ),
82 ),
83 image: GestureDetector(
84 onTap: item.onTap,
85 child: Icon(
86 Icons.launch_rounded,
87 color: Theme.of(context).colorScheme.onSurface,
88 ),
89 ),
90 );
91
92 if (item is DetailsListStatusItem)
93 return StandardListStatusRow(title: item.title, value: item.value);
94
95 if (item is TradeDetailsListCardItem)
96 return TradeDetailsStandardListCard(
97 id: item.id,
98 extraId: item.extraId,
99 create: item.createdAt,
100 pair: item.pair,
101 currentTheme: widget.currentTheme.type,
102 onTap: item.onTap,
103 );
104
105 if (item is TradeProviderUnsupportedItem)
106 return AutoSizeText(
107 item.value,
108 textAlign: TextAlign.center,
109 style: Theme.of(context).textTheme.bodyMedium?.copyWith(
110 fontSize: 16,
111 fontWeight: FontWeight.w500,
112 color: Theme.of(context).colorScheme.error,
113 ),
114 );
115
116 return GestureDetector(
117 onTap: () {
118 Clipboard.setData(ClipboardData(text: '${item.value}'));
119 showBar<void>(context, S.of(context).copied_to_clipboard);
120 },
121 child: ListRow(
122 title: '${item.title}',
123 value: '${item.value}',
124 hintTextColor: Theme.of(context).colorScheme.onSurfaceVariant,
125 ),
126 );
127 },
128 );
129 },
130 );
131 }
132 }