diff --git a/config/gdev_endpoints.json b/config/gdev_endpoints.json new file mode 100644 index 0000000..1e2f325 --- /dev/null +++ b/config/gdev_endpoints.json @@ -0,0 +1,3 @@ +[ + "wss://gdev.librelois.fr/ws" +] diff --git a/config/gva_endpoints.json b/config/gva_endpoints.json deleted file mode 100644 index 1533920..0000000 --- a/config/gva_endpoints.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "https://g1.librelois.fr/gva" -] diff --git a/lib/main.dart b/lib/main.dart index e0b29da..2cf37c3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -72,6 +72,7 @@ Future main() async { configBox = await Hive.openBox("configBox"); await Hive.deleteBoxFromDisk('g1WalletsBox'); g1WalletsBox = await Hive.openBox("g1WalletsBox"); + // keystoreBox = await Hive.openBox("keystoreBox"); // g1WalletsBox.clear(); @@ -82,7 +83,7 @@ Future main() async { // Get a valid GVA endpoint endPointGVA = 'https://g1.librelois.fr/gva'; // endPointGVA = 'https://duniter-g1.p2p.legal/gva'; - // await _homeProvider.getValidEndpoint(); + await _homeProvider.getValidEndpoints(); // if (endPointGVA == 'HS') { // _homeProvider.playSound('faché', 0.8); diff --git a/lib/providers/home.dart b/lib/providers/home.dart index 2f59221..4df43d0 100644 --- a/lib/providers/home.dart +++ b/lib/providers/home.dart @@ -57,56 +57,62 @@ class HomeProvider with ChangeNotifier { return version + '+' + buildNumber; } - Future getValidEndpoint() async { - List _listEndpoints = await rootBundle - .loadString('config/gva_endpoints.json') - .then((jsonStr) => jsonDecode(jsonStr)); - _listEndpoints.shuffle(); + Future getValidEndpoints() async { + configBox.delete('endpoint'); - int i = 0; - String? _endpoint; - int _statusCode = 0; + List _listEndpoints = []; + if (!configBox.containsKey('endpoint') || configBox.get('endpoint') == []) { + _listEndpoints = await rootBundle + .loadString('config/gdev_endpoints.json') + .then((jsonStr) => jsonDecode(jsonStr)); + _listEndpoints.shuffle(); + configBox.put('endpoint', _listEndpoints); + } - final _client = HttpClient(); - _client.connectionTimeout = const Duration(milliseconds: 1000); + // int i = 0; + // String? _endpoint; + // int _statusCode = 0; - do { - i++; - log.d(i.toString() + ' ème essai de recherche de endpoint GVA.'); - log.d('Try GVA endpoint: ${_listEndpoints[i - 1]}'); - int listLenght = _listEndpoints.length - 1; - if (i > listLenght) { - log.e('NO VALID GVA ENDPOINT FOUND'); - _endpoint = 'HS'; - break; - } - if (i != 0) { - await Future.delayed(const Duration(milliseconds: 300)); - } + // final _client = HttpClient(); + // _client.connectionTimeout = const Duration(milliseconds: 1000); - try { - final request = await _client.postUrl(Uri.parse(_listEndpoints[i])); - final response = await request.close(); + // do { + // i++; + // log.d(i.toString() + ' ème essai de recherche de endpoint GVA.'); + // log.d('Try GVA endpoint: ${_listEndpoints[i - 1]}'); + // int listLenght = _listEndpoints.length - 1; + // if (i > listLenght) { + // log.e('NO VALID GVA ENDPOINT FOUND'); + // _endpoint = 'HS'; + // break; + // } + // if (i != 0) { + // await Future.delayed(const Duration(milliseconds: 300)); + // } - _endpoint = _listEndpoints[i]; - _statusCode = response.statusCode; - } on TimeoutException catch (_) { - log.e('This endpoint is timeout, next'); - _statusCode = 50; - continue; - } on SocketException catch (_) { - log.e('This endpoint is a bad endpoint, next'); - _statusCode = 70; - continue; - } on Exception { - log.e('Unknown error'); - _statusCode = 60; - continue; - } - } while (_statusCode != 400); + // try { + // final request = await _client.postUrl(Uri.parse(_listEndpoints[i])); + // final response = await request.close(); - log.i('ENDPOINT: ' + _endpoint!); - return _endpoint; + // _endpoint = _listEndpoints[i]; + // _statusCode = response.statusCode; + // } on TimeoutException catch (_) { + // log.e('This endpoint is timeout, next'); + // _statusCode = 50; + // continue; + // } on SocketException catch (_) { + // log.e('This endpoint is a bad endpoint, next'); + // _statusCode = 70; + // continue; + // } on Exception { + // log.e('Unknown error'); + // _statusCode = 60; + // continue; + // } + // } while (_statusCode != 400); + + log.i('ENDPOINT: ' + _listEndpoints.toString()); + return _listEndpoints; } T getRandomElement(List list) { diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 6760027..0d2f7d8 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -22,11 +22,10 @@ class MyWalletsProvider with ChangeNotifier { bool checkIfWalletExist() { // configBox.delete('endpoint'); - if (!configBox.containsKey('endpoint') || configBox.get('endpoint') == '') { - log.d('No endpoint, configure...'); - // configBox.put('endpoint', 'wss://gdev.librelois.fr/ws'); - configBox.put('endpoint', 'ws://127.0.0.1:9944'); - } + // if (!configBox.containsKey('endpoint') || configBox.get('endpoint') == []) { + // log.d('No endpoint, configure...'); + // configBox.put('endpoint', 'wss://gdev.librelois.fr/ws'); + // } if (chestBox.isEmpty) { log.i('No wallets detected'); diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index a91d6fb..1306584 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -11,6 +11,7 @@ import 'package:polkawallet_sdk/api/types/txInfoData.dart'; import 'package:polkawallet_sdk/polkawallet_sdk.dart'; import 'package:polkawallet_sdk/storage/keyring.dart'; import 'package:polkawallet_sdk/storage/types/keyPairData.dart'; +import 'package:provider/provider.dart'; import 'package:truncate/truncate.dart'; // import 'package:web_socket_channel/io.dart'; @@ -45,11 +46,15 @@ class SubstrateSdk with ChangeNotifier { Future connectNode(BuildContext ctx) async { List node = []; - final n = NetworkParams(); - n.name = currencyName; - n.endpoint = configBox.get('endpoint'); - n.ss58 = ss58; - node.add(n); + + for (String _endpoint in configBox.get('endpoint')) { + final n = NetworkParams(); + n.name = currencyName; + n.endpoint = _endpoint; + n.ss58 = ss58; + node.add(n); + } + int timeout = 10000; // if (n.endpoint!.startsWith('ws://')) { @@ -428,6 +433,10 @@ class SubstrateSdk with ChangeNotifier { return await sdk.api.keyring.checkMnemonicValid(mnemonic); } + + String? getConnectedEndpoint() { + return sdk.api.connectedNode?.endpoint; + } } void snack(BuildContext context, String message, {int duration = 2}) { @@ -449,8 +458,10 @@ void snackNode(BuildContext context, bool isConnected) { _message = "Aucun noeud Duniter disponible, veuillez réessayer ultérieurement"; } else { + SubstrateSdk _sub = Provider.of(context, listen: false); + _message = - "Vous êtes connecté au noeud\n${configBox.get('endpoint').split('//')[1]}"; + "Vous êtes connecté au noeud\n${_sub.getConnectedEndpoint()!.split('//')[1]}"; } final snackBar = SnackBar( padding: const EdgeInsets.all(20), diff --git a/lib/screens/myWallets/choose_wallet.dart b/lib/screens/myWallets/choose_wallet.dart index 4bb756a..86fc4e0 100644 --- a/lib/screens/myWallets/choose_wallet.dart +++ b/lib/screens/myWallets/choose_wallet.dart @@ -1,6 +1,7 @@ import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; +import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; @@ -74,8 +75,7 @@ class ChooseWalletScreen extends StatelessWidget { WalletsProfilesProvider _walletViewProvider = Provider.of(context, listen: false); - WalletData? defaultWallet = - _myWalletProvider.getDefaultWallet(); + WalletData? defaultWallet = _myWalletProvider.getDefaultWallet(); _selectedId ??= defaultWallet!.id(); _derivation ??= defaultWallet!.derivation!; @@ -190,11 +190,14 @@ class ChooseWalletScreen extends StatelessWidget { ), ), ), - onTap: () { + onTap: () async { _derivation = _repository.derivation!; _selectedId = _repository.id(); - chestBox.get(currentChest)!.defaultWallet = - _repository.number; + + ChestData _newChestData = + chestBox.get(currentChest)!; + _newChestData.defaultWallet = _repository.number; + await chestBox.put(currentChest, _newChestData); _sub.setCurrentWallet(_repository.address!); _myWalletProvider.rebuildWidget(); diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 78a2eb0..3962dc3 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -198,7 +198,6 @@ class UnlockingWallet extends StatelessWidget { ) ], onCompleted: (_pin) async { - log.d("Completed"); _myWalletProvider.pinCode = _pin.toUpperCase(); final isValid = await _sub.checkPassword( diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index a740335..6eddab7 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; +import 'package:gecko/models/chest_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/wallet_options.dart'; @@ -335,17 +336,18 @@ class WalletOptions extends StatelessWidget { MyWalletsProvider _myWalletProvider, WalletOptionsProvider _walletOptions, int _currentChest) { - WalletData defaultWallet = - _myWalletProvider.getDefaultWallet()!; + WalletData defaultWallet = _myWalletProvider.getDefaultWallet()!; _walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id()[1]); return InkWell( key: const Key('setDefaultWallet'), onTap: !walletProvider.isDefaultWallet - ? () { + ? () async { defaultWallet = wallet; - chestBox.get(_currentChest)!.defaultWallet = wallet.number; + ChestData _newChestData = chestBox.get(_currentChest)!; + _newChestData.defaultWallet = wallet.number; + await chestBox.put(_currentChest, _newChestData); _myWalletProvider.readAllWallets(_currentChest); _myWalletProvider.rebuildWidget(); } diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index bd13ad4..2f85a8a 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -30,12 +30,13 @@ class SettingsScreen extends StatelessWidget { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + SubstrateSdk _sub = Provider.of(context, listen: false); const double buttonHigh = 50; const double buttonWidth = 240; const double fontSize = 16; TextEditingController _endpointController = - TextEditingController(text: configBox.get('endpoint')); + TextEditingController(text: _sub.getConnectedEndpoint()); // getAppDirectory(); return Scaffold( @@ -71,7 +72,7 @@ class SettingsScreen extends StatelessWidget { size: 40, ), onPressed: () async { - configBox.put('endpoint', _endpointController.text); + configBox.put('endpoint', [_endpointController.text]); await _sub.connectNode(context); }); }), diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 2eca815..d66d62f 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -193,6 +193,7 @@ class WalletViewScreen extends StatelessWidget { const double shapeSize = 20; WalletData? defaultWallet = _myWalletProvider.getDefaultWallet(); + log.d(defaultWallet!.address); bool canValidate = false; @@ -213,7 +214,7 @@ class WalletViewScreen extends StatelessWidget { if (_walletViewProvider.payAmount.text != '' && double.parse(_walletViewProvider.payAmount.text) <= double.parse( - balanceCache[defaultWallet!.address]!.split(' ')[0]) && + balanceCache[defaultWallet.address]!.split(' ')[0]) && _walletViewProvider.pubkey != defaultWallet.address) { canValidate = true; } else { @@ -286,7 +287,7 @@ class WalletViewScreen extends StatelessWidget { padding: const EdgeInsets.all(10), child: Row(children: [ - Text(defaultWallet!.name!), + Text(defaultWallet.name!), const Spacer(), FutureBuilder( future: diff --git a/pubspec.yaml b/pubspec.yaml index c0e7a6e..a1c2e93 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -107,7 +107,7 @@ flutter: assets: - images/ - - config/gva_endpoints.json + - config/gdev_endpoints.json - assets/ - assets/home/ - assets/avatars/