CAKE-28 | created information page, exchange trade view model, exchange trade item; added trade property to trades store; changed filtered method (trade filter store); added tradesStore property to exchange view model; applied information page to exchange trade page

This commit is contained in:
Oleksandr Sobol
2020-08-26 20:31:23 +03:00
parent ecf7a5ba78
commit 76cde0530d
28 changed files with 344 additions and 111 deletions
@@ -486,7 +486,7 @@ class BaseExchangeWidgetState extends State<BaseExchangeWidget> {
}
if (state is TradeIsCreatedSuccessfully) {
Navigator.of(context)
.pushNamed(Routes.exchangeConfirm, arguments: state.trade);
.pushNamed(Routes.exchangeConfirm);
}
});
@@ -1,3 +1,4 @@
import 'package:cake_wallet/store/dashboard/trades_store.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
@@ -9,33 +10,14 @@ import 'package:cake_wallet/src/domain/exchange/trade.dart';
import 'package:cake_wallet/palette.dart';
class ExchangeConfirmPage extends BasePage {
ExchangeConfirmPage({@required this.trade});
ExchangeConfirmPage({@required this.tradesStore}) : trade = tradesStore.trade;
final TradesStore tradesStore;
final Trade trade;
@override
String get title => S.current.copy_id;
@override
Widget trailing(BuildContext context) {
final questionImage = Image.asset('assets/images/question_mark.png',
color: Theme.of(context).primaryTextTheme.title.color);
return SizedBox(
height: 20.0,
width: 20.0,
child: ButtonTheme(
minWidth: double.minPositive,
child: FlatButton(
highlightColor: Colors.transparent,
splashColor: Colors.transparent,
padding: EdgeInsets.all(0),
onPressed: () {},
child: questionImage),
),
);
}
@override
Widget body(BuildContext context) {
return Container(
@@ -131,7 +113,7 @@ class ExchangeConfirmPage extends BasePage {
),
PrimaryButton(
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.exchangeTrade, arguments: trade),
.pushReplacementNamed(Routes.exchangeTrade),
text: S.of(context).saved_the_trade_id,
color: Palette.blueCraiola,
textColor: Colors.white)
@@ -0,0 +1,13 @@
import 'package:flutter/cupertino.dart';
class ExchangeTradeItem {
ExchangeTradeItem({
@required this.title,
@required this.data,
@required this.isCopied,
});
final String title;
final String data;
final bool isCopied;
}
@@ -1,5 +1,9 @@
import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/src/domain/common/crypto_currency.dart';
import 'package:cake_wallet/src/domain/exchange/exchange_provider_description.dart';
import 'package:cake_wallet/src/screens/exchange_trade/exchange_trade_item.dart';
import 'package:cake_wallet/src/screens/exchange_trade/information_page.dart';
import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart';
import 'package:mobx/mobx.dart';
import 'package:provider/provider.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
@@ -19,15 +23,62 @@ import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
void showInformation(ExchangeTradeViewModel exchangeTradeViewModel, BuildContext context) {
final fetchingLabel = S.current.fetching;
final trade = exchangeTradeViewModel.trade;
final walletName = exchangeTradeViewModel.wallet.name;
final information = exchangeTradeViewModel.isSendable
? S.current.exchange_result_confirm(
trade.amount ?? fetchingLabel,
trade.from.toString(),
walletName)
: S.current.exchange_result_description(
trade.amount ?? fetchingLabel, trade.from.toString());
showDialog<void>(
context: context,
builder: (_) => InformationPage(information: information)
);
}
class ExchangeTradePage extends BasePage {
ExchangeTradePage({@required this.exchangeTradeViewModel});
final ExchangeTradeViewModel exchangeTradeViewModel;
@override
String get title => S.current.exchange;
@override
Widget body(BuildContext context) => ExchangeTradeForm();
Widget trailing(BuildContext context) {
final questionImage = Image.asset('assets/images/question_mark.png',
color: Theme.of(context).primaryTextTheme.title.color);
return SizedBox(
height: 20.0,
width: 20.0,
child: ButtonTheme(
minWidth: double.minPositive,
child: FlatButton(
highlightColor: Colors.transparent,
splashColor: Colors.transparent,
padding: EdgeInsets.all(0),
onPressed: () => showInformation(exchangeTradeViewModel, context),
child: questionImage),
),
);
}
@override
Widget body(BuildContext context) => ExchangeTradeForm(exchangeTradeViewModel);
}
class ExchangeTradeForm extends StatefulWidget {
ExchangeTradeForm(this.exchangeTradeViewModel);
final ExchangeTradeViewModel exchangeTradeViewModel;
@override
ExchangeTradeState createState() => ExchangeTradeState();
}
@@ -35,23 +86,49 @@ class ExchangeTradeForm extends StatefulWidget {
class ExchangeTradeState extends State<ExchangeTradeForm> {
final fetchingLabel = S.current.fetching;
String get title => S.current.exchange;
List<ExchangeTradeItem> items;
bool _effectsInstalled = false;
@override
Widget build(BuildContext context) {
final tradeStore = Provider.of<ExchangeTradeStore>(context);
final sendStore = Provider.of<SendStore>(context);
final walletStore = Provider.of<WalletStore>(context);
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback(afterLayout);
_setEffects(context);
items = [
ExchangeTradeItem(
title: S.current.id,
data: '${widget.exchangeTradeViewModel.trade.id ?? fetchingLabel}',
isCopied: true),
ExchangeTradeItem(
title: S.current.amount,
data: '${widget.exchangeTradeViewModel.trade.amount ?? fetchingLabel}',
isCopied: false),
ExchangeTradeItem(
title: S.current.status,
data: '${widget.exchangeTradeViewModel.trade.state ?? fetchingLabel}',
isCopied: false),
ExchangeTradeItem(
title: S.current.widgets_address,
data: widget.exchangeTradeViewModel.trade.inputAddress ?? fetchingLabel,
isCopied: true),
];
}
void afterLayout(dynamic _) {
showInformation(widget.exchangeTradeViewModel, context);
}
@override
Widget build(BuildContext context) {
//_setEffects(context);
return Container(
child: ScrollableWithBottomSection(
contentPadding: EdgeInsets.only(left: 24, right: 24, top: 24),
content: Observer(builder: (_) {
final trade = tradeStore.trade;
final walletName = walletStore.name;
final trade = widget.exchangeTradeViewModel.trade;
return Column(
mainAxisAlignment: MainAxisAlignment.start,
@@ -268,10 +345,10 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
],
),
),
Container(
/*Container(
padding: EdgeInsets.only(top: 20),
child: Text(
tradeStore.isSendable
widget.exchangeTradeViewModel.isSendable
? S.of(context).exchange_result_confirm(
trade.amount ?? fetchingLabel,
trade.from.toString(),
@@ -283,7 +360,7 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
fontSize: 13.0,
color: Theme.of(context).primaryTextTheme.title.color),
),
),
),*/
Text(
S.of(context).exchange_result_write_down_ID,
textAlign: TextAlign.left,
@@ -295,7 +372,13 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
);
}),
bottomSectionPadding: EdgeInsets.all(24),
bottomSection: Observer(
bottomSection: PrimaryButton(
onPressed: () {},
text: S.of(context).confirm,
color: Palette.blueCraiola,
textColor: Colors.white
)
/*Observer(
builder: (_) => tradeStore.trade.from == CryptoCurrency.xmr &&
!(sendStore.state is TransactionCommitted)
? LoadingPrimaryButton(
@@ -312,7 +395,7 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
: S.of(context).send_xmr,
color: Colors.blue,
textColor: Colors.white)
: Offstage()),
: Offstage()),*/
),
);
}
@@ -322,7 +405,7 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
return;
}
final sendStore = Provider.of<SendStore>(context);
/*final sendStore = Provider.of<SendStore>(context);
reaction((_) => sendStore.state, (SendingState state) {
if (state is SendingFailed) {
@@ -376,7 +459,7 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
});
});
}
});
});*/
_effectsInstalled = true;
}
@@ -0,0 +1,57 @@
import 'dart:ui';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/src/widgets/alert_background.dart';
class InformationPage extends StatelessWidget {
InformationPage({@required this.information});
final String information;
@override
Widget build(BuildContext context) {
return AlertBackground(
child: Center(
child: Container(
margin: EdgeInsets.only(
left: 24,
right: 24
),
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(30)),
color: Theme.of(context).textTheme.body2.decorationColor
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
padding: EdgeInsets.fromLTRB(24, 28, 24, 24),
child: Text(
information,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.normal,
fontFamily: 'Poppins',
decoration: TextDecoration.none,
color: Theme.of(context).accentTextTheme.caption.decorationColor
),
),
),
Padding(
padding: EdgeInsets.fromLTRB(10, 0, 10, 10),
child: PrimaryButton(
onPressed: () => Navigator.of(context).pop(),
text: S.of(context).send_got_it,
color: Theme.of(context).accentTextTheme.caption.backgroundColor,
textColor: Theme.of(context).primaryTextTheme.title.color
),
)
],
),
),
)
);
}
}
@@ -0,0 +1,8 @@
import 'package:flutter/material.dart';
class ExchangeTradeRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container();
}
}