diff --git a/lib/globals.dart b/lib/globals.dart index 1c7816f55200bb3890d6b2dd0a58c922da8d615b..1b3913cf9cf994f71f89046f461b21a45f5f459d 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -8,7 +8,7 @@ import 'package:logger/logger.dart'; import 'package:shared_preferences/shared_preferences.dart'; // Version of box data -const int dataVersion = 1; +const int dataVersion = 2; // Files paths Directory? appPath; diff --git a/lib/main.dart b/lib/main.dart index f534cf7b2b9b3bdbe3b27792fa408a8dfc87dd8d..d1e3a768eb015316f0acfb716ad5768f544e7343 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -73,6 +73,7 @@ Future<void> main() async { await Hive.deleteBoxFromDisk('g1WalletsBox'); g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox"); + // keystoreBox = await Hive.openBox("keystoreBox"); // g1WalletsBox.clear(); diff --git a/lib/models/chest_data.dart b/lib/models/chest_data.dart index cd9ab30cfe4465f75ea8e827dc164de7012987dc..7e04b13d8b863cac48fe41c0264d82310d60a9fd 100644 --- a/lib/models/chest_data.dart +++ b/lib/models/chest_data.dart @@ -7,29 +7,21 @@ part 'chest_data.g.dart'; @HiveType(typeId: 1) class ChestData extends HiveObject { @HiveField(0) - String? address; - - @HiveField(1) - String? rootAddress; - - @HiveField(2) String? name; - @HiveField(3) + @HiveField(1) int? defaultWallet; - @HiveField(4) + @HiveField(2) String? imageName; - @HiveField(5) + @HiveField(3) File? imageFile; - @HiveField(6) + @HiveField(4) bool? isCesium; ChestData({ - this.address, - this.rootAddress, this.name, this.defaultWallet, this.imageName, diff --git a/lib/models/chest_data.g.dart b/lib/models/chest_data.g.dart index b853f39473d8acb05eac100940fee8f1ad07f4fb..b547a6b58fbc95302ee52e74e924008160e5a145 100644 --- a/lib/models/chest_data.g.dart +++ b/lib/models/chest_data.g.dart @@ -17,33 +17,27 @@ class ChestDataAdapter extends TypeAdapter<ChestData> { for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), }; return ChestData( - address: fields[0] as String?, - rootAddress: fields[1] as String?, - name: fields[2] as String?, - defaultWallet: fields[3] as int?, - imageName: fields[4] as String?, - imageFile: fields[5] as File?, - isCesium: fields[6] as bool?, + name: fields[0] as String?, + defaultWallet: fields[1] as int?, + imageName: fields[2] as String?, + imageFile: fields[3] as File?, + isCesium: fields[4] as bool?, ); } @override void write(BinaryWriter writer, ChestData obj) { writer - ..writeByte(7) + ..writeByte(5) ..writeByte(0) - ..write(obj.address) - ..writeByte(1) - ..write(obj.rootAddress) - ..writeByte(2) ..write(obj.name) - ..writeByte(3) + ..writeByte(1) ..write(obj.defaultWallet) - ..writeByte(4) + ..writeByte(2) ..write(obj.imageName) - ..writeByte(5) + ..writeByte(3) ..write(obj.imageFile) - ..writeByte(6) + ..writeByte(4) ..write(obj.isCesium); } diff --git a/lib/providers/generate_wallets.dart b/lib/providers/generate_wallets.dart index 56d8127d8e4d57573578eae7e9017fdc0d3eddee..af03416ccfc24fee9bc0303720436b57d89f3954 100644 --- a/lib/providers/generate_wallets.dart +++ b/lib/providers/generate_wallets.dart @@ -71,7 +71,6 @@ class GenerateWalletsProvider with ChangeNotifier { chestName = 'Coffre à Ğecko ${chestNumber + 1}'; } ChestData thisChest = ChestData( - address: address, name: chestName, defaultWallet: 0, imageName: '${chestNumber % 8}.png', diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 536295c62b4e2964e263506ada60fa1179487669..2ba85661989f2d40de998665ae734c7705438054 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'dart:async'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/screens/common_elements.dart'; @@ -73,7 +72,7 @@ class MyWalletsProvider with ChangeNotifier { try { log.w('DELETE ALL WALLETS ?'); - final bool? _answer = await (confirmPopop( + final bool? _answer = await (confirmPopup( context, 'Êtes-vous sûr de vouloir oublier tous vos coffres ?')); if (_answer!) { await walletBox.clear(); @@ -92,6 +91,9 @@ class MyWalletsProvider with ChangeNotifier { } Future<void> generateNewDerivation(context, String _name) async { + MyWalletsProvider _myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); + isNewDerivationLoading = true; notifyListeners(); int _newDerivationNbr; @@ -107,17 +109,12 @@ class MyWalletsProvider with ChangeNotifier { _newDerivationNbr = _walletConfig.last.derivation! + 2; _newWalletNbr = _walletConfig.last.number! + 1; } - - MyWalletsProvider myWalletProvider = - Provider.of<MyWalletsProvider>(context, listen: false); - SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); - final int? _currentChestNumber = myWalletProvider.getCurrentChest(); - final ChestData _currentChest = chestBox.get(_currentChestNumber)!; + WalletData defaultWallet = _myWalletProvider.getDefaultWallet()!; final address = await _sub.derive( - context, _currentChest.address!, _newDerivationNbr, pinCode); + context, defaultWallet.address!, _newDerivationNbr, pinCode); WalletData newWallet = WalletData( version: dataVersion, diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 1ae0c36d675f1814e22459c3b9f163b5316ecefb..02aeef828b7b5d2eb12a7b8653841b660e9551bc 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -58,16 +58,14 @@ class WalletOptionsProvider with ChangeNotifier { } Future<int> deleteWallet(context, WalletData wallet) async { - final bool? _answer = await (confirmPopop(context, + SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); + final bool? _answer = await (confirmPopup(context, 'Êtes-vous sûr de vouloir oublier le portefeuille "${wallet.name}" ?')); if (_answer!) { await walletBox.delete(wallet.key); + await _sub.deleteAccounts([wallet.address!]); - // Navigator.popUntil( - // context, - // ModalRoute.withName('/mywallets'), - // ); Navigator.pop(context); } return 0; diff --git a/lib/screens/common_elements.dart b/lib/screens/common_elements.dart index f9daa8f7d9f1995bfb6b874dd2d2889dd95c3f18..e78c7ff76cb7abee6f91e6a9e21e24182ace5386 100644 --- a/lib/screens/common_elements.dart +++ b/lib/screens/common_elements.dart @@ -192,53 +192,90 @@ class FaderTransition extends PageRouteBuilder { ); } -Future<bool?> confirmPopop(BuildContext context, String title) async { - return showDialog<bool>( - context: context, - barrierDismissible: true, // user must tap button! - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: backgroundColor, - content: Text( - title, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), - ), - actions: <Widget>[ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - TextButton( - key: const Key('confirmPopop'), - child: const Text( - "Oui", - style: TextStyle( - fontSize: 21, - color: Color(0xffD80000), - ), +Future<bool?> confirmPopup(BuildContext context, String title) async { + return showDialog<bool>( + context: context, + barrierDismissible: true, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: backgroundColor, + content: Text( + title, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + actions: <Widget>[ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + key: const Key('confirmPopop'), + child: const Text( + "Oui", + style: TextStyle( + fontSize: 21, + color: Color(0xffD80000), ), - onPressed: () { - Navigator.pop(context, true); - }, ), - const SizedBox(width: 20), - TextButton( - child: const Text( - "Non", - style: TextStyle(fontSize: 21), + onPressed: () { + Navigator.pop(context, true); + }, + ), + const SizedBox(width: 20), + TextButton( + child: const Text( + "Non", + style: TextStyle(fontSize: 21), + ), + onPressed: () { + Navigator.pop(context, false); + }, + ), + const SizedBox(height: 120) + ], + ) + ], + ); + }, + ); +} + +Future<void> infoPopup(BuildContext context, String title) async { + return showDialog<void>( + context: context, + barrierDismissible: true, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: backgroundColor, + content: Text( + title, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + actions: <Widget>[ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + key: const Key('infoPopup'), + child: const Text( + "D'accord", + style: TextStyle( + fontSize: 21, + color: Color(0xffD80000), ), - onPressed: () { - Navigator.pop(context, false); - }, ), - const SizedBox(height: 120) - ], - ) - ], - ); - }, - ); - } + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ) + ], + ); + }, + ); +} // Widget geckoAppBar() { // return AppBar( diff --git a/lib/screens/home.dart b/lib/screens/home.dart index ec7ef45741c5d844a71b84072f8b0bd86bd6eed0..55bc56a7266f58fb1a51b2daea0fb1f1ed004358 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -7,6 +7,7 @@ import 'package:gecko/providers/wallets_profiles.dart'; import 'package:flutter/material.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/models/wallet_data.dart'; +import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/myWallets/restore_chest.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/onBoarding/1.dart'; @@ -102,6 +103,17 @@ class HomeScreen extends StatelessWidget { WidgetsBinding.instance.addPostFrameCallback((_) async { if (!_sub.sdkReady && !_sub.sdkLoading) await _sub.initApi(); if (_sub.sdkReady && !_sub.nodeConnected) { + if (walletBox.isNotEmpty && + walletBox.getAt(0)!.version! < dataVersion) { + await infoPopup(context, + "La version de vos coffres n'est plus comptabile avec cette version de Ğecko.\nTous vos coffres vont être oubliés, vous devez les importer de nouveau."); + await walletBox.clear(); + await chestBox.clear(); + await configBox.delete('defaultWallet'); + await _sub.deleteAllAccounts(); + _myWalletProvider.rebuildWidget(); + } + await _sub.connectNode(ctx); //kopa } }); diff --git a/lib/screens/myWallets/change_pin.dart b/lib/screens/myWallets/change_pin.dart index 1f038e096c756c70152fd2fee8ff03877b607207..52e88ddd2f9902ad87569e820b918f6648b1e4c1 100644 --- a/lib/screens/myWallets/change_pin.dart +++ b/lib/screens/myWallets/change_pin.dart @@ -3,6 +3,7 @@ import 'package:durt/durt.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/stateful_wrapper.dart'; +import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'dart:io'; @@ -26,6 +27,8 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); + MyWalletsProvider _myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); return WillPopScope( onWillPop: () { @@ -100,9 +103,11 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { onPrimary: Colors.black, // foreground ), onPressed: () async { - final _chest = chestBox.get(configBox.get('currentChest')); + WalletData defaultWallet = + _myWalletProvider.getDefaultWallet()!; + await _sub.changePassword( - _chest!.address!, walletProvider.pinCode, newPin.text); + defaultWallet.address!, walletProvider.pinCode, newPin.text); walletProvider.pinCode = newPin.text; newPin.text = ''; Navigator.pop(context); diff --git a/lib/screens/myWallets/show_seed.dart b/lib/screens/myWallets/show_seed.dart index c05d794276fc991083605ecf45886d51a584e5a9..8d035d817c36bd62369050fd0ea4271bb1a2f909 100644 --- a/lib/screens/myWallets/show_seed.dart +++ b/lib/screens/myWallets/show_seed.dart @@ -2,6 +2,7 @@ import 'dart:typed_data'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; +import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/screens/common_elements.dart'; @@ -22,14 +23,14 @@ class ShowSeed extends StatelessWidget { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - // HomeProvider _homeProvider = Provider.of<HomeProvider>(context); + MyWalletsProvider _myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); CommonElements common = CommonElements(); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); - final _chest = chestBox.get(configBox.get('currentChest')); - // _sub.changePassword( - // _chest!.address!, walletProvider.pinCode, newPin.text); +WalletData defaultWallet = + _myWalletProvider.getDefaultWallet()!; return Scaffold( backgroundColor: backgroundColor, @@ -43,7 +44,7 @@ class ShowSeed extends StatelessWidget { child: Column(children: <Widget>[ const Spacer(flex: 1), FutureBuilder( - future: _sub.getSeed(_chest!.address!, walletProvider.pinCode), + future: _sub.getSeed(defaultWallet.address!, walletProvider.pinCode), builder: (BuildContext context, AsyncSnapshot<String?> _seed) { if (_seed.connectionState != ConnectionState.done || _seed.hasError) { diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 2b793e4aab01dfd8838dbf1e4397f68169223638..64acdaf73632c2a1bc309923fb0fbdc3a1fbf7d0 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -42,6 +42,7 @@ class UnlockingWallet extends StatelessWidget { currentChestNumber = configBox.get('currentChest'); currentChest = chestBox.get(currentChestNumber)!; + int _pinLenght = _walletOptions.getPinLenght(wallet!.number); errorController = StreamController<ErrorAnimationType>(); @@ -145,9 +146,10 @@ class UnlockingWallet extends StatelessWidget { Provider.of<WalletOptionsProvider>(context); MyWalletsProvider _myWalletProvider = Provider.of<MyWalletsProvider>(context); - SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); + WalletData? defaultWallet = _myWalletProvider.getDefaultWallet(); + FocusNode pinFocus = FocusNode(); return Form( @@ -201,7 +203,7 @@ class UnlockingWallet extends StatelessWidget { _myWalletProvider.pinCode = _pin.toUpperCase(); final isValid = await _sub.checkPassword( - currentChest.address!, _pin.toUpperCase()); + defaultWallet!.address!, _pin.toUpperCase()); if (!isValid) { await Future.delayed(const Duration(milliseconds: 50)); diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index 86a9e9fc4a410844cc1ae51aa695ed120dc9e65c..596d1b29d44a4dbdd92d4b5adfe0a26e6501c2ad 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -12,18 +12,26 @@ import 'package:provider/provider.dart'; AsyncSnapshot<List>? mnemoList; -class OnboardingStepFive extends StatelessWidget { +class OnboardingStepFive extends StatefulWidget { const OnboardingStepFive({Key? key, this.skipIntro = false}) : super(key: key); final bool skipIntro; + @override + State<StatefulWidget> createState() { + return _ChooseChestState(); + } +} + +// ignore: unused_element +class _ChooseChestState extends State<OnboardingStepFive> { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); GenerateWalletsProvider _generateWalletProvider = Provider.of<GenerateWalletsProvider>(context, listen: false); - CommonElements common = CommonElements(); + final CommonElements common = CommonElements(); return Scaffold( backgroundColor: backgroundColor, @@ -82,8 +90,8 @@ class OnboardingStepFive extends StatelessWidget { onPrimary: Colors.black, // foreground ), onPressed: () { - _generateWalletProvider.reloadBuild(); - // setState(() {}); + // _generateWalletProvider.reloadBuild(); + setState(() {}); }, child: Text("Choisir une autre phrase", style: TextStyle( @@ -93,7 +101,7 @@ class OnboardingStepFive extends StatelessWidget { ), ), SizedBox(height: 22 * ratio), - nextButton(context, "J'ai noté ma phrase", false, skipIntro), + nextButton(context, "J'ai noté ma phrase", false, widget.skipIntro), SizedBox(height: 35 * ratio), ]), ), @@ -103,7 +111,7 @@ class OnboardingStepFive extends StatelessWidget { Widget sentanceArray(BuildContext context) { GenerateWalletsProvider _generateWalletProvider = - Provider.of<GenerateWalletsProvider>(context); + Provider.of<GenerateWalletsProvider>(context, listen: false); return Padding( padding: const EdgeInsets.symmetric(horizontal: 3), @@ -181,7 +189,7 @@ class PrintWallet extends StatelessWidget { @override Widget build(BuildContext context) { GenerateWalletsProvider _generateWalletProvider = - Provider.of<GenerateWalletsProvider>(context); + Provider.of<GenerateWalletsProvider>(context, listen: false); return MaterialApp( home: Scaffold( appBar: AppBar( diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 308e6b09762331c0e9cf4d3026220ee50d63e947..ebbf720ebe9bd7526d8371ed50fbeaf7232b4679 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -76,7 +76,7 @@ class WalletViewScreen extends StatelessWidget { 'assets/walletOptions/clock.png'), height: 90)), onTap: () { - ////TODO: wait for subsquid indexer + //// Wait for subsquid indexer // _historyProvider.nPage = 1; // Navigator.push( // context, diff --git a/pubspec.yaml b/pubspec.yaml index d6ed34070bd1cf2908d8106d7af471a7c3f7e9f9..fac9f3eda32db55abeb03995606e4d7dd5bf6c3a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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.7+2 +version: 0.0.7+3 environment: sdk: '>=2.12.0 <3.0.0'