New import Chest screen

This commit is contained in:
poka 2021-11-21 06:36:12 +01:00
parent b24211e43d
commit fbff8a6a91
11 changed files with 2362 additions and 41 deletions

2050
lib/models/bip39_words.dart Normal file

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/bip39_words.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:pdf/pdf.dart';
@ -39,6 +40,21 @@ class GenerateWalletsProvider with ChangeNotifier {
bool canImport = false;
bool isPinChanged = false;
// Import Chest
TextEditingController cellController0 = TextEditingController();
TextEditingController cellController1 = TextEditingController();
TextEditingController cellController2 = TextEditingController();
TextEditingController cellController3 = TextEditingController();
TextEditingController cellController4 = TextEditingController();
TextEditingController cellController5 = TextEditingController();
TextEditingController cellController6 = TextEditingController();
TextEditingController cellController7 = TextEditingController();
TextEditingController cellController8 = TextEditingController();
TextEditingController cellController9 = TextEditingController();
TextEditingController cellController10 = TextEditingController();
TextEditingController cellController11 = TextEditingController();
bool isFirstTimeSentenceComplete = true;
Future storeHDWChest(
NewWallet _wallet, String _name, BuildContext context) async {
int chestNumber = 0;
@ -140,7 +156,7 @@ class GenerateWalletsProvider with ChangeNotifier {
Future<String> generateMnemonic() async {
try {
generatedMnemonic = await DubpRust.genMnemonic(language: Language.french);
actualWallet = await generateWallet(generatedMnemonic);
actualWallet = await generateWallet(generatedMnemonic, isImport: false);
walletIsGenerated = true;
} catch (e) {
log.e(e);
@ -148,7 +164,8 @@ class GenerateWalletsProvider with ChangeNotifier {
return generatedMnemonic;
}
Future<NewWallet> generateWallet(generatedMnemonic) async {
Future<NewWallet> generateWallet(String generatedMnemonic,
{@required bool isImport}) async {
try {
actualWallet = await DubpRust.genWalletFromMnemonic(
language: Language.french,
@ -159,8 +176,10 @@ class GenerateWalletsProvider with ChangeNotifier {
log.e(e);
}
mnemonicController.text = generatedMnemonic;
pin.text = actualWallet.pin;
if (!isImport) {
mnemonicController.text = generatedMnemonic;
pin.text = actualWallet.pin;
}
// notifyListeners();
return actualWallet;
@ -288,15 +307,9 @@ class GenerateWalletsProvider with ChangeNotifier {
notifyListeners();
}
void resetImportView() {
cesiumID.text = '';
cesiumPWD.text = '';
cesiumPubkey.text = '';
pin.text = '';
canImport = false;
isPinChanged = false;
isCesiumIDVisible = false;
isCesiumPWDVisible = false;
void resetCesiumImportView() {
cesiumID.text = cesiumPWD.text = cesiumPubkey.text = pin.text = '';
canImport = isPinChanged = isCesiumIDVisible = isCesiumPWDVisible = false;
actualWallet = null;
notifyListeners();
}
@ -315,6 +328,78 @@ class GenerateWalletsProvider with ChangeNotifier {
return _wordsList;
}
bool isBipWord(String word) {
notifyListeners();
return bip39Words.contains(word);
}
bool isBipWordsList(List words) {
bool isValid = true;
for (String word in words) {
if (!bip39Words.contains(word)) {
isValid = false;
}
}
return isValid;
}
void resetImportView() {
cellController0.text = cellController1.text = cellController2.text =
cellController3.text = cellController4.text = cellController5.text =
cellController6.text = cellController7.text = cellController8.text =
cellController9.text =
cellController10.text = cellController11.text = '';
isFirstTimeSentenceComplete = true;
notifyListeners();
}
bool isSentenceComplete(BuildContext context) {
if (isBipWordsList(
[
cellController0.text,
cellController1.text,
cellController2.text,
cellController3.text,
cellController4.text,
cellController5.text,
cellController6.text,
cellController7.text,
cellController8.text,
cellController9.text,
cellController10.text,
cellController11.text
],
)) {
if (isFirstTimeSentenceComplete) {
FocusScope.of(context).unfocus();
}
isFirstTimeSentenceComplete = false;
return true;
} else {
return false;
}
}
Future<bool> isSentenceValid() async {
String inputMnemonic =
'${cellController0.text} ${cellController1.text} ${cellController2.text} ${cellController3.text} ${cellController4.text} ${cellController5.text} ${cellController6.text} ${cellController7.text} ${cellController8.text} ${cellController9.text} ${cellController10.text} ${cellController11.text}';
//TODO: Fix bad accent management
// inputMnemonic = inputMnemonic.replaceAll('é', 'eM-LM-^A');
// inputMnemonic = inputMnemonic.replaceAll('è', 'eM-LM-^@');
NewWallet generatedWallet =
await generateWallet(inputMnemonic, isImport: true);
log.d(inputMnemonic);
if (generatedWallet == null) {
return false;
} else {
return true;
}
}
void reloadBuild() {
notifyListeners();
}

View File

@ -71,6 +71,7 @@ class MyWalletsProvider with ChangeNotifier {
await walletBox.clear();
await chestBox.clear();
await configBox.delete('defaultWallet');
rebuildWidget();
Navigator.pop(context);
}

View File

@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
import 'package:gecko/models/home.dart';
import 'package:gecko/models/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/screens/myWallets/restore_chest.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/onBoarding/1.dart';
import 'dart:ui';
@ -484,7 +485,14 @@ Widget welcomeHome(context) {
style: OutlinedButton.styleFrom(
side: BorderSide(width: 4, color: orangeC)),
onPressed: () {
Navigator.push(context, null);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return const RestoreChest();
},
),
);
},
child: Text(
"Restaurer mes portefeuilles",

View File

@ -34,17 +34,18 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
child: Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(
toolbarHeight: 60 * ratio,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
_changePin.newPin.text = '';
Navigator.of(context).pop();
}),
title: SizedBox(
height: 22,
child: Text(walletName),
)),
toolbarHeight: 60 * ratio,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
_changePin.newPin.text = '';
Navigator.of(context).pop();
}),
title: SizedBox(
height: 22,
child: Text(walletName),
),
),
body: Center(
child: SafeArea(
child: Column(children: <Widget>[

View File

@ -24,7 +24,7 @@ class ImportWalletScreen extends StatelessWidget {
return WillPopScope(
onWillPop: () {
_generateWalletProvider.resetImportView();
_generateWalletProvider.resetCesiumImportView();
return Future<bool>.value(true);
},
child: Scaffold(
@ -33,7 +33,7 @@ class ImportWalletScreen extends StatelessWidget {
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
_generateWalletProvider.resetImportView();
_generateWalletProvider.resetCesiumImportView();
Navigator.of(context).pop();
}),
title: const SizedBox(
@ -171,7 +171,8 @@ class ImportWalletScreen extends StatelessWidget {
.importCesiumWallet()
.then((value) {
_myWalletProvider.rebuildWidget();
_generateWalletProvider.resetImportView();
_generateWalletProvider
.resetCesiumImportView();
Navigator.popUntil(
context,
ModalRoute.withName('/'),

View File

@ -0,0 +1,182 @@
import 'package:bubble/bubble.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/generate_wallets.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/onBoarding/11.dart';
import 'package:provider/provider.dart';
// import 'package:gecko/models/home.dart';
// import 'package:provider/provider.dart';
class RestoreChest extends StatelessWidget {
const RestoreChest({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false);
return WillPopScope(
onWillPop: () {
generateWalletProvider.resetImportView();
return Future<bool>.value(true);
},
child: Scaffold(
appBar: AppBar(
toolbarHeight: 60 * ratio,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
generateWalletProvider.resetImportView();
Navigator.of(context).pop();
}),
title: const SizedBox(
height: 22,
child: Text('Restaurer un coffre'),
)),
body: SafeArea(
child: Column(children: <Widget>[
SizedBox(height: isTall ? 30 : 15),
bubbleSpeak(
'Pour restaurer vos portefeuilles Gecko, rentrez dans les champs ci-dessous les 12 mots qui constituent votre phrase de restauration :'),
SizedBox(height: isTall ? 30 : 15),
Column(children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
arrayCell(context, generateWalletProvider.cellController0),
arrayCell(context, generateWalletProvider.cellController1),
arrayCell(context, generateWalletProvider.cellController2),
arrayCell(context, generateWalletProvider.cellController3),
]),
const SizedBox(height: 15),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
arrayCell(context, generateWalletProvider.cellController4),
arrayCell(context, generateWalletProvider.cellController5),
arrayCell(context, generateWalletProvider.cellController6),
arrayCell(context, generateWalletProvider.cellController7),
]),
const SizedBox(height: 15),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
arrayCell(context, generateWalletProvider.cellController8),
arrayCell(context, generateWalletProvider.cellController9),
arrayCell(context, generateWalletProvider.cellController10),
arrayCell(context, generateWalletProvider.cellController11),
]),
]),
// const Spacer(),
if (generateWalletProvider.isSentenceComplete(context))
Expanded(
child: Align(
alignment: Alignment.center,
child: SizedBox(
width: 410,
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 4,
primary: orangeC, // background
onPrimary: Colors.white, // foreground
),
onPressed: () async {
if (await generateWalletProvider.isSentenceValid()) {
generateWalletProvider.resetImportView();
await Navigator.push(
context,
FaderTransition(
page: OnboardingStepThirteen(), isFast: true),
);
} else {
await badMnemonicPopup(context);
}
},
child: const Text(
'Restaurer ce coffre',
style:
TextStyle(fontSize: 24, fontWeight: FontWeight.w600),
),
),
),
// SizedBox(height: isTall ? 80 : 80),
))
]),
),
),
);
}
Widget bubbleSpeak(String text) {
return Bubble(
margin: const BubbleEdges.symmetric(horizontal: 20),
padding: BubbleEdges.all(isTall ? 25 : 15),
borderWidth: 1,
borderColor: Colors.black,
radius: Radius.zero,
color: Colors.white,
child: Text(
text,
key: const Key('importText'),
textAlign: TextAlign.justify,
style: const TextStyle(
color: Colors.black, fontSize: 21, fontWeight: FontWeight.w400),
),
);
}
Widget arrayCell(BuildContext context, TextEditingController cellCtl) {
GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context);
return Container(
width: 102,
height: 40 * ratio,
child: TextField(
autofocus: true,
controller: cellCtl,
textInputAction: TextInputAction.next,
onChanged: (v) {
bool isValid = generateWalletProvider.isBipWord(v);
if (isValid && generateWalletProvider.cellController11.text.isEmpty) {
FocusScope.of(context).nextFocus();
}
},
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 20),
),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
color: Colors.white,
borderRadius: BorderRadius.circular(3),
),
);
}
Future<bool> badMnemonicPopup(BuildContext context) async {
return showDialog<bool>(
context: context,
barrierDismissible: true, // user must tap button!
builder: (BuildContext context) {
return AlertDialog(
title: const Text('Phrase incorrecte'),
content: const Text(
'Votre phrase de restauration semble incorrecte, veuillez la corriger.'),
actions: <Widget>[
TextButton(
child: const Text("OK"),
onPressed: () {
Navigator.pop(context);
},
),
],
);
},
);
}
}

View File

@ -11,7 +11,6 @@ import 'package:gecko/screens/myWallets/cesium_wallet_options.dart';
import 'package:gecko/screens/myWallets/chest_options.dart';
import 'package:gecko/screens/myWallets/choose_chest.dart';
import 'package:gecko/screens/myWallets/wallet_options.dart';
import 'package:gecko/screens/onBoarding/0_no_keychain_found.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
@ -28,13 +27,10 @@ class WalletsHome extends StatelessWidget {
final int _currentChestNumber = myWalletProvider.getCurrentChest();
final ChestData _currentChest = chestBox.get(_currentChestNumber);
bool isWalletsExists;
if (!_currentChest.isCesium) {
myWalletProvider.listWallets =
myWalletProvider.readAllWallets(_currentChestNumber);
}
isWalletsExists = myWalletProvider.checkIfWalletExist();
return WillPopScope(
onWillPop: () {
@ -61,12 +57,9 @@ class WalletsHome extends StatelessWidget {
backgroundColor: const Color(0xffFFD58D),
),
body: SafeArea(
child: !isWalletsExists
? const NoKeyChainScreen()
: _currentChest.isCesium
? cesiumWalletOptions(
context, _currentChest, myWalletProvider)
: myWalletsTiles(context),
child: _currentChest.isCesium
? cesiumWalletOptions(context, _currentChest, myWalletProvider)
: myWalletsTiles(context),
),
),
);

View File

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/import_wallet.dart';
import 'package:gecko/screens/myWallets/import_cesium_wallet.dart';
import 'package:gecko/screens/onBoarding/1.dart';
class NoKeyChainScreen extends StatelessWidget {

View File

@ -5,7 +5,7 @@ import 'package:gecko/models/home.dart';
import 'package:gecko/models/my_wallets.dart';
import 'package:gecko/screens/myWallets/generate_wallets.dart';
import 'dart:io';
import 'package:gecko/screens/myWallets/import_wallet.dart';
import 'package:gecko/screens/myWallets/import_cesium_wallet.dart';
import 'package:gecko/globals.dart';
import 'package:provider/provider.dart';

View File

@ -5,7 +5,7 @@ description: Pay with G1.
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 0.0.3+1
version: 0.0.3+2
environment:
sdk: ">=2.7.0 <3.0.0"