CAKE-177. CAKE-176. CAKE-115.

This commit is contained in:
M 2020-11-16 20:17:03 +02:00
parent 70cf8f4560
commit 6418b28c08
5 changed files with 142 additions and 100 deletions

View file

@ -203,7 +203,8 @@ Future setup(
authPageState.changeProcessText('Loading the wallet'); authPageState.changeProcessText('Loading the wallet');
if (loginError != null) { if (loginError != null) {
authPageState.changeProcessText('ERROR: ${loginError.toString()}'); authPageState
.changeProcessText('ERROR: ${loginError.toString()}');
} }
ReactionDisposer _reaction; ReactionDisposer _reaction;

View file

@ -5,6 +5,14 @@ import 'package:cake_wallet/entities/crypto_currency.dart';
import 'package:cake_wallet/core/amount_converter.dart'; import 'package:cake_wallet/core/amount_converter.dart';
import 'package:cake_wallet/core/pending_transaction.dart'; import 'package:cake_wallet/core/pending_transaction.dart';
class DoubleSpendException implements Exception {
DoubleSpendException();
@override
String toString() =>
'This transaction cannot be committed. This can be due to many reasons including the wallet not being synced, there is not enough XMR in your available balance, or previous transactions are not yet fully processed.';
}
class PendingMoneroTransaction with PendingTransaction { class PendingMoneroTransaction with PendingTransaction {
PendingMoneroTransaction(this.pendingTransactionDescription); PendingMoneroTransaction(this.pendingTransactionDescription);
@ -22,7 +30,18 @@ class PendingMoneroTransaction with PendingTransaction {
CryptoCurrency.xmr, pendingTransactionDescription.fee); CryptoCurrency.xmr, pendingTransactionDescription.fee);
@override @override
Future<void> commit() async => Future<void> commit() async {
try {
monero_transaction_history.commitTransactionFromPointerAddress( monero_transaction_history.commitTransactionFromPointerAddress(
address: pendingTransactionDescription.pointerAddress); address: pendingTransactionDescription.pointerAddress);
} catch (e) {
final message = e.toString();
if (message.contains('Reason: double spend')) {
throw DoubleSpendException();
}
rethrow;
}
}
} }

View file

@ -39,14 +39,12 @@ class AuthPageState extends State<AuthPage> {
_reaction ??= _reaction ??=
reaction((_) => widget.authViewModel.state, (ExecutionState state) { reaction((_) => widget.authViewModel.state, (ExecutionState state) {
if (state is ExecutedSuccessfullyState) { if (state is ExecutedSuccessfullyState) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (widget.onAuthenticationFinished != null) { if (widget.onAuthenticationFinished != null) {
widget.onAuthenticationFinished(true, this); widget.onAuthenticationFinished(true, this);
} else { } else {
_authBar?.dismiss(); _authBar?.dismiss();
showBar<void>(context, S.of(context).authenticated); showBar<void>(context, S.of(context).authenticated);
} }
});
} }
if (state is IsExecutingState) { if (state is IsExecutingState) {

View file

@ -1,3 +1,4 @@
import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
@ -15,9 +16,10 @@ import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_h
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart';
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart';
import 'package:cake_wallet/src/screens/receive/widgets/qr_widget.dart'; import 'package:cake_wallet/src/screens/receive/widgets/qr_widget.dart';
import 'package:keyboard_actions/keyboard_actions.dart';
class ReceivePage extends BasePage { class ReceivePage extends BasePage {
ReceivePage({this.addressListViewModel}); ReceivePage({this.addressListViewModel}) : _cryptoAmountFocus = FocusNode();
final WalletAddressListViewModel addressListViewModel; final WalletAddressListViewModel addressListViewModel;
@ -33,6 +35,8 @@ class ReceivePage extends BasePage {
@override @override
Color get titleColor => Colors.white; Color get titleColor => Colors.white;
final FocusNode _cryptoAmountFocus;
@override @override
Widget Function(BuildContext, Widget) get rootWrapper => Widget Function(BuildContext, Widget) get rootWrapper =>
(BuildContext context, Widget scaffold) => Container( (BuildContext context, Widget scaffold) => Container(
@ -67,7 +71,20 @@ class ReceivePage extends BasePage {
@override @override
Widget body(BuildContext context) { Widget body(BuildContext context) {
return SingleChildScrollView( return KeyboardActions(
config: KeyboardActionsConfig(
keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
keyboardBarColor: isDarkTheme
? Color.fromRGBO(48, 51, 60, 1.0)
: Color.fromRGBO(98, 98, 98, 1.0),
nextFocus: false,
actions: [
KeyboardActionsItem(
focusNode: _cryptoAmountFocus,
toolbarButtons: [(_) => KeyboardDoneButton()],
)
]),
child: SingleChildScrollView(
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
Padding( Padding(
@ -75,7 +92,7 @@ class ReceivePage extends BasePage {
child: QRWidget( child: QRWidget(
addressListViewModel: addressListViewModel, addressListViewModel: addressListViewModel,
isAmountFieldShow: true, isAmountFieldShow: true,
), amountTextFieldFocusNode: _cryptoAmountFocus),
), ),
Observer( Observer(
builder: (_) => ListView.separated( builder: (_) => ListView.separated(
@ -99,7 +116,8 @@ class ReceivePage extends BasePage {
icon: Icon( icon: Icon(
Icons.arrow_forward_ios, Icons.arrow_forward_ios,
size: 14, size: 14,
color: Theme.of(context).textTheme.display1.color, color:
Theme.of(context).textTheme.display1.color,
)); ));
} }
@ -111,7 +129,8 @@ class ReceivePage extends BasePage {
icon: Icon( icon: Icon(
Icons.add, Icons.add,
size: 20, size: 20,
color: Theme.of(context).textTheme.display1.color, color:
Theme.of(context).textTheme.display1.color,
)); ));
} }
@ -136,7 +155,8 @@ class ReceivePage extends BasePage {
isCurrent: isCurrent, isCurrent: isCurrent,
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
textColor: textColor, textColor: textColor,
onTap: (_) => addressListViewModel.setAddress(item), onTap: (_) =>
addressListViewModel.setAddress(item),
onEdit: () => Navigator.of(context).pushNamed( onEdit: () => Navigator.of(context).pushNamed(
Routes.newSubaddress, Routes.newSubaddress,
arguments: item)); arguments: item));
@ -154,6 +174,6 @@ class ReceivePage extends BasePage {
})), })),
], ],
), ),
); ));
} }
} }

View file

@ -11,7 +11,9 @@ import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_v
class QRWidget extends StatelessWidget { class QRWidget extends StatelessWidget {
QRWidget( QRWidget(
{@required this.addressListViewModel, this.isAmountFieldShow = false}) {@required this.addressListViewModel,
this.isAmountFieldShow = false,
this.amountTextFieldFocusNode})
: amountController = TextEditingController(), : amountController = TextEditingController(),
_formKey = GlobalKey<FormState>() { _formKey = GlobalKey<FormState>() {
amountController.addListener(() => addressListViewModel.amount = amountController.addListener(() => addressListViewModel.amount =
@ -21,6 +23,7 @@ class QRWidget extends StatelessWidget {
final WalletAddressListViewModel addressListViewModel; final WalletAddressListViewModel addressListViewModel;
final bool isAmountFieldShow; final bool isAmountFieldShow;
final TextEditingController amountController; final TextEditingController amountController;
final FocusNode amountTextFieldFocusNode;
final GlobalKey<FormState> _formKey; final GlobalKey<FormState> _formKey;
@override @override
@ -68,6 +71,7 @@ class QRWidget extends StatelessWidget {
child: Form( child: Form(
key: _formKey, key: _formKey,
child: BaseTextFormField( child: BaseTextFormField(
focusNode: amountTextFieldFocusNode,
controller: amountController, controller: amountController,
keyboardType: TextInputType.numberWithOptions( keyboardType: TextInputType.numberWithOptions(
decimal: true), decimal: true),