From f39cafd309201bb1d39fb1980efa054eab47394e Mon Sep 17 00:00:00 2001 From: poka <poka@p2p.legal> Date: Thu, 11 Mar 2021 07:08:45 +0100 Subject: [PATCH] Big improve on Wallets Tiles; Review of wallets index format --- assets/chopp-gecko.svg | 9 ++ assets/chopp-gecko2.png | Bin 0 -> 9520 bytes lib/globals.dart | 2 + lib/main.dart | 2 + lib/models/generateWallets.dart | 62 +++++-------- lib/models/myWallets.dart | 27 ++++-- .../myWallets/confirmWalletStorage.dart | 5 +- lib/screens/myWallets/walletsHome.dart | 84 +++++++++++++----- lib/screens/myWallets/walletsHome_old.dart | 2 +- lib/screens/onBoarding/12.dart | 5 +- pubspec.yaml | 2 +- 11 files changed, 123 insertions(+), 77 deletions(-) create mode 100755 assets/chopp-gecko.svg create mode 100755 assets/chopp-gecko2.png diff --git a/assets/chopp-gecko.svg b/assets/chopp-gecko.svg new file mode 100755 index 00000000..39b6a7b6 --- /dev/null +++ b/assets/chopp-gecko.svg @@ -0,0 +1,9 @@ +<svg width="96" height="117" viewBox="0 0 96 117" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<rect width="96" height="115.59" transform="matrix(-1 0 0 1 96 0.480713)" fill="url(#pattern0)"/> +<defs> +<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1"> +<use xlink:href="#image0" transform="translate(-0.0160256) scale(0.00819088 0.00680272)"/> +</pattern> +<image id="image0" width="126" height="147" xlink:href="data:image/png;base64,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"/> +</defs> +</svg> diff --git a/assets/chopp-gecko2.png b/assets/chopp-gecko2.png new file mode 100755 index 0000000000000000000000000000000000000000..6e97b0b626fad33362a517736bacdb3d013b71cd GIT binary patch literal 9520 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 O0000<MNUMnLSTZ8k7DWo literal 0 HcmV?d00001 diff --git a/lib/globals.dart b/lib/globals.dart index 78a6a021..045c95a5 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -3,6 +3,8 @@ import 'package:shared_preferences/shared_preferences.dart'; Directory appPath; Directory walletsDirectory; +File defaultWalletFile; +String defaultWallet; String appVersion; SharedPreferences prefs; String endPointGVA; diff --git a/lib/main.dart b/lib/main.dart index 50db8865..af7109e8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,8 +25,10 @@ Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); HomeProvider _homeProvider = HomeProvider(); + MyWalletsProvider _walletsProvider = MyWalletsProvider(); await _homeProvider.getAppPath(); await _homeProvider.createDefaultAvatar(); + await _walletsProvider.getDefaultWallet(); appVersion = await _homeProvider.getAppVersion(); prefs = await SharedPreferences.getInstance(); final HiveStore _store = diff --git a/lib/models/generateWallets.dart b/lib/models/generateWallets.dart index a7bc55d6..88b85c29 100644 --- a/lib/models/generateWallets.dart +++ b/lib/models/generateWallets.dart @@ -39,50 +39,30 @@ class GenerateWalletsProvider with ChangeNotifier { bool canImport = false; bool isPinChanged = false; - Future storeWallet(NewWallet wallet, String _name, BuildContext context, - {bool isHD = false}) async { - int nbrWallet; - if (isHD) { - nbrWallet = 0; - } else { - nbrWallet = 1; - } - - Directory walletNbrDirectory; - do { - nbrWallet++; - walletNbrDirectory = Directory('${walletsDirectory.path}/$nbrWallet'); - } while (await walletNbrDirectory.exists()); - - final walletFile = File('${walletNbrDirectory.path}/wallet.dewif'); + Future storeHDWallet( + NewWallet _wallet, String _name, BuildContext context) async { + // Directory walletDirectory; - await walletNbrDirectory.create(); - await walletFile.writeAsString(wallet.dewif); + final Directory hdDirectory = Directory('${walletsDirectory.path}/0'); + await hdDirectory.create(); - final configFile = File('${walletNbrDirectory.path}/config.txt'); + final configFile = File('${hdDirectory.path}/config.txt'); + final dewifFile = File('${hdDirectory.path}/wallet.dewif'); - if (isHD) { - final int _derivationNbr = 3; - List _pubkeysTmp = await DubpRust.getBip32DewifAccountsPublicKeys( - dewif: wallet.dewif, - secretCode: wallet.pin, - accountsIndex: [_derivationNbr]); - String _pubkey = _pubkeysTmp[0]; + // List<String> _lastConfig = []; + // _lastConfig = await masterConfigFile.readAsLines(); + // final int _lastDerivation = int.parse(_lastConfig.last.split(':')[2]); + // final int _derivationNbr = _lastDerivation + 3; - await configFile - .writeAsString('$nbrWallet:$_name:$_derivationNbr:$_pubkey'); - // Navigator.pop(context, true); - } else { - final int _derivationNbr = -1; - String _pubkey = await DubpRust.getDewifPublicKey( - dewif: wallet.dewif, - pin: wallet.pin, - ); - await configFile - .writeAsString('$nbrWallet:$_name:$_derivationNbr:$_pubkey'); - } + final int _derivationNbr = 3; + List _pubkeysTmp = await DubpRust.getBip32DewifAccountsPublicKeys( + dewif: _wallet.dewif, + secretCode: _wallet.pin, + accountsIndex: [_derivationNbr]); + String _pubkey = _pubkeysTmp[0]; - // Navigator.pop(context, true); + await configFile.writeAsString('0:$_name:$_derivationNbr:$_pubkey'); + await dewifFile.writeAsString(_wallet.dewif); return _name; } @@ -263,8 +243,8 @@ class GenerateWalletsProvider with ChangeNotifier { salt: _cesiumID, password: _cesiumPWD); String shortPubkey = truncate(_walletPubkey, 9, omission: "...", position: TruncatePosition.end); - await storeWallet( - actualWallet, 'Portefeuille Cesium - $shortPubkey', context); + // await storeWallet( + // actualWallet, 'Portefeuille Cesium - $shortPubkey', context); cesiumID.text = ''; cesiumPWD.text = ''; cesiumPubkey.text = ''; diff --git a/lib/models/myWallets.dart b/lib/models/myWallets.dart index 4473f876..b0b61bab 100644 --- a/lib/models/myWallets.dart +++ b/lib/models/myWallets.dart @@ -13,6 +13,8 @@ class MyWalletsProvider with ChangeNotifier { return false; } + print(walletsDirectory.listSync()); + List contents = walletsDirectory.listSync(); if (contents.length == 0) { print('No wallets detected'); @@ -54,6 +56,23 @@ class MyWalletsProvider with ChangeNotifier { return listWallets; } + Future getDefaultWallet() async { + defaultWalletFile = File('${appPath.path}/defaultWallet'); + + bool isdefaultWalletFile = await defaultWalletFile.exists(); + + if (!isdefaultWalletFile) { + await File(defaultWalletFile.path).create(); + } + + try { + defaultWallet = await defaultWalletFile.readAsString(); + } catch (e) { + defaultWallet = '0:3'; + } + if (defaultWallet == '') defaultWallet = '0:3'; + } + Future<int> deleteAllWallet(context) async { try { print('DELETE THAT ?: $walletsDirectory'); @@ -107,11 +126,9 @@ class MyWalletsProvider with ChangeNotifier { ); } - Future<void> generateNewDerivation( - context, String _name, int _walletNbr) async { + Future<void> generateNewDerivation(context, String _name) async { int _newDerivationNbr; - final _walletConfig = - File('${walletsDirectory.path}/$_walletNbr/config.txt'); + final _walletConfig = File('${walletsDirectory.path}/0/config.txt'); if (await _walletConfig.readAsString() == '') { _newDerivationNbr = 3; @@ -122,7 +139,7 @@ class MyWalletsProvider with ChangeNotifier { _newDerivationNbr = _lastDerivation + 3; } - await _walletConfig.writeAsString('\n$_walletNbr:$_name:$_newDerivationNbr', + await _walletConfig.writeAsString('\n0:$_name:$_newDerivationNbr', mode: FileMode.append); print(await _walletConfig.readAsString()); diff --git a/lib/screens/myWallets/confirmWalletStorage.dart b/lib/screens/myWallets/confirmWalletStorage.dart index 3b6385f7..db1566ae 100644 --- a/lib/screens/myWallets/confirmWalletStorage.dart +++ b/lib/screens/myWallets/confirmWalletStorage.dart @@ -126,11 +126,10 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier { .isAskedWordValid && this.walletName.text != '') ? () async { - await _generateWalletProvider.storeWallet( + await _generateWalletProvider.storeHDWallet( generatedWallet, walletName.text, - context, - isHD: true); + context); _generateWalletProvider.isAskedWordValid = false; _generateWalletProvider.askedWordColor = diff --git a/lib/screens/myWallets/walletsHome.dart b/lib/screens/myWallets/walletsHome.dart index 370cc137..1ab1650e 100644 --- a/lib/screens/myWallets/walletsHome.dart +++ b/lib/screens/myWallets/walletsHome.dart @@ -1,4 +1,5 @@ import 'package:flutter/services.dart'; +import 'package:gecko/globals.dart'; import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/walletOptions.dart'; import 'package:flutter/material.dart'; @@ -81,7 +82,9 @@ class WalletsHome extends StatelessWidget { List _listWallets = _myWalletProvider.listWallets.split('\n'); // final int nbrOfWallets = _listWallets.length; - print(_listWallets); + // print(_listWallets); + // print("${_listWallets[0].split(':')[0]}:${_listWallets[0].split(':')[2]}"); + // print(defaultWallet); return GridView.count( crossAxisCount: 2, @@ -94,27 +97,62 @@ class WalletsHome extends StatelessWidget { padding: EdgeInsets.all(16), child: ClipRRect( borderRadius: BorderRadius.all(Radius.circular(12)), - child: ListTile( - // contentPadding: const EdgeInsets.only(left: 7.0), - tileColor: Colors.green[100], - // leading: Text('IMAGE'), - - // subtitle: Text(_repository.split(':')[3], - // style: TextStyle(fontSize: 12.0, fontFamily: 'Monospace')), - title: Center( - child: Text(_repository.split(':')[1], - style: TextStyle(fontSize: 16.0))), - // dense: true, - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) { - return UnlockingWallet( - walletNbr: int.parse(_repository.split(':')[0]), - walletName: _repository.split(':')[1], - derivation: int.parse(_repository.split(':')[2])); - })); - }, - ))) + child: Column(children: <Widget>[ + Expanded( + child: Container( + width: double.infinity, + height: double.infinity, + decoration: BoxDecoration( + gradient: RadialGradient( + radius: 1, + colors: [ + Colors.green[100], + Colors.green[500], + ], + )), + child: + // SvgPicture.asset('assets/chopp-gecko2.png', + // semanticsLabel: 'Gecko', height: 48), + Image.asset( + 'assets/chopp-gecko2.png', + ), + )), + ListTile( + // contentPadding: const EdgeInsets.only(left: 7.0), + tileColor: + "${_repository.split(':')[0]}:${_repository.split(':')[2]}" == + defaultWallet + ? Color(0xffD28928) + : Color(0xffFFD58D), + // leading: Text('IMAGE'), + + // subtitle: Text(_repository.split(':')[3], + // style: TextStyle(fontSize: 12.0, fontFamily: 'Monospace')), + title: Center( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 5), + child: Text(_repository.split(':')[1], + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.0, + color: + "${_repository.split(':')[0]}:${_repository.split(':')[2]}" == + defaultWallet + ? Color(0xffF9F9F1) + : Colors.black)))), + // dense: true, + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) { + return UnlockingWallet( + walletNbr: int.parse(_repository.split(':')[0]), + walletName: _repository.split(':')[1], + derivation: + int.parse(_repository.split(':')[2])); + })); + }, + ) + ]))) ]); } @@ -200,7 +238,7 @@ class WalletsHome extends StatelessWidget { onPressed: () async { await _myWalletProvider .generateNewDerivation( - context, _newDerivationName.text, _walletNbr) + context, _newDerivationName.text) .then((_) => _newDerivationName.text == ''); }, child: Text("Créer")), diff --git a/lib/screens/myWallets/walletsHome_old.dart b/lib/screens/myWallets/walletsHome_old.dart index 9f6dace7..7a5f99ee 100644 --- a/lib/screens/myWallets/walletsHome_old.dart +++ b/lib/screens/myWallets/walletsHome_old.dart @@ -142,7 +142,7 @@ class WalletsHome extends StatelessWidget { onPressed: () async { await _myWalletProvider .generateNewDerivation( - context, _newDerivationName.text, _walletNbr) + context, _newDerivationName.text) .then((_) => _newDerivationName.text == ''); }, child: Text("Créer")), diff --git a/lib/screens/onBoarding/12.dart b/lib/screens/onBoarding/12.dart index 73f44ee3..d9e8e618 100644 --- a/lib/screens/onBoarding/12.dart +++ b/lib/screens/onBoarding/12.dart @@ -116,9 +116,8 @@ class OnboardingStepFourteen extends StatelessWidget { if (resultWallet) { pinColor = Colors.green[500]; print(generatedWallet.pin); - await _generateWalletProvider.storeWallet( - generatedWallet, 'Mon portefeuille courant', context, - isHD: true); + await _generateWalletProvider.storeHDWallet( + generatedWallet, 'Mon portefeuille courant', context); _myWalletProvider.getAllWalletsNames(); _walletOptions.reloadBuild(); _myWalletProvider.rebuildWidget(); diff --git a/pubspec.yaml b/pubspec.yaml index 7179ea67..8cdb9aa6 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.1+20 +version: 0.0.1+21 environment: sdk: ">=2.7.0 <3.0.0" -- GitLab