From 3f1bb416d453f0e43436e18d2ff807677c4cc537 Mon Sep 17 00:00:00 2001 From: Oleksandr Sobol Date: Tue, 19 May 2020 20:47:42 +0300 Subject: [PATCH 1/2] CWA-215 | applied new design to address book page --- assets/images/2.0x/litecoin.png | Bin 0 -> 1980 bytes assets/images/3.0x/litecoin.png | Bin 0 -> 3368 bytes assets/images/litecoin.png | Bin 0 -> 941 bytes lib/generated/i18n.dart | 46 ++++ .../address_book/address_book_page.dart | 218 +++++++++--------- res/values/strings_de.arb | 2 + res/values/strings_en.arb | 2 + res/values/strings_es.arb | 2 + res/values/strings_hi.arb | 2 + res/values/strings_ja.arb | 2 + res/values/strings_ko.arb | 2 + res/values/strings_nl.arb | 2 + res/values/strings_pl.arb | 2 + res/values/strings_pt.arb | 2 + res/values/strings_ru.arb | 2 + res/values/strings_uk.arb | 2 + res/values/strings_zh.arb | 2 + 17 files changed, 179 insertions(+), 109 deletions(-) create mode 100644 assets/images/2.0x/litecoin.png create mode 100644 assets/images/3.0x/litecoin.png create mode 100644 assets/images/litecoin.png diff --git a/assets/images/2.0x/litecoin.png b/assets/images/2.0x/litecoin.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6d0e6a0acadd445e3b3155681c5a0c6b0588fd GIT binary patch literal 1980 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 P00000NkvXXu0mjf^D>u9 literal 0 HcmV?d00001 diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 608c882b0..56fac72e2 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -29,6 +29,8 @@ class S implements WidgetsLocalizations { String get add_new_word => "Add new word"; String get address_book => "Address Book"; String get address_book_menu => "Address book"; + String get address_remove_contact => "Remove contact"; + String get address_remove_content => "Are you sure that you want to remove selected contact?"; String get all => "ALL"; String get amount => "Amount: "; String get amount_is_estimate => "The receive amount is an estimate"; @@ -766,6 +768,8 @@ class $de extends S { @override String get trade_history_title => "Handelsgeschichte"; @override + String get address_remove_contact => "Kontakt entfernen"; + @override String get error_text_wallet_name => "Der Wallet darf nur Buchstaben und Zahlen enthalten\nund muss zwischen 1 und 15 Zeichen lang sein"; @override String get restore_description_from_keys => "Stellen Sie Ihr Wallet von generiert wieder her Tastenanschläge, die von Ihren privaten Schlüsseln gespeichert wurden"; @@ -836,6 +840,8 @@ class $de extends S { @override String get ok => "OK"; @override + String get address_remove_content => "Sind Sie sicher, dass Sie den ausgewählten Kontakt entfernen möchten?"; + @override String get wallet_list_title => "Monero Wallet"; @override String get authentication => "Authentifizierung"; @@ -1378,6 +1384,8 @@ class $hi extends S { @override String get trade_history_title => "व्यापार का इतिहास"; @override + String get address_remove_contact => "संपर्क हटाये"; + @override String get error_text_wallet_name => "वॉलेट नाम में केवल अक्षर, संख्याएं हो सकती हैं\nऔर 1 और 15 वर्णों के बीच लंबा होना चाहिए"; @override String get restore_description_from_keys => "अपने वॉलेट को जेनरेट से पुनर्स्थापित करें आपकी निजी कुंजी से कीस्ट्रोक्स सहेजे गए"; @@ -1448,6 +1456,8 @@ class $hi extends S { @override String get ok => "ठीक है"; @override + String get address_remove_content => "क्या आप वाकई चयनित संपर्क को हटाना चाहते हैं?"; + @override String get wallet_list_title => "Monero बटुआ"; @override String get authentication => "प्रमाणीकरण"; @@ -1990,6 +2000,8 @@ class $ru extends S { @override String get trade_history_title => "История сделок"; @override + String get address_remove_contact => "Удалить контакт"; + @override String get error_text_wallet_name => "Имя кошелька может содержать только буквы, цифры\nи должно быть от 1 до 15 символов в длину"; @override String get restore_description_from_keys => "Вы можете восстановить кошелёк с помощью приватных ключей"; @@ -2060,6 +2072,8 @@ class $ru extends S { @override String get ok => "OK"; @override + String get address_remove_content => "Вы уверены, что хотите удалить выбранный контакт?"; + @override String get wallet_list_title => "Monero Кошелёк"; @override String get authentication => "Аутентификация"; @@ -2602,6 +2616,8 @@ class $ko extends S { @override String get trade_history_title => "무역 역사"; @override + String get address_remove_contact => "연락처 삭제"; + @override String get error_text_wallet_name => "지갑 이름은 문자, 숫자 만 포함 할 수 있습니다\n1 ~ 15 자 사이 여야합니다"; @override String get restore_description_from_keys => "개인 키에서 저장된 생성 된 키 스트로크에서 월렛 복원"; @@ -2672,6 +2688,8 @@ class $ko extends S { @override String get ok => "승인"; @override + String get address_remove_content => "선택한 연락처를 삭제 하시겠습니까?"; + @override String get wallet_list_title => "모네로 월렛"; @override String get authentication => "입증"; @@ -3214,6 +3232,8 @@ class $pt extends S { @override String get trade_history_title => "Histórico de trocas"; @override + String get address_remove_contact => "Remover contato"; + @override String get error_text_wallet_name => "O nome da carteira só pode conter letras, números\ne deve ter entre 1 e 15 caracteres"; @override String get restore_description_from_keys => "Restaure sua carteira a partir de suas chaves privadas"; @@ -3284,6 +3304,8 @@ class $pt extends S { @override String get ok => "Ok"; @override + String get address_remove_content => "Tem certeza de que deseja remover o contato selecionado?"; + @override String get wallet_list_title => "Carteira Monero"; @override String get authentication => "Autenticação"; @@ -3826,6 +3848,8 @@ class $uk extends S { @override String get trade_history_title => "Історія операцій"; @override + String get address_remove_contact => "Видалити контакт"; + @override String get error_text_wallet_name => "Ім'я гаманця може містити тільки букви, цифри\nі повинно бути від 1 до 15 символів в довжину"; @override String get restore_description_from_keys => "Ви можете відновити гаманець за допомогою приватних ключів"; @@ -3896,6 +3920,8 @@ class $uk extends S { @override String get ok => "OK"; @override + String get address_remove_content => "Ви впевнені, що хочете видалити вибраний контакт?"; + @override String get wallet_list_title => "Monero Гаманець"; @override String get authentication => "Аутентифікація"; @@ -4438,6 +4464,8 @@ class $ja extends S { @override String get trade_history_title => "取引履歴"; @override + String get address_remove_contact => "連絡先を削除します"; + @override String get error_text_wallet_name => "ウォレット名には文字のみを含めることができます\n1〜15文字である必要があります"; @override String get restore_description_from_keys => "生成されたウォレットを復元します秘密鍵から保存されたキーストローク"; @@ -4508,6 +4536,8 @@ class $ja extends S { @override String get ok => "OK"; @override + String get address_remove_content => "選択した連絡先を削除してもよろしいですか?"; + @override String get wallet_list_title => "Monero 財布"; @override String get authentication => "認証"; @@ -5054,6 +5084,8 @@ class $pl extends S { @override String get trade_history_title => "Historia handlu"; @override + String get address_remove_contact => "Usuń kontakt"; + @override String get error_text_wallet_name => "Nazwa portfela może zawierać tylko litery i cyfry\ni musi mieć od 1 do 15 znaków"; @override String get restore_description_from_keys => "Przywróć swój portfel z wygenerowanego naciśnięcia klawiszy zapisane z kluczy prywatnych"; @@ -5124,6 +5156,8 @@ class $pl extends S { @override String get ok => "Dobrze"; @override + String get address_remove_content => "Czy na pewno chcesz usunąć wybrany kontakt?"; + @override String get wallet_list_title => "Portfel Monero"; @override String get authentication => "Poświadczenie"; @@ -5666,6 +5700,8 @@ class $es extends S { @override String get trade_history_title => "Historia del comercio"; @override + String get address_remove_contact => "Remover contacto"; + @override String get error_text_wallet_name => "El nombre de la billetera solo puede contener letras, números \ny debe tener entre 1 y 15 caracteres de longitud"; @override String get restore_description_from_keys => "Restaure su billetera de las pulsaciones de teclas generadas guardadas de sus claves privadas"; @@ -5736,6 +5772,8 @@ class $es extends S { @override String get ok => "OK"; @override + String get address_remove_content => "¿Estás seguro de que quieres eliminar el contacto seleccionado?"; + @override String get wallet_list_title => "Monedero Monero"; @override String get authentication => "Autenticación"; @@ -6278,6 +6316,8 @@ class $nl extends S { @override String get trade_history_title => "Handelsgeschiedenis"; @override + String get address_remove_contact => "Contact verwijderen"; + @override String get error_text_wallet_name => "Naam portemonnee kan alleen letters, cijfers bevatten\nen moet tussen de 1 en 15 tekens lang zijn"; @override String get restore_description_from_keys => "Herstel uw portemonnee van gegenereerd toetsaanslagen opgeslagen van uw privésleutels"; @@ -6348,6 +6388,8 @@ class $nl extends S { @override String get ok => "OK"; @override + String get address_remove_content => "Weet u zeker dat u het geselecteerde contact wilt verwijderen?"; + @override String get wallet_list_title => "Monero portemonnee"; @override String get authentication => "Authenticatie"; @@ -6890,6 +6932,8 @@ class $zh extends S { @override String get trade_history_title => "交易历史"; @override + String get address_remove_contact => "刪除聯繫人"; + @override String get error_text_wallet_name => "钱包名称只能包含字母,数字\n且必须介于1到15个字符之间"; @override String get restore_description_from_keys => "R从生成的电子钱包从您的私钥中保存的击键"; @@ -6960,6 +7004,8 @@ class $zh extends S { @override String get ok => "好"; @override + String get address_remove_content => "您確定要刪除所選的聯繫人嗎?"; + @override String get wallet_list_title => "Monero 钱包"; @override String get authentication => "认证方式"; diff --git a/lib/src/screens/address_book/address_book_page.dart b/lib/src/screens/address_book/address_book_page.dart index 97351f91b..4a66c3092 100644 --- a/lib/src/screens/address_book/address_book_page.dart +++ b/lib/src/screens/address_book/address_book_page.dart @@ -10,6 +10,7 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/domain/common/crypto_currency.dart'; import 'package:cake_wallet/src/stores/address_book/address_book_store.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; class AddressBookPage extends BasePage { AddressBookPage({this.isEditable = true}); @@ -17,14 +18,11 @@ class AddressBookPage extends BasePage { final bool isEditable; @override - bool get isModalBackButton => true; + Color get backgroundColor => PaletteDark.historyPanel; @override String get title => S.current.address_book; - @override - AppBarStyle get appBarStyle => AppBarStyle.withShadow; - @override Widget trailing(BuildContext context) { if (!isEditable) { @@ -34,17 +32,17 @@ class AddressBookPage extends BasePage { final addressBookStore = Provider.of(context); return Container( - width: 28.0, - height: 28.0, + width: 32.0, + height: 32.0, decoration: BoxDecoration( - shape: BoxShape.circle, color: Theme.of(context).selectedRowColor), + shape: BoxShape.circle, color: PaletteDark.menuList), child: Stack( alignment: Alignment.center, children: [ - Icon(Icons.add, color: Palette.violet, size: 22.0), + Icon(Icons.add, color: Colors.white, size: 22.0), ButtonTheme( - minWidth: 28.0, - height: 28.0, + minWidth: 32.0, + height: 32.0, child: FlatButton( shape: CircleBorder(), onPressed: () async { @@ -63,20 +61,30 @@ class AddressBookPage extends BasePage { final addressBookStore = Provider.of(context); return Container( + color: PaletteDark.historyPanel, padding: EdgeInsets.only(top: 20.0, bottom: 20.0), child: Observer( builder: (_) => ListView.separated( - separatorBuilder: (_, __) => Divider( - color: Theme.of(context).dividerTheme.color, - height: 1.0, - ), + separatorBuilder: (_, __) => Container( + height: 1, + padding: EdgeInsets.only(left: 24), + color: PaletteDark.menuList, + child: Container( + height: 1, + color: PaletteDark.mainBackgroundColor, + ), + ), itemCount: addressBookStore.contactList == null ? 0 : addressBookStore.contactList.length, itemBuilder: (BuildContext context, int index) { final contact = addressBookStore.contactList[index]; + final image = _getCurrencyImage(contact.type); - final content = ListTile( + final isDrawTop = index == 0 ? true : false; + final isDrawBottom = index == addressBookStore.contactList.length - 1 ? true : false; + + final content = GestureDetector( onTap: () async { if (!isEditable) { Navigator.of(context).pop(contact); @@ -86,39 +94,69 @@ class AddressBookPage extends BasePage { final isCopied = await showNameAndAddressDialog( context, contact.name, contact.address); - if (isCopied) { + if (isCopied != null && isCopied) { await Clipboard.setData( ClipboardData(text: contact.address)); Scaffold.of(context).showSnackBar( SnackBar( - content: Text('Copied to Clipboard'), + content: Text( + S.of(context).copied_to_clipboard, + style: TextStyle( + color: Colors.white + ), + ), backgroundColor: Colors.green, duration: Duration(milliseconds: 1500), ), ); } }, - leading: Container( - height: 25.0, - width: 48.0, - alignment: Alignment.center, - decoration: BoxDecoration( - color: _getCurrencyBackgroundColor(contact.type), - borderRadius: BorderRadius.circular(6.0), - ), - child: Text( - contact.type.toString(), - style: TextStyle( - fontSize: 11.0, - color: _getCurrencyTextColor(contact.type), + child: Column( + children: [ + isDrawTop + ? Container( + width: double.infinity, + height: 1, + color: PaletteDark.mainBackgroundColor, + ) + : Offstage(), + Container( + width: double.infinity, + color: PaletteDark.menuList, + child: Padding( + padding: const EdgeInsets.only(left: 24, top: 16, bottom: 16, right: 24), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + image != null + ? image + : Offstage(), + Padding( + padding: image != null + ? EdgeInsets.only(left: 12) + : EdgeInsets.only(left: 0), + child: Text( + contact.name, + style: TextStyle( + fontSize: 14, + color: Colors.white + ), + ), + ) + ], + ) + ), ), - ), - ), - title: Text( - contact.name, - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context).primaryTextTheme.title.color), + isDrawBottom + ? Container( + width: double.infinity, + height: 1, + color: PaletteDark.mainBackgroundColor, + ) + : Offstage(), + ], ), ); @@ -130,7 +168,7 @@ class AddressBookPage extends BasePage { child: content, secondaryActions: [ IconSlideAction( - caption: 'Edit', + caption: S.of(context).edit, color: Colors.blue, icon: Icons.edit, onTap: () async { @@ -141,7 +179,7 @@ class AddressBookPage extends BasePage { }, ), IconSlideAction( - caption: 'Delete', + caption: S.of(context).delete, color: Colors.red, icon: CupertinoIcons.delete, onTap: () async { @@ -171,95 +209,68 @@ class AddressBookPage extends BasePage { )); } - Color _getCurrencyBackgroundColor(CryptoCurrency currency) { - Color color; + Image _getCurrencyImage(CryptoCurrency currency) { + Image image; switch (currency) { case CryptoCurrency.xmr: - color = Palette.cakeGreenWithOpacity; + image = Image.asset('assets/images/monero.png', height: 24, width: 24); break; case CryptoCurrency.ada: - color = Colors.blue[200]; + image = null; break; case CryptoCurrency.bch: - color = Colors.orangeAccent; + image = null; break; case CryptoCurrency.bnb: - color = Colors.blue; + image = null; break; case CryptoCurrency.btc: - color = Colors.orange; + image = Image.asset('assets/images/bitcoin.png', height: 24, width: 24); break; case CryptoCurrency.dash: - color = Colors.blue; + image = null; break; case CryptoCurrency.eos: - color = Colors.orangeAccent; + image = null; break; case CryptoCurrency.eth: - color = Colors.black; + image = null; break; case CryptoCurrency.ltc: - color = Colors.blue[200]; + image = Image.asset('assets/images/litecoin.png', height: 24, width: 24); break; case CryptoCurrency.nano: - color = Colors.orange; + image = null; break; case CryptoCurrency.trx: - color = Colors.black; + image = null; break; case CryptoCurrency.usdt: - color = Colors.blue[200]; + image = null; break; case CryptoCurrency.xlm: - color = color = Colors.blue; + image = null; break; case CryptoCurrency.xrp: - color = Colors.orangeAccent; + image = null; break; default: - color = Colors.white; + image = null; } - return color; - } - - Color _getCurrencyTextColor(CryptoCurrency currency) { - Color color; - switch (currency) { - case CryptoCurrency.xmr: - color = Palette.cakeGreen; - break; - case CryptoCurrency.ltc: - case CryptoCurrency.ada: - case CryptoCurrency.usdt: - color = Palette.lightBlue; - break; - default: - color = Colors.white; - } - return color; + return image; } Future showAlertDialog(BuildContext context) async { return await showDialog( context: context, builder: (BuildContext context) { - return AlertDialog( - title: const Text( - 'Remove contact', - textAlign: TextAlign.center, - ), - content: const Text( - 'Are you sure that you want to remove selected contact?', - textAlign: TextAlign.center, - ), - actions: [ - FlatButton( - onPressed: () => Navigator.of(context).pop( false), - child: const Text('Cancel')), - FlatButton( - onPressed: () => Navigator.of(context).pop(true), - child: const Text('Remove')), - ], + return AlertWithTwoActions( + alertTitle: S.of(context).address_remove_contact, + alertContent: S.of(context).address_remove_content, + leftButtonText: S.of(context).remove, + rightButtonText: S.of(context).cancel, + actionLeftButton: () => Navigator.of(context).pop(true), + actionRightButton: () => Navigator.of(context).pop(false) ); }); } @@ -269,24 +280,13 @@ class AddressBookPage extends BasePage { return await showDialog( context: context, builder: (BuildContext context) { - return AlertDialog( - title: Text( - name, - textAlign: TextAlign.center, - style: TextStyle(fontWeight: FontWeight.bold), - ), - content: Text( - address, - textAlign: TextAlign.center, - ), - actions: [ - FlatButton( - onPressed: () => Navigator.of(context).pop(false), - child: Text('Cancel')), - FlatButton( - onPressed: () => Navigator.of(context).pop(true), - child: Text('Copy')) - ], + return AlertWithTwoActions( + alertTitle: name, + alertContent: address, + leftButtonText: S.of(context).copy, + rightButtonText: S.of(context).cancel, + actionLeftButton: () => Navigator.of(context).pop(true), + actionRightButton: () => Navigator.of(context).pop(false) ); }); } diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 4b78f6af2..147a49dba 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -21,6 +21,8 @@ "contact_name" : "Name des Ansprechpartners", "reset" : "Zurücksetzen", "save" : "speichern", + "address_remove_contact" : "Kontakt entfernen", + "address_remove_content" : "Sind Sie sicher, dass Sie den ausgewählten Kontakt entfernen möchten?", "authenticated" : "Authentifiziert", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 3f8ba3280..bbd4dd53e 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -21,6 +21,8 @@ "contact_name" : "Contact Name", "reset" : "Reset", "save" : "Save", + "address_remove_contact" : "Remove contact", + "address_remove_content" : "Are you sure that you want to remove selected contact?", "authenticated" : "Authenticated", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 54acc7d85..c36c2bb4b 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -21,6 +21,8 @@ "contact_name" : "Nombre de contacto", "reset" : "Reiniciar", "save" : "Salvar", + "address_remove_contact" : "Remover contacto", + "address_remove_content" : "¿Estás seguro de que quieres eliminar el contacto seleccionado?", "authenticated" : "Autenticados", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 1751b594e..3ed5edec7 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -21,6 +21,8 @@ "contact_name" : "संपर्क नाम", "reset" : "रीसेट", "save" : "बचाना", + "address_remove_contact" : "संपर्क हटाये", + "address_remove_content" : "क्या आप वाकई चयनित संपर्क को हटाना चाहते हैं?", "authenticated" : "प्रमाणीकृत", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 6ea4b08be..f11766e4f 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -21,6 +21,8 @@ "contact_name" : "連絡先", "reset" : "リセットする", "save" : "セーブ", + "address_remove_contact" : "連絡先を削除します", + "address_remove_content" : "選択した連絡先を削除してもよろしいですか?", "authenticated" : "認証済み", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 1a89f243d..cb559ccf4 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -21,6 +21,8 @@ "contact_name" : "담당자 이름", "reset" : "다시 놓기", "save" : "구하다", + "address_remove_contact" : "연락처 삭제", + "address_remove_content" : "선택한 연락처를 삭제 하시겠습니까?", "authenticated" : "인증", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 079bcfd55..346365ee8 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -21,6 +21,8 @@ "contact_name" : "Contactnaam", "reset" : "Reset", "save" : "Opslaan", + "address_remove_contact" : "Contact verwijderen", + "address_remove_content" : "Weet u zeker dat u het geselecteerde contact wilt verwijderen?", "authenticated" : "Authenticated", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 10c2cdb75..9ba148c0a 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -21,6 +21,8 @@ "contact_name" : "Nazwa Kontaktu", "reset" : "Nastawić", "save" : "Zapisać", + "address_remove_contact" : "Usuń kontakt", + "address_remove_content" : "Czy na pewno chcesz usunąć wybrany kontakt?", "authenticated" : "Zalegalizowany", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 2a0f779e6..f2aa35201 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -21,6 +21,8 @@ "contact_name" : "Nome do contato", "reset" : "Limpar", "save" : "Salvar", + "address_remove_contact" : "Remover contato", + "address_remove_content" : "Tem certeza de que deseja remover o contato selecionado?", "authenticated" : "Autenticado", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 35d67247a..b8833ff7a 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -21,6 +21,8 @@ "contact_name" : "Имя контакта", "reset" : "Сброс", "save" : "Сохранить", + "address_remove_contact" : "Удалить контакт", + "address_remove_content" : "Вы уверены, что хотите удалить выбранный контакт?", "authenticated" : "Аутентифицировано", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 07464070f..f420442da 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -21,6 +21,8 @@ "contact_name" : "Ім'я контакту", "reset" : "Скинути", "save" : "Зберегти", + "address_remove_contact" : "Видалити контакт", + "address_remove_content" : "Ви впевнені, що хочете видалити вибраний контакт?", "authenticated" : "Аутентифіковано", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 5c1c2c100..00f9c1ce9 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -21,6 +21,8 @@ "contact_name" : "联系人姓名", "reset" : "重启", "save" : "保存", + "address_remove_contact" : "刪除聯繫人", + "address_remove_content" : "您確定要刪除所選的聯繫人嗎?", "authenticated" : "已认证", From 3a8bae74e4d3f8146829a5a2710859053ae1bb8e Mon Sep 17 00:00:00 2001 From: Oleksandr Sobol Date: Wed, 20 May 2020 20:28:01 +0300 Subject: [PATCH 2/2] CWA-215 | added cryptocurrency icons to address book; applied new design to contact page; added suffixIcon parameter to base text form field; fixed seed widget --- assets/images/ada.png | Bin 0 -> 1653 bytes assets/images/bch.png | Bin 0 -> 1653 bytes assets/images/bnb.png | Bin 0 -> 1440 bytes assets/images/dash.png | Bin 0 -> 1259 bytes assets/images/eos.png | Bin 0 -> 1367 bytes assets/images/eth.png | Bin 0 -> 1710 bytes assets/images/nano.png | Bin 0 -> 1460 bytes assets/images/trx.png | Bin 0 -> 1387 bytes assets/images/usdt.png | Bin 0 -> 1514 bytes assets/images/xlm.png | Bin 0 -> 1200 bytes assets/images/xrp.png | Bin 0 -> 1189 bytes .../address_book/address_book_page.dart | 22 +- .../screens/address_book/contact_page.dart | 350 +++++++++--------- .../address_book/address_book_store.dart | 9 + lib/src/widgets/base_text_form_field.dart | 3 + lib/src/widgets/seed_widget.dart | 100 ++--- 16 files changed, 243 insertions(+), 241 deletions(-) create mode 100644 assets/images/ada.png create mode 100644 assets/images/bch.png create mode 100644 assets/images/bnb.png create mode 100644 assets/images/dash.png create mode 100644 assets/images/eos.png create mode 100644 assets/images/eth.png create mode 100644 assets/images/nano.png create mode 100644 assets/images/trx.png create mode 100644 assets/images/usdt.png create mode 100644 assets/images/xlm.png create mode 100644 assets/images/xrp.png diff --git a/assets/images/ada.png b/assets/images/ada.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfc1615ced429e75f6f8157a9251bdfc6ddfbee GIT binary patch literal 1653 zcmV-*28#KKP)LJfy*nm zthu$MMUT-LmF>Tc%Wt{LoLq4n0LNZ&iymW8gIb2$c6pVx?9suQUbR<>E~LPiA_|Nx zW+(yJ+7sDcbP-8Wh2%`F+>4%D9mK1&d8g#CjOwjYQ~@^#Vn#vCP((oN3GiC>qds~$}Da9ygq`NZ~=`vDXhS5jy1uE$=a84o>Mr`8Z(N);UjHt2^Yw68XVS9)P}nl3Dx zO`Jy(1Y}^{X~1~0B$bOCq9w7EO!38a_S~6Gs9m2ijcPy}9#;%T> zJaCS0e*A;p`tVD!HpQ@8?am~RPH1!iG(37j2VU?Lrw@xycW4}`q(gI9CXZTo27UU? zPn6GYE4bFh0nS9*QOEvcNaIMM(8wI>HGB&8JT(FZ&AQQ>AAA80U7@XUrjk20)#D)l;Oym6BPrhMBlPMyznvNVjPPm?Y=`DKwz0Wv5b^0`gWmHn1 z5mV`-FMmJ}dZ7VcM;l)7gg3wa&bZuP_y8!Bf#%xy^WS+ian{2WpVyQwT)05Eo@N8Q z^}*+$Y^Y=8N-3qW)9Jm%MQq9>kz9h_s;TF(Hh*g8?{gKyZhh3EdAvq0=W`phd- z(xMyZZF>%-+8%m)(g}F;0YY3!8`aiC(y#=g+LD0Cz@j-0oFgK&m_|;VMV zGDK!^jG1~b^&T>ghK-v+?!*F7k6xjLSjz*Ro&o$q-HCswEb-hBu{P9l{CDm`ns(2l zcPw8io47668fm6 z&=i#^nkC~rU;?r9-X~vDQPWPGD~(aaY8a29#GDH1J$MXBj(C#n3Dj%QXv!>Z#_}z{u6iynLCWwEZMA#~v(SzIIGDSPt^x5A_`Meb4%jwFvZuH(i9#hATPi}rxTq4191(0CL9M&=!>7YI&vO{V zQz*!pAlAsCrc>`BSff{f=R@2C4|p~9M~OE>h{j;QTM_Ic45EYx19)LoYtma|zy_#&pgA1|l9%_PIwfBHV z>!1m3cwF`GLiy!zszNMx2Lw8}fdV3OtPSj4VP8aOKnt4nU%YD#VfEJpwO0h$cl%3r z^5?@iuM4O}4|<^it!tY%{y0JyVgj^=u>q3xfWKsA;x-052}qs@*a$VKWj*823yo{t z_Nxuy&7hD!o7g*i6&3zk!$Sd*`L6)Ib(6njIR$`Y4>?v-j#{}#0gYS!ACbXFzJ-!} zJHzGECCC5|mva(o(Q^yN*Ssr$Pd#|w%xV7z^9Fhkf;$9O00000NkvXXu0mjfSv@56 literal 0 HcmV?d00001 diff --git a/assets/images/bch.png b/assets/images/bch.png new file mode 100644 index 0000000000000000000000000000000000000000..17872731feab738b290edf5c6c84da6f7f2e33eb GIT binary patch literal 1653 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 literal 0 HcmV?d00001 diff --git a/assets/images/eth.png b/assets/images/eth.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2d82a4779554ecb3e0892af0a0c5c21d1d1c2b GIT binary patch literal 1710 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 z zgs6dg+7})kuCKrTT9YSFhJZqpD_1V%$dQ8J$rV2`|Y=kP1mknV{EkC z%S$ZXNNZh)UZO;ap%@`EQWJo@bLY;QIB_D$+P{Clnm2E5G5D({SG0AZa! zf1YmOGd{}^nzk2WxL0KzNjSW~4h|hU#8vM6XU!>R!hn6DUAuNsqr^c*%)HFq!Y{&hZooZuVMT4?M0gz$KJhr#Z2+FY}rx=4;~an?Ay0bGiS~e z89xV1o-MV#k_wHR@P4);oocZeF z#fxHe*|KGmmz#Su(WZdd&hXd*0|6hR5fKrhjofF+l0_3HOwi-UkHw~|QKN=3XU;6* z=FFL+`Sa%!Lu?>E@DT043vkt(A`wR*-~&JY_@jFD>Lt5x*RGv@|NVDm%$QM#Ve8nj zqpn=J!gwq$ARn4mKrC0)CL{Ro)w`}-xw2NRS|!#z?a-k^HDbgFvBt)kfOwlWZOj&s z4qpBM=r^l4^`5BTPyftI!3 zepC{YC{dz1sZ*y`nlx!FSZULywX1<0ES~<{xpTUC^QP+5sbfBi54eUK4Ya(UW7`Xf zQl?Bf#G`Ye*p{$-lM?sk#+z8002ovPDHLkV1g5c65dA~dw=a);dUMFTJBy}u=6r!Y*BV5#v@qK1wvOx%yt^{Vw>Ovk z*yM6RFZN(BG_EFyW>IP4UeES4^5GNt_T;drNRL!6jZaq=K?7P>5<)Y(DmmY?EtR}G zGa+&bGNlR>a{wC9g68Ff(9A7~+3V4oOkVBj>JI|C}fb&uXin*zs*`iLGpb2ewTquOrzbg78 zkLDz##Rh?>=X&XCpO7b7NY-OKni2^f@KT>XHDax6eGG3%lyPrLpvY&tuR1``!}ZW$ zWKD9Ziy?UF--6Do^wd|b^>O6Z5HEw@kxzGBb%4MJYiT4+c)?RXz2B~tmQIzY$h9t( z8yK-7?ZWN?ih81*q8@JpJRYk5{r8`2^y^=LQq*IZS2Ddh4H}Z3tnE~FihQ;&vyyH> zJ2~#)VFYlgiB{oU9Yv1iC&-~}ILGPV|NbTE`R?~$$o~9MMGtVSI7QAiQA1j_B0NR_ zcuL=b&NnM;zzNM&kt&=jPb-+zkVtdevK2S*XAddXQ60`6rR?ViDdd4#lJo(_@Ps!4jI+-V{S_t-c#oyW2;-gorS#-y z?+72)^u|a`} zRQA$C0@bfP%5zwgc$yNQ>|*0QvMmfH8%AFro>G9Z&XL>iw=E7MyE74jF)B`ETNFk% zjCFpnfK^@)S>*y){a?7XYnS0q_zl`OuDq)ee zPZ{9XpUEt37n$?CvR|noXh&`N6kejI{2$0GD+S}W*NKDEV4(c@)+yN06&pw z$_}2Fdl=;yYtV)VyhKmMqh)S2T{S)0BxxI&@`=pScaOj>VXfl%`>FD|`vi)f=pmD& ztvtU|>{0GTKQy5Y57A5YXv9C4X2v@f)EXyjCXtNN>cL)UKnt4sAKs-xnBCy-w!$!c z#b<^wd{RCI1TP2lVh{F016r49u6iA}GR`;8nH*{uvGQw!$hBk;y^aiHSv+o|0?c6z zJ%$l0zP@?(q%iD-hWgqsKZI8NVvQM>36@4PZdr6&(ycq@K4=iQ@Lhu=%YOwJV-9QF zGabF+9_-bs%&#JdPQ1b!#p|>aPv11fR{?k|%( QQvd(}07*qoM6N<$g66L3vH$=8 literal 0 HcmV?d00001 diff --git a/assets/images/xlm.png b/assets/images/xlm.png new file mode 100644 index 0000000000000000000000000000000000000000..d4bf2f09678799be0aa34262109cdc2c4febbb09 GIT binary patch literal 1200 zcmV;h1W)^kP)r0!Pn-^$kXl#*^k^AP8ik zqEPKCm7=Ojm8zm@t5TAxUbPe@000Q^fU4|16*&8Uf5-I9{4>P7uf7`ho^!tQpZ}b5 zt@-%)+<^FvXR)!dO|XHjpxdCu#l_|L`}?1Z-}Dy37Cs+ML=z|aB_JT+072hF_#(!8 z649cgqiYbv9pqTro5dp{BKqLyPI64`Rq?2(C_cIS$+0z8C;#oWAXclDT3cIbY;25H zR#s?lZ;wVsMyS2Loy0UKeT+ty_n;C7h^>W3kwAF_xDp+SeWXLsi>%kJUuuzPydHzWK*hzyw7a`Y zz|ztZWn^SH*s+$uc6xDl!Onu>BtTgp;^qI?H|?Cfl518i+=Q9(h0Oh~L~YHn_(%gal;xw&!hWldd{ z-)uI2Q3*swMiNk4TkG&HJw2Tk7Z(Y@B$Skt;0n;J^2BFnX9QebT~T6UqH0TidA^1RRWornFPed#Mqvtq@>X7>?{EX2M1J9Q6ZZS%~w-XLnkLEwrT)vZEecxv8D$S zFpA9oQyDciH6aG>i;|L(XliPTfaBw1h}k;6va*s64-W~LnVF&FCF{ zz*GG3O=Z;8)n)5u0A)paQD&68w6s)~AHbNVrKQ2?E#y>+9vm^n z2OG~`Sb2I>%9)MO{Oh?14Ps~isxnGVO{Mwyc>=Ij%gV~obS}3c7SR3uz5GV-wJ6D& zatw7rlW2+;t9W{Pnt-FDBdV&Zf&(ZQkHunf2pAF)LVbOG1kBCNp?XfmSi@zrk1DDXm<@||H_cQYoKeMn6Yz-e1c3l*^$@EGr+b6MHzr^zcI*_9Vr)ywr2|b%SNZsBC91!mw8v7}d>6v3X=PU_^=@WYB zMPp+IsoQJ+gU$%0IwiW!ylw=EB57?!X?5zJufORw zAttA$KTee)j`uZE`>Ki6k6X4QAFB&S3wnOv4ORZl8lWe!ZVA$8}XcMce z1M+4CnrP#JSHV*kd=G=g?!4CQaErysAnlt4XrYNV9tE$WV4@}sc8ksRvdQKWv%OU; zj<(8hsuSpQ01dRzL>rHa{}&c6hudVaU2C*BwPrUW8wGmNKnu14qUD0 zB6`s%UVH6B)E927MMJQ0yX{67wwP{dHd;SyHd()KFTzxB`VIJx?=57B6Jsr^sm^_jd00000NkvXXu0mjf Dk48B# literal 0 HcmV?d00001 diff --git a/lib/src/screens/address_book/address_book_page.dart b/lib/src/screens/address_book/address_book_page.dart index 4a66c3092..bdcb3332d 100644 --- a/lib/src/screens/address_book/address_book_page.dart +++ b/lib/src/screens/address_book/address_book_page.dart @@ -216,43 +216,43 @@ class AddressBookPage extends BasePage { image = Image.asset('assets/images/monero.png', height: 24, width: 24); break; case CryptoCurrency.ada: - image = null; + image = Image.asset('assets/images/ada.png', height: 24, width: 24); break; case CryptoCurrency.bch: - image = null; + image = Image.asset('assets/images/bch.png', height: 24, width: 24); break; case CryptoCurrency.bnb: - image = null; + image = Image.asset('assets/images/bnb.png', height: 24, width: 24); break; case CryptoCurrency.btc: image = Image.asset('assets/images/bitcoin.png', height: 24, width: 24); break; case CryptoCurrency.dash: - image = null; + image = Image.asset('assets/images/dash.png', height: 24, width: 24); break; case CryptoCurrency.eos: - image = null; + image = Image.asset('assets/images/eos.png', height: 24, width: 24); break; case CryptoCurrency.eth: - image = null; + image = Image.asset('assets/images/eth.png', height: 24, width: 24); break; case CryptoCurrency.ltc: image = Image.asset('assets/images/litecoin.png', height: 24, width: 24); break; case CryptoCurrency.nano: - image = null; + image = Image.asset('assets/images/nano.png', height: 24, width: 24); break; case CryptoCurrency.trx: - image = null; + image = Image.asset('assets/images/trx.png', height: 24, width: 24); break; case CryptoCurrency.usdt: - image = null; + image = Image.asset('assets/images/usdt.png', height: 24, width: 24); break; case CryptoCurrency.xlm: - image = null; + image = Image.asset('assets/images/xlm.png', height: 24, width: 24); break; case CryptoCurrency.xrp: - image = null; + image = Image.asset('assets/images/xrp.png', height: 24, width: 24); break; default: image = null; diff --git a/lib/src/screens/address_book/contact_page.dart b/lib/src/screens/address_book/contact_page.dart index 7811c574c..13a9ff8cd 100644 --- a/lib/src/screens/address_book/contact_page.dart +++ b/lib/src/screens/address_book/contact_page.dart @@ -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 { 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(context); + addressBookStore.setDisabledStatus(false); + } + @override void dispose() { _contactNameController.dispose(); @@ -61,198 +77,164 @@ class ContactFormState extends State { super.dispose(); } - Future _setCurrencyType(BuildContext context) async { - var currencyType = CryptoCurrency.all[0].toString(); - var selectedCurrency = CryptoCurrency.all[0]; - - await showDialog( - 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: [ - 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(context); - return ScrollableWithBottomSection( - content: Form( - key: _formKey, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - 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: [ + 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: [ + downArrow + ], + ), + ) + ), ), ), ), + Padding( + padding: EdgeInsets.only(top: 20), + child: AddressTextField( + controller: _addressController, + options: [AddressTextFieldOption.qrCode], + validator: (value) { + addressBookStore.validateAddress(value, + cryptoCurrency: _selectectCrypto); + return addressBookStore.errorMessage; + }, + ), + ) + ], + ), + ), + bottomSectionPadding: EdgeInsets.only( + left: 24, + right: 24, + bottom: 24 + ), + bottomSection: Row( + children: [ + Expanded( + child: PrimaryButton( + onPressed: () { + setState(() { + _selectectCrypto = null; + _contactNameController.text = ''; + _currencyTypeController.text = ''; + _addressController.text = ''; + }); + }, + text: S.of(context).reset, + color: Colors.red, + textColor: Colors.white + ), ), - SizedBox(height: 14.0), - AddressTextField( - controller: _addressController, - options: [AddressTextFieldOption.qrCode], - validator: (value) { - addressBookStore.validateAddress(value, - cryptoCurrency: _selectectCrypto); - return addressBookStore.errorMessage; - }, + SizedBox(width: 20), + Expanded( + child: Observer( + builder: (_) => 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); + + await addressBookStore.update( + contact: widget.contact); + } + Navigator.pop(context); + } catch (e) { + await showDialog( + context: context, + builder: (BuildContext context) { + return AlertWithOneAction( + alertTitle: S.current.contact, + alertContent: e.toString(), + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop() + ); + }); + } + }, + text: S.of(context).save, + color: Colors.green, + textColor: Colors.white, + isDisabled: addressBookStore.isDisabledStatus, + ) + ) ) ], - ), + )), + ); + } + + void _presentPicker(BuildContext context) { + showDialog( + builder: (_) => CurrencyPicker( + selectedAtIndex: currencies.indexOf(_selectectCrypto), + items: currencies, + title: S.of(context).please_select, + onItemSelected: (CryptoCurrency item) { + _selectectCrypto = item; + _currencyTypeController.text = _selectectCrypto.toString(); + } ), - bottomSection: Row( - children: [ - 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), - ), - SizedBox(width: 20), - 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); - - await addressBookStore.update( - contact: widget.contact); - } - Navigator.pop(context); - } catch (e) { - await showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: Text( - e.toString(), - textAlign: TextAlign.center, - ), - actions: [ - 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)) - ], - )); + context: context); } } diff --git a/lib/src/stores/address_book/address_book_store.dart b/lib/src/stores/address_book/address_book_store.dart index 527809cbd..638d833ba 100644 --- a/lib/src/stores/address_book/address_book_store.dart +++ b/lib/src/stores/address_book/address_book_store.dart @@ -12,11 +12,15 @@ class AddressBookStore = AddressBookStoreBase with _$AddressBookStore; abstract class AddressBookStoreBase with Store { AddressBookStoreBase({@required this.contacts}) { updateContactList(); + isDisabledStatus = true; } @observable List contactList; + @observable + bool isDisabledStatus; + @observable bool isValid; @@ -37,6 +41,11 @@ abstract class AddressBookStoreBase with Store { @action Future delete({Contact contact}) async => await contact.delete(); + @action + void setDisabledStatus(bool isDisabled) { + isDisabledStatus = isDisabled; + } + void validateContactName(String value) { const pattern = '''^[^`,'"]{1,32}\$'''; final regExp = RegExp(pattern); diff --git a/lib/src/widgets/base_text_form_field.dart b/lib/src/widgets/base_text_form_field.dart index e05c3a277..6c69d16c2 100644 --- a/lib/src/widgets/base_text_form_field.dart +++ b/lib/src/widgets/base_text_form_field.dart @@ -17,6 +17,7 @@ class BaseTextFormField extends StatelessWidget { this.borderColor = PaletteDark.menuList, this.prefix, this.suffix, + this.suffixIcon, this.enabled = true, this.validator }); @@ -34,6 +35,7 @@ class BaseTextFormField extends StatelessWidget { final Color borderColor; final Widget prefix; final Widget suffix; + final Widget suffixIcon; final bool enabled; final FormFieldValidator validator; @@ -55,6 +57,7 @@ class BaseTextFormField extends StatelessWidget { decoration: InputDecoration( prefix: prefix, suffix: suffix, + suffixIcon: suffixIcon, hintStyle: TextStyle( color: hintColor, fontSize: 16 diff --git a/lib/src/widgets/seed_widget.dart b/lib/src/widgets/seed_widget.dart index 64298da6d..de4f38be7 100644 --- a/lib/src/widgets/seed_widget.dart +++ b/lib/src/widgets/seed_widget.dart @@ -13,7 +13,6 @@ import 'package:cake_wallet/src/domain/monero/mnemonics/russian.dart'; import 'package:cake_wallet/src/domain/monero/mnemonics/spanish.dart'; import 'package:cake_wallet/src/domain/common/mnemotic_item.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/src/widgets/top_panel.dart'; class SeedWidget extends StatefulWidget { SeedWidget({Key key, this.onMnemoticChange, this.onFinish, this.seedLanguage}) : super(key: key) { @@ -237,52 +236,61 @@ class SeedWidgetState extends State { Flexible( fit: FlexFit.tight, flex: 1, - child: TopPanel( - color: PaletteDark.menuList, - widget: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - S.of(context).restore_active_seed, - style: TextStyle( - fontSize: 14, - color: PaletteDark.walletCardText - ), - ), - Padding( - padding: EdgeInsets.only(top: 5), - child: Wrap( - children: items.map((item) { - final isValid = item.isCorrect(); - final isSelected = selectedItem == item; - - return InkWell( - onTap: () => onMnemoticTap(item), - child: Container( - decoration: BoxDecoration( - color: isValid ? Colors.transparent : Palette.red), - margin: EdgeInsets.only(right: 7, bottom: 8), - child: Text( - item.toString(), - style: TextStyle( - color: - isValid ? Colors.white : Palette.lightGrey, - fontSize: 16, - fontWeight: - isSelected ? FontWeight.w900 : FontWeight.w400, - decoration: isSelected - ? TextDecoration.underline - : TextDecoration.none), - )), - ); - }).toList(),) - ) - ], + child: Container( + width: double.infinity, + height: double.infinity, + padding: EdgeInsets.all(24), + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(24), + bottomRight: Radius.circular(24) ), - ) - ) + color: PaletteDark.menuList + ), + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + S.of(context).restore_active_seed, + style: TextStyle( + fontSize: 14, + color: PaletteDark.walletCardText + ), + ), + Padding( + padding: EdgeInsets.only(top: 5), + child: Wrap( + children: items.map((item) { + final isValid = item.isCorrect(); + final isSelected = selectedItem == item; + + return InkWell( + onTap: () => onMnemoticTap(item), + child: Container( + decoration: BoxDecoration( + color: isValid ? Colors.transparent : Palette.red), + margin: EdgeInsets.only(right: 7, bottom: 8), + child: Text( + item.toString(), + style: TextStyle( + color: + isValid ? Colors.white : Palette.lightGrey, + fontSize: 16, + fontWeight: + isSelected ? FontWeight.w900 : FontWeight.w400, + decoration: isSelected + ? TextDecoration.underline + : TextDecoration.none), + )), + ); + }).toList(),) + ) + ], + ), + ), + ), ), Flexible( fit: FlexFit.tight,