V4.6.4 fixes (#904)

* Check if context is still mounted or not before showing popup

* - Refactor Restore route flow
- Fix Monero.com restore from QR
- Remove deprecated restore classes
- Update Monero.com app version and notes

* Update Macos version and release notes

* Fixate android plugin versions as Flutter published new fail packages version

* Revert desktop changes as it's not supported yet to scan QR code on Desktop [skip ci]

* Revert macos version update [skip ci]
This commit is contained in:
Omar Hatem
2023-04-27 17:06:09 +02:00
committed by GitHub
parent 82b513d1f8
commit 367efb3cae
12 changed files with 62 additions and 524 deletions
@@ -1,6 +1,5 @@
import 'package:another_flushbar/flushbar.dart';
import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/desktop_dropdown_item.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart';
@@ -7,6 +7,7 @@ import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/restore/restore_from_qr_vm.dart';
import 'package:cake_wallet/view_model/restore/wallet_restore_from_qr_code.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/wallet_type_utils.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/routes.dart';
import 'package:flutter/cupertino.dart';
@@ -38,7 +39,7 @@ class RestoreOptionsPage extends BasePage {
children: <Widget>[
RestoreButton(
onPressed: () => Navigator.pushNamed(
context, Routes.restoreWalletOptionsFromWelcome,
context, Routes.restoreWalletFromSeedKeys,
arguments: isNewInstall),
image: imageSeedKeys,
title: S.of(context).restore_title_from_seed_keys,
@@ -1,212 +0,0 @@
import 'package:cake_wallet/core/wallet_name_validator.dart';
import 'package:cake_wallet/palette.dart';
import 'package:flutter/services.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
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/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/view_model/wallet_restoration_from_keys_vm.dart';
import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
class RestoreWalletFromKeysPage extends BasePage {
RestoreWalletFromKeysPage(
{required this.walletRestorationFromKeysVM});
final WalletRestorationFromKeysVM walletRestorationFromKeysVM;
@override
String get title => S.current.restore_title_from_keys;
@override
Widget body(BuildContext context) => RestoreFromKeysFrom(walletRestorationFromKeysVM);
}
class RestoreFromKeysFrom extends StatefulWidget {
RestoreFromKeysFrom(this.walletRestorationFromKeysVM);
final WalletRestorationFromKeysVM walletRestorationFromKeysVM;
@override
_RestoreFromKeysFromState createState() => _RestoreFromKeysFromState();
}
class _RestoreFromKeysFromState extends State<RestoreFromKeysFrom> {
final _formKey = GlobalKey<FormState>();
final _blockchainHeightKey = GlobalKey<BlockchainHeightState>();
final _nameController = TextEditingController();
final _addressController = TextEditingController();
final _viewKeyController = TextEditingController();
final _spendKeyController = TextEditingController();
final _wifController = TextEditingController();
@override
void initState() {
_nameController.addListener(() =>
widget.walletRestorationFromKeysVM.name = _nameController.text);
_addressController.addListener(() =>
widget.walletRestorationFromKeysVM.address = _addressController.text);
_viewKeyController.addListener(() =>
widget.walletRestorationFromKeysVM.viewKey = _viewKeyController.text);
_spendKeyController.addListener(() =>
widget.walletRestorationFromKeysVM.spendKey = _spendKeyController.text);
_wifController.addListener(() =>
widget.walletRestorationFromKeysVM.wif = _wifController.text);
super.initState();
}
@override
void dispose() {
_nameController.dispose();
_addressController.dispose();
_viewKeyController.dispose();
_spendKeyController.dispose();
_wifController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
/*reaction((_) => walletRestorationStore.state, (WalletRestorationState state) {
if (state is WalletRestoredSuccessfully) {
Navigator.of(context).popUntil((route) => route.isFirst);
}
if (state is WalletRestorationFailure) {
WidgetsBinding.instance.addPostFrameCallback((_) {
showPopUp<void>(
context: context,
builder: (BuildContext context) {
return AlertWithOneAction(
alertTitle: S.current.restore_title_from_keys,
alertContent: state.error,
buttonText: S.of(context).ok,
buttonAction: () => Navigator.of(context).pop()
);
});
});
}
});*/
return Container(
padding: EdgeInsets.only(left: 24, right: 24),
child: ScrollableWithBottomSection(
contentPadding: EdgeInsets.only(bottom: 24.0),
content: Form(
key: _formKey,
child: Column(children: <Widget>[
Row(
children: <Widget>[
Flexible(
child: Container(
padding: EdgeInsets.only(top: 20.0),
child: BaseTextFormField(
controller: _nameController,
hintText: S.of(context).restore_wallet_name,
validator: WalletNameValidator(),
)
))
],
),
if (!widget.walletRestorationFromKeysVM.hasRestorationHeight)
Row(
children: <Widget>[
Flexible(
child: Container(
padding: EdgeInsets.only(top: 20.0),
child: BaseTextFormField(
controller: _wifController,
hintText: 'WIF',
)
))
],
),
if (widget.walletRestorationFromKeysVM.hasRestorationHeight) ... [
Row(
children: <Widget>[
Flexible(
child: Container(
padding: EdgeInsets.only(top: 20.0),
child: BaseTextFormField(
controller: _addressController,
keyboardType: TextInputType.multiline,
maxLines: null,
hintText: S.of(context).restore_address,
)
))
],
),
Row(
children: <Widget>[
Flexible(
child: Container(
padding: EdgeInsets.only(top: 20.0),
child: BaseTextFormField(
controller: _viewKeyController,
hintText: S.of(context).restore_view_key_private,
)
))
],
),
Row(
children: <Widget>[
Flexible(
child: Container(
padding: EdgeInsets.only(top: 20.0),
child: BaseTextFormField(
controller: _spendKeyController,
hintText: S.of(context).restore_spend_key_private,
)
))
],
),
BlockchainHeightWidget(
key: _blockchainHeightKey,
onHeightChange: (height) {
widget.walletRestorationFromKeysVM.height = height;
print(height);
}),
Padding(
padding: EdgeInsets.only(left: 40, right: 40, top: 24),
child: Text(
S.of(context).restore_from_date_or_blockheight,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.normal,
color: Theme.of(context).hintColor
),
),
)],
]),
),
bottomSectionPadding: EdgeInsets.only(bottom: 24),
bottomSection: Observer(builder: (_) {
return LoadingPrimaryButton(
onPressed: () {
if (_formKey.currentState != null && _formKey.currentState!.validate()) {
/*walletRestorationStore.restoreFromKeys(
name: _nameController.text,
language: seedLanguageStore.selectedSeedLanguage,
address: _addressController.text,
viewKey: _viewKeyController.text,
spendKey: _spendKeyController.text,
restoreHeight: _blockchainHeightKey.currentState.height);*/
}
},
text: S.of(context).restore_recover,
color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
textColor: Colors.white,
//isDisabled: walletRestorationStore.disabledState,
);
}),
),
);
}
}
@@ -1,199 +0,0 @@
import 'package:cake_wallet/src/screens/restore/restore_from_keys.dart';
import 'package:cake_wallet/src/screens/restore/wallet_restore_from_seed_form.dart';
import 'package:cake_wallet/src/screens/seed_language/widgets/seed_language_picker.dart';
import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/src/widgets/blockchain_height_widget.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/utils/show_pop_up.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/widgets/seed_widget.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:cake_wallet/core/seed_validator.dart';
import 'package:cake_wallet/core/mnemonic_length.dart';
import 'package:smooth_page_indicator/smooth_page_indicator.dart';
class RestoreWalletFromSeedPage extends BasePage {
RestoreWalletFromSeedPage({required this.type})
: _pages = <Widget>[];
final WalletType type;
final String language = 'en';
// final formKey = GlobalKey<_RestoreFromSeedFormState>();
// final formKey = GlobalKey<_RestoreFromSeedFormState>();
@override
String get title => S.current.restore_title_from_seed;
final controller = PageController(initialPage: 0);
List<Widget> _pages;
Widget _page(BuildContext context, int index) {
if (_pages == null || _pages.isEmpty) {
_setPages(context);
}
return _pages[index];
}
int _pageLength(BuildContext context) {
if (_pages == null || _pages.isEmpty) {
_setPages(context);
}
return _pages.length;
}
void _setPages(BuildContext context) {
_pages = <Widget>[
// FIX-ME: Added args (displayBlockHeightSelector: true, displayLanguageSelector: true, type: type)
WalletRestoreFromSeedForm(displayBlockHeightSelector: true, displayLanguageSelector: true, type: type),
RestoreFromKeysFrom(),
];
}
@override
Widget body(BuildContext context) {
return Column(mainAxisAlignment: MainAxisAlignment.center, children: [
Expanded(
child: PageView.builder(
onPageChanged: (page) {
print('Page index $page');
},
controller: controller,
itemCount: _pageLength(context),
itemBuilder: (context, index) => _page(context, index))),
Padding(
padding: EdgeInsets.only(top: 10),
child: SmoothPageIndicator(
controller: controller,
count: _pageLength(context),
effect: ColorTransitionEffect(
spacing: 6.0,
radius: 6.0,
dotWidth: 6.0,
dotHeight: 6.0,
dotColor: Theme.of(context).hintColor.withOpacity(0.5),
activeDotColor: Theme.of(context).hintColor),
)),
Padding(
padding: EdgeInsets.only(top: 20, bottom: 24, left: 24, right: 24),
child: PrimaryButton(
text: S.of(context).restore_recover,
isDisabled: false,
onPressed: () => null,
color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
textColor: Colors.white)),
]);
// return GestureDetector(
// onTap: () =>
// SystemChannels.textInput.invokeMethod<void>('TextInput.hide'),
// child: ScrollableWithBottomSection(
// bottomSection: Column(children: [
// GestureDetector(
// onTap: () {},
// child: Text('Switch to restore from keys',
// style: TextStyle(fontSize: 15, color: Theme.of(context).hintColor))),
// SizedBox(height: 30),
// PrimaryButton(
// text: S.of(context).restore_next,
// isDisabled: false,
// onPressed: () => null,
// color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
// textColor: Colors.white)
// ]),
// contentPadding: EdgeInsets.only(bottom: 24),
// content: Container(
// padding: EdgeInsets.only(left: 25, right: 25),
// child: Column(children: [
// SeedWidget(
// maxLength: mnemonicLength(type),
// onMnemonicChange: (seed) => null,
// onFinish: () => Navigator.of(context).pushNamed(
// Routes.restoreWalletFromSeedDetails,
// arguments: [type, language, '']),
// validator: SeedValidator(type: type, language: language),
// ),
// // SizedBox(height: 15),
// // BaseTextFormField(hintText: 'Language', initialValue: 'English'),
// BlockchainHeightWidget(
// // key: _blockchainHeightKey,
// onHeightChange: (height) {
// // widget.walletRestorationFromKeysVM.height = height;
// print(height);
// })
// ]))),
// );
}
}
class RestoreFromSeedForm extends StatefulWidget {
RestoreFromSeedForm(
{Key? key,
required this.type,
this.language,
this.leading,
this.middle})
: super(key: key);
final WalletType type;
final String? language;
final Widget? leading;
final Widget? middle;
@override
_RestoreFromSeedFormState createState() => _RestoreFromSeedFormState();
}
class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> {
// final _seedKey = GlobalKey<SeedWidgetState>();
String mnemonic() =>
''; // _seedKey.currentState.items.map((e) => e.text).join(' ');
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () =>
SystemChannels.textInput.invokeMethod<void>('TextInput.hide'),
child: Container(
padding: EdgeInsets.only(left: 24, right: 24),
// color: Colors.blue,
// height: 300,
child: Column(children: [
SeedWidget(
type: widget.type,
language: widget.language ?? '',
// key: _seedKey,
// maxLength: mnemonicLength(widget.type),
// onMnemonicChange: (seed) => null,
// onFinish: () => Navigator.of(context).pushNamed(
// Routes.restoreWalletFromSeedDetails,
// arguments: [widget.type, widget.language, mnemonic()]),
// leading: widget.leading,
// middle: widget.middle,
// validator:
// SeedValidator(type: widget.type, language: widget.language),
),
BlockchainHeightWidget(
// key: _blockchainHeightKey,
onHeightChange: (height) {
// widget.walletRestorationFromKeysVM.height = height;
print(height);
}),
Container(
color: Colors.green,
width: 100,
height: 56,
child: BaseTextFormField(
hintText: 'Language', initialValue: 'English')),
])),
);
}
}
@@ -174,12 +174,7 @@ class WalletListBodyState extends State<WalletListBody> {
SizedBox(height: 10.0),
PrimaryImageButton(
onPressed: () {
if (isSingleCoin) {
Navigator.of(context).pushNamed(Routes.restoreWallet,
arguments: widget.walletListViewModel.currentWalletType);
} else {
Navigator.of(context).pushNamed(Routes.restoreOptions, arguments: false);
}
Navigator.of(context).pushNamed(Routes.restoreOptions, arguments: false);
},
image: restoreWalletImage,
text: S.of(context).wallet_list_restore_wallet,