diff --git a/assets/chests/cesium.png b/assets/chests/cesium.png new file mode 100755 index 0000000..f3028ac Binary files /dev/null and b/assets/chests/cesium.png differ diff --git a/lib/models/chestData.dart b/lib/models/chestData.dart index fcacb10..a053289 100644 --- a/lib/models/chestData.dart +++ b/lib/models/chestData.dart @@ -16,7 +16,16 @@ class ChestData extends HiveObject { @HiveField(4) String imageName; - ChestData({this.dewif, this.name, this.defaultWallet, this.imageName}); + @HiveField(5) + bool isCesium; + + ChestData({ + this.dewif, + this.name, + this.defaultWallet, + this.imageName, + this.isCesium, + }); @override String toString() { diff --git a/lib/models/chestData.g.dart b/lib/models/chestData.g.dart index b6fee4c..9beaa42 100644 --- a/lib/models/chestData.g.dart +++ b/lib/models/chestData.g.dart @@ -21,13 +21,14 @@ class ChestDataAdapter extends TypeAdapter { name: fields[2] as String, defaultWallet: fields[3] as int, imageName: fields[4] as String, + isCesium: fields[5] as bool, ); } @override void write(BinaryWriter writer, ChestData obj) { writer - ..writeByte(4) + ..writeByte(5) ..writeByte(0) ..write(obj.dewif) ..writeByte(2) @@ -35,7 +36,9 @@ class ChestDataAdapter extends TypeAdapter { ..writeByte(3) ..write(obj.defaultWallet) ..writeByte(4) - ..write(obj.imageName); + ..write(obj.imageName) + ..writeByte(5) + ..write(obj.isCesium); } @override diff --git a/lib/models/generateWallets.dart b/lib/models/generateWallets.dart index 43718de..d74666f 100644 --- a/lib/models/generateWallets.dart +++ b/lib/models/generateWallets.dart @@ -57,13 +57,14 @@ class GenerateWalletsProvider with ChangeNotifier { } walletBox.add(myWallet); ChestData thisChest = ChestData( - dewif: _wallet.dewif, - name: chestName, - defaultWallet: 0, - imageName: '${chestNumber % 8}.png'); + dewif: _wallet.dewif, + name: chestName, + defaultWallet: 0, + imageName: '${chestNumber % 8}.png', + isCesium: false, + ); chestBox.add(thisChest); configBox.put('currentChest', chestNumber); - // walletBox.get(1) } void checkAskedWord(String inputWord, String _mnemo) { @@ -221,13 +222,15 @@ class GenerateWalletsProvider with ChangeNotifier { log.d(_walletPubkey); } - Future importCesiumWallet(context, _cesiumID, _cesiumPWD) async { + Future importCesiumWallet() async { // String _walletPubkey = await DubpRust.getLegacyPublicKey( // salt: _cesiumID, password: _cesiumPWD); // String shortPubkey = truncate(_walletPubkey, 9, // omission: "...", position: TruncatePosition.end); // await storeWallet( // actualWallet, 'Portefeuille Cesium - $shortPubkey', context); + // NewWallet myCesiumWallet = await DubpRust.genWalletFromDeprecatedSaltPassword(salt: _cesiumID, password: _cesiumPWD); + cesiumID.text = ''; cesiumPWD.text = ''; cesiumPubkey.text = ''; @@ -236,6 +239,18 @@ class GenerateWalletsProvider with ChangeNotifier { pin.text = ''; isCesiumIDVisible = false; isCesiumPWDVisible = false; + + ChestData cesiumChest = ChestData( + dewif: actualWallet.dewif, + name: 'Coffre à Cesium', + imageName: 'cesium.png', + defaultWallet: 0, + isCesium: true); + + int chestNumber = chestBox.length; + chestBox.add(cesiumChest); + configBox.put('currentChest', chestNumber); + notifyListeners(); } diff --git a/lib/models/myWallets.dart b/lib/models/myWallets.dart index fb77bb8..53d0da0 100644 --- a/lib/models/myWallets.dart +++ b/lib/models/myWallets.dart @@ -18,13 +18,7 @@ class MyWalletsProvider with ChangeNotifier { } bool checkIfWalletExist() { - if (appPath == null) { - return false; - } - - final List _walletList = readAllWallets(getCurrentChest()); - - if (_walletList.isEmpty) { + if (chestBox.isEmpty) { log.i('No wallets detected'); return false; } else { diff --git a/lib/screens/myWallets/cesiumWalletOptions.dart b/lib/screens/myWallets/cesiumWalletOptions.dart new file mode 100644 index 0000000..da1b043 --- /dev/null +++ b/lib/screens/myWallets/cesiumWalletOptions.dart @@ -0,0 +1,398 @@ +import 'dart:ui'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:gecko/globals.dart'; +import 'package:gecko/models/history.dart'; +import 'package:gecko/models/myWallets.dart'; +import 'package:gecko/models/queries.dart'; +import 'package:gecko/models/walletData.dart'; +import 'package:gecko/models/walletOptions.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter/services.dart'; + +// ignore: must_be_immutable +class CesiumWalletOptions extends StatelessWidget { + CesiumWalletOptions({Key keyMyWallets, @required this.cesiumWallet}) + : super(key: keyMyWallets); + WalletData cesiumWallet; + int _nbrLinesName = 1; + bool _isNewNameValid = false; + + @override + Widget build(BuildContext context) { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + WalletOptionsProvider _walletOptions = + Provider.of(context); + MyWalletsProvider _myWalletProvider = + Provider.of(context); + HistoryProvider _historyProvider = Provider.of(context); + + final int _currentChest = _myWalletProvider.getCurrentChest(); + final String shortPubkey = + _walletOptions.getShortPubkey(_walletOptions.pubkey.text); + + if (_walletOptions.nameController.text == null || + _isNewNameValid == false) { + _walletOptions.nameController.text = cesiumWallet.name; + } else { + cesiumWallet.name = _walletOptions.nameController.text; + } + + _walletOptions.nameController.text.length >= 15 + ? _nbrLinesName = 2 + : _nbrLinesName = 1; + if (_walletOptions.nameController.text.length >= 26 && isTall) + _nbrLinesName = 3; + + _walletOptions.walletID = [0, cesiumWallet.number]; + + WalletData defaultWallet = + _myWalletProvider.getDefaultWallet(_currentChest); + + _walletOptions.isDefaultWallet = + (defaultWallet.number == _walletOptions.walletID[1]); + + int currentChest = _myWalletProvider.getCurrentChest(); + + log.d("Wallet options: $currentChest:${cesiumWallet.number}"); + + return WillPopScope( + onWillPop: () { + _walletOptions.isEditing = false; + _walletOptions.isBalanceBlur = true; + Navigator.popUntil( + context, + ModalRoute.withName('/mywallets'), + ); + return Future.value(true); + }, + child: Scaffold( + resizeToAvoidBottomInset: false, + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.arrow_back, color: Colors.black), + onPressed: () { + _walletOptions.isEditing = false; + _walletOptions.isBalanceBlur = true; + Navigator.popUntil( + context, + ModalRoute.withName('/mywallets'), + ); + }), + title: SizedBox( + height: 22, + child: Text(_walletOptions.nameController.text), + )), + body: Builder( + builder: (ctx) => SafeArea( + child: Column(children: [ + Container( + height: isTall ? 15 : 0, + color: yellowC, + ), + Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + yellowC, + Color(0xfffafafa), + ], + )), + child: Row(children: [ + SizedBox(width: 25), + InkWell( + onTap: () async { + await _walletOptions.changeAvatar(); + }, + child: Image.asset( + 'assets/avatars/${cesiumWallet.imageName}', + width: 110, + )), + InkWell( + onTap: () async { + await _walletOptions.changeAvatar(); + }, + child: Column(children: [ + Image.asset( + 'assets/walletOptions/camera.png', + ), + SizedBox(height: 100) + ])), + Column(children: [ + Row(children: [ + Column(children: [ + SizedBox( + width: 260, + child: TextField( + key: Key('walletName'), + autofocus: false, + focusNode: _walletOptions.walletNameFocus, + enabled: _walletOptions.isEditing, + controller: _walletOptions.nameController, + maxLines: _nbrLinesName, + textAlign: TextAlign.center, + decoration: InputDecoration( + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + disabledBorder: InputBorder.none, + contentPadding: EdgeInsets.all(15.0), + ), + style: TextStyle( + fontSize: isTall ? 27 : 23, + color: Colors.black, + fontWeight: FontWeight.w400, + fontFamily: 'Monospace')), + ), + SizedBox(height: isTall ? 5 : 0), + Query( + options: QueryOptions( + document: gql(getBalance), + variables: { + 'pubkey': _walletOptions.pubkey.text, + }, + // pollInterval: Duration(seconds: 1), + ), + builder: (QueryResult result, + {VoidCallback refetch, FetchMore fetchMore}) { + if (result.hasException) { + return Text(result.exception.toString()); + } + + if (result.isLoading) { + return Text('Loading'); + } + + // List repositories = result.data['viewer']['repositories']['nodes']; + String wBalanceUD; + if (result.data['balance'] == null) { + wBalanceUD = '0.0'; + } else { + int wBalanceG1 = + result.data['balance']['amount']; + int currentUD = + result.data['currentUd']['amount']; + double wBalanceUDBrut = + wBalanceG1 / currentUD; // .toString(); + wBalanceUD = double.parse( + (wBalanceUDBrut).toStringAsFixed(2)) + .toString(); + } + return Row(children: [ + ImageFiltered( + imageFilter: ImageFilter.blur( + sigmaX: _walletOptions.isBalanceBlur + ? 6 + : 0, + sigmaY: _walletOptions.isBalanceBlur + ? 5 + : 0), + child: Text('$wBalanceUD', + style: TextStyle( + fontSize: isTall ? 20 : 18, + color: Colors.black)), + ), + Text(' DU', + style: TextStyle( + fontSize: isTall ? 20 : 18, + color: Colors.black)) + ]); + + // Text( + // '$wBalanceUD DU', + // style: TextStyle( + // fontSize: 20, color: Colors.black), + // ); + }, + ), + SizedBox(height: 5), + InkWell( + key: Key('displayBalance'), + onTap: () { + _walletOptions.bluringBalance(); + }, + child: Image.asset( + _walletOptions.isBalanceBlur + ? 'assets/walletOptions/icon_oeuil.png' + : 'assets/walletOptions/icon_oeuil_close.png', + )), + ]), + SizedBox(width: 0), + Column(children: [ + InkWell( + key: Key('renameWallet'), + onTap: () async { + _isNewNameValid = _walletOptions + .editWalletName(_walletOptions.walletID); + await Future.delayed( + Duration(milliseconds: 30)); + _walletOptions.walletNameFocus.requestFocus(); + }, + child: ClipRRect( + child: Image.asset( + _walletOptions.isEditing + ? 'assets/walletOptions/android-checkmark.png' + : 'assets/walletOptions/edit.png', + width: 20, + height: 20), + )), + SizedBox( + height: 60, + ) + ]) + ]), + ]), + ])), + SizedBox(height: 4 * ratio), + FutureBuilder( + future: _walletOptions + .generateQRcode(_walletOptions.pubkey.text), + builder: (context, snapshot) { + return snapshot.data != null + ? Image.memory(snapshot.data, + height: isTall ? 300 : 270) + : Text('-', style: TextStyle(fontSize: 20)); + }), + SizedBox(height: 15 * ratio), + GestureDetector( + key: Key('copyPubkey'), + onTap: () { + Clipboard.setData( + ClipboardData(text: _walletOptions.pubkey.text)); + _walletOptions.snackCopyKey(ctx); + }, + child: SizedBox( + height: 50, + child: Row(children: [ + SizedBox(width: 30), + Image.asset( + 'assets/walletOptions/key.png', + ), + SizedBox(width: 10), + Text("${shortPubkey.split(':')[0]}:", + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.w800, + fontFamily: 'Monospace', + color: Colors.black)), + Text(shortPubkey.split(':')[1], + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.w800, + fontFamily: 'Monospace')), + SizedBox(width: 15), + SizedBox( + height: 40, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: + new BorderRadius.circular(8), + ), + elevation: 1, + primary: orangeC, // background + onPrimary: Colors.black, // foreground + ), + onPressed: () { + Clipboard.setData(ClipboardData( + text: _walletOptions.pubkey.text)); + _walletOptions.snackCopyKey(ctx); + }, + child: Row(children: [ + Image.asset( + 'assets/walletOptions/copy-white.png', + ), + SizedBox(width: 7), + Text('Copier', + style: TextStyle( + fontSize: 15, + color: Colors.grey[50])) + ]))), + ]))), + SizedBox(height: 10 * ratio), + InkWell( + key: Key('displayHistory'), + onTap: () { + _historyProvider.isPubkey(ctx, _walletOptions.pubkey.text, + goHistory: true); + }, + child: SizedBox( + height: 50, + child: Row(children: [ + SizedBox(width: 30), + Image.asset( + 'assets/walletOptions/clock.png', + ), + SizedBox(width: 12), + Text('Historique des transactions', + style: + TextStyle(fontSize: 20, color: Colors.black)), + ]))), + SizedBox(height: 12 * ratio), + InkWell( + key: Key('setDefaultWallet'), + onTap: !_walletOptions.isDefaultWallet + ? () { + defaultWallet = cesiumWallet; + chestBox.get(currentChest).defaultWallet = + cesiumWallet.number; + _myWalletProvider.readAllWallets(_currentChest); + _myWalletProvider.rebuildWidget(); + } + : null, + child: SizedBox( + height: 50, + child: Row(children: [ + SizedBox(width: 31), + CircleAvatar( + backgroundColor: Colors.grey[ + _walletOptions.isDefaultWallet ? 300 : 500], + child: Image.asset( + 'assets/walletOptions/android-checkmark.png', + )), + SizedBox(width: 12), + Text( + _walletOptions.isDefaultWallet + ? 'Ce portefeuille est celui par defaut' + : 'Définir comme portefeuille par défaut', + style: TextStyle( + fontSize: 20, + color: _walletOptions.isDefaultWallet + ? Colors.grey[500] + : Colors.black)), + ]))), + SizedBox(height: 17 * ratio), + if (!_walletOptions.isDefaultWallet) + InkWell( + key: Key('deleteWallet'), + onTap: !_walletOptions.isDefaultWallet + ? () async { + await _walletOptions.deleteWallet( + context, cesiumWallet); + WidgetsBinding.instance.addPostFrameCallback((_) { + _myWalletProvider.listWallets = + _myWalletProvider + .readAllWallets(_currentChest); + _myWalletProvider.rebuildWidget(); + }); + } + : null, + child: Row(children: [ + SizedBox(width: 33), + Image.asset( + 'assets/walletOptions/trash.png', + ), + SizedBox(width: 14), + Text('Supprimer ce portefeuille', + style: TextStyle( + fontSize: 20, color: Color(0xffD80000))), + ])), + ]), + ), + ), + )); + } +} diff --git a/lib/screens/myWallets/importWallet.dart b/lib/screens/myWallets/importWallet.dart index 8bdff93..d7c7b55 100644 --- a/lib/screens/myWallets/importWallet.dart +++ b/lib/screens/myWallets/importWallet.dart @@ -169,15 +169,14 @@ class ImportWalletScreen extends StatelessWidget { _generateWalletProvider.isPinChanged ? () { _generateWalletProvider - .importCesiumWallet( - context, - _generateWalletProvider - .cesiumID.text, - _generateWalletProvider - .cesiumPWD.text) + .importCesiumWallet() .then((value) { _myWalletProvider.rebuildWidget(); _generateWalletProvider.resetImportView(); + Navigator.popUntil( + context, + ModalRoute.withName('/'), + ); }); } : null, diff --git a/lib/screens/myWallets/walletsHome.dart b/lib/screens/myWallets/walletsHome.dart index cbfb7dd..350b771 100644 --- a/lib/screens/myWallets/walletsHome.dart +++ b/lib/screens/myWallets/walletsHome.dart @@ -1,5 +1,6 @@ import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; +import 'package:gecko/models/chestData.dart'; import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/queries.dart'; import 'package:gecko/models/walletData.dart'; @@ -21,11 +22,15 @@ class WalletsHome extends StatelessWidget { MyWalletsProvider myWalletProvider = Provider.of(context); - final int _currentChest = myWalletProvider.getCurrentChest(); + final int _currentChestNumber = myWalletProvider.getCurrentChest(); + final ChestData _currentChest = chestBox.get(_currentChestNumber); + bool isWalletsExists; - myWalletProvider.listWallets = - myWalletProvider.readAllWallets(_currentChest); - final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); + if (!_currentChest.isCesium) { + myWalletProvider.listWallets = + myWalletProvider.readAllWallets(_currentChestNumber); + isWalletsExists = myWalletProvider.checkIfWalletExist(); + } return WillPopScope( onWillPop: () { @@ -45,18 +50,27 @@ class WalletsHome extends StatelessWidget { ModalRoute.withName('/'), ); }), - title: Text(chestBox.get(_currentChest).name, + title: Text(_currentChest.name, key: Key('myWallets'), style: TextStyle(color: Colors.grey[850])), backgroundColor: Color(0xffFFD58D), ), body: SafeArea( - child: - !isWalletsExists ? NoKeyChainScreen() : myWalletsTiles(context), + child: !isWalletsExists + ? NoKeyChainScreen() + : _currentChest.isCesium + ? cesiumWalletOptions(context) + : myWalletsTiles(context), ), ), ); } + Widget cesiumWalletOptions(BuildContext context) { + return Column(children: [ + Center(child: Text('This is a Cesium wallet')), + ]); + } + Widget chestOptions(BuildContext context) { return Column(children: [ SizedBox(height: 50),