TF-228 Checking network status in the app

This commit is contained in:
dab246
2022-03-31 12:09:05 +07:00
committed by Dat H. Pham
parent ac52289891
commit 431ecd44ed
11 changed files with 125 additions and 25 deletions
+10
View File
@@ -1,9 +1,11 @@
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:get/get.dart';
abstract class BaseController extends GetxController {
final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
final connectivityResult = Rxn<ConnectivityResult>();
void consumeState(Stream<Either<Failure, Success>> newStateStream) async {
log('BaseController::consumeState():');
@@ -18,6 +20,14 @@ abstract class BaseController extends GetxController {
viewState.value = newState;
}
void setNetworkConnectivityState(ConnectivityResult newConnectivityResult) {
connectivityResult.value = newConnectivityResult;
}
bool isNetworkConnectionAvailable() {
return connectivityResult.value != ConnectivityResult.none;
}
void getState(Future<Either<Failure, Success>> newStateStream) async {
final state = await newStateStream;
state.fold(
@@ -0,0 +1,33 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
mixin NetworkConnectionMixin {
final _imagePaths = Get.find<ImagePaths>();
Widget buildNetworkConnectionWidget(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16)),
width: 320,
margin: EdgeInsets.only(bottom: 100),
child: Material(
elevation: 8,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(16.0)),
),
child: ListTile(
leading: SvgPicture.asset(_imagePaths.icNotConnection),
title: Text(
AppLocalizations.of(context).no_internet_connection,
style: TextStyle(fontSize: 15, color: Colors.black)),
)
)
);
}
}
+28 -22
View File
@@ -8,6 +8,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/mixin/network_connection_mixin.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_email_address_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/email_controller.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/app_bar_mail_widget_builder.dart';
@@ -20,7 +21,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/user_setti
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:filesize/filesize.dart';
class EmailView extends GetView with UserSettingPopupMenuMixin {
class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectionMixin {
final emailController = Get.find<EmailController>();
final responsiveUtils = Get.find<ResponsiveUtils>();
@@ -37,28 +38,33 @@ class EmailView extends GetView with UserSettingPopupMenuMixin {
},
child: Scaffold(
backgroundColor: responsiveUtils.isDesktop(context) ? AppColor.colorBgDesktop : Colors.white,
body: Container(
padding: EdgeInsets.zero,
margin: EdgeInsets.zero,
decoration: responsiveUtils.isTabletLarge(context)
? BoxDecoration(border: Border(left: BorderSide(color: AppColor.colorLineLeftEmailView, width: 1.0)))
: null,
child: SafeArea(
right: responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context),
left: responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (responsiveUtils.isDesktop(context))
Container(
color: Colors.white,
padding: EdgeInsets.only(right: 10, top: 16, bottom: 10),
child: _buildHeader(context)),
Expanded(child: _buildBody(context)),
]
)
body: Stack(children: [
Container(
padding: EdgeInsets.zero,
margin: EdgeInsets.zero,
decoration: responsiveUtils.isTabletLarge(context)
? BoxDecoration(border: Border(left: BorderSide(color: AppColor.colorLineLeftEmailView, width: 1.0)))
: null,
child: SafeArea(
right: responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context),
left: responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (responsiveUtils.isDesktop(context))
Container(
color: Colors.white,
padding: EdgeInsets.only(right: 10, top: 16, bottom: 10),
child: _buildHeader(context)),
Expanded(child: _buildBody(context)),
]
)
),
),
)
Obx(() => !emailController.mailboxDashBoardController.isNetworkConnectionAvailable() && (responsiveUtils.isMobile(context) || responsiveUtils.isTablet(context))
? Align(alignment: Alignment.bottomCenter, child: buildNetworkConnectionWidget(context))
: SizedBox.shrink()),
])
)
);
}
@@ -1,3 +1,6 @@
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter/foundation.dart';
@@ -47,6 +50,7 @@ class MailboxDashBoardController extends ReloadableController {
final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find<RemoveEmailDraftsInteractor>();
final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find<DeleteCredentialInteractor>();
final CachingManager _cachingManager = Get.find<CachingManager>();
final Connectivity _connectivity = Get.find<Connectivity>();
final MoveToTrashInteractor _moveToTrashInteractor;
final MoveToMailboxInteractor _moveToMailboxInteractor;
@@ -68,12 +72,19 @@ class MailboxDashBoardController extends ReloadableController {
TextEditingController searchInputController = TextEditingController();
FocusNode searchFocus = FocusNode();
RouterArguments? routerArguments;
late StreamSubscription _connectivityStreamSubscription;
MailboxDashBoardController(
this._moveToTrashInteractor,
this._moveToMailboxInteractor,
);
@override
void onInit() {
super.onInit();
_registerNetworkConnectivityState();
}
@override
void onReady() {
super.onReady();
@@ -144,7 +155,17 @@ class MailboxDashBoardController extends ReloadableController {
}
@override
void onError(error) {
void onError(error) {}
void _registerNetworkConnectivityState() async {
setNetworkConnectivityState(await _connectivity.checkConnectivity());
_connectivityStreamSubscription = _connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
log('MailboxDashBoardController::_registerNetworkConnectivityState(): ConnectivityResult: ${result.name}');
setNetworkConnectivityState(result);
if (userProfile.value == null && result != ConnectivityResult.none) {
_getUserProfile();
}
});
}
void _getUserProfile() async {
@@ -354,6 +375,7 @@ class MailboxDashBoardController extends ReloadableController {
@override
void onClose() {
_connectivityStreamSubscription.cancel();
searchInputController.dispose();
searchFocus.dispose();
super.onClose();
@@ -1,6 +1,7 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/network_connection_mixin.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart'
if (dart.library.html) 'package:tmail_ui_user/features/composer/presentation/composer_view_web.dart';
import 'package:tmail_ui_user/features/email/presentation/email_view.dart';
@@ -12,7 +13,7 @@ import 'package:tmail_ui_user/features/setting/presentation/model/reading_pane.d
import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> {
class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> with NetworkConnectionMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
@@ -40,6 +41,9 @@ class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> {
Obx(() => controller.dashBoardAction == DashBoardAction.compose
? ComposerView()
: SizedBox.shrink()),
Obx(() => controller.isNetworkConnectionAvailable()
? SizedBox.shrink()
: Align(alignment: Alignment.bottomCenter, child: buildNetworkConnectionWidget(context))),
]),
);
}