Check network state, try to reconnect if network up, display message if offline

This commit is contained in:
poka 2022-06-12 18:03:17 +02:00
parent 29505ad1be
commit 7c11146278
13 changed files with 283 additions and 181 deletions

View File

@ -27,7 +27,7 @@ class HomeProvider with ChangeNotifier {
Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850])); Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850]));
Widget appBarExplorer = Widget appBarExplorer =
Text('Explorateur', style: TextStyle(color: Colors.grey[850])); Text('Explorateur', style: TextStyle(color: Colors.grey[850]));
String homeMessage = "y'a pas de lézard ;-)"; String homeMessage = "Chargement en cours ...";
String defaultMessage = "y'a pas de lézard ;-)"; String defaultMessage = "y'a pas de lézard ;-)";
Future<void> initHive() async { Future<void> initHive() async {

View File

@ -50,6 +50,12 @@ class SubstrateSdk with ChangeNotifier {
List<NetworkParams> node = []; List<NetworkParams> node = [];
HomeProvider _homeProvider = Provider.of<HomeProvider>(ctx, listen: false); HomeProvider _homeProvider = Provider.of<HomeProvider>(ctx, listen: false);
// var connectivityResult = await (Connectivity().checkConnectivity());
// if (connectivityResult == ConnectivityResult.mobile ||
// connectivityResult == ConnectivityResult.wifi) {
// _homeProvider.changeMessage("Vous n'êtes pas connecté à internet", 0);
// return;
// }
_homeProvider.changeMessage("Connexion en cours...", 0); _homeProvider.changeMessage("Connexion en cours...", 0);
for (String _endpoint in configBox.get('endpoint')) { for (String _endpoint in configBox.get('endpoint')) {
@ -100,12 +106,17 @@ class SubstrateSdk with ChangeNotifier {
// Subscribe bloc number // Subscribe bloc number
sdk.api.setting.subscribeBestNumber((res) { sdk.api.setting.subscribeBestNumber((res) {
blocNumber = int.parse(res.toString()); blocNumber = int.parse(res.toString());
// log.d(sdk.api.connectedNode?.endpoint);
if (sdk.api.connectedNode?.endpoint == null) { if (sdk.api.connectedNode?.endpoint == null) {
nodeConnected = false;
_homeProvider.changeMessage("Le réseau a été perdu...", 0); _homeProvider.changeMessage("Le réseau a été perdu...", 0);
} else {
nodeConnected = true;
} }
notifyListeners(); notifyListeners();
}); });
// currencyName = await getCurencyName(); // currencyName = await getCurencyName();
notifyListeners(); notifyListeners();
_homeProvider.changeMessage( _homeProvider.changeMessage(
@ -250,9 +261,12 @@ class SubstrateSdk with ChangeNotifier {
Future<double> getBalance(String address, {bool isUd = false}) async { Future<double> getBalance(String address, {bool isUd = false}) async {
double balance = 0.0; double balance = 0.0;
// log.d('nodeConnected: ' + nodeConnected.toString());
if (nodeConnected) { if (nodeConnected) {
final brutBalance = await sdk.api.account.queryBalance(address); final brutBalance = await sdk.api.account.queryBalance(address);
balance = int.parse(brutBalance!.freeBalance) / 100; balance = int.parse(brutBalance!.freeBalance) / 100;
} else {
balance = -1;
} }
return balance; return balance;
} }

View File

@ -318,7 +318,8 @@ class WalletOptionsProvider with ChangeNotifier {
Map<String, double> balanceCache = {}; Map<String, double> balanceCache = {};
Widget balance(BuildContext context, String address, double size, Widget balance(BuildContext context, String address, double size,
[Color _color = Colors.black]) { [Color _color = Colors.black,
Color _loadingColor = const Color(0xffd07316)]) {
return Column(children: <Widget>[ return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, _sdk, _) { Consumer<SubstrateSdk>(builder: (context, _sdk, _) {
return FutureBuilder( return FutureBuilder(
@ -326,7 +327,8 @@ Widget balance(BuildContext context, String address, double size,
builder: (BuildContext context, AsyncSnapshot<double> _balance) { builder: (BuildContext context, AsyncSnapshot<double> _balance) {
if (_balance.connectionState != ConnectionState.done || if (_balance.connectionState != ConnectionState.done ||
_balance.hasError) { _balance.hasError) {
if (balanceCache[address] != null) { if (balanceCache[address] != null &&
balanceCache[address] != -1) {
return Text( return Text(
"${balanceCache[address]!.toString()} $currencyName", "${balanceCache[address]!.toString()} $currencyName",
style: TextStyle( style: TextStyle(
@ -336,13 +338,14 @@ Widget balance(BuildContext context, String address, double size,
height: 15, height: 15,
width: 15, width: 15,
child: CircularProgressIndicator( child: CircularProgressIndicator(
color: orangeC, color: _loadingColor,
strokeWidth: 2, strokeWidth: 2,
), ),
); );
} }
} }
balanceCache[address] = _balance.data!; balanceCache[address] = _balance.data!;
if (balanceCache[address] != -1) {
return Text( return Text(
"${balanceCache[address]!.toString()} $currencyName", "${balanceCache[address]!.toString()} $currencyName",
style: TextStyle( style: TextStyle(
@ -350,6 +353,9 @@ Widget balance(BuildContext context, String address, double size,
color: _color, color: _color,
), ),
); );
} else {
return const Text('');
}
}); });
}), }),
]); ]);
@ -362,9 +368,9 @@ Widget getCerts(BuildContext context, String address, double size,
return FutureBuilder( return FutureBuilder(
future: _sdk.getCerts(address), future: _sdk.getCerts(address),
builder: (BuildContext context, AsyncSnapshot<List<int>> _certs) { builder: (BuildContext context, AsyncSnapshot<List<int>> _certs) {
// log.d(_certs.data); log.d(_certs.data);
return _certs.data?[0] != 0 return _certs.data?[0] != 0 && _certs.data != null
? Row( ? Row(
children: [ children: [
Image.asset('assets/medal.png', height: 20), Image.asset('assets/medal.png', height: 20),

View File

@ -1,6 +1,8 @@
import 'package:dots_indicator/dots_indicator.dart'; import 'package:dots_indicator/dots_indicator.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:provider/provider.dart';
class CommonElements { class CommonElements {
// Exemple de Widget // Exemple de Widget
@ -145,6 +147,33 @@ class CommonElements {
), ),
); );
} }
Widget offlineInfo(BuildContext context) {
// SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
final double screenWidth = MediaQuery.of(context).size.width;
return Consumer<SubstrateSdk>(builder: (context, _sub, _) {
return Visibility(
visible: !_sub.nodeConnected,
child: Positioned(
top: 0,
child: Container(
height: 30,
width: screenWidth,
color: Colors.grey[800],
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Vous êtes hors ligne...",
style: TextStyle(color: Colors.grey[50]),
textAlign: TextAlign.center,
),
],
)),
),
);
});
}
} }
class SmoothTransition extends PageRouteBuilder { class SmoothTransition extends PageRouteBuilder {
@ -277,6 +306,7 @@ Future<void> infoPopup(BuildContext context, String title) async {
); );
} }
// Widget geckoAppBar() { // Widget geckoAppBar() {
// return AppBar( // return AppBar(
// toolbarHeight: 60 * ratio, // toolbarHeight: 60 * ratio,

View File

@ -1,4 +1,5 @@
import 'package:bubble/bubble.dart'; import 'package:bubble/bubble.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/stateful_wrapper.dart'; import 'package:gecko/models/stateful_wrapper.dart';
import 'package:gecko/providers/chest_provider.dart'; import 'package:gecko/providers/chest_provider.dart';
@ -118,7 +119,24 @@ class HomeScreen extends StatelessWidget {
_myWalletProvider.rebuildWidget(); _myWalletProvider.rebuildWidget();
} }
await _sub.connectNode(ctx); //kopa var connectivityResult =
await (Connectivity().checkConnectivity());
if (connectivityResult != ConnectivityResult.mobile &&
connectivityResult != ConnectivityResult.wifi) {
HomeProvider _homeProvider =
Provider.of<HomeProvider>(ctx, listen: false);
_homeProvider.changeMessage(
"Vous n'êtes pas connecté à internet", 0);
_sub.nodeConnected = false;
}
Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) async {
log.d('Network changed: $result');
await _sub.connectNode(ctx);
});
} }
}); });
}, },

View File

@ -20,6 +20,7 @@ class UnlockingWallet extends StatelessWidget {
WalletData? wallet; WalletData? wallet;
late int currentChestNumber; late int currentChestNumber;
late ChestData currentChest; late ChestData currentChest;
bool canUnlock = true;
// ignore: close_sinks // ignore: close_sinks
StreamController<ErrorAnimationType>? errorController; StreamController<ErrorAnimationType>? errorController;
@ -101,6 +102,7 @@ class UnlockingWallet extends StatelessWidget {
SizedBox(height: 40 * ratio), SizedBox(height: 40 * ratio),
pinForm(context, _pinLenght), pinForm(context, _pinLenght),
SizedBox(height: 3 * ratio), SizedBox(height: 3 * ratio),
if (canUnlock)
InkWell( InkWell(
onTap: () { onTap: () {
_walletOptions.changePinCacheChoice(); _walletOptions.changePinCacheChoice();
@ -117,13 +119,14 @@ class UnlockingWallet extends StatelessWidget {
const SizedBox(width: 8), const SizedBox(width: 8),
Text( Text(
'Garder ce code en mémoire 15 minutes', 'Garder ce code en mémoire 15 minutes',
style: style: TextStyle(
TextStyle(fontSize: 16, color: Colors.grey[700]), fontSize: 16, color: Colors.grey[700]),
), ),
const Spacer() const Spacer()
]), ]),
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
if (canUnlock)
InkWell( InkWell(
key: const Key('chooseChest'), key: const Key('chooseChest'),
onTap: () { onTap: () {
@ -164,11 +167,21 @@ class UnlockingWallet extends StatelessWidget {
MyWalletsProvider _myWalletProvider = MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context); Provider.of<MyWalletsProvider>(context);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
WalletData? defaultWallet = _myWalletProvider.getDefaultWallet();
FocusNode pinFocus = FocusNode(); FocusNode pinFocus = FocusNode();
WalletData defaultWallet = _myWalletProvider.getDefaultWallet();
// defaultWallet.address = null;
if (defaultWallet.address == null) {
canUnlock = false;
return Text(
'Impossible de retrouver votre\nportefeuille par défaut.\nID: ${defaultWallet.id()}',
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.redAccent, fontWeight: FontWeight.w500),
);
}
return Form( return Form(
key: formKey, key: formKey,
child: Padding( child: Padding(

View File

@ -8,6 +8,7 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/manage_membership.dart'; import 'package:gecko/screens/myWallets/manage_membership.dart';
import 'package:gecko/screens/qrcode_fullscreen.dart'; import 'package:gecko/screens/qrcode_fullscreen.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -70,7 +71,8 @@ class WalletOptions extends StatelessWidget {
), ),
), ),
bottomNavigationBar: _homeProvider.bottomAppBar(context), bottomNavigationBar: _homeProvider.bottomAppBar(context),
body: Builder( body: Stack(children: [
Builder(
builder: (ctx) => SafeArea( builder: (ctx) => SafeArea(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Container( Container(
@ -101,10 +103,12 @@ class WalletOptions extends StatelessWidget {
walletName(walletProvider, _walletOptions), walletName(walletProvider, _walletOptions),
SizedBox(height: isTall ? 5 : 0), SizedBox(height: isTall ? 5 : 0),
// SizedBox(height: isTall ? 5 : 0), // SizedBox(height: isTall ? 5 : 0),
balance(context, walletProvider.address.text, 21), balance(
context, walletProvider.address.text, 21),
const SizedBox(width: 30), const SizedBox(width: 30),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment:
CrossAxisAlignment.center,
children: [ children: [
_walletOptions.idtyStatus( _walletOptions.idtyStatus(
context, _walletOptions.address.text, context, _walletOptions.address.text,
@ -186,6 +190,8 @@ class WalletOptions extends StatelessWidget {
]), ]),
), ),
), ),
CommonElements().offlineInfo(context),
]),
), ),
); );
} }
@ -501,7 +507,7 @@ class WalletOptions extends StatelessWidget {
return const Text(''); return const Text('');
} }
final double _balance = final double _balance =
balanceCache[walletProvider.address.text] ?? 0; balanceCache[walletProvider.address.text] ?? -1;
final bool canDelete = !isDefaultWallet && final bool canDelete = !isDefaultWallet &&
!_hasConsumers.data! && !_hasConsumers.data! &&
(_balance > 2 || _balance == 0); (_balance > 2 || _balance == 0);

View File

@ -61,7 +61,12 @@ class WalletsHome extends StatelessWidget {
), ),
bottomNavigationBar: _homeProvider.bottomAppBar(context), bottomNavigationBar: _homeProvider.bottomAppBar(context),
body: SafeArea( body: SafeArea(
child: myWalletsTiles(context, _currentChestNumber!), child: Stack(
children: [
myWalletsTiles(context, _currentChestNumber!),
CommonElements().offlineInfo(context),
],
),
), ),
), ),
); );
@ -322,7 +327,11 @@ class WalletsHome extends StatelessWidget {
// style: TextStyle(color: isDefault ? Colors.white : Colors.black), // style: TextStyle(color: isDefault ? Colors.white : Colors.black),
// ), // ),
balance( balance(
context, _address, 15, isDefault ? Colors.white : Colors.black) context,
_address,
15,
isDefault ? Colors.white : Colors.black,
isDefault ? yellowC : orangeC)
]), ]),
), ),
); );

View File

@ -3,6 +3,7 @@ import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
// import 'package:gecko/providers/home.dart'; // import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/search.dart'; import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/search_result.dart'; import 'package:gecko/screens/search_result.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// import 'package:gecko/models/home.dart'; // import 'package:gecko/models/home.dart';
@ -44,6 +45,7 @@ class SearchScreen extends StatelessWidget {
// bottomNavigationBar: _homeProvider.bottomAppBar(context), // bottomNavigationBar: _homeProvider.bottomAppBar(context),
body: SafeArea( body: SafeArea(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
CommonElements().offlineInfo(context),
SizedBox(height: isTall ? 200 : 100), SizedBox(height: isTall ? 200 : 100),
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 17), padding: const EdgeInsets.symmetric(horizontal: 17),

View File

@ -8,6 +8,7 @@ import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/providers/search.dart'; import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/screens/wallet_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -46,6 +47,7 @@ class SearchResultScreen extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
CommonElements().offlineInfo(context),
const SizedBox(height: 30), const SizedBox(height: 30),
RichText( RichText(
text: TextSpan( text: TextSpan(

View File

@ -898,6 +898,7 @@ class WalletViewScreen extends StatelessWidget {
]), ]),
]), ]),
), ),
CommonElements().offlineInfo(context),
]); ]);
} }
} }

View File

@ -205,12 +205,12 @@ packages:
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
connectivity_plus: connectivity_plus:
dependency: transitive dependency: "direct main"
description: description:
name: connectivity_plus name: connectivity_plus
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.2" version: "2.3.3"
connectivity_plus_linux: connectivity_plus_linux:
dependency: transitive dependency: transitive
description: description:
@ -224,7 +224,7 @@ packages:
name: connectivity_plus_macos name: connectivity_plus_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.2" version: "1.2.3"
connectivity_plus_platform_interface: connectivity_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -245,7 +245,7 @@ packages:
name: connectivity_plus_windows name: connectivity_plus_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.1" version: "1.2.2"
convert: convert:
dependency: transitive dependency: transitive
description: description:

View File

@ -70,6 +70,7 @@ dependencies:
ref: gecko-work ref: gecko-work
dots_indicator: ^2.1.0 dots_indicator: ^2.1.0
web_socket_channel: ^2.2.0 web_socket_channel: ^2.2.0
connectivity_plus: ^2.3.3
dev_dependencies: dev_dependencies:
# flutter_launcher_icons: ^0.9.2 # flutter_launcher_icons: ^0.9.2