dev
dart 156 lines 6.6 KB
Raw
1 import 'package:cake_wallet/entities/qr_view_data.dart';
2 import 'package:cake_wallet/routes.dart';
3 import 'package:cake_wallet/src/screens/exchange_trade/widgets/exchange_trade_card_item_widget.dart';
4 import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart';
5 import 'package:cake_wallet/utils/brightness_util.dart';
6 import 'package:flutter_mobx/flutter_mobx.dart';
7 import 'package:flutter/material.dart';
8 import 'package:cake_wallet/generated/i18n.dart';
9 import 'package:cake_wallet/core/execution_state.dart';
10 import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart';
11 import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
12 import 'package:cake_wallet/src/screens/base_page.dart';
13 import 'package:cake_wallet/src/widgets/primary_button.dart';
14 import 'package:cake_wallet/src/widgets/scrollable_with_bottom_section.dart';
15
16 class ExchangeTradeExternalSendPage extends BasePage {
17 ExchangeTradeExternalSendPage({required this.exchangeTradeViewModel});
18
19 final ExchangeTradeViewModel exchangeTradeViewModel;
20 @override
21 String get title => S.current.swap;
22
23 @override
24 bool get gradientAll => true;
25
26 @override
27 bool get resizeToAvoidBottomInset => false;
28
29 @override
30 bool get extendBodyBehindAppBar => true;
31
32 @override
33 AppBarStyle get appBarStyle => AppBarStyle.transparent;
34
35 final fetchingLabel = S.current.fetching;
36
37 @override
38 Widget body(BuildContext context) {
39 final copyImage = Image.asset(
40 'assets/images/copy_content.png',
41 height: 16,
42 width: 16,
43 color: Theme.of(context).colorScheme.primary,
44 );
45 return Container(
46 child: ScrollableWithBottomSection(
47 contentPadding: EdgeInsets.only(bottom: 24),
48 content: Observer(
49 builder: (_) {
50 return Column(
51 children: <Widget>[
52 Container(
53 decoration: BoxDecoration(
54 borderRadius: BorderRadius.only(
55 bottomLeft: Radius.circular(24), bottomRight: Radius.circular(24)),
56 color: Theme.of(context).colorScheme.surfaceContainerLow,
57 ),
58 padding: EdgeInsets.fromLTRB(24, 110, 24, 32),
59 child: Column(
60 crossAxisAlignment: CrossAxisAlignment.start,
61 children: <Widget>[
62 Row(
63 children: <Widget>[
64 Spacer(flex: 3),
65 Flexible(
66 flex: 6,
67 child: GestureDetector(
68 onTap: () {
69 BrightnessUtil.changeBrightnessForFunction(
70 () async {
71 await Navigator.pushNamed(
72 context,
73 Routes.fullscreenQR,
74 arguments: QrViewData(
75 embeddedImagePath:
76 exchangeTradeViewModel.trade.from?.iconPath,
77 data: exchangeTradeViewModel.paymentUri?.toString() ??
78 exchangeTradeViewModel.trade.inputAddress ??
79 fetchingLabel,
80 ),
81 );
82 },
83 );
84 },
85 child: Center(
86 child: AspectRatio(
87 aspectRatio: 1.0,
88 child: Container(
89 padding: EdgeInsets.all(5),
90 decoration: BoxDecoration(
91 border: Border.all(
92 width: 3,
93 color: Theme.of(context).colorScheme.primary,
94 ),
95 ),
96 child: QrImage(
97 data: exchangeTradeViewModel.paymentUri?.toString() ??
98 exchangeTradeViewModel.trade.inputAddress ??
99 fetchingLabel,
100 embeddedImagePath:
101 exchangeTradeViewModel.trade.from?.iconPath,
102 size: 230,
103 ),
104 ),
105 ),
106 ),
107 ),
108 ),
109 Spacer(flex: 3)
110 ],
111 ),
112 SizedBox(height: 24),
113 ...exchangeTradeViewModel.items
114 .where((item) => item.isExternalSendDetail)
115 .map(
116 (item) => TradeItemRowWidget(
117 key: ValueKey(
118 'exchange_trade_external_send_page_send_item_${item.title}_key'),
119 title: item.title,
120 value: item.data,
121 isCopied: true,
122 copyImage: copyImage,
123 ),
124 )
125 .toList(),
126 ],
127 ),
128 ),
129 ],
130 );
131 },
132 ),
133 bottomSection: Observer(
134 builder: (_) {
135 final trade = exchangeTradeViewModel.trade;
136 final sendingState = exchangeTradeViewModel.sendViewModel.state;
137
138 return exchangeTradeViewModel.isSendable && !(sendingState is TransactionCommitted)
139 ? LoadingPrimaryButton(
140 key: ValueKey('exchange_trade_external_send_page_continue_button_key'),
141 isDisabled: trade.inputAddress == null || trade.inputAddress!.isEmpty,
142 isLoading: sendingState is IsExecutingState,
143 onPressed: () {
144 Navigator.of(context).popUntil((route) => route.isFirst);
145 },
146 text: S.current.continue_text,
147 color: Theme.of(context).colorScheme.primary,
148 textColor: Theme.of(context).colorScheme.onPrimary,
149 )
150 : Offstage();
151 },
152 ),
153 ),
154 );
155 }
156 }