diff --git a/core/lib/data/network/config/dynamic_url_interceptors.dart b/core/lib/data/network/config/dynamic_url_interceptors.dart index a8c0c366d..1734808e2 100644 --- a/core/lib/data/network/config/dynamic_url_interceptors.dart +++ b/core/lib/data/network/config/dynamic_url_interceptors.dart @@ -7,6 +7,8 @@ class DynamicUrlInterceptors extends InterceptorsWrapper { _baseUrl = url; } + String? get baseUrl => _baseUrl; + @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { if (_baseUrl != null) { diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index 8cf1bf5c8..5c96bc5ce 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -14,7 +14,9 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/t import 'package:tmail_ui_user/main/error/capability_validator.dart'; abstract class BaseController extends GetxController - with MessageDialogActionMixin, PopupContextMenuActionMixin, ViewAsDialogActionMixin { + with MessageDialogActionMixin, + PopupContextMenuActionMixin, + ViewAsDialogActionMixin { final viewState = Rx>(Right(UIState.idle)); FpsCallback? fpsCallback; diff --git a/lib/features/contact/presentation/contact_controller.dart b/lib/features/contact/presentation/contact_controller.dart index 73c6e3dd0..96ee28373 100644 --- a/lib/features/contact/presentation/contact_controller.dart +++ b/lib/features/contact/presentation/contact_controller.dart @@ -73,11 +73,7 @@ class ContactController extends BaseController { @override void onClose() { - textInputSearchController?.dispose(); - textInputSearchController = null; - textInputSearchFocus?.dispose(); - textInputSearchFocus = null; - _deBouncerTime.cancel(); + _disposeWidget(); super.onClose(); } @@ -167,16 +163,19 @@ class ContactController extends BaseController { } } + void _disposeWidget() { + textInputSearchFocus?.dispose(); + textInputSearchFocus = null; + textInputSearchController?.dispose(); + textInputSearchController = null; + _deBouncerTime.cancel(); + } + void selectContact(BuildContext context, EmailAddress emailAddress) { FocusScope.of(context).unfocus(); if (BuildUtils.isWeb) { - textInputSearchFocus?.dispose(); - textInputSearchFocus = null; - textInputSearchController?.dispose(); - textInputSearchController = null; - _deBouncerTime.cancel(); - + _disposeWidget(); onSelectedContactCallback?.call(emailAddress); } else { popBack(result: emailAddress); @@ -188,12 +187,7 @@ class ContactController extends BaseController { FocusScope.of(context).unfocus(); if (BuildUtils.isWeb) { - textInputSearchFocus?.dispose(); - textInputSearchFocus = null; - textInputSearchController?.dispose(); - textInputSearchController = null; - _deBouncerTime.cancel(); - + _disposeWidget(); onDismissContactView?.call(); } else { popBack(); diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index cd85f6ac1..7e6c271e9 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -11,6 +11,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; @@ -507,47 +508,28 @@ class EmailController extends BaseController with AppLoaderMixin { context: context, arguments: arguments, onSelectedMailbox: (destinationMailbox) { - _dispatchMoveToAction( - context, - accountId, - email, - currentMailbox, - destinationMailbox); + if (mailboxDashBoardController.sessionCurrent != null) { + _dispatchMoveToAction( + context, + accountId, + mailboxDashBoardController.sessionCurrent!, + email, + currentMailbox, + destinationMailbox); + } }); } else { final destinationMailbox = await push( AppRoutes.destinationPicker, arguments: arguments); - if (destinationMailbox != null && destinationMailbox is PresentationMailbox && mailboxDashBoardController.sessionCurrent != null) { - if (destinationMailbox.isTrash) { - _moveToTrashAction(context, accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToTrash)); - } else if (destinationMailbox.isSpam) { - _moveToSpamAction(context, accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToSpam)); - } else { - _moveToMailbox(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath)); - } - } - if (destinationMailbox is PresentationMailbox) { + if (destinationMailbox != null && + destinationMailbox is PresentationMailbox && + mailboxDashBoardController.sessionCurrent != null) { _dispatchMoveToAction( context, accountId, + mailboxDashBoardController.sessionCurrent!, email, currentMailbox, destinationMailbox); @@ -559,30 +541,31 @@ class EmailController extends BaseController with AppLoaderMixin { void _dispatchMoveToAction( BuildContext context, AccountId accountId, + Session session, PresentationEmail emailSelected, PresentationMailbox currentMailbox, PresentationMailbox destinationMailbox ) { if (destinationMailbox.isTrash) { _moveToTrashAction(context, accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, + {currentMailbox.id: [emailSelected.id]}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { _moveToSpamAction(context, accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, + {currentMailbox.id: [emailSelected.id]}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToSpam)); } else { _moveToMailbox(accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, + {currentMailbox.id: [emailSelected.id]}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } diff --git a/lib/features/home/presentation/home_controller.dart b/lib/features/home/presentation/home_controller.dart index 15fd02a9f..832546d8a 100644 --- a/lib/features/home/presentation/home_controller.dart +++ b/lib/features/home/presentation/home_controller.dart @@ -199,7 +199,7 @@ class HomeController extends BaseController { _authorizationIsolateInterceptors.setTokenAndAuthorityOidc( newToken: storedTokenOidcSuccess.tokenOidc.toToken(), newConfig: storedTokenOidcSuccess.oidcConfiguration); - pushAndPop(AppRoutes.session); + pushAndPop(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl); } void _goToSessionWithBasicAuth(GetCredentialViewState credentialViewState) { @@ -212,6 +212,6 @@ class HomeController extends BaseController { credentialViewState.userName.userName, credentialViewState.password.value, ); - pushAndPop(AppRoutes.session); + pushAndPop(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl); } } \ No newline at end of file diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 155f8b37a..6a6a2abf6 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -94,7 +94,6 @@ class LoginController extends ReloadableController { this._getAllRecentLoginUrlOnMobileInteractor, this._saveLoginUsernameOnMobileInteractor, this._getAllRecentLoginUsernameOnMobileInteractor, - ); ) : super(logoutOidcInteractor, deleteAuthorityOidcInteractor, getAuthenticatedAccountInteractor); @@ -312,7 +311,7 @@ class LoginController extends ReloadableController { _authorizationIsolateInterceptors.setTokenAndAuthorityOidc( newToken: success.tokenOIDC.toToken(), newConfig: success.configuration); - pushAndPop(AppRoutes.session); + pushAndPop(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl); } void _loginAction(Uri baseUrl, UserName userName, Password password) async { @@ -324,7 +323,7 @@ class LoginController extends ReloadableController { _dynamicUrlInterceptors.changeBaseUrl(kIsWeb ? AppConfig.baseUrl : _urlText); _authorizationInterceptors.setBasicAuthorization(_userNameText, _passwordText); _authorizationIsolateInterceptors.setBasicAuthorization(_userNameText, _passwordText); - pushAndPop(AppRoutes.session); + pushAndPop(AppRoutes.session, arguments: _dynamicUrlInterceptors.baseUrl); } void _loginFailureAction(FeatureFailure failure) { 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 da5faea4f..d1d8986a3 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -623,46 +623,29 @@ class MailboxDashBoardController extends ReloadableController { context: context, arguments: arguments, onSelectedMailbox: (destinationMailbox) { - _dispatchMoveToMultipleAction( - accountId.value!, - listEmails.listEmailIds, - currentMailbox, destinationMailbox); + if (sessionCurrent != null) { + _dispatchMoveToMultipleAction( + accountId.value!, + sessionCurrent!, + listEmails.listEmailIds, + currentMailbox, + destinationMailbox); + } }); } else { final destinationMailbox = await push( AppRoutes.destinationPicker, arguments: arguments); - if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { - if (destinationMailbox.isTrash) { - _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - {mailboxCurrent.id: listEmails.listEmailIds}, - destinationMailbox.id, - MoveAction.moving, - sessionCurrent!, - EmailActionType.moveToTrash)); - } else if (destinationMailbox.isSpam) { - _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - {mailboxCurrent.id: listEmails.listEmailIds}, - destinationMailbox.id, - MoveAction.moving, - sessionCurrent!, - EmailActionType.moveToSpam)); - } else { - _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - {mailboxCurrent.id: listEmails.listEmailIds}, - destinationMailbox.id, - MoveAction.moving, - sessionCurrent!, - EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath)); - } - } - if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { + if (destinationMailbox != null && + destinationMailbox is PresentationMailbox && + sessionCurrent != null) { _dispatchMoveToMultipleAction( accountId.value!, + sessionCurrent!, listEmails.listEmailIds, - currentMailbox, destinationMailbox); + currentMailbox, + destinationMailbox); } } } @@ -670,30 +653,31 @@ class MailboxDashBoardController extends ReloadableController { void _dispatchMoveToMultipleAction( AccountId accountId, + Session session, List listEmailIds, PresentationMailbox currentMailbox, PresentationMailbox destinationMailbox ) { if (destinationMailbox.isTrash) { _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToSpam)); } else { _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } diff --git a/lib/features/session/presentation/session_controller.dart b/lib/features/session/presentation/session_controller.dart index 31e9fc23b..b8a5da9e4 100644 --- a/lib/features/session/presentation/session_controller.dart +++ b/lib/features/session/presentation/session_controller.dart @@ -3,18 +3,22 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/domain/exceptions/remote_exception.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/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.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/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; -class SessionController extends GetxController { +class SessionController extends ReloadableController { final GetSessionInteractor _getSessionInteractor; final DeleteCredentialInteractor _deleteCredentialInteractor; final CachingManager _cachingManager; @@ -24,6 +28,9 @@ class SessionController extends GetxController { final DynamicUrlInterceptors _dynamicUrlInterceptors; SessionController( + LogoutOidcInteractor logoutOidcInteractor, + DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor, + GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor, this._getSessionInteractor, this._deleteCredentialInteractor, this._cachingManager, @@ -31,12 +38,24 @@ class SessionController extends GetxController { this._authorizationInterceptors, this._appToast, this._dynamicUrlInterceptors, - ); + ) : super(logoutOidcInteractor, + deleteAuthorityOidcInteractor, + getAuthenticatedAccountInteractor); @override void onReady() { super.onReady(); - _getSession(); + final arguments = Get.arguments; + if (arguments != null && arguments is String) { + _getSession(); + } else { + reload(); + } + } + + @override + void handleReloaded(Session session) { + pushAndPop(AppRoutes.dashboard, arguments: session); } void _getSession() async { @@ -89,4 +108,10 @@ class SessionController extends GetxController { _goToLogin(); } } + + @override + void onDone() {} + + @override + void onError(error) {} } \ 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 index 825214d6d..ddcdae846 100644 --- a/lib/features/session/presentation/session_page_bindings.dart +++ b/lib/features/session/presentation/session_page_bindings.dart @@ -3,18 +3,27 @@ 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/caching/caching_manager.dart'; +import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart'; import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart'; +import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_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'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'; +import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart'; import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_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_credential_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; import 'package:tmail_ui_user/features/session/presentation/session_controller.dart'; @@ -23,6 +32,9 @@ class SessionPageBindings extends BaseBindings { @override void bindingsController() { Get.lazyPut(() => SessionController( + Get.find(), + Get.find(), + Get.find(), Get.find(), Get.find(), Get.find(), @@ -36,6 +48,7 @@ class SessionPageBindings extends BaseBindings { @override void bindingsDataSource() { Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override @@ -46,6 +59,9 @@ class SessionPageBindings extends BaseBindings { Get.find(), Get.find() )); + Get.lazyPut(() => HiveAccountDatasourceImpl( + Get.find() + )); } @override @@ -53,15 +69,30 @@ class SessionPageBindings extends BaseBindings { Get.lazyPut(() => DeleteAuthorityOidcInteractor( Get.find(), Get.find())); + Get.lazyPut(() => LogoutOidcInteractor( + Get.find(), + Get.find(), + )); + Get.lazyPut(() => GetStoredTokenOidcInteractor( + Get.find(), + Get.find(), + )); + Get.lazyPut(() => GetAuthenticatedAccountInteractor( + Get.find(), + Get.find(), + Get.find(), + )); } @override void bindingsRepository() { Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override void bindingsRepositoryImpl() { Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find())); + Get.lazyPut(() => AccountRepositoryImpl(Get.find())); } } \ No newline at end of file diff --git a/lib/features/thread/presentation/mixin/email_action_controller.dart b/lib/features/thread/presentation/mixin/email_action_controller.dart index 92235327c..773dca5ff 100644 --- a/lib/features/thread/presentation/mixin/email_action_controller.dart +++ b/lib/features/thread/presentation/mixin/email_action_controller.dart @@ -1,5 +1,4 @@ - import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; @@ -10,6 +9,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/mark_star_action.dart'; import 'package:model/email/presentation_email.dart'; @@ -37,9 +37,9 @@ mixin EmailActionController on ViewAsDialogActionMixin { void editEmail(PresentationEmail presentationEmail) { final arguments = ComposerArguments( - emailActionType: EmailActionType.edit, - presentationEmail: presentationEmail, - mailboxRole: mailboxDashBoardController.selectedMailbox.value?.role); + emailActionType: EmailActionType.edit, + presentationEmail: presentationEmail, + mailboxRole: mailboxDashBoardController.selectedMailbox.value?.role); mailboxDashBoardController.goToComposer(arguments); } @@ -56,11 +56,11 @@ mixin EmailActionController on ViewAsDialogActionMixin { if (currentMailbox != null && accountId != null && trashMailboxId != null) { _moveToTrashAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - trashMailboxId, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToTrash) + {currentMailbox.id: [email.id]}, + trashMailboxId, + MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, + EmailActionType.moveToTrash) ); } } @@ -76,11 +76,11 @@ mixin EmailActionController on ViewAsDialogActionMixin { if (currentMailbox != null && accountId != null && spamMailboxId != null) { moveToSpamAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - spamMailboxId, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToSpam) + {currentMailbox.id: [email.id]}, + spamMailboxId, + MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, + EmailActionType.moveToSpam) ); } } @@ -92,11 +92,11 @@ mixin EmailActionController on ViewAsDialogActionMixin { if (inboxMailboxId != null && accountId != null && spamMailboxId != null) { moveToSpamAction(accountId, MoveToMailboxRequest( - {spamMailboxId: [email.id]}, - inboxMailboxId, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.unSpam) + {spamMailboxId: [email.id]}, + inboxMailboxId, + MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, + EmailActionType.unSpam) ); } } @@ -114,85 +114,69 @@ mixin EmailActionController on ViewAsDialogActionMixin { if (BuildUtils.isWeb) { showDialogDestinationPicker( - context: context, - arguments: arguments, - onSelectedMailbox: (destinationMailbox) { + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + if (mailboxDashBoardController.sessionCurrent != null) { _dispatchMoveToAction( - context, - accountId, - email, - currentMailbox, - destinationMailbox); - }); + context, + accountId, + mailboxDashBoardController.sessionCurrent!, + email, + currentMailbox, + destinationMailbox); + } + }); } else { final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: arguments); + AppRoutes.destinationPicker, + arguments: arguments); - if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { - if (destinationMailbox.isTrash) { - moveToSpamAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToTrash)); - } else if (destinationMailbox.isSpam) { - moveToSpamAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToSpam)); - } else { - _moveToMailboxAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath)); - } - } - _dispatchMoveToAction( + if (destinationMailbox != null && + destinationMailbox is PresentationMailbox && + mailboxDashBoardController.sessionCurrent != null) { + _dispatchMoveToAction( context, accountId, + mailboxDashBoardController.sessionCurrent!, email, currentMailbox, destinationMailbox); + } } } } void _dispatchMoveToAction( - BuildContext context, - AccountId accountId, - PresentationEmail emailSelected, - PresentationMailbox currentMailbox, - PresentationMailbox destinationMailbox + BuildContext context, + AccountId accountId, + Session session, + PresentationEmail emailSelected, + PresentationMailbox currentMailbox, + PresentationMailbox destinationMailbox ) { if (destinationMailbox.isTrash) { moveToSpamAction(accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, - destinationMailbox.id, - MoveAction.moving, - EmailActionType.moveToTrash)); + {currentMailbox.id: [emailSelected.id]}, + destinationMailbox.id, + MoveAction.moving, + session, + EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { moveToSpamAction(accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, - destinationMailbox.id, - MoveAction.moving, - EmailActionType.moveToSpam)); + {currentMailbox.id: [emailSelected.id]}, + destinationMailbox.id, + MoveAction.moving, + session, + EmailActionType.moveToSpam)); } else { _moveToMailboxAction(accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, - destinationMailbox.id, - MoveAction.moving, - EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath)); + {currentMailbox.id: [emailSelected.id]}, + destinationMailbox.id, + MoveAction.moving, + session, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath)); } } @@ -207,31 +191,31 @@ mixin EmailActionController on ViewAsDialogActionMixin { ..onCancelAction(AppLocalizations.of(context).cancel, () => popBack()) ..onConfirmAction( DeleteActionType.single.getConfirmActionName(context), - () => _deleteEmailPermanentlyAction(context, email))) + () => _deleteEmailPermanentlyAction(context, email))) .show(); } else { showDialog( - context: context, - barrierColor: AppColor.colorDefaultCupertinoActionSheet, - builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(imagePaths) - ..key(const Key('confirm_dialog_delete_email_permanently')) - ..title(DeleteActionType.single.getTitleDialog(context)) - ..content(DeleteActionType.single.getContentDialog(context)) - ..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog, fit: BoxFit.fill)) - ..colorConfirmButton(AppColor.colorConfirmActionDialog) - ..styleTextConfirmButton( - const TextStyle( - fontSize: 17, - fontWeight: FontWeight.w500, - color: AppColor.colorActionDeleteConfirmDialog)) - ..onCloseButtonAction(() => popBack()) - ..onConfirmButtonAction( - DeleteActionType.single.getConfirmActionName(context), - () => _deleteEmailPermanentlyAction(context, email)) - ..onCancelButtonAction( - AppLocalizations.of(context).cancel, - () => popBack())) - .build())); + context: context, + barrierColor: AppColor.colorDefaultCupertinoActionSheet, + builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(imagePaths) + ..key(const Key('confirm_dialog_delete_email_permanently')) + ..title(DeleteActionType.single.getTitleDialog(context)) + ..content(DeleteActionType.single.getContentDialog(context)) + ..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog, fit: BoxFit.fill)) + ..colorConfirmButton(AppColor.colorConfirmActionDialog) + ..styleTextConfirmButton( + const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w500, + color: AppColor.colorActionDeleteConfirmDialog)) + ..onCloseButtonAction(() => popBack()) + ..onConfirmButtonAction( + DeleteActionType.single.getConfirmActionName(context), + () => _deleteEmailPermanentlyAction(context, email)) + ..onCancelButtonAction( + AppLocalizations.of(context).cancel, + () => popBack())) + .build())); } } @@ -257,14 +241,14 @@ mixin EmailActionController on ViewAsDialogActionMixin { } void moveSelectedMultipleEmailToMailbox( - BuildContext context, - List listEmails, - PresentationMailbox mailboxCurrent + BuildContext context, + List listEmails, + PresentationMailbox mailboxCurrent ) { mailboxDashBoardController.moveSelectedMultipleEmailToMailbox( - context, - listEmails, - mailboxCurrent); + context, + listEmails, + mailboxCurrent); } void moveSelectedMultipleEmailToTrash(List listEmails, PresentationMailbox mailboxCurrent) { @@ -280,19 +264,19 @@ mixin EmailActionController on ViewAsDialogActionMixin { } void deleteSelectionEmailsPermanently( - BuildContext context, - DeleteActionType actionType, - { - List? listEmails, - PresentationMailbox? mailboxCurrent, - Function? onCancelSelectionEmail, - } + BuildContext context, + DeleteActionType actionType, + { + List? listEmails, + PresentationMailbox? mailboxCurrent, + Function? onCancelSelectionEmail, + } ) { mailboxDashBoardController.deleteSelectionEmailsPermanently( - context, - actionType, - listEmails: listEmails, - mailboxCurrent: mailboxCurrent, - onCancelSelectionEmail: onCancelSelectionEmail); + context, + actionType, + listEmails: listEmails, + mailboxCurrent: mailboxCurrent, + onCancelSelectionEmail: onCancelSelectionEmail); } } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 7a4ca9ab7..e193849db 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; @@ -647,45 +648,26 @@ class ThreadController extends BaseController { context: context, arguments: arguments, onSelectedMailbox: (destinationMailbox) { - _dispatchMoveToMultipleAction( - _accountId!, - listEmail.listEmailIds, - currentMailbox, - destinationMailbox); + if (mailboxDashBoardController.sessionCurrent != null) { + _dispatchMoveToMultipleAction( + _accountId!, + mailboxDashBoardController.sessionCurrent!, + listEmail.listEmailIds, + currentMailbox, + destinationMailbox); + } }); } else { final destinationMailbox = await push( AppRoutes.destinationPicker, arguments: arguments); - if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { - if (destinationMailbox.isTrash) { - _moveSelectedEmailMultipleToTrashAction(_accountId!, MoveToMailboxRequest( - {currentMailbox.id: listEmailIds}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToTrash)); - } else if (destinationMailbox.isSpam) { - _moveSelectedEmailMultipleToSpamAction(_accountId!, MoveToMailboxRequest( - {currentMailbox.id: listEmailIds}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToSpam)); - } else { - _moveSelectedEmailMultipleToMailboxAction(_accountId!, MoveToMailboxRequest( - {currentMailbox.id: listEmailIds}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath)); - } - } - if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { + if (destinationMailbox != null && + destinationMailbox is PresentationMailbox && + mailboxDashBoardController.sessionCurrent != null) { _dispatchMoveToMultipleAction( _accountId!, + mailboxDashBoardController.sessionCurrent!, listEmail.listEmailIds, currentMailbox, destinationMailbox); @@ -696,30 +678,31 @@ class ThreadController extends BaseController { void _dispatchMoveToMultipleAction( AccountId accountId, + Session session, List listEmailIds, PresentationMailbox currentMailbox, PresentationMailbox destinationMailbox ) { if (destinationMailbox.isTrash) { _moveSelectedEmailMultipleToTrashAction(accountId, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { _moveSelectedEmailMultipleToSpamAction(accountId, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToSpam)); } else { _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } @@ -1138,47 +1121,28 @@ class ThreadController extends BaseController { context: context, arguments: arguments, onSelectedMailbox: (destinationMailbox) { - _dispatchMoveToAction( - context, - accountId, - email, - currentMailbox, - destinationMailbox); + if (mailboxDashBoardController.sessionCurrent != null) { + _dispatchMoveToAction( + context, + accountId, + mailboxDashBoardController.sessionCurrent!, + email, + currentMailbox, + destinationMailbox); + } }); } else { final destinationMailbox = await push( AppRoutes.destinationPicker, arguments: arguments); - if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { - if (destinationMailbox.isTrash) { - _moveToTrashAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToTrash)); - } else if (destinationMailbox.isSpam) { - _moveToSpamAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToSpam)); - } else { - _moveToMailboxAction(accountId, MoveToMailboxRequest( - {currentMailbox.id: [email.id]}, - destinationMailbox.id, - MoveAction.moving, - mailboxDashBoardController.sessionCurrent!, - EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath)); - } - } - if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { + if (destinationMailbox != null && + destinationMailbox is PresentationMailbox && + mailboxDashBoardController.sessionCurrent != null) { _dispatchMoveToAction( context, accountId, + mailboxDashBoardController.sessionCurrent!, email, currentMailbox, destinationMailbox); @@ -1190,30 +1154,31 @@ class ThreadController extends BaseController { void _dispatchMoveToAction( BuildContext context, AccountId accountId, + Session session, PresentationEmail emailSelected, PresentationMailbox currentMailbox, PresentationMailbox destinationMailbox ) { if (destinationMailbox.isTrash) { _moveToTrashAction(accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, + {currentMailbox.id: [emailSelected.id]}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { _moveToSpamAction(accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, + {currentMailbox.id: [emailSelected.id]}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToSpam)); } else { _moveToMailboxAction(accountId, MoveToMailboxRequest( - [emailSelected.id], - currentMailbox.id, + {currentMailbox.id: [emailSelected.id]}, destinationMailbox.id, MoveAction.moving, + session, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } diff --git a/lib/main/pages/app_pages.dart b/lib/main/pages/app_pages.dart index be1afd84d..ad85d0238 100644 --- a/lib/main/pages/app_pages.dart +++ b/lib/main/pages/app_pages.dart @@ -31,58 +31,6 @@ import 'package:tmail_ui_user/main/pages/deferred_widget.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; class AppPages { - static final pagesOnlyOnMobile = [ - GetPage( - name: AppRoutes.composer, - opaque: false, - page: () => DeferredWidget( - composer.loadLibrary, - () => composer.ComposerView()), - binding: ComposerBindings()), - GetPage( - name: AppRoutes.destinationPicker, - opaque: false, - page: () => DeferredWidget( - destination_picker.loadLibrary, - () => destination_picker.DestinationPickerView()), - binding: DestinationPickerBindings()), - GetPage( - name: AppRoutes.mailboxCreator, - opaque: false, - page: () => DeferredWidget( - mailbox_creator.loadLibrary, - () => mailbox_creator.MailboxCreatorView()), - binding: MailboxCreatorBindings()), - GetPage( - name: AppRoutes.contact, - opaque: false, - page: () => DeferredWidget( - contact_view.loadLibrary, - () => contact_view.ContactView()), - binding: ContactBindings()), - GetPage( - name: AppRoutes.identityCreator, - opaque: false, - page: () => DeferredWidget( - identity_creator.loadLibrary, - () => identity_creator.IdentityCreatorView()), - binding: IdentityCreatorBindings()), - GetPage( - name: AppRoutes.rulesFilterCreator, - opaque: false, - page: () => DeferredWidget( - rules_filter_creator.loadLibrary, - () => rules_filter_creator.RuleFilterCreatorView()), - binding: RulesFilterCreatorBindings()), - GetPage( - name: AppRoutes.emailsForwardCreator, - opaque: false, - page: () => DeferredWidget( - emails_forward_creator.loadLibrary, - () => emails_forward_creator.EmailsForwardCreatorView()), - binding: EmailsForwardCreatorBindings()), - ]; - static final pages = [ GetPage( name: AppRoutes.home, @@ -109,6 +57,56 @@ class AppPages { () => manage_account_dashboard.ManageAccountDashBoardView()), binding: ManageAccountDashBoardBindings()), if (!BuildUtils.isWeb) - ...pagesOnlyOnMobile + ...[ + GetPage( + name: AppRoutes.composer, + opaque: false, + page: () => DeferredWidget( + composer.loadLibrary, + () => composer.ComposerView()), + binding: ComposerBindings()), + GetPage( + name: AppRoutes.destinationPicker, + opaque: false, + page: () => DeferredWidget( + destination_picker.loadLibrary, + () => destination_picker.DestinationPickerView()), + binding: DestinationPickerBindings()), + GetPage( + name: AppRoutes.mailboxCreator, + opaque: false, + page: () => DeferredWidget( + mailbox_creator.loadLibrary, + () => mailbox_creator.MailboxCreatorView()), + binding: MailboxCreatorBindings()), + GetPage( + name: AppRoutes.contact, + opaque: false, + page: () => DeferredWidget( + contact_view.loadLibrary, + () => contact_view.ContactView()), + binding: ContactBindings()), + GetPage( + name: AppRoutes.identityCreator, + opaque: false, + page: () => DeferredWidget( + identity_creator.loadLibrary, + () => identity_creator.IdentityCreatorView()), + binding: IdentityCreatorBindings()), + GetPage( + name: AppRoutes.rulesFilterCreator, + opaque: false, + page: () => DeferredWidget( + rules_filter_creator.loadLibrary, + () => rules_filter_creator.RuleFilterCreatorView()), + binding: RulesFilterCreatorBindings()), + GetPage( + name: AppRoutes.emailsForwardCreator, + opaque: false, + page: () => DeferredWidget( + emails_forward_creator.loadLibrary, + () => emails_forward_creator.EmailsForwardCreatorView()), + binding: EmailsForwardCreatorBindings()), + ] ]; }