@ -1,5 +1,6 @@
import ' package:flutter/material.dart ' ;
import ' package:flutter/cupertino.dart ' ;
import ' package:flutter_mobx/flutter_mobx.dart ' ;
import ' package:provider/provider.dart ' ;
import ' package:cake_wallet/generated/i18n.dart ' ;
import ' package:cake_wallet/src/domain/common/crypto_currency.dart ' ;
@ -10,6 +11,9 @@ import 'package:cake_wallet/src/widgets/primary_button.dart';
import ' package:cake_wallet/src/widgets/address_text_field.dart ' ;
import ' package:cake_wallet/src/widgets/scollable_with_bottom_section.dart ' ;
import ' package:cake_wallet/palette.dart ' ;
import ' package:cake_wallet/src/widgets/base_text_form_field.dart ' ;
import ' package:cake_wallet/src/screens/exchange/widgets/currency_picker.dart ' ;
import ' package:cake_wallet/src/widgets/alert_with_one_action.dart ' ;
class ContactPage extends BasePage {
ContactPage ( { this . contact } ) ;
@ -19,6 +23,9 @@ class ContactPage extends BasePage {
@ override
String get title = > S . current . contact ;
@ override
Color get backgroundColor = > PaletteDark . historyPanel ;
@ override
Widget body ( BuildContext context ) = > ContactForm ( contact ) ;
}
@ -37,22 +44,31 @@ class ContactFormState extends State<ContactForm> {
final _contactNameController = TextEditingController ( ) ;
final _currencyTypeController = TextEditingController ( ) ;
final _addressController = TextEditingController ( ) ;
final currencies = CryptoCurrency . all ;
final downArrow = Image . asset (
' assets/images/arrow_bottom_purple_icon.png ' ,
color: PaletteDark . walletCardText ,
height: 8 ) ;
CryptoCurrency _selectectCrypto = CryptoCurrency . xmr ;
CryptoCurrency _selectectCrypto ;
@ override
void initState ( ) {
super . initState ( ) ;
if ( widget . contact = = null ) {
_currencyTypeController . text = _selectectCrypto . toString ( ) ;
} else {
if ( widget . contact ! = null ) {
_selectectCrypto = widget . contact . type ;
_contactNameController . text = widget . contact . name ;
_currencyTypeController . text = _selectectCrypto . toString ( ) ;
_addressController . text = widget . contact . address ;
WidgetsBinding . instance . addPostFrameCallback ( afterLayout ) ;
}
}
void afterLayout ( dynamic _ ) {
final addressBookStore = Provider . of < AddressBookStore > ( context ) ;
addressBookStore . setDisabledStatus ( false ) ;
}
@ override
void dispose ( ) {
_contactNameController . dispose ( ) ;
@ -61,198 +77,164 @@ class ContactFormState extends State<ContactForm> {
super . dispose ( ) ;
}
Future < void > _setCurrencyType ( BuildContext context ) async {
var currencyType = CryptoCurrency . all [ 0 ] . toString ( ) ;
var selectedCurrency = CryptoCurrency . all [ 0 ] ;
await showDialog < void > (
context: context ,
builder: ( BuildContext context ) {
return AlertDialog (
title: Text ( S . of ( context ) . please_select ) ,
backgroundColor: Theme . of ( context ) . backgroundColor ,
content: Container (
height: 150.0 ,
child: CupertinoPicker (
backgroundColor: Theme . of ( context ) . backgroundColor ,
itemExtent: 45.0 ,
onSelectedItemChanged: ( int index ) {
selectedCurrency = CryptoCurrency . all [ index ] ;
currencyType = CryptoCurrency . all [ index ] . toString ( ) ;
} ,
children:
List . generate ( CryptoCurrency . all . length , ( int index ) {
return Center (
child: Text (
CryptoCurrency . all [ index ] . toString ( ) ,
style: TextStyle (
color: Theme . of ( context )
. primaryTextTheme
. caption
. color ) ,
) ,
) ;
} ) ) ,
) ,
actions: < Widget > [
FlatButton (
onPressed: ( ) {
Navigator . pop ( context ) ;
} ,
child: Text ( S . of ( context ) . cancel ) ) ,
FlatButton (
onPressed: ( ) {
_selectectCrypto = selectedCurrency ;
_currencyTypeController . text = currencyType ;
Navigator . of ( context ) . pop ( ) ;
} ,
child: Text ( S . of ( context ) . ok ) )
] ,
) ;
} ) ;
void onHandleControllers ( AddressBookStore addressBookStore ) {
if ( _contactNameController . text . isNotEmpty & &
_addressController . text . isNotEmpty & &
_currencyTypeController . text . isNotEmpty ) {
addressBookStore . setDisabledStatus ( false ) ;
} else {
addressBookStore . setDisabledStatus ( true ) ;
}
}
@ override
Widget build ( BuildContext context ) {
final addressBookStore = Provider . of < AddressBookStore > ( context ) ;
return ScrollableWithBottomSection (
content: Form (
key: _formKey ,
child: Column (
mainAxisSize: MainAxisSize . min ,
children: < Widget > [
TextFormField (
style: TextStyle (
fontSize: 14.0 ,
color: Theme . of ( context ) . primaryTextTheme . headline . color ) ,
decoration: InputDecoration (
hintStyle: TextStyle ( color: Theme . of ( context ) . hintColor ) ,
hintText: S . of ( context ) . contact_name ,
focusedBorder: UnderlineInputBorder (
borderSide:
BorderSide ( color: Palette . cakeGreen , width: 2.0 ) ) ,
enabledBorder: UnderlineInputBorder (
borderSide: BorderSide (
color: Theme . of ( context ) . focusColor , width: 1.0 ) ) ) ,
controller: _contactNameController ,
validator: ( value ) {
addressBookStore . validateContactName ( value ) ;
return addressBookStore . errorMessage ;
} ,
) ,
SizedBox ( height: 14.0 ) ,
Container (
child: InkWell (
onTap: ( ) = > _setCurrencyType ( context ) ,
child: IgnorePointer (
child: TextFormField (
style: TextStyle (
fontSize: 14.0 ,
color: Theme . of ( context )
. primaryTextTheme
. headline
. color ) ,
decoration: InputDecoration (
focusedBorder: UnderlineInputBorder (
borderSide: BorderSide (
color: Palette . cakeGreen , width: 2.0 ) ) ,
enabledBorder: UnderlineInputBorder (
borderSide: BorderSide (
color: Theme . of ( context ) . focusColor ,
width: 1.0 ) ) ) ,
controller: _currencyTypeController ,
_contactNameController . addListener ( ( ) { onHandleControllers ( addressBookStore ) ; } ) ;
_currencyTypeController . addListener ( ( ) { onHandleControllers ( addressBookStore ) ; } ) ;
_addressController . addListener ( ( ) { onHandleControllers ( addressBookStore ) ; } ) ;
return Container (
color: PaletteDark . historyPanel ,
child: ScrollableWithBottomSection (
contentPadding: EdgeInsets . all ( 24 ) ,
content: Form (
key: _formKey ,
child: Column (
mainAxisSize: MainAxisSize . min ,
children: < Widget > [
BaseTextFormField (
controller: _contactNameController ,
hintText: S . of ( context ) . contact_name ,
borderColor: PaletteDark . walletCardSubAddressField ,
validator: ( value ) {
addressBookStore . validateContactName ( value ) ;
return addressBookStore . errorMessage ;
}
) ,
Padding (
padding: EdgeInsets . only ( top: 20 ) ,
child: Container (
child: InkWell (
onTap: ( ) = > _presentPicker ( context ) ,
child: IgnorePointer (
child: BaseTextFormField (
controller: _currencyTypeController ,
hintText: S . of ( context ) . settings_currency ,
borderColor: PaletteDark . walletCardSubAddressField ,
suffixIcon: Row (
mainAxisSize: MainAxisSize . min ,
mainAxisAlignment: MainAxisAlignment . end ,
children: < Widget > [
downArrow
] ,
) ,
)
) ,
) ,
) ,
) ,
) ,
SizedBox ( height: 14.0 ) ,
AddressTextField (
controller: _addressController ,
options: [ AddressTextFieldOption . qrCode ] ,
validator: ( value ) {
addressBookStore . validateAddress ( value ,
cryptoCurrency: _selectectCrypto ) ;
return addressBookStore . errorMessage ;
} ,
)
] ,
) ,
) ,
bottomSection: Row (
children: < Widget > [
Expanded (
child: PrimaryButton (
onPressed: ( ) {
setState ( ( ) {
_selectectCrypto = CryptoCurrency . xmr ;
_contactNameController . text = ' ' ;
_currencyTypeController . text =
_selectectCrypto . toString ( ) ;
_addressController . text = ' ' ;
} ) ;
} ,
text: S . of ( context ) . reset ,
color:
Theme . of ( context ) . accentTextTheme . button . backgroundColor ,
textColor:
Theme . of ( context ) . primaryTextTheme . button . color ) ,
Padding (
padding: EdgeInsets . only ( top: 20 ) ,
child: AddressTextField (
controller: _addressController ,
options: [ AddressTextFieldOption . qrCode ] ,
validator: ( value ) {
addressBookStore . validateAddress ( value ,
cryptoCurrency: _selectectCrypto ) ;
return addressBookStore . errorMessage ;
} ,
) ,
)
] ,
) ,
SizedBox ( width: 20 ) ,
Expanded (
) ,
bottomSectionPadding: EdgeInsets . only (
left: 24 ,
right: 24 ,
bottom: 24
) ,
bottomSection: Row (
children: < Widget > [
Expanded (
child: PrimaryButton (
onPressed: ( ) async {
if ( ! _formKey . currentState . validate ( ) ) {
return ;
}
try {
if ( widget . contact = = null ) {
final newContact = Contact (
name: _contactNameController . text ,
address: _addressController . text ,
type: _selectectCrypto ) ;
await addressBookStore . add ( contact: newContact ) ;
} else {
widget . contact . name = _contactNameController . text ;
widget . contact . address = _addressController . text ;
widget . contact
. updateCryptoCurrency ( currency: _selectectCrypto ) ;
onPressed: ( ) {
setState ( ( ) {
_selectectCrypto = null ;
_contactNameController . text = ' ' ;
_currencyTypeController . text = ' ' ;
_addressController . text = ' ' ;
} ) ;
} ,
text: S . of ( context ) . reset ,
color: Colors . red ,
textColor: Colors . white
) ,
) ,
SizedBox ( width: 20 ) ,
Expanded (
child: Observer (
builder: ( _ ) = > PrimaryButton (
onPressed: ( ) async {
if ( ! _formKey . currentState . validate ( ) ) {
return ;
}
await addressBookStore . update (
contact: widget . contact ) ;
try {
if ( widget . contact = = null ) {
final newContact = Contact (
name: _contactNameController . text ,
address: _addressController . text ,
type: _selectectCrypto ) ;
await addressBookStore . add ( contact: newContact ) ;
} else {
widget . contact . name = _contactNameController . text ;
widget . contact . address = _addressController . text ;
widget . contact
. updateCryptoCurrency ( currency: _selectectCrypto ) ;
await addressBookStore . update (
contact: widget . contact ) ;
}
Navigator . pop ( context ) ;
} catch ( e ) {
await showDialog < void > (
context: context ,
builder: ( BuildContext context ) {
return AlertWithOneAction (
alertTitle: S . current . contact ,
alertContent: e . toString ( ) ,
buttonText: S . of ( context ) . ok ,
buttonAction: ( ) = > Navigator . of ( context ) . pop ( )
) ;
} ) ;
}
Navigator . pop ( context ) ;
} catch ( e ) {
await showDialog < void > (
context: context ,
builder: ( BuildContext context ) {
return AlertDialog (
title: Text (
e . toString ( ) ,
textAlign: TextAlign . center ,
) ,
actions: < Widget > [
FlatButton (
onPressed: ( ) = >
Navigator . of ( context ) . pop ( ) ,
child: Text ( S . of ( context ) . ok ) )
] ,
) ;
} ) ;
}
} ,
text: S . of ( context ) . save ,
color: Theme . of ( context )
. primaryTextTheme
. button
. backgroundColor ,
textColor: Theme . of ( context )
. primaryTextTheme
. button
. color ) )
] ,
) ) ;
} ,
text: S . of ( context ) . save ,
color: Colors . green ,
textColor: Colors . white ,
isDisabled: addressBookStore . isDisabledStatus ,
)
)
)
] ,
) ) ,
) ;
}
void _presentPicker ( BuildContext context ) {
showDialog < void > (
builder: ( _ ) = > CurrencyPicker (
selectedAtIndex: currencies . indexOf ( _selectectCrypto ) ,
items: currencies ,
title: S . of ( context ) . please_select ,
onItemSelected: ( CryptoCurrency item ) {
_selectectCrypto = item ;
_currencyTypeController . text = _selectectCrypto . toString ( ) ;
}
) ,
context: context ) ;
}
}