diff --git a/lib/features/caching/config/hive_cache_config.dart b/lib/features/caching/config/hive_cache_config.dart index df018e7d4..bea12da44 100644 --- a/lib/features/caching/config/hive_cache_config.dart +++ b/lib/features/caching/config/hive_cache_config.dart @@ -24,6 +24,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/recent_searc import 'package:tmail_ui_user/features/offline_mode/model/attachment_hive_cache.dart'; import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_cache.dart'; import 'package:tmail_ui_user/features/offline_mode/model/email_header_hive_cache.dart'; +import 'package:tmail_ui_user/features/offline_mode/model/sending_email_hive_cache.dart'; import 'package:tmail_ui_user/features/push_notification/data/model/fcm_subscription.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_address_hive_cache.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_cache.dart'; @@ -150,6 +151,10 @@ class HiveCacheConfig { DetailedEmailHiveCacheAdapter(), CachingConstants.DETAILED_EMAIL_HIVE_CACHE_ID ); + registerCacheAdapter( + SendingEmailHiveCacheAdapter(), + CachingConstants.SENDING_EMAIL_HIVE_CACHE_ID + ); } void registerCacheAdapter(TypeAdapter typeAdapter, int typeId) { diff --git a/lib/features/composer/domain/extensions/email_requestl_extension.dart b/lib/features/composer/domain/extensions/email_requestl_extension.dart new file mode 100644 index 000000000..82790c0b0 --- /dev/null +++ b/lib/features/composer/domain/extensions/email_requestl_extension.dart @@ -0,0 +1,20 @@ + +import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; + +extension EmailRequestExtension on EmailRequest { + SendingEmail toSendingEmail(String sendingId, {CreateNewMailboxRequest? mailboxRequest}) { + return SendingEmail( + sendingId: sendingId, + email: email, + emailActionType: emailActionType, + sentMailboxId: sentMailboxId, + emailIdDestroyed: emailIdDestroyed, + emailIdAnsweredOrForwarded: emailIdAnsweredOrForwarded, + identityId: identityId, + mailboxNameRequest: mailboxRequest?.newName, + creationIdRequest: mailboxRequest?.creationId + ); + } +} \ No newline at end of file diff --git a/lib/features/composer/domain/model/email_request.dart b/lib/features/composer/domain/model/email_request.dart index e6dd3d4ed..57b42b93e 100644 --- a/lib/features/composer/domain/model/email_request.dart +++ b/lib/features/composer/domain/model/email_request.dart @@ -11,23 +11,23 @@ class EmailRequest with EquatableMixin { final MailboxId? sentMailboxId; final EmailId? emailIdDestroyed; final EmailId? emailIdAnsweredOrForwarded; - final Identity? identity; - final EmailActionType? emailActionType; + final IdentityId? identityId; + final EmailActionType emailActionType; - EmailRequest( - this.email, { + EmailRequest({ + required this.email, + required this.emailActionType, this.sentMailboxId, - this.identity, + this.identityId, this.emailIdDestroyed, this.emailIdAnsweredOrForwarded, - this.emailActionType }); @override List get props => [ email, sentMailboxId, - identity, + identityId, emailIdDestroyed, emailIdAnsweredOrForwarded, emailActionType diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index cea0bf49d..ae429965b 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -48,6 +48,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/features/upload/data/datasource/attachment_upload_datasource.dart'; import 'package:tmail_ui_user/features/upload/data/datasource_impl/attachment_upload_datasource_impl.dart'; @@ -102,6 +103,7 @@ class ComposerBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), Get.find(), Get.find())); } diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 0d73a8ce5..9dff02731 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -796,9 +796,9 @@ class ComposerController extends BaseController { if (arguments != null && accountId != null && userProfile != null && session != null) { final email = await _generateEmail(context, userProfile, outboxMailboxId: outboxMailboxId); final emailRequest = EmailRequest( - email, + email: email, sentMailboxId: sentMailboxId, - identity: identitySelected.value, + identityId: identitySelected.value?.id, emailIdDestroyed: arguments.emailActionType == EmailActionType.edit ? arguments.presentationEmail?.id : null, diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index 65934bb47..c33168de7 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -8,9 +8,11 @@ import 'package:dartz/dartz.dart'; import 'package:dio/dio.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/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; @@ -186,4 +188,9 @@ class EmailDataSourceImpl extends EmailDataSource { Future getEmailStored(Session session, AccountId accountId, EmailId emailId) { throw UnimplementedError(); } + + @override + Future storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail) { + throw UnimplementedError(); + } } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart index 3d3ffe0d1..63349472c 100644 --- a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart @@ -12,6 +12,7 @@ import 'package:dartz/dartz.dart'; import 'package:dio/dio.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/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/account/account_request.dart'; import 'package:model/download/download_task_id.dart'; @@ -20,7 +21,9 @@ import 'package:model/email/mark_star_action.dart'; import 'package:model/email/read_actions.dart'; import 'package:model/extensions/email_id_extensions.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; +import 'package:tmail_ui_user/features/composer/domain/extensions/sending_email_extension.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_extension.dart'; import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_hive_cache_extension.dart'; @@ -34,6 +37,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_m import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/worker/hive_task.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_cache_extension.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_extension.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; @@ -45,6 +49,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { final DetailedEmailCacheWorkerQueue _cacheWorkerQueue; final OpenedEmailCacheWorkerQueue _openedEmailCacheWorkerQueue; final EmailCacheManager _emailCacheManager; + final SendingEmailCacheManager _sendingEmailCacheManager; final FileUtils _fileUtils; final ExceptionThrower _exceptionThrower; @@ -54,6 +59,7 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { this._cacheWorkerQueue, this._openedEmailCacheWorkerQueue, this._emailCacheManager, + this._sendingEmailCacheManager, this._fileUtils, this._exceptionThrower ); @@ -239,4 +245,11 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { return email?.toEmail(); }).catchError(_exceptionThrower.throwException); } + + @override + Future storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail) { + return Future.sync(() async { + return await _sendingEmailCacheManager.storeSendingEmail(accountId, userName, sendingEmail.toHiveCache()); + }).catchError(_exceptionThrower.throwException); + } } \ No newline at end of file diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index f3ac5a676..7c1ea2bed 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -153,7 +153,7 @@ class EmailAPI with HandleSetErrorMixin { }) }; final emailSubmission = EmailSubmission( - identityId: emailRequest.identity?.id?.id, + identityId: emailRequest.identityId?.id, emailId: EmailId(ReferenceId(ReferencePrefix.defaultPrefix, idCreateMethod)), envelope: Envelope(mailFrom, recipientsList)); diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index abe03ffe5..aa2f9852c 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -11,6 +11,7 @@ import 'package:dio/dio.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/state.dart' as jmap; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/account/account_request.dart'; import 'package:model/download/download_task_id.dart'; @@ -19,6 +20,7 @@ import 'package:model/email/email_content.dart'; import 'package:model/email/mark_star_action.dart'; import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; @@ -219,4 +221,9 @@ class EmailRepositoryImpl extends EmailRepository { Future getEmailStored(Session session, AccountId accountId, EmailId emailId) { return emailDataSource[DataSourceType.hiveCache]!.getEmailStored(session, accountId, emailId); } + + @override + Future storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail) { + return emailDataSource[DataSourceType.hiveCache]!.storeSendingEmail(accountId, userName, sendingEmail); + } } \ No newline at end of file diff --git a/lib/features/email/domain/state/store_sending_email_state.dart b/lib/features/email/domain/state/store_sending_email_state.dart new file mode 100644 index 000000000..2ef3e341e --- /dev/null +++ b/lib/features/email/domain/state/store_sending_email_state.dart @@ -0,0 +1,14 @@ + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class StoreSendingEmailLoading extends UIState {} + +class StoreSendingEmailSuccess extends UIState {} + +class StoreSendingEmailFailure extends FeatureFailure { + StoreSendingEmailFailure(dynamic exception) : super(exception: exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/email/domain/usecases/store_sending_email_interactor.dart b/lib/features/email/domain/usecases/store_sending_email_interactor.dart new file mode 100644 index 000000000..88c639e70 --- /dev/null +++ b/lib/features/email/domain/usecases/store_sending_email_interactor.dart @@ -0,0 +1,24 @@ +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/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_state.dart'; + +class StoreSendingEmailInteractor { + final EmailRepository _emailRepository; + + StoreSendingEmailInteractor(this._emailRepository); + + Stream> execute(AccountId accountId, UserName userName, SendingEmail sendingEmail) async* { + try { + yield Right(StoreSendingEmailLoading()); + await _emailRepository.storeSendingEmail(accountId, userName, sendingEmail); + yield Right(StoreSendingEmailSuccess()); + } catch (e) { + yield Left(StoreSendingEmailFailure(e)); + } + } +} \ No newline at end of file diff --git a/lib/features/email/presentation/email_bindings.dart b/lib/features/email/presentation/email_bindings.dart index 69e45bcc2..b07f86bcb 100644 --- a/lib/features/email/presentation/email_bindings.dart +++ b/lib/features/email/presentation/email_bindings.dart @@ -47,6 +47,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.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/exceptions/remote_exception_thrower.dart'; @@ -105,6 +106,7 @@ class EmailBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), Get.find(), Get.find())); } diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index 4a8fd8035..e946795af 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/caching/clients/state_cache_client.dart'; import 'package:tmail_ui_user/features/composer/data/repository/contact_repository_impl.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/contact_repository.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/store_sending_email_interactor.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; @@ -98,6 +99,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; import 'package:tmail_ui_user/features/quotas/presentation/quotas_controller_bindings.dart'; import 'package:tmail_ui_user/features/search/email/domain/usecases/refresh_changes_search_email_interactor.dart'; import 'package:tmail_ui_user/features/search/email/presentation/search_email_bindings.dart'; @@ -167,7 +169,8 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), - Get.find() + Get.find(), + Get.find() )); Get.put(AdvancedFilterController()); } @@ -239,6 +242,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), Get.find(), Get.find())); } @@ -319,6 +323,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find() )); + Get.lazyPut(() => StoreSendingEmailInteractor(Get.find())); } @override 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 3d48aee14..95a2c0288 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -14,6 +14,7 @@ import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart'; import 'package:jmap_dart_client/jmap/core/error/set_error.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/vacation/vacation_response.dart'; @@ -24,11 +25,15 @@ import 'package:rxdart/transformers.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/composer/domain/exceptions/set_email_method_exception.dart'; +import 'package:tmail_ui_user/features/composer/domain/extensions/email_requestl_extension.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_state.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/store_sending_email_interactor.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; @@ -80,6 +85,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/extensions/da import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart'; +import 'package:tmail_ui_user/features/network_status_handle/presentation/network_connnection_controller.dart'; import 'package:tmail_ui_user/features/push_notification/domain/state/get_email_state_to_refresh_state.dart'; import 'package:tmail_ui_user/features/push_notification/domain/state/get_mailbox_state_to_refresh_state.dart'; import 'package:tmail_ui_user/features/push_notification/domain/usecases/delete_email_state_to_refresh_interactor.dart'; @@ -110,6 +116,7 @@ import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/routes/router_arguments.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:uuid/uuid.dart'; class MailboxDashBoardController extends ReloadableController { @@ -122,6 +129,8 @@ class MailboxDashBoardController extends ReloadableController { final DownloadController downloadController = Get.find(); final AppGridDashboardController appGridDashboardController = Get.find(); final SpamReportController spamReportController = Get.find(); + final NetworkConnectionController networkConnectionController = Get.find(); + final Uuid _uuid = Get.find(); final MoveToMailboxInteractor _moveToMailboxInteractor; final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor; @@ -136,6 +145,7 @@ class MailboxDashBoardController extends ReloadableController { final DeleteMultipleEmailsPermanentlyInteractor _deleteMultipleEmailsPermanentlyInteractor; final GetEmailByIdInteractor _getEmailByIdInteractor; final SendEmailInteractor _sendEmailInteractor; + final StoreSendingEmailInteractor _storeSendingEmailInteractor; GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; @@ -202,7 +212,8 @@ class MailboxDashBoardController extends ReloadableController { this._emptyTrashFolderInteractor, this._deleteMultipleEmailsPermanentlyInteractor, this._getEmailByIdInteractor, - this._sendEmailInteractor + this._sendEmailInteractor, + this._storeSendingEmailInteractor, ) : super( getAuthenticatedAccountInteractor, updateAuthenticationAccountInteractor @@ -305,6 +316,8 @@ class MailboxDashBoardController extends ReloadableController { appGridDashboardController.handleShowAppDashboard(success.linagoraApplications); } else if(success is GetEmailByIdSuccess) { _moveToEmailDetailedView(success); + } else if (success is StoreSendingEmailSuccess) { + _handleStoreSendingEmailSuccess(success); } } @@ -1703,12 +1716,41 @@ class MailboxDashBoardController extends ReloadableController { EmailRequest emailRequest, CreateNewMailboxRequest? mailboxRequest ) { - consumeState(_sendEmailInteractor.execute( - session, - accountId, - emailRequest, - mailboxRequest: mailboxRequest - )); + if (PlatformInfo.isWeb) { + consumeState(_sendEmailInteractor.execute( + session, + accountId, + emailRequest, + mailboxRequest: mailboxRequest + )); + } else { + if (networkConnectionController.isNetworkConnectionAvailable()) { + consumeState(_sendEmailInteractor.execute( + session, + accountId, + emailRequest, + mailboxRequest: mailboxRequest + )); + } else { + final sendingEmail = emailRequest.toSendingEmail(_uuid.v1(), mailboxRequest: mailboxRequest); + _storeSendingEmail(accountId, session.username, sendingEmail); + } + } + } + + void _storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail) { + log('MailboxDashBoardController::_storeSendingEmail():sendingEmail: $sendingEmail'); + consumeState(_storeSendingEmailInteractor.execute(accountId, userName, sendingEmail)); + } + + void _handleStoreSendingEmailSuccess(StoreSendingEmailSuccess success) { + if (currentOverlayContext != null && currentContext != null) { + _appToast.showToastSuccessMessage( + currentOverlayContext!, + AppLocalizations.of(currentContext!).messageHasBeenSavedToTheSendingQueue, + leadingSVGIconColor: Colors.white, + leadingSVGIcon: _imagePaths.icEmail); + } } @override diff --git a/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart b/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart index 664f63e41..a24f91d3c 100644 --- a/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart +++ b/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart @@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; import 'package:tmail_ui_user/features/push_notification/data/datasource/fcm_datasource.dart'; import 'package:tmail_ui_user/features/push_notification/data/datasource_impl/fcm_datasource_impl.dart'; import 'package:tmail_ui_user/features/push_notification/data/datasource_impl/cache_fcm_datasource_impl.dart'; @@ -108,6 +109,7 @@ class FcmInteractorBindings extends InteractorsBindings { Get.find(), Get.find(), Get.find(), + Get.find(), Get.find(), Get.find())); } diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 7c2f23b69..76c14a3c2 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-05-05T18:33:11.589556", + "@@last_modified": "2023-05-24T15:03:16.377036", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -2793,5 +2793,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "messageHasBeenSavedToTheSendingQueue": "Message has been saved to the sending queue.", + "@messageHasBeenSavedToTheSendingQueue": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index 62b804f58..6bf064ec6 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/caching/clients/opened_email_hive_cache_c import 'package:tmail_ui_user/features/caching/clients/recent_login_url_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/recent_login_username_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/recent_search_cache_client.dart'; +import 'package:tmail_ui_user/features/caching/clients/sending_email_hive_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/state_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/subscription_cache_client.dart'; import 'package:tmail_ui_user/features/caching/clients/token_oidc_cache_client.dart'; @@ -33,6 +34,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; import 'package:tmail_ui_user/features/push_notification/data/local/fcm_cache_manager.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'; @@ -76,6 +78,8 @@ class LocalBindings extends Bindings { Get.put(DetailedEmailCacheManager(Get.find(), Get.find())); Get.put(OpenedEmailHiveCacheClient()); Get.put(OpenedEmailCacheManager(Get.find(), Get.find())); + Get.put(SendingEmailHiveCacheClient()); + Get.put(SendingEmailCacheManager(Get.find())); Get.put(CachingManager( Get.find(), Get.find(), diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index b7b4d9123..be64bcc30 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -2869,4 +2869,11 @@ class AppLocalizations { 'Cannot select this image.', name: 'cannotSelectThisImage'); } + + String get messageHasBeenSavedToTheSendingQueue { + return Intl.message( + 'Message has been saved to the sending queue.', + name: 'messageHasBeenSavedToTheSendingQueue', + ); + } } \ No newline at end of file