diff --git a/lib/main.dart b/lib/main.dart index 5200843..e79d21e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -43,18 +43,24 @@ import 'package:flutter/foundation.dart'; import 'package:responsive_framework/responsive_framework.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:window_size/window_size.dart'; const bool enableSentry = true; Future main() async { WidgetsFlutterBinding.ensureInitialized(); + if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) { + setWindowTitle('Ğecko'); + setWindowMinSize(const Size(600, 800)); + setWindowMaxSize(const Size(800, 1000)); + } HomeProvider _homeProvider = HomeProvider(); + await _homeProvider.initHive(); appVersion = await _homeProvider.getAppVersion(); prefs = await SharedPreferences.getInstance(); // Configure Hive and open boxes - await Hive.initFlutter(); Hive.registerAdapter(WalletDataAdapter()); Hive.registerAdapter(ChestDataAdapter()); Hive.registerAdapter(G1WalletsListAdapter()); diff --git a/lib/models/cesium_plus.dart b/lib/models/cesium_plus.dart index 7bae7b3..d99321c 100644 --- a/lib/models/cesium_plus.dart +++ b/lib/models/cesium_plus.dart @@ -103,7 +103,7 @@ class CesiumPlusProvider with ChangeNotifier { } Future getAvatar(String _pubkey, double size) async { - if (g1WalletsBox.get(_pubkey).avatar != null) { + if (g1WalletsBox.get(_pubkey)?.avatar != null) { return g1WalletsBox.get(_pubkey).avatar; } var dio = Dio(); diff --git a/lib/models/change_pin.dart b/lib/models/change_pin.dart index 2bd4e08..11989fe 100644 --- a/lib/models/change_pin.dart +++ b/lib/models/change_pin.dart @@ -1,6 +1,5 @@ import 'package:durt/durt.dart'; import 'package:flutter/material.dart'; -import 'dart:async'; import 'package:gecko/globals.dart'; class ChangePinProvider with ChangeNotifier { @@ -8,23 +7,23 @@ class ChangePinProvider with ChangeNotifier { TextEditingController newPin = TextEditingController(); String pinToGive; - Future get badWallet => null; + NewWallet get badWallet => null; - Future changePin(String _oldPin) async { + NewWallet changePin(String _oldPin, {String newCustomPin}) { try { final _dewif = chestBox.get(configBox.get('currentChest')).dewif; NewWallet newWalletFile = Dewif().changePassword( - dewif: _dewif, - oldPassword: _oldPin.toUpperCase(), - ); + dewif: _dewif, + oldPassword: _oldPin.toUpperCase(), + newPassword: newCustomPin); newPin.text = pinToGive = newWalletFile.password; ischangedPin = true; - notifyListeners(); + // notifyListeners(); return newWalletFile; } catch (e) { - log.e('Impossible de changer le code PIN.'); + log.e('Impossible de changer le code PIN: $e'); return badWallet; } } diff --git a/lib/models/generate_wallets.dart b/lib/models/generate_wallets.dart index 58271b8..bfdae69 100644 --- a/lib/models/generate_wallets.dart +++ b/lib/models/generate_wallets.dart @@ -37,6 +37,7 @@ class GenerateWalletsProvider with ChangeNotifier { bool isCesiumIDVisible = false; bool isCesiumPWDVisible = false; bool canImport = false; + CesiumWallet cesiumWallet; // Import Chest TextEditingController cellController0 = TextEditingController(); @@ -171,7 +172,6 @@ class GenerateWalletsProvider with ChangeNotifier { } String changePinCode({bool reload}) { - pin.text = randomSecretCode(5); if (reload) { notifyListeners(); @@ -219,17 +219,14 @@ class GenerateWalletsProvider with ChangeNotifier { Future generateCesiumWalletPubkey( String _cesiumID, String _cesiumPWD) async { - var cesiumWallet = CesiumWallet(_cesiumID, _cesiumPWD); - actualWallet = - Dewif().generateCesiumDewif(cesiumWallet.seed, randomSecretCode(5)); + cesiumWallet = CesiumWallet(_cesiumID, _cesiumPWD); String _walletPubkey = cesiumWallet.pubkey; cesiumPubkey.text = _walletPubkey; - pin.text = actualWallet.password; log.d(_walletPubkey); } - Future importCesiumWallet() async { + Future importCesiumWallet() async { // String _walletPubkey = await DubpRust.getLegacyPublicKey( // salt: _cesiumID, password: _cesiumPWD); // String shortPubkey = truncate(_walletPubkey, 9, @@ -242,7 +239,6 @@ class GenerateWalletsProvider with ChangeNotifier { cesiumPWD.text = ''; cesiumPubkey.text = ''; canImport = false; - pin.text = ''; isCesiumIDVisible = false; isCesiumPWDVisible = false; @@ -260,8 +256,12 @@ class GenerateWalletsProvider with ChangeNotifier { chestName = 'Coffre à Césium ${chestNumber + 1}'; } + log.d(pin.text); + NewWallet cesiumDewif = + Dewif().generateCesiumDewif(cesiumWallet.seed, pin.text); + ChestData cesiumChest = ChestData( - dewif: actualWallet.dewif, + dewif: cesiumDewif.dewif, name: chestName, imageName: 'cesium.png', defaultWallet: 0, @@ -272,7 +272,8 @@ class GenerateWalletsProvider with ChangeNotifier { // chestBox.toMap(). await configBox.put('currentChest', chestKey); - notifyListeners(); + pin.text = ''; + return chestKey; } void cesiumIDisVisible() { diff --git a/lib/models/home.dart b/lib/models/home.dart index c011042..294b91f 100644 --- a/lib/models/home.dart +++ b/lib/models/home.dart @@ -9,8 +9,10 @@ import 'dart:async'; import 'package:gecko/globals.dart'; import 'package:gecko/screens/old_history_pay.dart'; import 'package:gecko/screens/myWallets/wallets_home.dart'; +import 'package:hive_flutter/hive_flutter.dart'; import 'package:package_info/package_info.dart'; import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:path_provider/path_provider.dart' as pp; class HomeProvider with ChangeNotifier { int _currentIndex = 0; @@ -32,6 +34,25 @@ class HomeProvider with ChangeNotifier { notifyListeners(); } + Future initHive() async { + Directory hivePath; + + if (Platform.isLinux || Platform.isMacOS) { + final home = Platform.environment['HOME']; + hivePath = Directory('$home/.gecko/db'); + } else if (Platform.isWindows) { + final home = Platform.environment['UserProfile']; + hivePath = Directory('$home/.gecko/db'); + } else if (Platform.isAndroid || Platform.isIOS || kIsWeb) { + final home = await pp.getApplicationDocumentsDirectory(); + hivePath = Directory('${home.path}/db'); + } + if (!await hivePath.exists()) { + await hivePath.create(recursive: true); + } + await Hive.initFlutter(hivePath.path); + } + Future getAppVersion() async { String version; String buildNumber; diff --git a/lib/models/wallet_options.dart b/lib/models/wallet_options.dart index 3f6184b..20bb30d 100644 --- a/lib/models/wallet_options.dart +++ b/lib/models/wallet_options.dart @@ -1,6 +1,4 @@ -// import 'dart:ffi'; import 'dart:io'; -import 'dart:typed_data'; import 'package:crypto/crypto.dart'; import 'package:durt/durt.dart'; import 'package:fast_base58/fast_base58.dart'; @@ -12,7 +10,6 @@ import 'package:gecko/models/my_wallets.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:image_picker/image_picker.dart'; import 'package:truncate/truncate.dart'; -import 'package:qrscan/qrscan.dart' as scanner; class WalletOptionsProvider with ChangeNotifier { TextEditingController pubkey = TextEditingController(); @@ -30,7 +27,6 @@ class WalletOptionsProvider with ChangeNotifier { String _getPubkeyFromDewif( String _dewif, _pin, int _pinLenght, int derivation) { - String _pubkey; RegExp regExp = RegExp( r'^[A-Z0-9]+$', caseSensitive: false, @@ -44,12 +40,11 @@ class WalletOptionsProvider with ChangeNotifier { if (derivation != -1) { try { final _wallet = HdWallet.fromDewif(_dewif, _pin); - _pubkey = _wallet.getPubkey(derivation); - log.d(_pubkey); - pubkey.text = _pubkey; + pubkey.text = _wallet.getPubkey(derivation); + log.d(pubkey.text); notifyListeners(); - return _pubkey; + return pubkey.text; } catch (e) { log.w('Bad PIN code !\n' + e); notifyListeners(); @@ -58,10 +53,9 @@ class WalletOptionsProvider with ChangeNotifier { } } else { try { - _pubkey = CesiumWallet.fromDewif(_dewif, _pin).pubkey; - pubkey.text = _pubkey; + pubkey.text = CesiumWallet.fromDewif(_dewif, _pin).pubkey; notifyListeners(); - return _pubkey; + return pubkey.text; } catch (e) { log.w('Bad PIN code !\n' + e); notifyListeners(); @@ -83,10 +77,14 @@ class WalletOptionsProvider with ChangeNotifier { 'false') { pubkey.text = _localPubkey; isWalletUnlock = true; + log.d(pubkey.text); return _localDewif; } else { throw 'Bad pubkey'; } + } on ChecksumException catch (e) { + log.e(e.cause); + return 'bad'; } catch (e) { // _homeProvider.playSound('non', 0.6); log.e('ERROR READING FILE: $e'); @@ -202,7 +200,6 @@ class WalletOptionsProvider with ChangeNotifier { } String getShortPubkey(String pubkey) { - log.d(pubkey); List pubkeyByte = Base58Decode(pubkey); Digest pubkeyS256 = sha256.convert(sha256.convert(pubkeyByte).bytes); String pubkeyCheksum = Base58Encode(pubkeyS256.bytes); @@ -223,10 +220,6 @@ class WalletOptionsProvider with ChangeNotifier { notifyListeners(); } - Future generateQRcode(String _pubkey) async { - return await scanner.generateBarCode(_pubkey); - } - Future changeAvatar() async { File _image; final picker = ImagePicker(); diff --git a/lib/models/wallets_profiles.dart b/lib/models/wallets_profiles.dart index 67726b5..85879e4 100644 --- a/lib/models/wallets_profiles.dart +++ b/lib/models/wallets_profiles.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:durt/durt.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -33,7 +35,9 @@ class WalletsProfilesProvider with ChangeNotifier { int nPage = 1; Future scan(context) async { - await Permission.camera.request(); + if (Platform.isAndroid || Platform.isIOS) { + await Permission.camera.request(); + } String barcode; try { barcode = await scanner.scan(); @@ -205,8 +209,6 @@ class WalletsProfilesProvider with ChangeNotifier { } else if (nPage == 2) { nRepositories = 100; } - log.d(nPage); - log.d(nRepositories); nPage++; if (fetchMoreCursor != null) { diff --git a/lib/screens/history.dart b/lib/screens/history.dart index 075479b..1f0d6a3 100644 --- a/lib/screens/history.dart +++ b/lib/screens/history.dart @@ -72,7 +72,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { }, ), builder: (QueryResult result, {fetchMore, refetch}) { - if (result.isLoading && result.data == null) { + if (result.isLoading && result?.data == null) { return const Center( child: CircularProgressIndicator(), ); @@ -87,7 +87,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { style: TextStyle(fontSize: 18), ) ]); - } else if (result.data == null) { + } else if (result?.data == null) { return Column(children: const [ SizedBox(height: 50), Text( @@ -97,7 +97,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { ]); } - if (result.data['balance'] == null) { + if (result?.data['balance'] == null) { _historyProvider.balance = 0.0; } else { _historyProvider.balance = _historyProvider @@ -124,7 +124,9 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { if (t is ScrollEndNotification && scrollController.position.pixels >= scrollController.position.maxScrollExtent * 0.7 && - _historyProvider.pageInfo['hasPreviousPage']) { + _historyProvider.pageInfo['hasPreviousPage'] && + result.isNotLoading) { + log.d('FETCHMORE !!'); fetchMore(opts); } return true; @@ -295,8 +297,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { } if (_avatar.hasData) { g1WalletsBox.get(repository[2]).avatar = - _avatar.data; - return ClipOval(child: _avatar.data); + _avatar?.data; + return ClipOval(child: _avatar?.data); } else { g1WalletsBox.get(repository[2]).avatar = _cesiumPlusProvider @@ -427,8 +429,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { {VoidCallback refetch, FetchMore fetchMore}) { if (result.isLoading || result.hasException) { return const Text('...'); - } else if (result.data['idty'] == null || - result.data['idty']['username'] == null) { + } else if (result?.data['idty'] == null || + result?.data['idty']['username'] == null) { return const Text(''); } else { return SizedBox( @@ -466,7 +468,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { return const Text('...'); } return Text( - "${_balance.data.toString()} Ğ1", + "${_balance?.data.toString()} Ğ1", textAlign: TextAlign.center, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.w500), @@ -506,13 +508,13 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { Navigator.push( context, MaterialPageRoute(builder: (context) { - return AvatarFullscreen(_avatar.data); + return AvatarFullscreen(_avatar?.data); }), ); }, child: ClipOval( child: Image( - image: _avatar.data.image, + image: _avatar?.data?.image, height: _avatarSize, fit: BoxFit.cover, ), diff --git a/lib/screens/myWallets/cesium_wallet_options.dart b/lib/screens/myWallets/cesium_wallet_options.dart index b5ea61a..46fde54 100644 --- a/lib/screens/myWallets/cesium_wallet_options.dart +++ b/lib/screens/myWallets/cesium_wallet_options.dart @@ -13,6 +13,7 @@ import 'package:gecko/screens/myWallets/change_pin.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; import 'package:flutter/services.dart'; +import 'package:qr_flutter/qr_flutter.dart'; int _nbrLinesName = 1; bool _isNewNameValid = false; @@ -262,15 +263,11 @@ class CesiumWalletOptions extends StatelessWidget { ); }), 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) - : const Text('-', style: TextStyle(fontSize: 20)); - }), + QrImage( + data: _walletOptions.pubkey.text, + version: QrVersions.auto, + size: isTall ? 300 : 270, + ), SizedBox(height: 15 * ratio), GestureDetector( key: const Key('copyPubkey'), diff --git a/lib/screens/myWallets/change_pin.dart b/lib/screens/myWallets/change_pin.dart index e10a52f..be4e011 100644 --- a/lib/screens/myWallets/change_pin.dart +++ b/lib/screens/myWallets/change_pin.dart @@ -17,7 +17,6 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { final String walletName; final MyWalletsProvider walletProvider; Directory appPath; - NewWallet _newWalletFile; @override Widget build(BuildContext context) { @@ -49,9 +48,8 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { child: SafeArea( child: Column(children: [ StatefulWrapper( - onInit: () async { - _newWalletFile = - await _changePin.changePin(walletProvider.pinCode); + onInit: () { + _changePin.newPin.text = randomSecretCode(5); }, child: Container(), ), @@ -82,8 +80,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { icon: const Icon(Icons.replay), color: orangeC, onPressed: () async { - _newWalletFile = - await _changePin.changePin(walletProvider.pinCode); + _changePin.newPin.text = randomSecretCode(5); }, ), ], @@ -98,13 +95,14 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { primary: Colors.green[400], //smoothYellow, // background onPrimary: Colors.black, // foreground ), - onPressed: _changePin.newPin.text != '' - ? () { - _changePin.newPin.text = ''; - _changePin.storeNewPinChest(context, _newWalletFile); - walletProvider.pinCode = _changePin.newPin.text; - } - : null, + onPressed: () { + NewWallet _newWalletFile = _changePin.changePin( + walletProvider.pinCode, + newCustomPin: _changePin.newPin.text); + _changePin.newPin.text = ''; + _changePin.storeNewPinChest(context, _newWalletFile); + walletProvider.pinCode = _changePin.newPin.text; + }, child: const Text( 'Confirmer', style: TextStyle(fontSize: 28), diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart index d9acdd5..95f5ea7 100644 --- a/lib/screens/myWallets/chest_options.dart +++ b/lib/screens/myWallets/chest_options.dart @@ -69,8 +69,10 @@ class ChestOptions extends StatelessWidget { height: 25, ), const SizedBox(width: 18), - const Text('Changer mon code secret', - style: TextStyle(fontSize: 20, color: Colors.black)), + const Text( + 'Changer mon code secret', + style: TextStyle(fontSize: 20, color: Colors.black), + ), ])), ), SizedBox(height: 10 * ratio), diff --git a/lib/screens/myWallets/generate_wallets.dart b/lib/screens/myWallets/generate_wallets.dart index c25fe33..a967094 100644 --- a/lib/screens/myWallets/generate_wallets.dart +++ b/lib/screens/myWallets/generate_wallets.dart @@ -1,3 +1,4 @@ +import 'package:durt/durt.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/generate_wallets.dart'; @@ -26,6 +27,13 @@ class GenerateFastChestScreen extends StatelessWidget { GenerateWalletsProvider _generateWalletProvider = Provider.of(context); + if (_generateWalletProvider.mnemonicController.text == '') { + _generateWalletProvider.generateWordList(); + _generateWalletProvider.mnemonicController.text = + _generateWalletProvider.generatedMnemonic; + _generateWalletProvider.pin.text = randomSecretCode(5); + } + return Scaffold( appBar: AppBar( toolbarHeight: 60 * ratio, @@ -39,7 +47,11 @@ class GenerateFastChestScreen extends StatelessWidget { child: FittedBox( child: FloatingActionButton( heroTag: "buttonGenerateWallet", - onPressed: () => _generateWalletProvider.generateWordList(), + onPressed: () { + _generateWalletProvider.generateWordList(); + _generateWalletProvider.mnemonicController.text = + _generateWalletProvider.generatedMnemonic; + }, child: SizedBox( height: 40.0, width: 40.0, @@ -87,8 +99,7 @@ class GenerateFastChestScreen extends StatelessWidget { icon: const Icon(Icons.replay), color: orangeC, onPressed: () { - _generateWalletProvider.changePinCode( - reload: true); + _generateWalletProvider.changePinCode(reload: true); }, ), ], @@ -104,6 +115,12 @@ class GenerateFastChestScreen extends StatelessWidget { ? () async { _generateWalletProvider.nbrWord = _generateWalletProvider.getRandomInt(); + _generateWalletProvider.actualWallet = Dewif() + .generateDewif( + _generateWalletProvider + .generatedMnemonic, + _generateWalletProvider.pin.text, + lang: 'french'); await Navigator.push( context, MaterialPageRoute(builder: (context) { @@ -115,19 +132,6 @@ class GenerateFastChestScreen extends StatelessWidget { .actualWallet); }), ); - await Future.delayed( - const Duration(milliseconds: 20)); - // if (_generateWalletProvider.hasBeenStored) { - // _generateWalletProvider.hasBeenStored = false; - // await Navigator.pushAndRemoveUntil(context, - // MaterialPageRoute(builder: (context) { - // return UnlockingWallet( - // wallet: _myWalletClass.getDefaultWallet( - // configBox.get('currentChest')), - // action: "mywallets", - // ); - // }), ModalRoute.withName('/')); - // } } : null, child: const Text('Enregistrer ce trousseau', diff --git a/lib/screens/myWallets/import_cesium_wallet.dart b/lib/screens/myWallets/import_cesium_wallet.dart index af1d7ad..b925a17 100644 --- a/lib/screens/myWallets/import_cesium_wallet.dart +++ b/lib/screens/myWallets/import_cesium_wallet.dart @@ -1,10 +1,12 @@ import 'dart:async'; +import 'package:durt/durt.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/generate_wallets.dart'; import 'package:flutter/material.dart'; -import 'package:gecko/models/my_wallets.dart'; +import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_options.dart'; +import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:provider/provider.dart'; class ImportWalletScreen extends StatelessWidget { @@ -16,173 +18,190 @@ class ImportWalletScreen extends StatelessWidget { GlobalKey _toolTipSecret = GlobalKey(); Timer _debounce; GenerateWalletsProvider _generateWalletProvider = - Provider.of(context); - MyWalletsProvider _myWalletProvider = - Provider.of(context); + Provider.of(context, listen: false); WalletOptionsProvider _walletOptions = - Provider.of(context); + Provider.of(context, listen: false); + _generateWalletProvider.pin.text = randomSecretCode(5); return WillPopScope( - onWillPop: () { - _generateWalletProvider.resetCesiumImportView(); - return Future.value(true); - }, - child: Scaffold( - appBar: AppBar( - toolbarHeight: 60 * ratio, - leading: IconButton( - icon: const Icon(Icons.arrow_back, color: Colors.black), + onWillPop: () { + _generateWalletProvider.resetCesiumImportView(); + return Future.value(true); + }, + child: Scaffold( + appBar: AppBar( + toolbarHeight: 60 * ratio, + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.black), + onPressed: () { + _generateWalletProvider.resetCesiumImportView(); + Navigator.of(context).pop(); + }), + title: const SizedBox( + height: 22, + child: Text('Importer un portefeuille'), + )), + body: Builder( + builder: (ctx) => SafeArea( + child: Column(children: [ + const SizedBox(height: 20), + Consumer( + builder: (context, walletProvider, _) { + return TextFormField( + autofocus: true, + onChanged: (text) { + if (_debounce?.isActive ?? false) { + _debounce.cancel(); + } + _debounce = Timer(const Duration(milliseconds: 200), () { + walletProvider + .generateCesiumWalletPubkey( + text, walletProvider.cesiumPWD.text) + .then((value) { + walletProvider.canImport = true; + walletProvider.reloadBuild(); + }); + }); + }, + keyboardType: TextInputType.text, + controller: walletProvider.cesiumID, + obscureText: !walletProvider + .isCesiumIDVisible, //This will obscure text dynamically + decoration: InputDecoration( + hintText: 'Entrez votre identifiant Cesium', + suffixIcon: IconButton( + icon: Icon( + walletProvider.isCesiumIDVisible + ? Icons.visibility + : Icons.visibility_off, + color: Colors.black, + ), + onPressed: () { + walletProvider.cesiumIDisVisible(); + }, + ), + ), + ); + }), + const SizedBox(height: 15), + Consumer( + builder: (context, walletProvider, _) { + return TextFormField( + onChanged: (text) { + if (_debounce?.isActive ?? false) { + _debounce.cancel(); + } + _debounce = Timer(const Duration(milliseconds: 200), () { + walletProvider + .generateCesiumWalletPubkey( + walletProvider.cesiumID.text, text) + .then((value) { + walletProvider.canImport = true; + walletProvider.reloadBuild(); + }); + }); + }, + keyboardType: TextInputType.text, + controller: walletProvider.cesiumPWD, + obscureText: !walletProvider + .isCesiumPWDVisible, //This will obscure text dynamically + decoration: InputDecoration( + hintText: 'Entrez votre mot de passe Cesium', + suffixIcon: IconButton( + icon: Icon( + walletProvider.isCesiumPWDVisible + ? Icons.visibility + : Icons.visibility_off, + color: Colors.black, + ), + onPressed: () { + walletProvider.cesiumPWDisVisible(); + }, + ), + ), + ); + }), + const SizedBox(height: 15), + GestureDetector( + onTap: () { + Clipboard.setData(ClipboardData( + text: _generateWalletProvider.cesiumPubkey.text)); + _walletOptions.snackCopyKey(ctx); + }, + child: Consumer( + builder: (context, walletProvider, _) { + return Text( + _generateWalletProvider.cesiumPubkey.text, + style: const TextStyle( + fontSize: 14.0, + color: Colors.black, + fontWeight: FontWeight.bold, + fontFamily: 'Monospace'), + ); + }), + ), + const SizedBox(height: 20), + toolTips(_toolTipSecret, 'Code secret:', + "Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"), + Stack( + alignment: Alignment.centerRight, + children: [ + TextField( + enabled: false, + controller: _generateWalletProvider.pin, + maxLines: 1, + textAlign: TextAlign.center, + decoration: const InputDecoration(), + style: const TextStyle( + fontSize: 30.0, + color: Colors.black, + fontWeight: FontWeight.bold)), + IconButton( + icon: const Icon(Icons.replay), + color: orangeC, onPressed: () { - _generateWalletProvider.resetCesiumImportView(); - Navigator.of(context).pop(); - }), - title: const SizedBox( - height: 22, - child: Text('Importer un portefeuille'), - )), - body: Builder( - builder: (ctx) => SafeArea( - child: Column(children: [ - const SizedBox(height: 20), - TextFormField( - onChanged: (text) { - if (_debounce?.isActive ?? false) { - _debounce.cancel(); - } - _debounce = - Timer(const Duration(milliseconds: 200), () { - _generateWalletProvider - .generateCesiumWalletPubkey(text, - _generateWalletProvider.cesiumPWD.text) - .then((value) { - _generateWalletProvider.canImport = true; - _generateWalletProvider.reloadBuild(); - }); - }); - }, - keyboardType: TextInputType.text, - controller: _generateWalletProvider.cesiumID, - obscureText: !_generateWalletProvider - .isCesiumIDVisible, //This will obscure text dynamically - decoration: InputDecoration( - hintText: 'Entrez votre identifiant Cesium', - suffixIcon: IconButton( - icon: Icon( - _generateWalletProvider.isCesiumIDVisible - ? Icons.visibility - : Icons.visibility_off, - color: Colors.black, - ), - onPressed: () { - _generateWalletProvider.cesiumIDisVisible(); - }, - ), - ), - ), - const SizedBox(height: 15), - TextFormField( - onChanged: (text) { - if (_debounce?.isActive ?? false) { - _debounce.cancel(); - } - _debounce = - Timer(const Duration(milliseconds: 200), () { - _generateWalletProvider - .generateCesiumWalletPubkey( - _generateWalletProvider.cesiumID.text, - text) - .then((value) { - _generateWalletProvider.canImport = true; - _generateWalletProvider.reloadBuild(); - }); - }); - }, - keyboardType: TextInputType.text, - controller: _generateWalletProvider.cesiumPWD, - obscureText: !_generateWalletProvider - .isCesiumPWDVisible, //This will obscure text dynamically - decoration: InputDecoration( - hintText: 'Entrez votre mot de passe Cesium', - suffixIcon: IconButton( - icon: Icon( - _generateWalletProvider.isCesiumPWDVisible - ? Icons.visibility - : Icons.visibility_off, - color: Colors.black, - ), - onPressed: () { - _generateWalletProvider.cesiumPWDisVisible(); - }, - ), - ), - ), - const SizedBox(height: 15), - GestureDetector( - onTap: () { - Clipboard.setData(ClipboardData( - text: _generateWalletProvider - .cesiumPubkey.text)); - _walletOptions.snackCopyKey(ctx); - }, - child: Text( - _generateWalletProvider.cesiumPubkey.text, - style: const TextStyle( - fontSize: 14.0, - color: Colors.black, - fontWeight: FontWeight.bold, - fontFamily: 'Monospace'), - )), - const SizedBox(height: 20), - toolTips(_toolTipSecret, 'Code secret:', - "Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"), - Stack( - alignment: Alignment.centerRight, - children: [ - TextField( - enabled: false, - controller: _generateWalletProvider.pin, - maxLines: 1, - textAlign: TextAlign.center, - decoration: const InputDecoration(), - style: const TextStyle( - fontSize: 30.0, - color: Colors.black, - fontWeight: FontWeight.bold)), - IconButton( - icon: const Icon(Icons.replay), - color: orangeC, - onPressed: () { - _generateWalletProvider.changePinCode( - reload: true); - }, - ), - ], - ), - const SizedBox(height: 30), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: yellowC, // background - onPrimary: Colors.black, // foreground - ), - onPressed: _generateWalletProvider.canImport - ? () { - _generateWalletProvider - .importCesiumWallet() - .then((value) { - _myWalletProvider.rebuildWidget(); - _generateWalletProvider - .resetCesiumImportView(); - Navigator.popUntil( - context, - ModalRoute.withName('/'), - ); - }); - } - : null, - child: const Text('Importer ce portefeuille Cesium', - style: TextStyle(fontSize: 20))), - ]), - )))); + _generateWalletProvider.changePinCode(reload: true); + }, + ), + ], + ), + const SizedBox(height: 30), + Consumer( + builder: (context, walletProvider, _) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + primary: yellowC, // background + onPrimary: Colors.black, // foreground + ), + onPressed: walletProvider.canImport + ? () async { + final chestKey = + await walletProvider.importCesiumWallet(); + walletProvider.reloadBuild(); + + await Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute(builder: (context) { + return UnlockingWallet( + wallet: WalletData(chest: chestKey), + action: "mywallets", + ); + }), + ModalRoute.withName('/'), + ); + } + : null, + child: const Text( + 'Importer ce portefeuille Cesium', + style: TextStyle(fontSize: 20), + ), + ); + }), + ]), + ), + ), + ), + ); } Widget toolTips(_key, _text, _message) { diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 77fdd3d..df12f2f 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -11,6 +11,7 @@ import 'package:gecko/screens/history.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; import 'package:flutter/services.dart'; +import 'package:qr_flutter/qr_flutter.dart'; // ignore: must_be_immutable class WalletOptions extends StatelessWidget { @@ -27,10 +28,11 @@ class WalletOptions extends StatelessWidget { Provider.of(context, listen: false); WalletsProfilesProvider _historyProvider = Provider.of(context, listen: false); - MyWalletsProvider _myWalletProvider = Provider.of(context); + log.d(_walletOptions.pubkey.text); + final int _currentChest = _myWalletProvider.getCurrentChest(); final String shortPubkey = _walletOptions.getShortPubkey(_walletOptions.pubkey.text); @@ -278,14 +280,10 @@ class WalletOptions extends StatelessWidget { ); }), 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) - : const Text('-', style: TextStyle(fontSize: 20)); - }, + QrImage( + data: _walletOptions.pubkey.text, + version: QrVersions.auto, + size: isTall ? 300 : 270, ), SizedBox(height: 15 * ratio), Consumer( diff --git a/lib/screens/myWallets/wallets_home.dart b/lib/screens/myWallets/wallets_home.dart index 6826550..74025c8 100644 --- a/lib/screens/myWallets/wallets_home.dart +++ b/lib/screens/myWallets/wallets_home.dart @@ -4,7 +4,6 @@ import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/my_wallets.dart'; import 'package:gecko/models/queries.dart'; import 'package:gecko/models/wallet_data.dart'; -import 'package:gecko/models/wallet_options.dart'; import 'package:flutter/material.dart'; import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/myWallets/chest_options.dart'; @@ -128,8 +127,6 @@ class WalletsHome extends StatelessWidget { Widget myWalletsTiles(BuildContext context) { MyWalletsProvider _myWalletProvider = Provider.of(context); - WalletOptionsProvider _walletOptions = - Provider.of(context); final bool isWalletsExists = _myWalletProvider.checkIfWalletExist(); @@ -166,17 +163,14 @@ class WalletsHome extends StatelessWidget { padding: const EdgeInsets.all(16), child: GestureDetector( onTap: () { - _walletOptions.readLocalWallet( - context, - _repository, - _myWalletProvider.pinCode, - _myWalletProvider.pinLenght); Navigator.push( - context, - SmoothTransition( - page: WalletOptions( + context, + SmoothTransition( + page: WalletOptions( wallet: _repository, - ))); + ), + ), + ); // Navigator.push(context, // MaterialPageRoute(builder: (context) { diff --git a/pubspec.lock b/pubspec.lock index 09adf5a..6f33c90 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -281,6 +281,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.5.6" + desktop_window: + dependency: "direct main" + description: + name: desktop_window + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0" dio: dependency: "direct main" description: @@ -814,7 +821,7 @@ packages: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "8.1.6" + version: "8.3.0" permission_handler_platform_interface: dependency: transitive description: @@ -920,6 +927,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + qr_code_scanner: + dependency: "direct main" + description: + name: qr_code_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.1" + qr_flutter: + dependency: "direct main" + description: + name: qr_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" qrscan: dependency: "direct main" description: @@ -1233,6 +1254,15 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.2.10" + window_size: + dependency: "direct main" + description: + path: "plugins/window_size" + ref: HEAD + resolved-ref: "03d957e8b5c99fc83cd4a781031b154ab3de8753" + url: "git://github.com/google/flutter-desktop-embedding.git" + source: git + version: "0.1.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 06e8f4b..db0a916 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,6 +15,10 @@ dependencies: sdk: flutter flutter_driver: sdk: flutter + window_size: + git: + url: git://github.com/google/flutter-desktop-embedding.git + path: plugins/window_size assorted_layout_widgets: ^5.2.1 bubble: ^1.2.1 carousel_slider: ^4.0.0 @@ -38,11 +42,13 @@ dependencies: package_info: ^2.0.2 path_provider: ^2.0.3 pdf: ^3.5.0 - permission_handler: 8.1.6 + permission_handler: ^8.3.0 pin_code_fields: ^7.3.0 printing: ^5.6.0 provider: ^6.0.1 qrscan: ^0.3.2 + qr_code_scanner: ^0.6.1 + qr_flutter: ^4.0.0 responsive_builder: ^0.4.1 responsive_framework: ^0.1.4 sentry: ^6.0.0 @@ -56,6 +62,7 @@ dependencies: xml: ^5.3.0 pull_to_refresh: ^2.0.0 dio: ^4.0.4 + desktop_window: ^0.4.0 durt: ^0.1.4 flutter_icons: