New import Chest screen
This commit is contained in:
parent
b24211e43d
commit
fbff8a6a91
File diff suppressed because it is too large
Load Diff
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -71,6 +71,7 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
await walletBox.clear();
|
||||
await chestBox.clear();
|
||||
await configBox.delete('defaultWallet');
|
||||
rebuildWidget();
|
||||
|
||||
Navigator.pop(context);
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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>[
|
||||
|
|
|
@ -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('/'),
|
|
@ -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);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue