diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart index a08e78b97..c8c8cd13c 100644 --- a/lib/features/base/reloadable/reloadable_controller.dart +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -1,7 +1,7 @@ -import 'package:core/data/network/config/dynamic_url_interceptors.dart'; import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:core/utils/app_logger.dart'; +import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; @@ -10,6 +10,11 @@ import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:model/extensions/session_extension.dart'; import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; +import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; +import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_authenticated_account_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart'; @@ -18,21 +23,15 @@ import 'package:tmail_ui_user/features/login/domain/usecases/update_authenticati 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/manage_account/presentation/vacation/vacation_interactors_bindings.dart'; -import 'package:tmail_ui_user/features/session/domain/extensions/session_extensions.dart'; -import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart'; -import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; +import 'package:tmail_ui_user/main/exceptions/remote_exception.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; abstract class ReloadableController extends BaseController { - final DynamicUrlInterceptors dynamicUrlInterceptors = Get.find(); final GetSessionInteractor _getSessionInteractor = Get.find(); - final GetAuthenticatedAccountInteractor _getAuthenticatedAccountInteractor; - final UpdateAuthenticationAccountInteractor _updateAuthenticationAccountInteractor; - - ReloadableController( - this._getAuthenticatedAccountInteractor, - this._updateAuthenticationAccountInteractor - ); + final GetAuthenticatedAccountInteractor _getAuthenticatedAccountInteractor = Get.find(); + final UpdateAuthenticationAccountInteractor _updateAuthenticationAccountInteractor = Get.find(); @override void handleFailureViewState(Failure failure) { @@ -40,7 +39,10 @@ abstract class ReloadableController extends BaseController { if (failure is GetCredentialFailure) { goToLogin(arguments: LoginArguments(LoginFormType.credentialForm)); } else if (failure is GetSessionFailure) { - _handleGetSessionFailure(); + _handleGetSessionFailure( + sessionCacheException: failure.exception, + sessionRemoteException: failure.remoteException + ); } else if (failure is GetStoredTokenOidcFailure) { goToLogin(arguments: LoginArguments(LoginFormType.ssoForm)); } else if (failure is GetAuthenticatedAccountFailure) { @@ -86,29 +88,73 @@ abstract class ReloadableController extends BaseController { void _handleGetCredentialSuccess(GetCredentialViewState credentialViewState) { _setUpInterceptors(credentialViewState); - _getSessionAction(); + getSessionAction(); } - void _getSessionAction() { + void getSessionAction() { consumeState(_getSessionInteractor.execute()); } - void _handleGetSessionFailure() { - performInvokeLogoutAction(); + void _handleGetSessionFailure({ + dynamic sessionRemoteException, + dynamic sessionCacheException + }) { + showToastErrorMessageSessionFailure( + sessionRemoteException: sessionRemoteException, + sessionCacheException: sessionCacheException, + ); + clearDataAndGoToLoginPage(); + } + + void showToastErrorMessageSessionFailure({ + dynamic sessionRemoteException, + dynamic sessionCacheException + }) { + if (currentContext == null || currentOverlayContext == null) { + return; + } + appToast.showToastErrorMessage( + currentOverlayContext!, + getErrorMessageFromSessionFailure( + context: currentContext!, + sessionRemoteException: sessionRemoteException, + sessionCacheException: sessionCacheException, + ) + ); + } + + String getErrorMessageFromSessionFailure({ + required BuildContext context, + dynamic sessionRemoteException, + dynamic sessionCacheException, + }) { + if (sessionRemoteException is ConnectionTimeout || + sessionRemoteException is BadGateway || + sessionRemoteException is SocketError) { + return AppLocalizations.of(context).wrongUrlMessage; + } else if (sessionRemoteException is BadCredentialsException) { + return AppLocalizations.of(context).badCredentials; + } else if (sessionRemoteException is ConnectionError) { + return AppLocalizations.of(context).connectionError; + } else if (sessionRemoteException is UnknownError && sessionRemoteException.message != null) { + return '[${sessionRemoteException.code ?? ''}] ${sessionRemoteException.message}'; + } else if (sessionCacheException is NotFoundSessionException) { + return AppLocalizations.of(context).notFoundSession; + } else { + return AppLocalizations.of(context).unknownError; + } } void _handleGetSessionSuccess(GetSessionSuccess success) { final session = success.session; final personalAccount = session.personalAccount; final apiUrl = session.getQualifiedApiUrl(baseUrl: dynamicUrlInterceptors.jmapUrl); - log('ReloadableController::_handleGetSessionSuccess():apiUrl: $apiUrl'); if (apiUrl.isNotEmpty) { dynamicUrlInterceptors.changeBaseUrl(apiUrl); updateAuthenticationAccount(session, personalAccount.accountId, session.username); handleReloaded(session); } else { - logError('ReloadableController::_handleGetSessionSuccess(): apiUrl is NULL'); - performInvokeLogoutAction(); + clearDataAndGoToLoginPage(); } } @@ -116,7 +162,7 @@ abstract class ReloadableController extends BaseController { void _handleGetStoredTokenOIDCSuccess(GetStoredTokenOidcSuccess tokenOidcSuccess) { _setUpInterceptorsOidc(tokenOidcSuccess); - _getSessionAction(); + getSessionAction(); } void _setUpInterceptorsOidc(GetStoredTokenOidcSuccess tokenOidcSuccess) { @@ -141,7 +187,6 @@ abstract class ReloadableController extends BaseController { void updateAuthenticationAccount(Session session, AccountId accountId, UserName userName) { final apiUrl = session.getQualifiedApiUrl(baseUrl: dynamicUrlInterceptors.jmapUrl); - log('ReloadableController::updateAuthenticationAccount():apiUrl: $apiUrl'); if (apiUrl.isNotEmpty) { consumeState(_updateAuthenticationAccountInteractor.execute(accountId, apiUrl, userName)); } diff --git a/lib/features/caching/clients/session_hive_cache_client.dart b/lib/features/caching/clients/session_hive_cache_client.dart index 9071d5cda..1798d9aad 100644 --- a/lib/features/caching/clients/session_hive_cache_client.dart +++ b/lib/features/caching/clients/session_hive_cache_client.dart @@ -1,7 +1,7 @@ import 'package:tmail_ui_user/features/caching/config/hive_cache_client.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; -import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; +import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart'; class SessionHiveCacheClient extends HiveCacheClient { diff --git a/lib/features/session/data/datasource/session_datasource.dart b/lib/features/home/data/datasource/session_datasource.dart similarity index 100% rename from lib/features/session/data/datasource/session_datasource.dart rename to lib/features/home/data/datasource/session_datasource.dart diff --git a/lib/features/session/data/datasource_impl/hive_session_datasource_impl.dart b/lib/features/home/data/datasource_impl/hive_session_datasource_impl.dart similarity index 72% rename from lib/features/session/data/datasource_impl/hive_session_datasource_impl.dart rename to lib/features/home/data/datasource_impl/hive_session_datasource_impl.dart index 1d3037819..fb97e5d76 100644 --- a/lib/features/session/data/datasource_impl/hive_session_datasource_impl.dart +++ b/lib/features/home/data/datasource_impl/hive_session_datasource_impl.dart @@ -1,10 +1,10 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:tmail_ui_user/features/caching/clients/session_hive_cache_client.dart'; -import 'package:tmail_ui_user/features/session/data/datasource/session_datasource.dart'; -import 'package:tmail_ui_user/features/session/data/exceptions/session_exceptions.dart'; -import 'package:tmail_ui_user/features/session/data/extensions/session_hive_obj_extension.dart'; -import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; -import 'package:tmail_ui_user/features/session/domain/extensions/session_extensions.dart'; +import 'package:tmail_ui_user/features/home/data/datasource/session_datasource.dart'; +import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; +import 'package:tmail_ui_user/features/home/data/extensions/session_hive_obj_extension.dart'; +import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; class HiveSessionDataSourceImpl extends SessionDataSource { diff --git a/lib/features/session/data/datasource_impl/session_datasource_impl.dart b/lib/features/home/data/datasource_impl/session_datasource_impl.dart similarity index 80% rename from lib/features/session/data/datasource_impl/session_datasource_impl.dart rename to lib/features/home/data/datasource_impl/session_datasource_impl.dart index 41777496f..c7fefa71d 100644 --- a/lib/features/session/data/datasource_impl/session_datasource_impl.dart +++ b/lib/features/home/data/datasource_impl/session_datasource_impl.dart @@ -1,6 +1,6 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:tmail_ui_user/features/session/data/datasource/session_datasource.dart'; -import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; +import 'package:tmail_ui_user/features/home/data/datasource/session_datasource.dart'; +import 'package:tmail_ui_user/features/home/data/network/session_api.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; class SessionDataSourceImpl extends SessionDataSource { diff --git a/lib/features/session/data/exceptions/session_exceptions.dart b/lib/features/home/data/exceptions/session_exceptions.dart similarity index 100% rename from lib/features/session/data/exceptions/session_exceptions.dart rename to lib/features/home/data/exceptions/session_exceptions.dart diff --git a/lib/features/session/data/extensions/session_hive_obj_extension.dart b/lib/features/home/data/extensions/session_hive_obj_extension.dart similarity index 71% rename from lib/features/session/data/extensions/session_hive_obj_extension.dart rename to lib/features/home/data/extensions/session_hive_obj_extension.dart index 2a8c0da13..a2f333701 100644 --- a/lib/features/session/data/extensions/session_hive_obj_extension.dart +++ b/lib/features/home/data/extensions/session_hive_obj_extension.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; +import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart'; extension SessionHiveObjExtension on SessionHiveObj { Session toSession() => Session.fromJson(jsonDecode(value)); diff --git a/lib/features/session/data/model/session_hive_obj.dart b/lib/features/home/data/model/session_hive_obj.dart similarity index 88% rename from lib/features/session/data/model/session_hive_obj.dart rename to lib/features/home/data/model/session_hive_obj.dart index 4d207e136..3d0e8b51f 100644 --- a/lib/features/session/data/model/session_hive_obj.dart +++ b/lib/features/home/data/model/session_hive_obj.dart @@ -4,7 +4,7 @@ import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; part 'session_hive_obj.g.dart'; -@HiveType(typeId: CachingConstants.typeIdSessionHiveObj) +@HiveType(typeId: CachingConstants.SESSION_HIVE_CACHE_ID) class SessionHiveObj extends HiveObject with EquatableMixin { static const String keyValue = 'session'; diff --git a/lib/features/session/data/network/session_api.dart b/lib/features/home/data/network/session_api.dart similarity index 100% rename from lib/features/session/data/network/session_api.dart rename to lib/features/home/data/network/session_api.dart diff --git a/lib/features/session/data/repository/session_repository_impl.dart b/lib/features/home/data/repository/session_repository_impl.dart similarity index 79% rename from lib/features/session/data/repository/session_repository_impl.dart rename to lib/features/home/data/repository/session_repository_impl.dart index 3613f4cd3..4e7111881 100644 --- a/lib/features/session/data/repository/session_repository_impl.dart +++ b/lib/features/home/data/repository/session_repository_impl.dart @@ -1,7 +1,7 @@ import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:tmail_ui_user/features/session/data/datasource/session_datasource.dart'; -import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; +import 'package:tmail_ui_user/features/home/data/datasource/session_datasource.dart'; +import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart'; class SessionRepositoryImpl extends SessionRepository { diff --git a/lib/features/session/domain/converter/capability_properties_converter.dart b/lib/features/home/domain/converter/capability_properties_converter.dart similarity index 100% rename from lib/features/session/domain/converter/capability_properties_converter.dart rename to lib/features/home/domain/converter/capability_properties_converter.dart diff --git a/lib/features/session/domain/converter/session_account_converter.dart b/lib/features/home/domain/converter/session_account_converter.dart similarity index 81% rename from lib/features/session/domain/converter/session_account_converter.dart rename to lib/features/home/domain/converter/session_account_converter.dart index 9dbed1d94..b4498d85e 100644 --- a/lib/features/session/domain/converter/session_account_converter.dart +++ b/lib/features/home/domain/converter/session_account_converter.dart @@ -1,7 +1,7 @@ import 'package:jmap_dart_client/http/converter/account_id_converter.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/account/account.dart'; -import 'package:tmail_ui_user/features/session/domain/extensions/session_account_extension.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_account_extension.dart'; class SessionAccountConverter { diff --git a/lib/features/session/domain/converter/session_capabilities_converter.dart b/lib/features/home/domain/converter/session_capabilities_converter.dart similarity index 84% rename from lib/features/session/domain/converter/session_capabilities_converter.dart rename to lib/features/home/domain/converter/session_capabilities_converter.dart index e458b0204..4f4858797 100644 --- a/lib/features/session/domain/converter/session_capabilities_converter.dart +++ b/lib/features/home/domain/converter/session_capabilities_converter.dart @@ -1,7 +1,7 @@ import 'package:jmap_dart_client/http/converter/capability_identifier_converter.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart'; -import 'package:tmail_ui_user/features/session/domain/converter/capability_properties_converter.dart'; +import 'package:tmail_ui_user/features/home/domain/converter/capability_properties_converter.dart'; class SessionCapabilitiesConverter { diff --git a/lib/features/session/domain/converter/session_primary_account_converter.dart b/lib/features/home/domain/converter/session_primary_account_converter.dart similarity index 100% rename from lib/features/session/domain/converter/session_primary_account_converter.dart rename to lib/features/home/domain/converter/session_primary_account_converter.dart diff --git a/lib/features/session/domain/extensions/session_account_extension.dart b/lib/features/home/domain/extensions/session_account_extension.dart similarity index 87% rename from lib/features/session/domain/extensions/session_account_extension.dart rename to lib/features/home/domain/extensions/session_account_extension.dart index b4eba81fc..1e5ee35eb 100644 --- a/lib/features/session/domain/extensions/session_account_extension.dart +++ b/lib/features/home/domain/extensions/session_account_extension.dart @@ -1,7 +1,7 @@ import 'package:jmap_dart_client/http/converter/account_name_converter.dart'; import 'package:jmap_dart_client/jmap/core/account/account.dart'; -import 'package:tmail_ui_user/features/session/domain/converter/session_capabilities_converter.dart'; +import 'package:tmail_ui_user/features/home/domain/converter/session_capabilities_converter.dart'; extension SessionAccountExtension on Account { diff --git a/lib/features/session/domain/extensions/session_extensions.dart b/lib/features/home/domain/extensions/session_extensions.dart similarity index 80% rename from lib/features/session/domain/extensions/session_extensions.dart rename to lib/features/home/domain/extensions/session_extensions.dart index c1363e75b..6abcca89f 100644 --- a/lib/features/session/domain/extensions/session_extensions.dart +++ b/lib/features/home/domain/extensions/session_extensions.dart @@ -5,10 +5,10 @@ import 'package:core/presentation/extensions/uri_extension.dart'; import 'package:jmap_dart_client/http/converter/state_converter.dart'; import 'package:jmap_dart_client/http/converter/user_name_converter.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; -import 'package:tmail_ui_user/features/session/domain/converter/session_account_converter.dart'; -import 'package:tmail_ui_user/features/session/domain/converter/session_capabilities_converter.dart'; -import 'package:tmail_ui_user/features/session/domain/converter/session_primary_account_converter.dart'; +import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart'; +import 'package:tmail_ui_user/features/home/domain/converter/session_account_converter.dart'; +import 'package:tmail_ui_user/features/home/domain/converter/session_capabilities_converter.dart'; +import 'package:tmail_ui_user/features/home/domain/converter/session_primary_account_converter.dart'; extension SessionExtensions on Session { diff --git a/lib/features/session/domain/repository/session_repository.dart b/lib/features/home/domain/repository/session_repository.dart similarity index 100% rename from lib/features/session/domain/repository/session_repository.dart rename to lib/features/home/domain/repository/session_repository.dart diff --git a/lib/features/session/domain/state/get_session_state.dart b/lib/features/home/domain/state/get_session_state.dart similarity index 68% rename from lib/features/session/domain/state/get_session_state.dart rename to lib/features/home/domain/state/get_session_state.dart index 180552ed9..569344b36 100644 --- a/lib/features/session/domain/state/get_session_state.dart +++ b/lib/features/home/domain/state/get_session_state.dart @@ -2,7 +2,7 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -class GetSessionLoading extends UIState {} +class GetSessionLoading extends LoadingState {} class GetSessionSuccess extends UIState { final Session session; @@ -14,6 +14,7 @@ class GetSessionSuccess extends UIState { } class GetSessionFailure extends FeatureFailure { + final dynamic remoteException; - GetSessionFailure(dynamic exception) : super(exception: exception); + GetSessionFailure({dynamic exception, this.remoteException}) : super(exception: exception); } \ No newline at end of file diff --git a/lib/features/session/domain/state/store_session_state.dart b/lib/features/home/domain/state/store_session_state.dart similarity index 84% rename from lib/features/session/domain/state/store_session_state.dart rename to lib/features/home/domain/state/store_session_state.dart index bb1a732a1..61d2f3df7 100644 --- a/lib/features/session/domain/state/store_session_state.dart +++ b/lib/features/home/domain/state/store_session_state.dart @@ -1,7 +1,7 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; -class StoreSessionLoading extends UIState {} +class StoreSessionLoading extends LoadingState {} class StoreSessionSuccess extends UIState {} diff --git a/lib/features/home/domain/usecases/get_session_interactor.dart b/lib/features/home/domain/usecases/get_session_interactor.dart new file mode 100644 index 000000000..c450da9d2 --- /dev/null +++ b/lib/features/home/domain/usecases/get_session_interactor.dart @@ -0,0 +1,41 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/platform_info.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart'; +import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; + +class GetSessionInteractor { + final SessionRepository sessionRepository; + + GetSessionInteractor(this.sessionRepository); + + Stream> execute() async* { + try { + yield Right(GetSessionLoading()); + final session = await sessionRepository.getSession(); + yield Right(GetSessionSuccess(session)); + } catch (e) { + if (PlatformInfo.isMobile) { + yield* _getStoredSessionFromCache(remoteException: e); + } else { + yield Left(GetSessionFailure(exception: e)); + } + } + } + + Stream> _getStoredSessionFromCache({dynamic remoteException}) async* { + try { + log('GetSessionInteractor::_getStoredSessionFromCache:'); + yield Right(GetSessionLoading()); + final session = await sessionRepository.getStoredSession(); + yield Right(GetSessionSuccess(session)); + } catch (e) { + yield Left(GetSessionFailure( + exception: e, + remoteException: remoteException + )); + } + } +} \ No newline at end of file diff --git a/lib/features/session/domain/usecases/store_session_interactor.dart b/lib/features/home/domain/usecases/store_session_interactor.dart similarity index 79% rename from lib/features/session/domain/usecases/store_session_interactor.dart rename to lib/features/home/domain/usecases/store_session_interactor.dart index e0bd244f3..1b69fc317 100644 --- a/lib/features/session/domain/usecases/store_session_interactor.dart +++ b/lib/features/home/domain/usecases/store_session_interactor.dart @@ -2,8 +2,8 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; -import 'package:tmail_ui_user/features/session/domain/state/store_session_state.dart'; +import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart'; +import 'package:tmail_ui_user/features/home/domain/state/store_session_state.dart'; class StoreSessionInteractor { final SessionRepository sessionRepository; diff --git a/lib/features/home/presentation/home_bindings.dart b/lib/features/home/presentation/home_bindings.dart index 4cd550ab6..2e75157d2 100644 --- a/lib/features/home/presentation/home_bindings.dart +++ b/lib/features/home/presentation/home_bindings.dart @@ -1,4 +1,3 @@ -import 'package:core/core.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/cleanup/data/datasource/cleanup_datasource.dart'; @@ -15,7 +14,6 @@ import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_se import 'package:tmail_ui_user/features/home/presentation/home_controller.dart'; import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; @@ -25,13 +23,11 @@ class HomeBindings extends BaseBindings { @override void bindingsController() { Get.lazyPut(() => HomeController( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), )); } diff --git a/lib/features/home/presentation/home_controller.dart b/lib/features/home/presentation/home_controller.dart index 814d3fd49..c2b351bc0 100644 --- a/lib/features/home/presentation/home_controller.dart +++ b/lib/features/home/presentation/home_controller.dart @@ -1,17 +1,14 @@ -import 'package:core/data/network/config/dynamic_url_interceptors.dart'; -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/platform_info.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/account/personal_account.dart'; import 'package:model/email/email_content.dart'; import 'package:model/email/email_content_type.dart'; -import 'package:model/oidc/token_oidc.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; -import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; @@ -22,19 +19,13 @@ import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_email_cac import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_login_url_cache_interactor.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_login_username_interactor.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_search_cache_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/state/get_authenticated_account_state.dart'; -import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart'; -import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; -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/main/routes/app_routes.dart'; +import 'package:tmail_ui_user/main/routes/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; +import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; -class HomeController extends BaseController { - final GetAuthenticatedAccountInteractor _getAuthenticatedAccountInteractor; - final DynamicUrlInterceptors _dynamicUrlInterceptors; +class HomeController extends ReloadableController { final CleanupEmailCacheInteractor _cleanupEmailCacheInteractor; final EmailReceiveManager _emailReceiveManager; final CleanupRecentSearchCacheInteractor _cleanupRecentSearchCacheInteractor; @@ -42,8 +33,6 @@ class HomeController extends BaseController { final CleanupRecentLoginUsernameCacheInteractor _cleanupRecentLoginUsernameCacheInteractor; HomeController( - this._getAuthenticatedAccountInteractor, - this._dynamicUrlInterceptors, this._cleanupEmailCacheInteractor, this._emailReceiveManager, this._cleanupRecentSearchCacheInteractor, @@ -55,7 +44,7 @@ class HomeController extends BaseController { @override void onInit() { - if (!kIsWeb) { + if (PlatformInfo.isMobile) { _initFlutterDownloader(); _registerReceivingSharingIntent(); } @@ -68,6 +57,17 @@ class HomeController extends BaseController { super.onReady(); } + @override + void handleReloaded(Session session) { + popAndPush( + RouteUtils.generateNavigationRoute( + AppRoutes.dashboard, + NavigationRouter() + ), + arguments: session + ); + } + void _initFlutterDownloader() { FlutterDownloader .initialize(debug: kDebugMode) @@ -84,84 +84,22 @@ class HomeController extends BaseController { _cleanupRecentSearchCacheInteractor.execute(RecentSearchCleanupRule()), _cleanupRecentLoginUrlCacheInteractor.execute(RecentLoginUrlCleanupRule()), _cleanupRecentLoginUsernameCacheInteractor.execute(RecentLoginUsernameCleanupRule()), - ]).then((value) => _getAuthenticatedAccount()); - } - - void _getAuthenticatedAccount() async { - log('HomeController::_getAuthenticatedAccount()'); - consumeState(_getAuthenticatedAccountInteractor.execute()); + ]).then((value) => getAuthenticatedAccountAction()); } void _registerReceivingSharingIntent() { _emailReceiveManager.receivingSharingStream.listen((uri) { - log('HomeController::onReady(): Received Email: ${uri.toString()}'); if (uri != null) { if (GetUtils.isEmail(uri.path)) { - log('HomeController::onReady(): Address: ${uri.path}'); _emailReceiveManager.setPendingEmailAddress(EmailAddress(null, uri.path)); } else if (uri.scheme == "file") { - log('HomeController::onReady(): SharedMediaFilePath: ${uri.path}'); _emailReceiveManager.setPendingFileInfo([SharedMediaFile(uri.path, null, null, SharedMediaType.FILE)]); } else { - log('HomeController::onReady(): EmailContent: ${uri.path}'); _emailReceiveManager.setPendingEmailContent(EmailContent(EmailContentType.textPlain, Uri.decodeComponent(uri.path))); } } }); - _emailReceiveManager.receivingFileSharingStream.listen((listFile) { - log('HomeController::onInit(): SharedMediaFile: ${listFile.toString()}'); - _emailReceiveManager.setPendingFileInfo(listFile); - }); - } - - void _goToLogin({LoginArguments? arguments}) { - popAndPush(AppRoutes.login, arguments: arguments); - } - - @override - void handleFailureViewState(Failure failure) async { - super.handleFailureViewState(failure); - if (failure is GetAuthenticatedAccountFailure || - failure is GetStoredTokenOidcFailure || - failure is GetCredentialFailure) { - _goToLogin(arguments: LoginArguments(LoginFormType.baseUrlForm)); - } - } - - @override - void handleSuccessViewState(Success success) { - super.handleSuccessViewState(success); - if (success is GetStoredTokenOidcSuccess) { - _goToSessionWithTokenOidc(success); - } else if (success is GetCredentialViewState) { - _goToSessionWithBasicAuth(success); - } - } - - void _goToSessionWithTokenOidc(GetStoredTokenOidcSuccess storedTokenOidcSuccess) { - _dynamicUrlInterceptors.setJmapUrl(storedTokenOidcSuccess.baseUrl.toString()); - _dynamicUrlInterceptors.changeBaseUrl(storedTokenOidcSuccess.baseUrl.toString()); - authorizationInterceptors.setTokenAndAuthorityOidc( - newToken: storedTokenOidcSuccess.tokenOidc.toToken(), - newConfig: storedTokenOidcSuccess.oidcConfiguration); - authorizationIsolateInterceptors.setTokenAndAuthorityOidc( - newToken: storedTokenOidcSuccess.tokenOidc.toToken(), - newConfig: storedTokenOidcSuccess.oidcConfiguration); - popAndPush(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl); - } - - void _goToSessionWithBasicAuth(GetCredentialViewState credentialViewState) { - _dynamicUrlInterceptors.setJmapUrl(credentialViewState.baseUrl.origin); - _dynamicUrlInterceptors.changeBaseUrl(credentialViewState.baseUrl.origin); - authorizationInterceptors.setBasicAuthorization( - credentialViewState.userName.value, - credentialViewState.password.value, - ); - authorizationIsolateInterceptors.setBasicAuthorization( - credentialViewState.userName.value, - credentialViewState.password.value, - ); - popAndPush(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl); + _emailReceiveManager.receivingFileSharingStream.listen(_emailReceiveManager.setPendingFileInfo); } } \ No newline at end of file diff --git a/lib/features/login/presentation/base_login_view.dart b/lib/features/login/presentation/base_login_view.dart index 86ea753a7..3b09a425f 100644 --- a/lib/features/login/presentation/base_login_view.dart +++ b/lib/features/login/presentation/base_login_view.dart @@ -1,14 +1,13 @@ import 'package:core/presentation/extensions/color_extension.dart'; -import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; -import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/views/text/type_ahead_form_field_builder.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/widget/recent_item_tile_widget.dart'; +import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_username.dart'; @@ -25,16 +24,13 @@ import 'package:tmail_ui_user/features/login/presentation/widgets/login_text_inp import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; abstract class BaseLoginView extends GetWidget { - BaseLoginView({Key? key}) : super(key: key); - - final responsiveUtils = Get.find(); - final imagePaths = Get.find(); + const BaseLoginView({Key? key}) : super(key: key); Widget buildLoginMessage(BuildContext context, Either viewState) { return Padding( padding: const EdgeInsets.only(top: 11, bottom: 36, left: 58, right: 58), child: SizedBox( - width: responsiveUtils.getWidthLoginTextField(context), + width: controller.responsiveUtils.getWidthLoginTextField(context), child: Text( viewState.fold( (failure) { @@ -50,6 +46,12 @@ abstract class BaseLoginView extends GetWidget { return _getMessageFailure(context, failure.exception); } else if (failure is GetOIDCConfigurationFailure) { return AppLocalizations.of(context).canNotVerifySSOConfiguration; + } else if (failure is GetSessionFailure) { + return controller.getErrorMessageFromSessionFailure( + context: context, + sessionRemoteException: failure.remoteException, + sessionCacheException: failure.exception + ); } else { return AppLocalizations.of(context).unknownError; } @@ -93,7 +95,7 @@ abstract class BaseLoginView extends GetWidget { Widget buildLoginButton(BuildContext context) { return Container( margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24), - width: responsiveUtils.getDeviceWidth(context),height: 48, + width: controller.responsiveUtils.getDeviceWidth(context),height: 48, child: ElevatedButton( key: const Key('loginSubmitForm'), style: ButtonStyle( @@ -144,7 +146,7 @@ abstract class BaseLoginView extends GetWidget { .build(), debounceDuration: const Duration(milliseconds: 300), suggestionsCallback: controller.getAllRecentLoginUsernameAction, - itemBuilder: (context, loginUsername) => RecentItemTileWidget(loginUsername, imagePath: imagePaths), + itemBuilder: (context, loginUsername) => RecentItemTileWidget(loginUsername, imagePath: controller.imagePaths), onSuggestionSelected: (recentUsername) { controller.setUsername(recentUsername.username); controller.passFocusNode.requestFocus(); diff --git a/lib/features/login/presentation/login_bindings.dart b/lib/features/login/presentation/login_bindings.dart index ef34ac5ae..1dae7cd02 100644 --- a/lib/features/login/presentation/login_bindings.dart +++ b/lib/features/login/presentation/login_bindings.dart @@ -1,4 +1,3 @@ -import 'package:core/core.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/caching/clients/recent_login_url_cache_client.dart'; @@ -19,7 +18,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_all_recent_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_all_recent_login_username_on_mobile_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_info_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_is_available_interactor.dart'; @@ -27,7 +25,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_con import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart'; import 'package:tmail_ui_user/features/login/presentation/login_controller.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; @@ -36,10 +33,7 @@ class LoginBindings extends BaseBindings { @override void bindingsController() { Get.create(() => LoginController( - Get.find(), - Get.find(), Get.find(), - Get.find(), Get.find(), Get.find(), Get.find(), @@ -106,7 +100,6 @@ class LoginBindings extends BaseBindings { Get.lazyPut(() => GetAllRecentLoginUsernameOnMobileInteractor( Get.find() )); - Get.lazyPut(() => UpdateAuthenticationAccountInteractor(Get.find())); } @override diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 469cb48d4..8d3b85e4c 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -1,4 +1,3 @@ -import 'package:core/data/network/config/dynamic_url_interceptors.dart'; import 'package:core/presentation/extensions/url_extension.dart'; import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; @@ -16,6 +15,7 @@ import 'package:model/oidc/request/oidc_request.dart'; import 'package:model/oidc/response/oidc_response.dart'; import 'package:model/oidc/token_oidc.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; +import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/login/domain/model/login_constants.dart'; @@ -37,7 +37,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_all_recent_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_all_recent_login_username_on_mobile_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_info_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_is_available_interactor.dart'; @@ -45,7 +44,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_con import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart'; 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/main/routes/app_routes.dart'; @@ -58,7 +56,6 @@ import 'package:universal_html/html.dart' as html; class LoginController extends ReloadableController { final AuthenticationInteractor _authenticationInteractor; - final DynamicUrlInterceptors _dynamicUrlInterceptors; final CheckOIDCIsAvailableInteractor _checkOIDCIsAvailableInteractor; final GetOIDCIsAvailableInteractor _getOIDCIsAvailableInteractor; final GetOIDCConfigurationInteractor _getOIDCConfigurationInteractor; @@ -77,10 +74,7 @@ class LoginController extends ReloadableController { final FocusNode passFocusNode = FocusNode(); LoginController( - GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor, - UpdateAuthenticationAccountInteractor updateAuthenticationAccountInteractor, this._authenticationInteractor, - this._dynamicUrlInterceptors, this._checkOIDCIsAvailableInteractor, this._getOIDCIsAvailableInteractor, this._getOIDCConfigurationInteractor, @@ -92,9 +86,6 @@ class LoginController extends ReloadableController { this._getAllRecentLoginUrlOnMobileInteractor, this._saveLoginUsernameOnMobileInteractor, this._getAllRecentLoginUsernameOnMobileInteractor, - ) : super( - getAuthenticatedAccountInteractor, - updateAuthenticationAccountInteractor ); final loginFormType = LoginFormType.baseUrlForm.obs; @@ -138,21 +129,24 @@ class LoginController extends ReloadableController { @override void handleFailureViewState(Failure failure) { - super.handleFailureViewState(failure); if (failure is GetAuthenticationInfoFailure) { getAuthenticatedAccountAction(); } else if (failure is CheckOIDCIsAvailableFailure || failure is GetStoredOidcConfigurationFailure || - failure is GetOIDCIsAvailableFailure) { + failure is GetOIDCIsAvailableFailure || + failure is GetTokenOIDCFailure) { _showFormLoginWithCredentialAction(); } else if (failure is GetAuthenticatedAccountFailure) { _checkOIDCIsAvailable(); + } else if (failure is GetSessionFailure) { + clearAllData(); + } else { + super.handleFailureViewState(failure); } } @override void handleSuccessViewState(Success success) { - super.handleSuccessViewState(success); if (success is GetAuthenticationInfoSuccess) { _getStoredOidcConfiguration(); } else if (success is GetStoredOidcConfigurationSuccess) { @@ -168,13 +162,18 @@ class LoginController extends ReloadableController { _getTokenOIDCSuccess(success); } else if (success is AuthenticationUserSuccess) { _loginSuccessAction(success); + } else { + super.handleSuccessViewState(success); } } @override void handleExceptionAction({Failure? failure, Exception? exception}) { super.handleExceptionAction(failure: failure, exception: exception); - if (failure is CheckOIDCIsAvailableFailure || failure is GetOIDCIsAvailableFailure) { + if (failure is CheckOIDCIsAvailableFailure || + failure is GetStoredOidcConfigurationFailure || + failure is GetOIDCIsAvailableFailure || + failure is GetTokenOIDCFailure) { _showFormLoginWithCredentialAction(); } else { clearState(); @@ -307,15 +306,15 @@ class LoginController extends ReloadableController { void _getTokenOIDCSuccess(GetTokenOIDCSuccess success) { log('LoginController::_getTokenOIDCSuccess(): ${success.tokenOIDC.toString()}'); - _dynamicUrlInterceptors.setJmapUrl(_getBaseUrl().toString()); - _dynamicUrlInterceptors.changeBaseUrl(_getBaseUrl().toString()); + dynamicUrlInterceptors.setJmapUrl(_getBaseUrl().toString()); + dynamicUrlInterceptors.changeBaseUrl(_getBaseUrl().toString()); authorizationInterceptors.setTokenAndAuthorityOidc( newToken: success.tokenOIDC.toToken(), newConfig: success.configuration); authorizationIsolateInterceptors.setTokenAndAuthorityOidc( newToken: success.tokenOIDC.toToken(), newConfig: success.configuration); - popAndPush(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl); + getSessionAction(); } void _loginAction({Uri? baseUrl, UserName? userName, Password? password}) { @@ -327,11 +326,11 @@ class LoginController extends ReloadableController { } void _loginSuccessAction(AuthenticationUserSuccess success) { - _dynamicUrlInterceptors.setJmapUrl(_getBaseUrl().toString()); - _dynamicUrlInterceptors.changeBaseUrl(_getBaseUrl().toString()); + dynamicUrlInterceptors.setJmapUrl(_getBaseUrl().toString()); + dynamicUrlInterceptors.changeBaseUrl(_getBaseUrl().toString()); authorizationInterceptors.setBasicAuthorization(_userNameText, _passwordText); authorizationIsolateInterceptors.setBasicAuthorization(_userNameText, _passwordText); - popAndPush(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl); + getSessionAction(); } void formatUrl(String url) { diff --git a/lib/features/offline_mode/work_manager/sending_email_worker.dart b/lib/features/offline_mode/work_manager/sending_email_worker.dart index adf10ca4a..323cb00ca 100644 --- a/lib/features/offline_mode/work_manager/sending_email_worker.dart +++ b/lib/features/offline_mode/work_manager/sending_email_worker.dart @@ -13,6 +13,9 @@ import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; +import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; +import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_authenticated_account_state.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart'; @@ -28,9 +31,6 @@ import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_e import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/bindings/sending_queue_interactor_bindings.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/utils/sending_queue_isolate_manager.dart'; -import 'package:tmail_ui_user/features/session/domain/extensions/session_extensions.dart'; -import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart'; -import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; import 'package:tmail_ui_user/main/bindings/main_bindings.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; diff --git a/lib/features/push_notification/presentation/controller/fcm_message_controller.dart b/lib/features/push_notification/presentation/controller/fcm_message_controller.dart index f1db98bcf..0279342e2 100644 --- a/lib/features/push_notification/presentation/controller/fcm_message_controller.dart +++ b/lib/features/push_notification/presentation/controller/fcm_message_controller.dart @@ -17,6 +17,9 @@ import 'package:model/oidc/token_oidc.dart'; import 'package:rxdart/rxdart.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; +import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart'; +import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart'; import 'package:tmail_ui_user/features/home/presentation/home_bindings.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/domain/state/get_authenticated_account_state.dart'; @@ -34,9 +37,6 @@ import 'package:tmail_ui_user/features/push_notification/presentation/listener/e import 'package:tmail_ui_user/features/push_notification/presentation/listener/mailbox_change_listener.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/services/fcm_service.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/utils/fcm_utils.dart'; -import 'package:tmail_ui_user/features/session/domain/extensions/session_extensions.dart'; -import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart'; -import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; import 'package:tmail_ui_user/main/bindings/main_bindings.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; diff --git a/lib/features/session/domain/state/get_stored_session_state.dart b/lib/features/session/domain/state/get_stored_session_state.dart deleted file mode 100644 index 6d3597094..000000000 --- a/lib/features/session/domain/state/get_stored_session_state.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:jmap_dart_client/jmap/core/session/session.dart'; - -class GetStoredSessionLoading extends UIState {} - -class GetStoredSessionSuccess extends UIState { - - final Session session; - - GetStoredSessionSuccess(this.session); - - @override - List get props => [session]; -} - -class GetStoredSessionFailure extends FeatureFailure { - - GetStoredSessionFailure(dynamic exception) : super(exception: exception); -} \ No newline at end of file diff --git a/lib/features/session/domain/usecases/get_session_interactor.dart b/lib/features/session/domain/usecases/get_session_interactor.dart deleted file mode 100644 index c108a28be..000000000 --- a/lib/features/session/domain/usecases/get_session_interactor.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:dartz/dartz.dart'; -import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; -import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart'; - -class GetSessionInteractor { - final SessionRepository sessionRepository; - - GetSessionInteractor(this.sessionRepository); - - Stream> execute() async* { - try { - yield Right(GetSessionLoading()); - final session = await sessionRepository.getSession(); - yield Right(GetSessionSuccess(session)); - } catch (e) { - yield Left(GetSessionFailure(e)); - } - } -} \ No newline at end of file diff --git a/lib/features/session/domain/usecases/get_stored_session_interactor.dart b/lib/features/session/domain/usecases/get_stored_session_interactor.dart deleted file mode 100644 index beacc16dc..000000000 --- a/lib/features/session/domain/usecases/get_stored_session_interactor.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:dartz/dartz.dart'; -import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; -import 'package:tmail_ui_user/features/session/domain/state/get_stored_session_state.dart'; - -class GetStoredSessionInteractor { - final SessionRepository sessionRepository; - - GetStoredSessionInteractor(this.sessionRepository); - - Stream> execute() async* { - try { - yield Right(GetStoredSessionLoading()); - final session = await sessionRepository.getStoredSession(); - yield Right(GetStoredSessionSuccess(session)); - } catch (e) { - yield Left(GetStoredSessionFailure(e)); - } - } -} \ No newline at end of file diff --git a/lib/features/session/presentation/session_controller.dart b/lib/features/session/presentation/session_controller.dart deleted file mode 100644 index a36b01593..000000000 --- a/lib/features/session/presentation/session_controller.dart +++ /dev/null @@ -1,147 +0,0 @@ -import 'package:core/data/network/config/dynamic_url_interceptors.dart'; -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:core/presentation/utils/app_toast.dart'; -import 'package:core/utils/app_logger.dart'; -import 'package:core/utils/platform_info.dart'; -import 'package:get/get.dart'; -import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; -import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart'; -import 'package:tmail_ui_user/features/session/domain/extensions/session_extensions.dart'; -import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart'; -import 'package:tmail_ui_user/features/session/domain/state/get_stored_session_state.dart'; -import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; -import 'package:tmail_ui_user/features/session/domain/usecases/get_stored_session_interactor.dart'; -import 'package:tmail_ui_user/main/exceptions/remote_exception.dart'; -import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; -import 'package:tmail_ui_user/main/routes/app_routes.dart'; -import 'package:tmail_ui_user/main/routes/navigation_router.dart'; -import 'package:tmail_ui_user/main/routes/route_navigation.dart'; -import 'package:tmail_ui_user/main/routes/route_utils.dart'; - -class SessionController extends ReloadableController { - final GetSessionInteractor _getSessionInteractor; - final AppToast _appToast; - final DynamicUrlInterceptors _dynamicUrlInterceptors; - final GetStoredSessionInteractor _getStoredSessionInteractor; - - SessionController( - GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor, - UpdateAuthenticationAccountInteractor updateAuthenticationAccountInteractor, - this._getSessionInteractor, - this._appToast, - this._dynamicUrlInterceptors, - this._getStoredSessionInteractor, - ) : super( - getAuthenticatedAccountInteractor, - updateAuthenticationAccountInteractor - ); - - @override - void onReady() { - super.onReady(); - final arguments = Get.arguments; - if (arguments != null && arguments is String) { - _getSession(); - } else { - reload(); - } - } - - @override - void handleFailureViewState(Failure failure) { - if (failure is GetSessionFailure) { - _handleSessionFailure(failure); - } if (failure is GetStoredSessionFailure) { - _handleSessionFailure(failure); - } else { - super.handleFailureViewState(failure); - } - } - - @override - void handleSuccessViewState(Success success) { - super.handleSuccessViewState(success); - if (success is GetSessionSuccess) { - _goToMailboxDashBoard(success.session); - } else if (success is GetStoredSessionSuccess) { - _goToMailboxDashBoard(success.session); - } - } - - @override - void handleExceptionAction({Failure? failure, Exception? exception}) { - if (PlatformInfo.isMobile && failure is GetSessionFailure) { - _handleGetStoredSession(); - } else { - super.handleExceptionAction(failure: failure, exception: exception); - } - } - - @override - void handleReloaded(Session session) { - popAndPush( - RouteUtils.generateNavigationRoute(AppRoutes.dashboard, NavigationRouter()), - arguments: session); - } - - void _handleGetStoredSession() { - consumeState(_getStoredSessionInteractor.execute()); - } - - void _getSession() async { - consumeState(_getSessionInteractor.execute()); - } - - void _handleSessionFailure(FeatureFailure failure) { - final sessionException = failure.exception; - var errorMessage = ''; - if (_checkUrlError(sessionException) && currentContext != null) { - errorMessage = AppLocalizations.of(currentContext!).wrongUrlMessage; - } else if (sessionException is BadCredentialsException && currentContext != null) { - errorMessage = AppLocalizations.of(currentContext!).badCredentials; - } else if (sessionException is ConnectionError && currentContext != null) { - errorMessage = AppLocalizations.of(currentContext!).connectionError; - } else if (sessionException is UnknownError && currentContext != null) { - if (sessionException.message != null && sessionException.code != null) { - errorMessage = '[${sessionException.code}] ${sessionException.message}'; - } else if (sessionException.message != null) { - errorMessage = sessionException.message!; - } else { - errorMessage = AppLocalizations.of(currentContext!).unknownError; - } - } - - logError('SessionController::_handleSessionFailure():errorMessage: $errorMessage'); - if (errorMessage.isNotEmpty && currentOverlayContext != null) { - _appToast.showToastErrorMessage(currentOverlayContext!, errorMessage); - } - - if (PlatformInfo.isMobile) { - _handleGetStoredSession(); - } else { - performInvokeLogoutAction(); - } - } - - bool _checkUrlError(dynamic sessionException) { - return sessionException is ConnectionTimeout || sessionException is BadGateway || sessionException is SocketError; - } - - void _goToMailboxDashBoard(Session session) { - final apiUrl = session.getQualifiedApiUrl(baseUrl: _dynamicUrlInterceptors.jmapUrl); - log('SessionController::_goToMailboxDashBoard():apiUrl: $apiUrl'); - if (apiUrl.isNotEmpty) { - _dynamicUrlInterceptors.changeBaseUrl(apiUrl); - popAndPush( - RouteUtils.generateNavigationRoute(AppRoutes.dashboard, NavigationRouter()), - arguments: session); - } else { - logError('SessionController::_goToMailboxDashBoard(): apiUrl is NULL'); - performInvokeLogoutAction(); - } - } -} \ No newline at end of file diff --git a/lib/features/session/presentation/session_page_bindings.dart b/lib/features/session/presentation/session_page_bindings.dart deleted file mode 100644 index b81105d48..000000000 --- a/lib/features/session/presentation/session_page_bindings.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:core/data/network/config/dynamic_url_interceptors.dart'; -import 'package:core/presentation/utils/app_toast.dart'; -import 'package:get/get.dart'; -import 'package:tmail_ui_user/features/base/base_bindings.dart'; -import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; -import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart'; -import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; -import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; -import 'package:tmail_ui_user/features/session/domain/usecases/get_stored_session_interactor.dart'; -import 'package:tmail_ui_user/features/session/presentation/session_controller.dart'; - -class SessionPageBindings extends BaseBindings { - - @override - void bindingsController() { - Get.lazyPut(() => SessionController( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - )); - } - - @override - void bindingsDataSource() {} - - @override - void bindingsDataSourceImpl() {} - - @override - void bindingsInteractor() { - Get.lazyPut(() => UpdateAuthenticationAccountInteractor(Get.find())); - Get.lazyPut(() => GetStoredSessionInteractor(Get.find())); - } - - @override - void bindingsRepository() {} - - @override - void bindingsRepositoryImpl() {} -} \ No newline at end of file diff --git a/lib/features/session/presentation/session_view.dart b/lib/features/session/presentation/session_view.dart deleted file mode 100644 index 02f7d83ad..000000000 --- a/lib/features/session/presentation/session_view.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:core/core.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:get/get.dart'; -import 'package:tmail_ui_user/features/session/presentation/session_controller.dart'; - -class SessionView extends GetWidget { - const SessionView({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - color: AppColor.primaryLightColor, - child: const SizedBox( - width: 100, - height: 100, - child: CupertinoActivityIndicator(), - ), - ); - } -} \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 1c0960bb1..83ca07bd1 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-11-10T18:20:48.278058", + "@@last_modified": "2023-11-14T16:28:55.718679", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3475,5 +3475,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "notFoundSession": "Session not found", + "@notFoundSession": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ 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 32b4fc27a..4b037d864 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -12,6 +12,7 @@ import 'package:jmap_dart_client/http/http_client.dart'; import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/mdn_api.dart'; +import 'package:tmail_ui_user/features/home/data/network/session_api.dart'; import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart'; @@ -27,7 +28,6 @@ import 'package:tmail_ui_user/features/manage_account/data/network/rule_filter_a import 'package:tmail_ui_user/features/manage_account/data/network/vacation_api.dart'; import 'package:tmail_ui_user/features/push_notification/data/network/fcm_api.dart'; import 'package:tmail_ui_user/features/quotas/data/network/quotas_api.dart'; -import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; import 'package:tmail_ui_user/main/localizations/locale_interceptor.dart'; diff --git a/lib/main/bindings/session/session_bindings.dart b/lib/main/bindings/session/session_bindings.dart index 9dbb08d56..80035184e 100644 --- a/lib/main/bindings/session/session_bindings.dart +++ b/lib/main/bindings/session/session_bindings.dart @@ -2,13 +2,13 @@ import 'package:core/data/model/source_type/data_source_type.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; import 'package:tmail_ui_user/features/caching/clients/session_hive_cache_client.dart'; -import 'package:tmail_ui_user/features/session/data/datasource/session_datasource.dart'; -import 'package:tmail_ui_user/features/session/data/datasource_impl/hive_session_datasource_impl.dart'; -import 'package:tmail_ui_user/features/session/data/datasource_impl/session_datasource_impl.dart'; -import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; -import 'package:tmail_ui_user/features/session/data/repository/session_repository_impl.dart'; -import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; -import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; +import 'package:tmail_ui_user/features/home/data/datasource/session_datasource.dart'; +import 'package:tmail_ui_user/features/home/data/datasource_impl/hive_session_datasource_impl.dart'; +import 'package:tmail_ui_user/features/home/data/datasource_impl/session_datasource_impl.dart'; +import 'package:tmail_ui_user/features/home/data/network/session_api.dart'; +import 'package:tmail_ui_user/features/home/data/repository/session_repository_impl.dart'; +import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart'; +import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; diff --git a/lib/main/exceptions/remote_exception_thrower.dart b/lib/main/exceptions/remote_exception_thrower.dart index 6f1e6dd8a..668b52f1f 100644 --- a/lib/main/exceptions/remote_exception_thrower.dart +++ b/lib/main/exceptions/remote_exception_thrower.dart @@ -42,6 +42,8 @@ class RemoteExceptionThrower extends ExceptionThrower { throw ConnectionTimeout(message: error.message); case DioErrorType.connectionError: throw ConnectionError(message: error.message); + case DioErrorType.badResponse: + throw const BadCredentialsException(); default: if (error.error is SocketException) { throw const SocketError(); diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 997b36c3e..1e7128c92 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3603,4 +3603,11 @@ class AppLocalizations { name: 'subjectDescending', ); } + + String get notFoundSession { + return Intl.message( + 'Session not found', + name: 'notFoundSession', + ); + } } \ No newline at end of file diff --git a/lib/main/pages/app_pages.dart b/lib/main/pages/app_pages.dart index 99455f643..4448b4e04 100644 --- a/lib/main/pages/app_pages.dart +++ b/lib/main/pages/app_pages.dart @@ -27,8 +27,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_da import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_view.dart' deferred as manage_account_dashboard; import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_bindings.dart'; -import 'package:tmail_ui_user/features/session/presentation/session_page_bindings.dart'; -import 'package:tmail_ui_user/features/session/presentation/session_view.dart' deferred as session; import 'package:tmail_ui_user/features/unknown_route_page/unknown_route_page_view.dart'; import 'package:tmail_ui_user/main/pages/deferred_widget.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -45,10 +43,6 @@ class AppPages { name: AppRoutes.login, page: () => DeferredWidget(login.loadLibrary, () => login.LoginView()), binding: LoginBindings()), - GetPage( - name: AppRoutes.session, - page: () => DeferredWidget(session.loadLibrary, () => session.SessionView()), - binding: SessionPageBindings()), GetPage( name: AppRoutes.dashboard, page: () => DeferredWidget( diff --git a/lib/main/routes/app_routes.dart b/lib/main/routes/app_routes.dart index 7fbf482c2..27df7c61a 100644 --- a/lib/main/routes/app_routes.dart +++ b/lib/main/routes/app_routes.dart @@ -1,7 +1,6 @@ abstract class AppRoutes { static const home = '/'; static const login = '/login'; - static const session = '/session'; static const dashboard = '/dashboard'; static const dashboardWithParameter = '/dashboard/:id'; static const settings = '/settings'; diff --git a/test/features/session/session_hive_obj_test.dart b/test/features/session/session_hive_obj_test.dart index a88b0102d..6f3ea90a5 100644 --- a/test/features/session/session_hive_obj_test.dart +++ b/test/features/session/session_hive_obj_test.dart @@ -1,6 +1,6 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:tmail_ui_user/features/session/data/extensions/session_hive_obj_extension.dart'; -import 'package:tmail_ui_user/features/session/domain/extensions/session_extensions.dart'; +import 'package:tmail_ui_user/features/home/data/extensions/session_hive_obj_extension.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import '../../fixtures/session_fixtures.dart';