2021-02-19 16:32:38 +00:00
|
|
|
import 'package:comunic/helpers/account_helper.dart';
|
2020-04-18 11:48:21 +00:00
|
|
|
import 'package:comunic/helpers/events_helper.dart';
|
2021-04-17 16:05:33 +00:00
|
|
|
import 'package:comunic/helpers/preferences_helper.dart';
|
2021-02-19 16:32:38 +00:00
|
|
|
import 'package:comunic/helpers/server_config_helper.dart';
|
2021-02-20 07:58:03 +00:00
|
|
|
import 'package:comunic/helpers/version_helper.dart';
|
2020-04-17 13:25:26 +00:00
|
|
|
import 'package:comunic/helpers/websocket_helper.dart';
|
2021-04-12 17:26:05 +00:00
|
|
|
import 'package:comunic/models/config.dart';
|
2021-02-20 08:24:51 +00:00
|
|
|
import 'package:comunic/ui/dialogs/deprecation_dialog.dart';
|
2020-05-09 12:07:14 +00:00
|
|
|
import 'package:comunic/ui/routes/main_route/main_route.dart';
|
2020-05-05 11:21:37 +00:00
|
|
|
import 'package:comunic/ui/routes/main_route/smartphone_route.dart';
|
2020-05-05 11:31:03 +00:00
|
|
|
import 'package:comunic/ui/routes/main_route/tablet_route.dart';
|
2021-04-23 16:11:17 +00:00
|
|
|
import 'package:comunic/ui/routes/tour_route.dart';
|
2021-04-17 09:16:21 +00:00
|
|
|
import 'package:comunic/ui/routes/welcome_route.dart';
|
2021-04-23 10:24:35 +00:00
|
|
|
import 'package:comunic/ui/widgets/login_routes_theme.dart';
|
2020-04-18 11:48:21 +00:00
|
|
|
import 'package:comunic/ui/widgets/safe_state.dart';
|
2021-03-14 16:44:29 +00:00
|
|
|
import 'package:comunic/utils/flutter_utils.dart';
|
2020-04-17 13:25:26 +00:00
|
|
|
import 'package:comunic/utils/intl_utils.dart';
|
2020-05-05 11:31:03 +00:00
|
|
|
import 'package:comunic/utils/ui_utils.dart';
|
2020-04-17 13:25:26 +00:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
|
|
/// Comunic account initialization widget
|
|
|
|
///
|
|
|
|
/// Application screens should only appears as children of this widget
|
|
|
|
///
|
|
|
|
/// This widget ensures that the application is correctly initialized before
|
|
|
|
/// starting it
|
|
|
|
///
|
|
|
|
/// @author Pierre Hubert
|
|
|
|
|
|
|
|
class InitializeWidget extends StatefulWidget {
|
|
|
|
@override
|
|
|
|
_InitializeWidgetState createState() => _InitializeWidgetState();
|
|
|
|
}
|
|
|
|
|
2020-04-18 11:48:21 +00:00
|
|
|
class _InitializeWidgetState extends SafeState<InitializeWidget> {
|
2020-04-17 13:25:26 +00:00
|
|
|
bool _error = false;
|
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
_tryConnect();
|
|
|
|
|
|
|
|
super.initState();
|
2020-04-18 11:48:21 +00:00
|
|
|
|
2020-04-20 07:02:54 +00:00
|
|
|
// Check if login token are considered as invalid
|
|
|
|
super.listen<InvalidLoginTokensEvent>((ev) => _openLoginPage());
|
|
|
|
|
2020-04-18 11:48:21 +00:00
|
|
|
// Listen to WebSocket close event
|
2021-02-18 18:11:50 +00:00
|
|
|
super.listen<WSClosedEvent>((e) {
|
|
|
|
_popToMainRoute();
|
|
|
|
_tryConnect();
|
|
|
|
});
|
2020-04-17 13:25:26 +00:00
|
|
|
}
|
|
|
|
|
2020-04-20 06:52:01 +00:00
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
super.dispose();
|
|
|
|
WebSocketHelper.close();
|
|
|
|
}
|
|
|
|
|
2020-04-20 07:02:54 +00:00
|
|
|
/// Open login page
|
|
|
|
_openLoginPage() {
|
|
|
|
Navigator.of(context)
|
2021-04-17 08:59:06 +00:00
|
|
|
.pushReplacement(MaterialPageRoute(builder: (c) => WelcomeRoute()));
|
2020-04-20 07:02:54 +00:00
|
|
|
}
|
|
|
|
|
2020-04-17 13:25:26 +00:00
|
|
|
/// Try to connect to server
|
|
|
|
void _tryConnect() async {
|
|
|
|
try {
|
2021-02-19 16:32:38 +00:00
|
|
|
await ServerConfigurationHelper.ensureLoaded();
|
|
|
|
|
2021-03-14 16:44:29 +00:00
|
|
|
if (!isWeb &&
|
2022-03-10 18:39:57 +00:00
|
|
|
ServerConfigurationHelper.config!.minSupportedMobileVersion >
|
2021-03-14 16:44:29 +00:00
|
|
|
VersionHelper.version) await showDeprecationDialog(context);
|
2021-02-20 08:24:51 +00:00
|
|
|
|
2021-02-19 16:32:38 +00:00
|
|
|
if (!AccountHelper.isUserIDLoaded) {
|
|
|
|
_popToMainRoute();
|
|
|
|
_openLoginPage();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-04-17 13:25:26 +00:00
|
|
|
setState(() {
|
|
|
|
_error = false;
|
|
|
|
});
|
|
|
|
|
2021-04-24 06:51:56 +00:00
|
|
|
final prefs = await PreferencesHelper.getInstance();
|
2021-04-24 08:35:12 +00:00
|
|
|
if (!prefs.getBool(PreferencesKeyList.IS_TOUR_SEEN)) {
|
|
|
|
await WebSocketHelper.connect();
|
2021-04-24 06:51:56 +00:00
|
|
|
await showTour(context);
|
2021-04-24 08:35:12 +00:00
|
|
|
}
|
2021-04-24 06:51:56 +00:00
|
|
|
|
|
|
|
print("Attempting WebSocket connection...");
|
|
|
|
|
2021-04-24 08:14:56 +00:00
|
|
|
if (config().additionalLoading != null)
|
2022-03-10 18:39:57 +00:00
|
|
|
await config().additionalLoading!();
|
2021-04-24 08:14:56 +00:00
|
|
|
|
2021-04-24 08:35:12 +00:00
|
|
|
await WebSocketHelper.connect();
|
|
|
|
|
2020-04-17 13:25:26 +00:00
|
|
|
setState(() {});
|
|
|
|
} catch (e, stack) {
|
|
|
|
print("Could not connect to server! $e");
|
|
|
|
print(stack);
|
|
|
|
|
2021-02-18 18:11:50 +00:00
|
|
|
_popToMainRoute();
|
2020-05-01 07:17:08 +00:00
|
|
|
|
2020-04-17 13:25:26 +00:00
|
|
|
setState(() {
|
|
|
|
_error = true;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2021-04-24 07:16:29 +00:00
|
|
|
if (_error || !WebSocketHelper.isConnected()) return _buildNonReadyWidget();
|
|
|
|
|
|
|
|
if (config().mainRouteBuilder != null)
|
2022-03-10 18:39:57 +00:00
|
|
|
return config().mainRouteBuilder!(context, mainControllerKey);
|
2021-04-24 07:16:29 +00:00
|
|
|
|
|
|
|
return isTablet(context)
|
|
|
|
? TabletRoute(key: mainControllerKey)
|
|
|
|
: SmartphoneMainRoute(key: mainControllerKey);
|
2020-04-17 13:25:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Build loading widget
|
|
|
|
Widget _buildNonReadyWidget() {
|
2021-04-23 10:24:35 +00:00
|
|
|
return LoginRoutesTheme(
|
|
|
|
child: Scaffold(
|
|
|
|
backgroundColor: config().splashBackgroundColor,
|
|
|
|
body: Center(
|
|
|
|
child: Material(
|
|
|
|
color: Colors.transparent,
|
|
|
|
textStyle: TextStyle(color: Colors.white),
|
|
|
|
child: Column(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
Spacer(
|
|
|
|
flex: 4,
|
|
|
|
),
|
|
|
|
Text(
|
|
|
|
config().appName,
|
|
|
|
style: TextStyle(fontSize: 50),
|
|
|
|
),
|
|
|
|
Spacer(
|
|
|
|
flex: 2,
|
|
|
|
),
|
|
|
|
_error ? _buildErrorWidget() : _buildConnectingWidget(),
|
|
|
|
Spacer(
|
|
|
|
flex: 2,
|
|
|
|
),
|
|
|
|
!isWeb
|
|
|
|
? Text(tr("Version %version% - Build %build%", args: {
|
2022-03-10 18:39:57 +00:00
|
|
|
"version": VersionHelper.info!.version.toString(),
|
|
|
|
"build": VersionHelper.info!.buildNumber.toString()
|
|
|
|
})!)
|
2021-04-23 10:24:35 +00:00
|
|
|
: Container(),
|
|
|
|
Spacer(flex: 1),
|
|
|
|
],
|
|
|
|
),
|
2020-05-03 19:13:20 +00:00
|
|
|
),
|
2020-04-17 13:25:26 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Widget _buildConnectingWidget() {
|
|
|
|
return CircularProgressIndicator();
|
|
|
|
}
|
|
|
|
|
|
|
|
Widget _buildErrorWidget() {
|
|
|
|
return Column(
|
|
|
|
children: <Widget>[
|
2020-05-03 19:13:20 +00:00
|
|
|
Icon(Icons.error, color: Colors.white),
|
2020-04-17 13:25:26 +00:00
|
|
|
SizedBox(height: 30),
|
2022-03-10 18:39:57 +00:00
|
|
|
Text(tr("Could not connect to server!")!),
|
2020-04-17 13:25:26 +00:00
|
|
|
SizedBox(
|
|
|
|
height: 30,
|
|
|
|
),
|
2021-03-13 14:38:43 +00:00
|
|
|
ElevatedButton(
|
2020-04-17 13:25:26 +00:00
|
|
|
onPressed: () => _tryConnect(),
|
2022-03-10 18:39:57 +00:00
|
|
|
child: Text(tr("Try again")!),
|
2020-04-17 13:25:26 +00:00
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
2021-02-18 18:11:50 +00:00
|
|
|
|
|
|
|
void _popToMainRoute() {
|
|
|
|
// Pop until we reach main route
|
|
|
|
Navigator.of(context).popUntil((settings) =>
|
2022-03-10 18:39:57 +00:00
|
|
|
ModalRoute.of(context)!.isCurrent || !ModalRoute.of(context)!.isActive);
|
2021-02-18 18:11:50 +00:00
|
|
|
}
|
2020-04-17 13:25:26 +00:00
|
|
|
}
|