CWA-175 | added seed language parameter to wallet manager and wallet list service, created seed_language_page and seed_language_store, applied seed language page before create and restore wallet, added mnemonics

This commit is contained in:
Oleksandr Sobol
2020-02-28 22:16:39 +02:00
parent ed31909694
commit cb4fff7aec
40 changed files with 11769 additions and 400 deletions
@@ -13,6 +13,7 @@ import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart';
class NewWalletPage extends BasePage {
NewWalletPage(
@@ -43,6 +44,7 @@ class _WalletNameFormState extends State<WalletNameForm> {
@override
Widget build(BuildContext context) {
final walletCreationStore = Provider.of<WalletCreationStore>(context);
final seedLanguageStore = Provider.of<SeedLanguageStore>(context);
reaction((_) => walletCreationStore.state, (WalletCreationState state) {
if (state is WalletCreatedSuccessfully) {
@@ -107,7 +109,8 @@ class _WalletNameFormState extends State<WalletNameForm> {
return LoadingPrimaryButton(
onPressed: () {
if (_formKey.currentState.validate()) {
walletCreationStore.create(name: nameController.text);
walletCreationStore.create(name: nameController.text,
language: seedLanguageStore.selectedSeedLanguage);
}
},
text: S.of(context).continue_text,
@@ -15,6 +15,7 @@ import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/widgets/blockchain_height_widget.dart';
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart';
class RestoreWalletFromKeysPage extends BasePage {
RestoreWalletFromKeysPage(
@@ -49,6 +50,7 @@ class _RestoreFromKeysFromState extends State<RestoreFromKeysFrom> {
@override
Widget build(BuildContext context) {
final walletRestorationStore = Provider.of<WalletRestorationStore>(context);
final seedLanguageStore = Provider.of<SeedLanguageStore>(context);
reaction((_) => walletRestorationStore.state, (WalletRestorationState state) {
if (state is WalletRestoredSuccessfully) {
@@ -206,6 +208,7 @@ class _RestoreFromKeysFromState extends State<RestoreFromKeysFrom> {
if (_formKey.currentState.validate()) {
walletRestorationStore.restoreFromKeys(
name: _nameController.text,
language: seedLanguageStore.selectedSeedLanguage,
address: _addressController.text,
viewKey: _viewKeyController.text,
spendKey: _spendKeyController.text,
@@ -1,4 +1,3 @@
import 'package:mobx/mobx.dart';
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
@@ -11,6 +10,7 @@ import 'package:cake_wallet/src/domain/services/wallet_service.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/stores/wallet_restoration/wallet_restoration_store.dart';
import 'package:cake_wallet/src/widgets/seed_widget.dart';
import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart';
class RestoreWalletFromSeedPage extends BasePage {
RestoreWalletFromSeedPage(
@@ -53,6 +53,7 @@ class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> {
@override
Widget build(BuildContext context) {
final walletRestorationStore = Provider.of<WalletRestorationStore>(context);
final seedLanguageStore = Provider.of<SeedLanguageStore>(context);
return GestureDetector(
onTap: () =>
@@ -65,6 +66,7 @@ class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> {
onFinish: () => Navigator.of(context).pushNamed(
Routes.restoreWalletFromSeedDetails,
arguments: _seedKey.currentState.items),
seedLanguage: seedLanguageStore.selectedSeedLanguage,
),
),
);
@@ -5,6 +5,8 @@ import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/src/screens/restore/widgets/restore_button.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart';
import 'package:provider/provider.dart';
class RestoreWalletOptionsPage extends BasePage {
static const _aspectRatioImage = 2.086;
@@ -19,38 +21,46 @@ class RestoreWalletOptionsPage extends BasePage {
final _imageKeys = Image.asset('assets/images/keysIco.png');
@override
Widget body(BuildContext context) => Container(
padding: EdgeInsets.only(
left: 20.0,
right: 20.0,
),
child: Column(
children: <Widget>[
Flexible(
child: RestoreButton(
onPressed: () =>
Navigator.pushNamed(context, Routes.restoreWalletFromSeed),
image: _imageSeed,
aspectRatioImage: _aspectRatioImage,
titleColor: Palette.lightViolet,
color: Palette.lightViolet,
title: S.of(context).restore_title_from_seed,
description: S.of(context).restore_description_from_seed,
textButton: S.of(context).restore_next,
)),
Flexible(
child: RestoreButton(
onPressed: () =>
Navigator.pushNamed(context, Routes.restoreWalletFromKeys),
image: _imageKeys,
aspectRatioImage: _aspectRatioImage,
titleColor: Palette.cakeGreen,
color: Palette.cakeGreen,
title: S.of(context).restore_title_from_keys,
description: S.of(context).restore_description_from_keys,
textButton: S.of(context).restore_next,
))
],
),
);
Widget body(BuildContext context) {
final seedLanguageStore = Provider.of<SeedLanguageStore>(context);
return Container(
padding: EdgeInsets.only(
left: 20.0,
right: 20.0,
),
child: Column(
children: <Widget>[
Flexible(
child: RestoreButton(
onPressed: () {
seedLanguageStore.setCurrentRoute(Routes.restoreWalletFromSeed);
Navigator.pushNamed(context, Routes.seedLanguage);
},
image: _imageSeed,
aspectRatioImage: _aspectRatioImage,
titleColor: Palette.lightViolet,
color: Palette.lightViolet,
title: S.of(context).restore_title_from_seed,
description: S.of(context).restore_description_from_seed,
textButton: S.of(context).restore_next,
)),
Flexible(
child: RestoreButton(
onPressed: () {
seedLanguageStore.setCurrentRoute(Routes.restoreWalletFromKeys);
Navigator.pushNamed(context, Routes.seedLanguage);
},
image: _imageKeys,
aspectRatioImage: _aspectRatioImage,
titleColor: Palette.cakeGreen,
color: Palette.cakeGreen,
title: S.of(context).restore_title_from_keys,
description: S.of(context).restore_description_from_keys,
textButton: S.of(context).restore_next,
))
],
),
);
}
}
@@ -1,83 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
class SeedAlert extends StatelessWidget {
final imageSeed = Image.asset('assets/images/seedIco.png');
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomPadding: false,
backgroundColor: Theme.of(context).backgroundColor,
body: SafeArea(
child: Container(
padding: EdgeInsets.all(20.0),
child: Column(
children: <Widget>[
Expanded(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
imageSeed,
Text(
S.of(context).seed_alert_first_text,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 19.0),
),
SizedBox(
height: 20.0,
),
Text(
S.of(context).seed_alert_second_text,
textAlign: TextAlign.center,
style: TextStyle(
letterSpacing: 0.2,
fontSize: 16.0,
color: Palette.lightBlue),
),
SizedBox(
height: 20.0,
),
RichText(
textAlign: TextAlign.center,
text: TextSpan(children: <TextSpan>[
TextSpan(
text: S.of(context).seed_alert_third_text,
style: TextStyle(
letterSpacing: 0.2,
fontSize: 16.0,
color: Palette.lightBlue)),
TextSpan(
text: S.of(context).seed_alert_settings,
style: TextStyle(
letterSpacing: 0.2,
fontSize: 16.0,
color: Palette.lightGreen)),
TextSpan(
text: S.of(context).seed_alert_menu,
style: TextStyle(
letterSpacing: 0.2,
fontSize: 16.0,
color: Palette.lightBlue)),
]))
],
),
),
),
PrimaryButton(
onPressed: () {},
text: S.of(context).seed_alert_understand,
color:
Theme.of(context).primaryTextTheme.button.backgroundColor,
borderColor:
Theme.of(context).primaryTextTheme.button.decorationColor),
],
),
)),
);
}
}
@@ -0,0 +1,71 @@
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:provider/provider.dart';
import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart';
import 'package:cake_wallet/src/widgets/present_picker.dart';
class SeedLanguage extends BasePage {
final imageSeed = Image.asset('assets/images/seedIco.png');
@override
Widget body(BuildContext context) {
final seedLanguageStore = Provider.of<SeedLanguageStore>(context);
return Container(
padding: EdgeInsets.all(20.0),
child: Column(
children: <Widget>[
Expanded(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
imageSeed,
Text(
S.of(context).seed_language_choose,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 19.0),
),
SizedBox(
height: 20.0,
),
Observer(
builder: (_) => InkWell(
onTap: () => _setSeedLanguage(context),
child: Text(seedLanguageStore.selectedSeedLanguage,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 19.0, color: Palette.lightBlue),
),
)),
],
),
),
),
PrimaryButton(
onPressed: () =>
Navigator.of(context).popAndPushNamed(seedLanguageStore.currentRoute),
text: S.of(context).seed_language_next,
color:
Theme.of(context).primaryTextTheme.button.backgroundColor,
borderColor:
Theme.of(context).primaryTextTheme.button.decorationColor),
],
),
);
}
Future<void> _setSeedLanguage(BuildContext context) async {
final seedLanguageStore = Provider.of<SeedLanguageStore>(context);
final selectedSeedLanguage =
await presentPicker(context, seedLanguages);
if (selectedSeedLanguage != null) {
seedLanguageStore.setSelectedSeedLanguage(selectedSeedLanguage);
}
}
}
+4 -44
View File
@@ -17,6 +17,7 @@ import 'package:cake_wallet/src/screens/settings/attributes.dart';
import 'package:cake_wallet/src/screens/disclaimer/disclaimer_page.dart';
import 'package:cake_wallet/src/screens/settings/items/settings_item.dart';
import 'package:cake_wallet/src/screens/settings/items/item_headers.dart';
import 'package:cake_wallet/src/widgets/present_picker.dart';
// Settings widgets
import 'package:cake_wallet/src/screens/settings/widgets/settings_arrow_list_row.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_header_list_row.dart';
@@ -393,51 +394,10 @@ class SettingsFormState extends State<SettingsForm> {
));
}
Future<T> _presentPicker<T extends Object>(
BuildContext context, List<T> list) async {
T _value = list[0];
return 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) => _value = list[index],
children: List.generate(
list.length,
(index) => Center(
child: Text(
list[index].toString(),
style: TextStyle(
color: Theme.of(context)
.primaryTextTheme
.caption
.color),
),
))),
),
actions: <Widget>[
FlatButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(S.of(context).cancel)),
FlatButton(
onPressed: () => Navigator.of(context).pop(_value),
child: Text(S.of(context).ok))
],
);
});
}
Future<void> _setBalance(BuildContext context) async {
final settingsStore = Provider.of<SettingsStore>(context);
final selectedDisplayMode =
await _presentPicker(context, BalanceDisplayMode.all);
await presentPicker(context, BalanceDisplayMode.all);
if (selectedDisplayMode != null) {
await settingsStore.setCurrentBalanceDisplayMode(
@@ -447,7 +407,7 @@ class SettingsFormState extends State<SettingsForm> {
Future<void> _setCurrency(BuildContext context) async {
final settingsStore = Provider.of<SettingsStore>(context);
final selectedCurrency = await _presentPicker(context, FiatCurrency.all);
final selectedCurrency = await presentPicker(context, FiatCurrency.all);
if (selectedCurrency != null) {
await settingsStore.setCurrentFiatCurrency(currency: selectedCurrency);
@@ -457,7 +417,7 @@ class SettingsFormState extends State<SettingsForm> {
Future<void> _setTransactionPriority(BuildContext context) async {
final settingsStore = Provider.of<SettingsStore>(context);
final selectedPriority =
await _presentPicker(context, TransactionPriority.all);
await presentPicker(context, TransactionPriority.all);
if (selectedPriority != null) {
await settingsStore.setCurrentTransactionPriority(
@@ -12,6 +12,7 @@ import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/src/stores/wallet_list/wallet_list_store.dart';
import 'package:cake_wallet/src/screens/wallet_list/wallet_menu.dart';
import 'package:cake_wallet/src/widgets/picker.dart';
import 'package:cake_wallet/src/stores/seed_language/seed_language_store.dart';
class WalletListPage extends BasePage {
@override
@@ -54,6 +55,7 @@ class WalletListBodyState extends State<WalletListBody> {
@override
Widget build(BuildContext context) {
_walletListStore = Provider.of<WalletListStore>(context);
final seedLanguageStore = Provider.of<SeedLanguageStore>(context);
return ScrollableWithBottomSection(
content: Container(
@@ -100,8 +102,10 @@ class WalletListBodyState extends State<WalletListBody> {
),
bottomSection: Column(children: <Widget>[
PrimaryIconButton(
onPressed: () =>
Navigator.of(context).pushNamed(Routes.newWallet),
onPressed: () {
seedLanguageStore.setCurrentRoute(Routes.newWallet);
Navigator.of(context).pushNamed(Routes.seedLanguage);
},
iconData: Icons.add,
color: Theme.of(context).primaryTextTheme.button.backgroundColor,
borderColor: