TF-1042:Connection pop up never be disappear

This commit is contained in:
ManhNTX
2022-10-18 14:36:33 +07:00
committed by Dat H. Pham
parent 9626d12c77
commit df7f9b89ba
20 changed files with 191 additions and 165 deletions
-10
View File
@@ -1,4 +1,3 @@
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:contact/contact/model/capability_contact.dart';
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
@@ -13,7 +12,6 @@ import 'package:tmail_ui_user/main/error/capability_validator.dart';
abstract class BaseController extends GetxController with MessageDialogActionMixin, PopupContextMenuActionMixin {
final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
final connectivityResult = Rxn<ConnectivityResult>();
FpsCallback? fpsCallback;
void consumeState(Stream<Either<Failure, Success>> newStateStream) async {
@@ -28,14 +26,6 @@ abstract class BaseController extends GetxController with MessageDialogActionMix
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(
@@ -1,33 +0,0 @@
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: const EdgeInsets.only(bottom: 150),
child: Material(
elevation: 2,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(10.0)),
),
child: ListTile(
leading: SvgPicture.asset(_imagePaths.icNotConnection),
title: Text(
AppLocalizations.of(context).no_internet_connection,
style: const TextStyle(fontSize: 15, color: Colors.black)),
)
)
);
}
}
@@ -6,7 +6,6 @@ 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/domain/state/get_email_content_state.dart';
import 'package:tmail_ui_user/features/email/presentation/email_controller.dart';
@@ -18,7 +17,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/extensions/va
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class EmailView extends GetWidget<EmailController> with NetworkConnectionMixin {
class EmailView extends GetWidget<EmailController> {
static const double maxSizeFullDisplayEmailAddressArrowDownButton = 30.0;
@@ -5,7 +5,6 @@ import 'package:core/presentation/views/text/text_builder.dart';
import 'package:core/presentation/views/text/text_field_builder.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/login/domain/state/get_oidc_configuration_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_token_oidc_state.dart';
import 'package:tmail_ui_user/features/login/presentation/login_controller.dart';
@@ -15,7 +14,7 @@ import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_de
import 'package:tmail_ui_user/features/login/presentation/widgets/login_text_input_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
abstract class BaseLoginView extends GetWidget<LoginController> with NetworkConnectionMixin {
abstract class BaseLoginView extends GetWidget<LoginController> {
BaseLoginView({Key? key}) : super(key: key);
final loginController = Get.find<LoginController>();
@@ -72,14 +71,14 @@ abstract class BaseLoginView extends GetWidget<LoginController> with NetworkConn
margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24),
width: responsiveUtils.getDeviceWidth(context),height: 48,
child: AbsorbPointer(
absorbing: !controller.isNetworkConnectionAvailable(),
absorbing: !controller.networkConnectionController.isNetworkConnectionAvailable(),
child: ElevatedButton(
key: const Key('loginSubmitForm'),
style: ButtonStyle(
foregroundColor: MaterialStateProperty.resolveWith<Color>((Set<MaterialState> states) => Colors.white),
backgroundColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) => AppColor.primaryColor.withOpacity(
controller.isNetworkConnectionAvailable() ? 1 : 0.5)),
controller.networkConnectionController.isNetworkConnectionAvailable() ? 1 : 0.5)),
shape: MaterialStateProperty.all(RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
side: const BorderSide(width: 0, color: AppColor.primaryColor)
@@ -1,6 +1,3 @@
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter/cupertino.dart';
@@ -26,6 +23,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_inte
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart';
import 'package:tmail_ui_user/features/network_status_handle/presentation/network_connnection_controller.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
@@ -43,11 +41,9 @@ class LoginController extends BaseController {
final GetAuthenticationInfoInteractor _getAuthenticationInfoInteractor;
final GetStoredOidcConfigurationInteractor _getStoredOidcConfigurationInteractor;
final Connectivity _connectivity = Get.find<Connectivity>();
final TextEditingController urlInputController = TextEditingController();
late StreamSubscription _connectivityStreamSubscription;
final NetworkConnectionController networkConnectionController = Get.find<NetworkConnectionController>();
LoginController(
this._authenticationInteractor,
@@ -88,12 +84,6 @@ class LoginController extends BaseController {
? Password(password.trim())
: null;
@override
void onInit() {
_registerNetworkConnectivityState();
super.onInit();
}
@override
void onReady() {
if (BuildUtils.isWeb) {
@@ -337,18 +327,9 @@ class LoginController extends BaseController {
setUrlText(urlInputController.text);
}
void _registerNetworkConnectivityState() async {
setNetworkConnectivityState(await _connectivity.checkConnectivity());
_connectivityStreamSubscription = _connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
log('LoginController::_registerNetworkConnectivityState(): ConnectivityResult: ${result.name}');
setNetworkConnectivityState(result);
});
}
@override
void onClose() {
urlInputController.clear();
_connectivityStreamSubscription.cancel();
super.onClose();
}
@@ -49,14 +49,6 @@ class LoginView extends BaseLoginView {
),
),
),
Obx(() {
if (controller.isNetworkConnectionAvailable()) {
return const SizedBox.shrink();
}
return Align(
alignment: Alignment.bottomCenter,
child: buildNetworkConnectionWidget(context));
}),
]));
}
@@ -169,14 +161,14 @@ class LoginView extends BaseLoginView {
margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24),
width: responsiveUtils.getDeviceWidth(context),height: 48,
child: AbsorbPointer(
absorbing: !controller.isNetworkConnectionAvailable(),
absorbing: !controller.networkConnectionController.isNetworkConnectionAvailable(),
child: ElevatedButton(
key: const Key('nextToCredentialForm'),
style: ButtonStyle(
foregroundColor: MaterialStateProperty.resolveWith<Color>((Set<MaterialState> states) => Colors.white),
backgroundColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) => AppColor.primaryColor.withOpacity(
controller.isNetworkConnectionAvailable() ? 1 : 0.5)),
controller.networkConnectionController.isNetworkConnectionAvailable() ? 1 : 0.5)),
shape: MaterialStateProperty.all(RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
side: const BorderSide(width: 0, color: AppColor.primaryColor)
@@ -24,14 +24,6 @@ class LoginView extends BaseLoginView {
desktop: _buildWebForm(context),
)))
),
Obx(() {
if (controller.isNetworkConnectionAvailable()) {
return const SizedBox.shrink();
}
return Align(
alignment: Alignment.bottomCenter,
child: buildNetworkConnectionWidget(context));
}),
]),
);
}
@@ -280,14 +272,14 @@ class LoginView extends BaseLoginView {
margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24),
width: responsiveUtils.getDeviceWidth(context),height: 48,
child: AbsorbPointer(
absorbing: !controller.isNetworkConnectionAvailable(),
absorbing: !controller.networkConnectionController.isNetworkConnectionAvailable(),
child: ElevatedButton(
key: const Key('ssoSubmitForm'),
style: ButtonStyle(
foregroundColor: MaterialStateProperty.resolveWith<Color>((Set<MaterialState> states) => Colors.white),
backgroundColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) => AppColor.primaryColor.withOpacity(
controller.isNetworkConnectionAvailable() ? 1 : 0.5)),
controller.networkConnectionController.isNetworkConnectionAvailable() ? 1 : 0.5)),
shape: MaterialStateProperty.all(RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
side: const BorderSide(width: 0, color: AppColor.primaryColor)
@@ -3,14 +3,13 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/network_connection_mixin.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/filter_email_popup_menu_mixin.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart';
abstract class BaseMailboxDashBoardView extends GetWidget<MailboxDashBoardController>
with NetworkConnectionMixin, UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin,
with UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin,
AppLoaderMixin {
BaseMailboxDashBoardView({Key? key}) : super(key: key);
@@ -1,6 +1,5 @@
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';
@@ -63,6 +62,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vac
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart';
import 'package:tmail_ui_user/features/network_status_handle/presentation/network_connnection_controller.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
@@ -85,12 +85,12 @@ class MailboxDashBoardController extends ReloadableController {
final AppToast _appToast = Get.find<AppToast>();
final ImagePaths _imagePaths = Get.find<ImagePaths>();
final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find<RemoveEmailDraftsInteractor>();
final Connectivity _connectivity = Get.find<Connectivity>();
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>();
final SearchController searchController = Get.find<SearchController>();
final DownloadController downloadController = Get.find<DownloadController>();
final AppGridDashboardController _appGridDashboardController = Get.find<AppGridDashboardController>();
final NetworkConnectionController networkConnectionController = Get.find<NetworkConnectionController>();
final MoveToMailboxInteractor _moveToMailboxInteractor;
final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor;
@@ -128,7 +128,6 @@ class MailboxDashBoardController extends ReloadableController {
PresentationMailbox? outboxMailbox;
RouterArguments? routerArguments;
late StreamSubscription _connectivityStreamSubscription;
late StreamSubscription _emailReceiveManagerStreamSubscription;
late StreamSubscription _fileReceiveManagerStreamSubscription;
@@ -158,8 +157,6 @@ class MailboxDashBoardController extends ReloadableController {
@override
void onInit() {
_registerProgressState();
_registerNetworkConnectivityState();
super.onInit();
}
@@ -287,17 +284,6 @@ class MailboxDashBoardController extends ReloadableController {
@override
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 _registerPendingEmailAddress() {
_emailReceiveManagerStreamSubscription =
_emailReceiveManager.pendingEmailAddressInfo.stream.listen((emailAddress) {
@@ -1150,7 +1136,6 @@ class MailboxDashBoardController extends ReloadableController {
_emailReceiveManager.closeEmailReceiveManagerStream();
_emailReceiveManagerStreamSubscription.cancel();
_fileReceiveManagerStreamSubscription.cancel();
_connectivityStreamSubscription.cancel();
_progressStateController.close();
Get.delete<DownloadController>();
super.onClose();
@@ -91,14 +91,6 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
mobile: ThreadView());
}
}),
Obx(() {
if (controller.isNetworkConnectionAvailable()) {
return const SizedBox.shrink();
}
return Align(
alignment: Alignment.bottomCenter,
child: buildNetworkConnectionWidget(context));
}),
]),
);
}
@@ -206,15 +206,6 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Obx(() => controller.composerOverlayState.value == ComposerOverlayState.active
? ComposerView()
: const SizedBox.shrink()),
Obx(() {
if (controller.isNetworkConnectionAvailable()) {
return const SizedBox.shrink();
} else {
return Align(
alignment: Alignment.bottomCenter,
child: buildNetworkConnectionWidget(context));
}
}),
_buildDownloadTaskStateWidget(),
]),
),
@@ -0,0 +1,77 @@
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
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/features/base/base_controller.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class NetworkConnectionController extends BaseController {
final connectivityResult = Rxn<ConnectivityResult>();
final _imagePaths = Get.find<ImagePaths>();
final Connectivity _connectivity;
final AppToast _appToast = Get.find<AppToast>();
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
bool _isEnableShowToastDisConnection = true;
late StreamSubscription<ConnectivityResult> subscription;
NetworkConnectionController(this._connectivity);
@override
void onReady() {
subscription = _connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
connectivityResult.value = result;
if (_isEnableShowToastDisConnection && result == ConnectivityResult.none) {
_showToastLostConnection();
}
}) ;
super.onReady();
}
@override
void onClose() {
subscription.cancel();
super.onClose();
}
@override
void onDone() {}
@override
void onError(error) {}
void setNetworkConnectivityState(ConnectivityResult newConnectivityResult) {
connectivityResult.value = newConnectivityResult;
}
bool isNetworkConnectionAvailable() {
return connectivityResult.value != ConnectivityResult.none;
}
void _showToastLostConnection() {
if (currentContext != null && currentOverlayContext != null) {
_appToast.showBottomToast(
currentOverlayContext!,
AppLocalizations.of(currentContext!).no_internet_connection,
actionName: AppLocalizations.of(currentContext!).skip,
onActionClick: () {
_isEnableShowToastDisConnection = false;
ToastView.dismiss();
},
leadingIcon: SvgPicture.asset(
_imagePaths.icNotConnection,
width: 24,
height: 24,
fit: BoxFit.fill),
backgroundColor: Colors.redAccent,
textColor: Colors.white,
textActionColor: Colors.white,
maxWidth: _responsiveUtils.getMaxWidthToast(currentContext!),
infinityToast: true,
);
}
}
}