diff --git a/assets/images/ic_not_connection.svg b/assets/images/ic_not_connection.svg index 3b806bfe1..e87d1904c 100644 --- a/assets/images/ic_not_connection.svg +++ b/assets/images/ic_not_connection.svg @@ -1,3 +1,8 @@ - + + + + + + diff --git a/core/lib/presentation/utils/app_toast.dart b/core/lib/presentation/utils/app_toast.dart index 6e96530d9..cbf0e2755 100644 --- a/core/lib/presentation/utils/app_toast.dart +++ b/core/lib/presentation/utils/app_toast.dart @@ -47,6 +47,7 @@ class AppToast { Widget? actionIcon, Widget? leadingIcon, double? maxWidth, + bool infinityToast = false, Color? backgroundColor, Color? textColor, Color? textActionColor, @@ -103,6 +104,7 @@ class AppToast { message, maxWidth: maxWidth, backgroundColor: backgroundColor, + infinityToast: infinityToast, textColor: textColor, leading: leadingIcon, trailing: trailingAction); @@ -113,6 +115,7 @@ class AppToast { String message, { Color? textColor, Widget? leading, + bool infinityToast = false, Widget? trailing, double? maxWidth, Color? backgroundColor @@ -138,7 +141,7 @@ class AppToast { child: PointerInterceptor(child: leading)) : null, toastBorderRadius: 10.0, - toastDuration: 3 + toastDuration: infinityToast ? null : 3, ); } diff --git a/core/lib/presentation/views/toast/tmail_toast.dart b/core/lib/presentation/views/toast/tmail_toast.dart index a832227c6..954aeba66 100644 --- a/core/lib/presentation/views/toast/tmail_toast.dart +++ b/core/lib/presentation/views/toast/tmail_toast.dart @@ -50,9 +50,9 @@ class TMailToast { }) { assert(text != null); ToastView.dismiss(); - ToastView.createView(text, context, toastDuration, toastPosition, + ToastView.createView(text, context, toastPosition, backgroundColor, textStyle, toastBorderRadius, border, trailing, - leading, width); + leading, width, toastDuration: toastDuration,); } } @@ -69,21 +69,24 @@ class ToastView { // ignore: avoid_void_async static void createView( - String text, - BuildContext context, - int? toastDuration, - ToastPosition? toastPosition, - Color backgroundColor, - TextStyle textStyle, - double toastBorderRadius, - Border? border, - Widget? trailing, - Widget? leading, - double? width) async { + String text, + BuildContext context, + ToastPosition? toastPosition, + Color backgroundColor, + TextStyle textStyle, + double toastBorderRadius, + Border? border, + Widget? trailing, + Widget? leading, + double? width, + {int? toastDuration = 2} + ) async { overlayState = Overlay.of(context, rootOverlay: false); - final Widget toastChild = ToastCard( - Container( + final Widget child = Center( + child: Material( + color: Colors.transparent, + child: Container( width: width, decoration: BoxDecoration( color: backgroundColor, @@ -92,27 +95,36 @@ class ToastView { ), margin: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - child: trailing == null && leading == null - ? Text(text, softWrap: true, style: textStyle) - : Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - if (leading != null) leading, - Expanded(child: Text(text, style: textStyle)), - if (trailing != null) trailing - ], - ), + child: trailing == null && leading == null ? + Text(text, softWrap: true, style: textStyle) : + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (leading != null) leading, + Expanded(child: Text(text, style: textStyle)), + if (trailing != null) trailing + ], + ), ), - Duration(seconds: toastDuration ?? 2), fadeDuration: 500); + ), + ); + + final Widget toastChild = ToastCard( + child, + Duration(seconds: toastDuration ?? 2), + fadeDuration: 500, + ); _overlayEntry = OverlayEntry( builder: (BuildContext context) => - _showWidgetBasedOnPosition(toastChild, toastPosition)); + _showWidgetBasedOnPosition(toastDuration != null ? toastChild : child, toastPosition)); _isVisible = true; overlayState!.insert(_overlayEntry!); - await Future.delayed(Duration(seconds: toastDuration ?? 2)); - await dismiss(); + if (toastDuration != null) { + await Future.delayed(Duration(seconds: toastDuration)); + await dismiss(); + } } static Positioned _showWidgetBasedOnPosition( @@ -209,11 +221,6 @@ class ToastStateFulState extends State @override Widget build(BuildContext context) => FadeTransition( opacity: _fadeAnimation as Animation, - child: Center( - child: Material( - color: Colors.transparent, - child: widget.child, - ), - ), + child: widget.child, ); } diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index 04c22343c..8825cf611 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -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>(Right(UIState.idle)); - final connectivityResult = Rxn(); FpsCallback? fpsCallback; void consumeState(Stream> 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> newStateStream) async { final state = await newStateStream; state.fold( diff --git a/lib/features/base/mixin/network_connection_mixin.dart b/lib/features/base/mixin/network_connection_mixin.dart deleted file mode 100644 index fb8528d61..000000000 --- a/lib/features/base/mixin/network_connection_mixin.dart +++ /dev/null @@ -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(); - - 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)), - ) - ) - ); - } -} \ No newline at end of file diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index d91398aeb..40b6d82f0 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -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 with NetworkConnectionMixin { +class EmailView extends GetWidget { static const double maxSizeFullDisplayEmailAddressArrowDownButton = 30.0; diff --git a/lib/features/login/presentation/base_login_view.dart b/lib/features/login/presentation/base_login_view.dart index ba7a3ea90..159d23ab3 100644 --- a/lib/features/login/presentation/base_login_view.dart +++ b/lib/features/login/presentation/base_login_view.dart @@ -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 with NetworkConnectionMixin { +abstract class BaseLoginView extends GetWidget { BaseLoginView({Key? key}) : super(key: key); final loginController = Get.find(); @@ -72,14 +71,14 @@ abstract class BaseLoginView extends GetWidget 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((Set states) => Colors.white), backgroundColor: MaterialStateProperty.resolveWith( (Set 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) diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 4304f0d0e..36c54f926 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -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(); final TextEditingController urlInputController = TextEditingController(); - - late StreamSubscription _connectivityStreamSubscription; + final NetworkConnectionController networkConnectionController = Get.find(); 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(); } diff --git a/lib/features/login/presentation/login_view.dart b/lib/features/login/presentation/login_view.dart index 374a535db..97962fbbe 100644 --- a/lib/features/login/presentation/login_view.dart +++ b/lib/features/login/presentation/login_view.dart @@ -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((Set states) => Colors.white), backgroundColor: MaterialStateProperty.resolveWith( (Set 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) diff --git a/lib/features/login/presentation/login_view_web.dart b/lib/features/login/presentation/login_view_web.dart index 18e56cf14..b456cfc55 100644 --- a/lib/features/login/presentation/login_view_web.dart +++ b/lib/features/login/presentation/login_view_web.dart @@ -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((Set states) => Colors.white), backgroundColor: MaterialStateProperty.resolveWith( (Set 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) diff --git a/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart b/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart index 015f30b8e..fed9861f3 100644 --- a/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart +++ b/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart @@ -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 - with NetworkConnectionMixin, UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin, + with UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin, AppLoaderMixin { BaseMailboxDashBoardView({Key? key}) : super(key: key); diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 9e64c32a8..be1f21ec6 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -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(); final ImagePaths _imagePaths = Get.find(); final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find(); - final Connectivity _connectivity = Get.find(); final ResponsiveUtils _responsiveUtils = Get.find(); final EmailReceiveManager _emailReceiveManager = Get.find(); final SearchController searchController = Get.find(); final DownloadController downloadController = Get.find(); final AppGridDashboardController _appGridDashboardController = Get.find(); + final NetworkConnectionController networkConnectionController = Get.find(); 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(); super.onClose(); diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart index 16513461c..06946d3ce 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart @@ -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)); - }), ]), ); } diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 0a0b3b558..f788dd47f 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -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(), ]), ), diff --git a/lib/features/network_status_handle/presentation/network_connnection_controller.dart b/lib/features/network_status_handle/presentation/network_connnection_controller.dart new file mode 100644 index 000000000..e1bff2fb7 --- /dev/null +++ b/lib/features/network_status_handle/presentation/network_connnection_controller.dart @@ -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(); + final _imagePaths = Get.find(); + final Connectivity _connectivity; + final AppToast _appToast = Get.find(); + final ResponsiveUtils _responsiveUtils = Get.find(); + + bool _isEnableShowToastDisConnection = true; + + late StreamSubscription 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, + ); + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index f74825770..d18d7eca0 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-10-12T16:44:35.025767", + "@@last_modified": "2022-10-18T14:05:06.644786", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -664,6 +664,12 @@ "placeholders_order": [], "placeholders": {} }, + "skip": "Skip", + "@skip": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, "hint_input_create_new_mailbox": "Enter name of mailbox", "@hint_input_create_new_mailbox": { "type": "text", diff --git a/lib/main/bindings/main_bindings.dart b/lib/main/bindings/main_bindings.dart index 523a5bedd..2035dc015 100644 --- a/lib/main/bindings/main_bindings.dart +++ b/lib/main/bindings/main_bindings.dart @@ -4,6 +4,7 @@ import 'package:tmail_ui_user/main/bindings/credential/credential_bindings.dart' import 'package:tmail_ui_user/main/bindings/local/local_bindings.dart'; import 'package:tmail_ui_user/main/bindings/network/network_bindings.dart'; import 'package:tmail_ui_user/main/bindings/network/network_isolate_binding.dart'; +import 'package:tmail_ui_user/main/bindings/network_connection/network_connection_bindings.dart'; import 'package:tmail_ui_user/main/bindings/session/session_bindings.dart'; class MainBindings extends Bindings { @@ -14,6 +15,7 @@ class MainBindings extends Bindings { NetworkBindings().dependencies(); NetworkIsolateBindings().dependencies(); CredentialBindings().dependencies(); + NetWorkConnectionBindings().dependencies(); SessionBindings().dependencies(); } } \ No newline at end of file diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index 85b1b35e8..859aa5a54 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -25,9 +25,9 @@ class NetworkBindings extends Bindings { @override void dependencies() { + _bindingConnection(); _bindingDio(); _bindingApi(); - _bindingConnection(); _bindingException(); } diff --git a/lib/main/bindings/network_connection/network_connection_bindings.dart b/lib/main/bindings/network_connection/network_connection_bindings.dart new file mode 100644 index 000000000..14db154a9 --- /dev/null +++ b/lib/main/bindings/network_connection/network_connection_bindings.dart @@ -0,0 +1,32 @@ +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/network_status_handle/presentation/network_connnection_controller.dart'; + +class NetWorkConnectionBindings extends BaseBindings { + + @override + void bindingsController() { + Get.put(NetworkConnectionController(Get.find())); + } + + @override + void bindingsDataSource() { + } + + @override + void bindingsDataSourceImpl() { + } + + @override + void bindingsInteractor() { + } + + @override + void bindingsRepository() { + } + + @override + void bindingsRepositoryImpl() { + } +} \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 7993e1daa..f6086fc67 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -687,6 +687,13 @@ class AppLocalizations { ); } + String get skip { + return Intl.message( + 'Skip', + name: 'skip' + ); + } + String get hint_input_create_new_mailbox { return Intl.message( 'Enter name of mailbox',