diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 9d9e55b37..54993977a 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -175,4 +175,14 @@ abstract class EmailDataSource { AccountId accountId, EmailId emailId, EventActionType eventActionType); + + Future markAsAnswered( + Session session, + AccountId accountId, + List emailIds); + + Future markAsForwarded( + Session session, + AccountId accountId, + List emailIds); } \ No newline at end of file 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 dcbf0d081..9e9c39522 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -368,4 +368,14 @@ class EmailDataSourceImpl extends EmailDataSource { eventActionType); }).catchError(_exceptionThrower.throwException); } + + @override + Future markAsAnswered(Session session, AccountId accountId, List emailIds) { + throw UnimplementedError(); + } + + @override + Future markAsForwarded(Session session, AccountId accountId, List emailIds) { + 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 c607b59bb..46d903386 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 @@ -476,4 +476,54 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { Future storeEventAttendanceStatus(Session session, AccountId accountId, EmailId emailId, EventActionType eventActionType) { throw UnimplementedError(); } + + @override + Future markAsAnswered(Session session, AccountId accountId, List emailIds) async { + final cacheEmails = await _emailCacheManager.getMultipleStoredEmails( + accountId, + session.username, + emailIds, + ); + + final storedEmails = cacheEmails + .map((emailCache) => emailCache.toEmail()) + .toList(); + + for (var email in storedEmails) { + email.keywords?[KeyWordIdentifier.emailAnswered] = true; + } + + await _emailCacheManager.storeMultipleEmails( + accountId, + session.username, + storedEmails.map((email) => email.toEmailCache()).toList(), + ); + + return Future.value(); + } + + @override + Future markAsForwarded(Session session, AccountId accountId, List emailIds) async { + final cacheEmails = await _emailCacheManager.getMultipleStoredEmails( + accountId, + session.username, + emailIds, + ); + + final storedEmails = cacheEmails + .map((emailCache) => emailCache.toEmail()) + .toList(); + + for (var email in storedEmails) { + email.keywords?[KeyWordIdentifier.emailForwarded] = true; + } + + await _emailCacheManager.storeMultipleEmails( + accountId, + session.username, + storedEmails.map((email) => email.toEmailCache()).toList(), + ); + + return Future.value(); + } } \ No newline at end of file diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 5b19266eb..241b00188 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -75,14 +75,38 @@ class EmailRepositoryImpl extends EmailRepository { CreateNewMailboxRequest? mailboxRequest, CancelToken? cancelToken } - ) { - return emailDataSource[DataSourceType.network]!.sendEmail( + ) async { + await emailDataSource[DataSourceType.network]!.sendEmail( session, accountId, emailRequest, mailboxRequest: mailboxRequest, cancelToken: cancelToken, ); + + if (emailRequest.isEmailAnswered) { + try { + await emailDataSource[DataSourceType.hiveCache]!.markAsAnswered( + session, + accountId, + [emailRequest.emailIdAnsweredOrForwarded!], + ); + } catch (e) { + logError('EmailRepositoryImpl::sendEmail::markAsAnswered:Exception $e'); + } + } else if (emailRequest.isEmailForwarded) { + try { + await emailDataSource[DataSourceType.hiveCache]!.markAsForwarded( + session, + accountId, + [emailRequest.emailIdAnsweredOrForwarded!], + ); + } catch (e) { + logError('EmailRepositoryImpl::sendEmail::markAsForwarded:Exception $e'); + } + } + + return Future.value(); } @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 da3abdcda..171cdac52 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -2722,6 +2722,14 @@ class MailboxDashBoardController extends ReloadableController success.emailRequest.previousEmailId != null) { unsubscribeMail(success.emailRequest.previousEmailId!); } + + if (success.emailRequest.isEmailAnswered) { + updateEmailAnswered(success.emailRequest.emailIdAnsweredOrForwarded!); + } + + if (success.emailRequest.isEmailForwarded) { + updateEmailForwarded(success.emailRequest.emailIdAnsweredOrForwarded!); + } } Future> getContactSuggestion(String query) async { diff --git a/lib/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart index f0771be0f..1fc76d271 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart @@ -3,6 +3,7 @@ import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; import 'package:model/email/mark_star_action.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/email/read_actions.dart'; +import 'package:model/extensions/presentation_email_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; @@ -11,13 +12,20 @@ extension UpdateCurrentEmailsFlagsExtension on MailboxDashBoardController { List emailIds, { ReadActions? readAction, MarkStarAction? markStarAction, + bool markAsAnswered = false, + bool markAsForwarded = false, }) { - if (readAction == null && markStarAction == null) return; + if (readAction == null && + markStarAction == null && + !markAsAnswered && + !markAsForwarded) return; final currentEmails = dashboardRoute.value == DashboardRoutes.searchEmail ? listResultSearch : emailsInCurrentMailbox; + if (currentEmails.isEmpty) return; + for (var email in currentEmails) { if (!emailIds.contains(email.id)) continue; @@ -42,6 +50,14 @@ extension UpdateCurrentEmailsFlagsExtension on MailboxDashBoardController { default: break; } + + if (markAsAnswered) { + _updateKeyword(email, KeyWordIdentifier.emailAnswered, true); + } + + if (markAsForwarded) { + _updateKeyword(email, KeyWordIdentifier.emailForwarded, true); + } } currentEmails.refresh(); @@ -58,4 +74,28 @@ extension UpdateCurrentEmailsFlagsExtension on MailboxDashBoardController { presentationEmail.keywords?.remove(keyword); } } + + void updateEmailAnswered(EmailId emailId) { + if (selectedEmail.value != null) { + final newEmail = selectedEmail.value!.updateKeywords({ + KeyWordIdentifier.emailAnswered: true, + }); + setSelectedEmail(newEmail); + } + + if (emailsInCurrentMailbox.isNotEmpty) { + updateEmailFlagByEmailIds([emailId], markAsAnswered: true); + } + } + + void updateEmailForwarded(EmailId emailId) { + if (selectedEmail.value != null) { + final newEmail = selectedEmail.value!.updateKeywords({ + KeyWordIdentifier.emailForwarded: true, + }); + setSelectedEmail(newEmail); + } + + updateEmailFlagByEmailIds([emailId], markAsForwarded: true); + } } \ No newline at end of file