Changed way for validation of seed phrase. Added multi words to text field on restore from seed screen.

This commit is contained in:
M 2020-01-17 15:26:17 +02:00
parent 6154c6dfa5
commit 92c2cfcbab
15 changed files with 102 additions and 67 deletions

View file

@ -289,6 +289,7 @@ class S implements WidgetsLocalizations {
String get paste => "Paste"; String get paste => "Paste";
String get restore_from_seed_placeholder => "Please enter or paste your seed here"; String get restore_from_seed_placeholder => "Please enter or paste your seed here";
String get add_new_word => "Add new word"; String get add_new_word => "Add new word";
String get incorrect_seed => 'The text entered is not valid.';
} }
class $de extends S { class $de extends S {
@ -833,6 +834,8 @@ class $de extends S {
String get restore_from_seed_placeholder => "Bitte geben Sie hier Ihren Code ein"; String get restore_from_seed_placeholder => "Bitte geben Sie hier Ihren Code ein";
@override @override
String get add_new_word => "Neues Wort hinzufügen"; String get add_new_word => "Neues Wort hinzufügen";
@override
String get incorrect_seed => 'Der eingegebene Text ist ungültig.';
} }
class $hi extends S { class $hi extends S {
@ -1377,6 +1380,8 @@ class $hi extends S {
String get restore_from_seed_placeholder => "कृपया अपना कोड वाक्यांश यहां दर्ज करें या पेस्ट करें"; String get restore_from_seed_placeholder => "कृपया अपना कोड वाक्यांश यहां दर्ज करें या पेस्ट करें";
@override @override
String get add_new_word => "नया शब्द जोड़ें"; String get add_new_word => "नया शब्द जोड़ें";
@override
String get incorrect_seed => 'दर्ज किया गया पाठ मान्य नहीं है।';
} }
class $ru extends S { class $ru extends S {
@ -1921,6 +1926,8 @@ class $ru extends S {
String get restore_from_seed_placeholder => "Введите или вставте код фразу вашего кошелька"; String get restore_from_seed_placeholder => "Введите или вставте код фразу вашего кошелька";
@override @override
String get add_new_word => "Добавить новое слово"; String get add_new_word => "Добавить новое слово";
@override
String get incorrect_seed => 'Введенный текст некорректный.';
} }
class $ko extends S { class $ko extends S {
@ -2465,6 +2472,8 @@ class $ko extends S {
String get restore_from_seed_placeholder => "여기에 코드 문구를 입력하거나 붙여 넣으십시오."; String get restore_from_seed_placeholder => "여기에 코드 문구를 입력하거나 붙여 넣으십시오.";
@override @override
String get add_new_word => "새로운 단어 추가"; String get add_new_word => "새로운 단어 추가";
@override
String get incorrect_seed => '입력하신 텍스트가 유효하지 않습니다.';
} }
class $pt extends S { class $pt extends S {
@ -3009,6 +3018,8 @@ class $pt extends S {
String get restore_from_seed_placeholder => "Digite ou cole sua frase de código aqui"; String get restore_from_seed_placeholder => "Digite ou cole sua frase de código aqui";
@override @override
String get add_new_word => "Adicionar nova palavra"; String get add_new_word => "Adicionar nova palavra";
@override
String get incorrect_seed => 'O texto digitado não é válido.';
} }
class $ja extends S { class $ja extends S {
@ -3553,6 +3564,8 @@ class $ja extends S {
String get restore_from_seed_placeholder => "ここにコードフレーズを入力または貼り付けてください"; String get restore_from_seed_placeholder => "ここにコードフレーズを入力または貼り付けてください";
@override @override
String get add_new_word => "新しい単語を追加"; String get add_new_word => "新しい単語を追加";
@override
String get incorrect_seed => '入力されたテキストは無効です。';
} }
class $en extends S { class $en extends S {
@ -4101,6 +4114,8 @@ class $pl extends S {
String get restore_from_seed_placeholder => "Wpisz lub wklej tutaj swoją frazę kodową"; String get restore_from_seed_placeholder => "Wpisz lub wklej tutaj swoją frazę kodową";
@override @override
String get add_new_word => "Dodaj nowe słowo"; String get add_new_word => "Dodaj nowe słowo";
@override
String get incorrect_seed => 'Wprowadzony tekst jest nieprawidłowy.';
} }
class $es extends S { class $es extends S {
@ -4645,6 +4660,8 @@ class $es extends S {
String get restore_from_seed_placeholder => "Ingrese o pegue su frase de código aquí"; String get restore_from_seed_placeholder => "Ingrese o pegue su frase de código aquí";
@override @override
String get add_new_word => "Agregar palabra nueva"; String get add_new_word => "Agregar palabra nueva";
@override
String get incorrect_seed => 'El texto ingresado no es válido.';
} }
class $nl extends S { class $nl extends S {
@ -5189,6 +5206,8 @@ class $nl extends S {
String get restore_from_seed_placeholder => "Voer hier uw codefrase in of plak deze"; String get restore_from_seed_placeholder => "Voer hier uw codefrase in of plak deze";
@override @override
String get add_new_word => "Nieuw woord toevoegen"; String get add_new_word => "Nieuw woord toevoegen";
@override
String get incorrect_seed => 'De ingevoerde tekst is niet geldig.';
} }
class $zh extends S { class $zh extends S {
@ -5733,6 +5752,8 @@ class $zh extends S {
String get restore_from_seed_placeholder => "请在此处输入或粘贴您的代码短语"; String get restore_from_seed_placeholder => "请在此处输入或粘贴您的代码短语";
@override @override
String get add_new_word => "添加新词"; String get add_new_word => "添加新词";
@override
String get incorrect_seed => '输入的文字无效。';
} }
class GeneratedLocalizationsDelegate extends LocalizationsDelegate<S> { class GeneratedLocalizationsDelegate extends LocalizationsDelegate<S> {

View file

@ -48,17 +48,12 @@ class RestoreFromSeedForm extends StatefulWidget {
class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> { class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> {
final _seedKey = GlobalKey<SeedWidgetState>(); final _seedKey = GlobalKey<SeedWidgetState>();
bool _reactionSet = false;
void clear() => _seedKey.currentState.clear(); void clear() => _seedKey.currentState.clear();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final walletRestorationStore = Provider.of<WalletRestorationStore>(context); final walletRestorationStore = Provider.of<WalletRestorationStore>(context);
WidgetsBinding.instance.addPostFrameCallback(
(_) => _setReactions(context, walletRestorationStore));
return GestureDetector( return GestureDetector(
onTap: () => onTap: () =>
SystemChannels.textInput.invokeMethod<void>('TextInput.hide'), SystemChannels.textInput.invokeMethod<void>('TextInput.hide'),
@ -74,22 +69,4 @@ class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> {
), ),
); );
} }
void _setReactions(BuildContext context, WalletRestorationStore store) {
if (_reactionSet) {
return;
}
reaction((_) => store.errorMessage, (String errorMessage) {
if (errorMessage == null || errorMessage.isEmpty) {
_seedKey.currentState.validated();
} else {
_seedKey.currentState.invalidate();
}
_seedKey.currentState.setErrorMessage(errorMessage);
});
_reactionSet = true;
}
} }

View file

@ -8,10 +8,11 @@ class PrimaryButton extends StatelessWidget {
@required this.text, @required this.text,
@required this.color, @required this.color,
@required this.borderColor, @required this.borderColor,
this.isDisabled = false,
this.isDisabled = false}); this.onDisabledPressed});
final VoidCallback onPressed; final VoidCallback onPressed;
final VoidCallback onDisabledPressed;
final Color color; final Color color;
final Color borderColor; final Color borderColor;
final String text; final String text;
@ -23,15 +24,19 @@ class PrimaryButton extends StatelessWidget {
minWidth: double.infinity, minWidth: double.infinity,
height: 56.0, height: 56.0,
child: FlatButton( child: FlatButton(
onPressed: isDisabled ? null : onPressed, onPressed: isDisabled
color: isDisabled ? Colors.grey : color, ? (onDisabledPressed != null ? onDisabledPressed : null)
: onPressed,
color: isDisabled ? Colors.transparent : color,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
side: BorderSide(color: borderColor), side: BorderSide(color: borderColor),
borderRadius: BorderRadius.circular(10.0)), borderRadius: BorderRadius.circular(10.0)),
child: Text(text, child: Text(text,
style: TextStyle( style: TextStyle(
fontSize: 16.0, fontSize: 16.0,
color: isDisabled ? Palette.darkGrey : Theme.of(context).primaryTextTheme.button.color)), color: isDisabled
? Palette.darkGrey
: Theme.of(context).primaryTextTheme.button.color)),
)); ));
} }
} }

View file

@ -27,8 +27,9 @@ class SeedWidgetState extends State<SeedWidget> {
bool isValid; bool isValid;
String errorMessage; String errorMessage;
MnemoticItem currentMnemotic; List<MnemoticItem> currentMnemotics;
bool isCurrentMnemoticValid; bool isCurrentMnemoticValid;
String _errorMessage;
@override @override
void initState() { void initState() {
@ -49,14 +50,6 @@ class SeedWidgetState extends State<SeedWidget> {
} }
} }
void deleteMnemotic(MnemoticItem item) {
setState(() => items.remove(item));
if (widget.onMnemoticChange != null) {
widget.onMnemoticChange(items);
}
}
void mnemoticFromText(String text) { void mnemoticFromText(String text) {
final splitted = text.split(' '); final splitted = text.split(' ');
@ -78,7 +71,7 @@ class SeedWidgetState extends State<SeedWidget> {
void selectMnemotic(MnemoticItem item) { void selectMnemotic(MnemoticItem item) {
setState(() { setState(() {
selectedItem = item; selectedItem = item;
currentMnemotic = item; currentMnemotics = [item];
_seedController _seedController
..text = item.text ..text = item.text
@ -106,18 +99,6 @@ class SeedWidgetState extends State<SeedWidget> {
} }
} }
void onFieldSubmitted(String text) {
if (text.isEmpty || text == null) {
return;
}
if (selectedItem != null) {
editTextOfSelectedMnemotic(text);
} else {
addMnemotic(text);
}
}
void clear() { void clear() {
setState(() { setState(() {
items = []; items = [];
@ -149,31 +130,68 @@ class SeedWidgetState extends State<SeedWidget> {
void changeCurrentMnemotic(String text) { void changeCurrentMnemotic(String text) {
setState(() { setState(() {
final trimmedText = text.trim();
final splitted = trimmedText.split(' ');
_errorMessage = null;
if (text == null) { if (text == null) {
currentMnemotic = null; currentMnemotics = [];
isCurrentMnemoticValid = false; isCurrentMnemoticValid = false;
return; return;
} }
currentMnemotic = MnemoticItem(text: text, dic: EnglishMnemonics.words); currentMnemotics = splitted
isCurrentMnemoticValid = currentMnemotic.isCorrect(); .map((text) => MnemoticItem(text: text, dic: EnglishMnemonics.words))
.toList();
bool isValid = true;
for (final word in currentMnemotics) {
print('word ${word.text}');
isValid = word.isCorrect();
if (!isValid) {
break;
}
}
isCurrentMnemoticValid = isValid;
}); });
} }
void saveCurrentMnemoticToItems() { void saveCurrentMnemoticToItems() {
setState(() { setState(() {
if (selectedItem != null) { if (selectedItem != null) {
selectedItem.changeText(currentMnemotic.text); selectedItem.changeText(currentMnemotics.first.text.trim());
selectedItem = null; selectedItem = null;
} else { } else {
items.add(currentMnemotic); items.addAll(currentMnemotics);
} }
currentMnemotic = null; currentMnemotics = [];
_seedController.text = ''; _seedController.text = '';
}); });
} }
void showErrorIfExist() {
setState(() => _errorMessage =
!isCurrentMnemoticValid ? S.current.incorrect_seed : null);
}
bool isSeedValid() {
bool isValid;
for (final item in items) {
isValid = item.isCorrect();
if (!isValid) {
break;
}
}
return isValid;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -258,6 +276,7 @@ class SeedWidgetState extends State<SeedWidget> {
hintStyle: hintStyle:
TextStyle(color: Theme.of(context).hintColor), TextStyle(color: Theme.of(context).hintColor),
hintText: S.of(context).restore_from_seed_placeholder, hintText: S.of(context).restore_from_seed_placeholder,
errorText: _errorMessage,
focusedBorder: UnderlineInputBorder( focusedBorder: UnderlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(
color: Palette.cakeGreen, width: 2.0)), color: Palette.cakeGreen, width: 2.0)),
@ -273,6 +292,7 @@ class SeedWidgetState extends State<SeedWidget> {
child: (selectedItem == null && items.length == maxLength) child: (selectedItem == null && items.length == maxLength)
? PrimaryButton( ? PrimaryButton(
text: S.of(context).restore_next, text: S.of(context).restore_next,
isDisabled: !isSeedValid(),
onPressed: () => widget.onFinish != null onPressed: () => widget.onFinish != null
? widget.onFinish() ? widget.onFinish()
: null, : null,
@ -291,6 +311,7 @@ class SeedWidgetState extends State<SeedWidget> {
onPressed: () => isCurrentMnemoticValid onPressed: () => isCurrentMnemoticValid
? saveCurrentMnemoticToItems() ? saveCurrentMnemoticToItems()
: null, : null,
onDisabledPressed: () => showErrorIfExist(),
isDisabled: !isCurrentMnemoticValid, isDisabled: !isCurrentMnemoticValid,
color: PaletteDark.darkThemeBlueButton, color: PaletteDark.darkThemeBlueButton,
borderColor: Palette.brightBlue)) borderColor: Palette.brightBlue))

View file

@ -335,5 +335,6 @@
"paste" : "Einfügen", "paste" : "Einfügen",
"restore_from_seed_placeholder" : "Bitte geben Sie hier Ihren Code ein", "restore_from_seed_placeholder" : "Bitte geben Sie hier Ihren Code ein",
"add_new_word" : "Neues Wort hinzufügen" "add_new_word" : "Neues Wort hinzufügen",
"incorrect_seed" : "Der eingegebene Text ist ungültig."
} }

View file

@ -335,5 +335,6 @@
"paste" : ""paste"", "paste" : ""paste"",
"restore_from_seed_placeholder" : "Please enter or "paste" your seed here", "restore_from_seed_placeholder" : "Please enter or "paste" your seed here",
"add_new_word" : "Add new word" "add_new_word" : "Add new word",
"incorrect_seed" : "The text entered is not valid."
} }

View file

@ -335,5 +335,6 @@
"paste" : "Pegar", "paste" : "Pegar",
"restore_from_seed_placeholder" : "Ingrese o pegue su frase de código aquí", "restore_from_seed_placeholder" : "Ingrese o pegue su frase de código aquí",
"add_new_word" : "Agregar palabra nueva" "add_new_word" : "Agregar palabra nueva",
"incorrect_seed" : "El texto ingresado no es válido."
} }

View file

@ -335,5 +335,6 @@
"paste" : "पेस्ट करें", "paste" : "पेस्ट करें",
"restore_from_seed_placeholder" : "कृपया अपना कोड वाक्यांश यहां दर्ज करें या पेस्ट करें", "restore_from_seed_placeholder" : "कृपया अपना कोड वाक्यांश यहां दर्ज करें या पेस्ट करें",
"add_new_word" : "नया शब्द जोड़ें" "add_new_word" : "नया शब्द जोड़ें",
"incorrect_seed" : "दर्ज किया गया पाठ मान्य नहीं है।"
} }

View file

@ -336,5 +336,6 @@
"paste" : "ペースト", "paste" : "ペースト",
"restore_from_seed_placeholder" : "ここにコードフレーズを入力または貼り付けてください", "restore_from_seed_placeholder" : "ここにコードフレーズを入力または貼り付けてください",
"add_new_word" : "新しい単語を追加", "add_new_word" : "新しい単語を追加",
"add_new_word" : "새로운 단어 추가" "add_new_word" : "새로운 단어 추가",
"incorrect_seed" : "入力されたテキストは無効です。"
} }

View file

@ -334,5 +334,6 @@
"change_language_to" : "언어를로 변경 ${language}?", "change_language_to" : "언어를로 변경 ${language}?",
"paste" : "풀", "paste" : "풀",
"restore_from_seed_placeholder" : "여기에 코드 문구를 입력하거나 붙여 넣으십시오." "restore_from_seed_placeholder" : "여기에 코드 문구를 입력하거나 붙여 넣으십시오.",
"incorrect_seed" : "입력하신 텍스트가 유효하지 않습니다."
} }

View file

@ -335,5 +335,6 @@
"paste" : "Plakken", "paste" : "Plakken",
"restore_from_seed_placeholder" : "Voer hier uw codefrase in of plak deze", "restore_from_seed_placeholder" : "Voer hier uw codefrase in of plak deze",
"add_new_word" : "Nieuw woord toevoegen" "add_new_word" : "Nieuw woord toevoegen",
"incorrect_seed" : "De ingevoerde tekst is niet geldig."
} }

View file

@ -335,5 +335,6 @@
"paste" : "Pasta", "paste" : "Pasta",
"restore_from_seed_placeholder" : "Wpisz lub wklej tutaj swoją frazę kodową", "restore_from_seed_placeholder" : "Wpisz lub wklej tutaj swoją frazę kodową",
"add_new_word" : "Dodaj nowe słowo" "add_new_word" : "Dodaj nowe słowo",
"incorrect_seed" : "Wprowadzony tekst jest nieprawidłowy."
} }

View file

@ -335,5 +335,6 @@
"paste" : "Colar", "paste" : "Colar",
"restore_from_seed_placeholder" : "Digite ou cole sua frase de código aqui", "restore_from_seed_placeholder" : "Digite ou cole sua frase de código aqui",
"add_new_word" : "Adicionar nova palavra" "add_new_word" : "Adicionar nova palavra",
"incorrect_seed" : "O texto digitado não é válido."
} }

View file

@ -335,5 +335,6 @@
"paste" : "Вставить", "paste" : "Вставить",
"restore_from_seed_placeholder" : "Введите или вставте код фразу вашего кошелька", "restore_from_seed_placeholder" : "Введите или вставте код фразу вашего кошелька",
"add_new_word" : "Добавить новое слово" "add_new_word" : "Добавить новое слово",
"incorrect_seed" : "Введенный текст некорректный."
} }

View file

@ -335,5 +335,6 @@
"paste" : "糊", "paste" : "糊",
"restore_from_seed_placeholder" : "请在此处输入或粘贴您的代码短语", "restore_from_seed_placeholder" : "请在此处输入或粘贴您的代码短语",
"add_new_word" : "添加新词" "add_new_word" : "添加新词",
"incorrect_seed" : "输入的文字无效。"
} }