diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index 20f19b347..43005ef6a 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -72,6 +72,11 @@ abstract class BaseController extends GetxController } void onError(dynamic error) { + if (error is NoNetworkError) { + logError('BaseController::onError(): $error'); + return; + } + final _appToast = Get.find(); final _imagePaths = Get.find(); final _responsiveUtils = Get.find(); diff --git a/lib/features/network_status_handle/presentation/network_connnection_controller.dart b/lib/features/network_status_handle/presentation/network_connnection_controller.dart index e6e577c18..ebcbc3473 100644 --- a/lib/features/network_status_handle/presentation/network_connnection_controller.dart +++ b/lib/features/network_status_handle/presentation/network_connnection_controller.dart @@ -22,17 +22,18 @@ class NetworkConnectionController extends BaseController { NetworkConnectionController(this._connectivity); + @override + void onInit() { + super.onInit(); + log('NetworkConnectionController::onInit():'); + _listenNetworkConnectionChanged(); + } + @override void onReady() { - subscription = _connectivity.onConnectivityChanged.listen((ConnectivityResult result) { - connectivityResult.value = result; - if (_isEnableShowToastDisconnection && result == ConnectivityResult.none) { - _showToastLostConnection(); - } else { - ToastView.dismiss(); - } - }) ; - super.onReady(); + super.onReady(); + log('NetworkConnectionController::onReady():'); + _getCurrentNetworkConnectionState(); } @override @@ -44,7 +45,36 @@ class NetworkConnectionController extends BaseController { @override void onDone() {} - void setNetworkConnectivityState(ConnectivityResult newConnectivityResult) { + void _getCurrentNetworkConnectionState() async { + final currentConnectionResult = await _connectivity.checkConnectivity(); + log('NetworkConnectionController::onReady():_getCurrentNetworkConnectionState: $currentConnectionResult'); + _setNetworkConnectivityState(currentConnectionResult); + if (_isEnableShowToastDisconnection && !isNetworkConnectionAvailable()) { + _showToastLostConnection(); + } else { + ToastView.dismiss(); + } + } + + void _listenNetworkConnectionChanged() { + subscription = _connectivity.onConnectivityChanged.listen( + (result) { + log('NetworkConnectionController::_listenNetworkConnectionChanged():onConnectivityChanged: $result'); + _setNetworkConnectivityState(result); + if (_isEnableShowToastDisconnection && !isNetworkConnectionAvailable()) { + _showToastLostConnection(); + } else { + ToastView.dismiss(); + } + }, + onError: (error, stackTrace) { + logError('NetworkConnectionController::_listenNetworkConnectionChanged():error: $error'); + logError('NetworkConnectionController::_listenNetworkConnectionChanged():stackTrace: $stackTrace'); + } + ); + } + + void _setNetworkConnectivityState(ConnectivityResult newConnectivityResult) { connectivityResult.value = newConnectivityResult; } diff --git a/lib/main/exceptions/remote_exception.dart b/lib/main/exceptions/remote_exception.dart index 35f305d1e..fa7452c93 100644 --- a/lib/main/exceptions/remote_exception.dart +++ b/lib/main/exceptions/remote_exception.dart @@ -5,6 +5,7 @@ import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.da abstract class RemoteException with EquatableMixin implements Exception { static const connectError = 'Connect error'; + static const noNetworkError = 'No network error'; final String? message; final int? code; @@ -40,4 +41,11 @@ class MethodLevelErrors extends RemoteException { class CannotCalculateChangesMethodResponseException extends MethodLevelErrors { CannotCalculateChangesMethodResponseException({String? message}) : super(ErrorMethodResponse.cannotCalculateChanges, message: message); +} + +class NoNetworkError extends RemoteException { + const NoNetworkError() : super(message: RemoteException.noNetworkError); + + @override + List get props => [message]; } \ No newline at end of file diff --git a/lib/main/exceptions/remote_exception_thrower.dart b/lib/main/exceptions/remote_exception_thrower.dart index db8863b83..9dc1702cf 100644 --- a/lib/main/exceptions/remote_exception_thrower.dart +++ b/lib/main/exceptions/remote_exception_thrower.dart @@ -1,14 +1,26 @@ +import 'package:core/utils/app_logger.dart'; import 'package:dio/dio.dart'; import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart'; import 'package:jmap_dart_client/jmap/core/error/method/exception/error_method_response_exception.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; +import 'package:tmail_ui_user/features/network_status_handle/presentation/network_connnection_controller.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class RemoteExceptionThrower extends ExceptionThrower { @override void throwException(dynamic error) { + logError('RemoteExceptionThrower::throwException():error: $error'); + final networkConnectionController = getBinding(); + if (networkConnectionController != null) { + log('RemoteExceptionThrower::throwException(): CONNECTION: ${networkConnectionController.connectivityResult.value}'); + if (!networkConnectionController.isNetworkConnectionAvailable()) { + throw const NoNetworkError(); + } + } + if (error is DioError) { switch (error.type) { case DioErrorType.connectTimeout: