From 5fd305d102f5130afcac0d805b938b8e95b17bda Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 15 Sep 2021 13:12:15 +0700 Subject: [PATCH] TF-78 Implement mark as unread when touch the "eye slash" icon on the top of screen EmailView --- lib/features/base/base_controller.dart | 4 + .../data/datasource/email_datasource.dart | 3 +- .../email_datasource_impl.dart | 5 +- .../email/data/network/email_api.dart | 6 +- .../repository/email_repository_impl.dart | 5 +- .../domain/repository/email_repository.dart | 3 +- .../state/mark_as_email_read_state.dart | 11 +- .../mark_as_email_read_interactor.dart | 9 +- .../email/presentation/email_controller.dart | 57 ++++--- .../email/presentation/email_view.dart | 55 +++--- .../widgets/app_bar_mail_widget_builder.dart | 24 ++- .../presentation/mailbox_controller.dart | 47 ++---- .../mailbox_dashboard_controller.dart | 10 -- .../mark_as_multiple_email_read_state.dart | 21 ++- ...ark_as_multiple_email_read_interactor.dart | 23 ++- .../presentation/thread_controller.dart | 156 +++++++++--------- .../thread/presentation/thread_view.dart | 2 +- ...bar_thread_select_mode_active_builder.dart | 12 +- lib/l10n/intl_en.arb | 53 +++++- lib/l10n/intl_fr.arb | 53 +++++- lib/l10n/intl_messages.arb | 38 ++--- lib/l10n/intl_ru.arb | 53 +++++- lib/l10n/intl_vi.arb | 53 +++++- lib/main/actions/app_action.dart | 8 - lib/main/actions/email_action.dart | 25 --- model/lib/email/read_actions.dart | 5 + .../keyword_identifier_extension.dart | 9 +- .../presentation_email_extension.dart | 4 +- model/lib/model.dart | 1 + 29 files changed, 462 insertions(+), 293 deletions(-) delete mode 100644 lib/main/actions/app_action.dart delete mode 100644 lib/main/actions/email_action.dart create mode 100644 model/lib/email/read_actions.dart diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index ba0d68259..123b49b7a 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -13,6 +13,10 @@ abstract class BaseController extends GetxController { ); } + void dispatchState(Either newState) { + viewState.value = newState; + } + void getState(Future> newStateStream) async { final state = await newStateStream; state.fold( diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index eae1d9c21..47e11246c 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -1,5 +1,6 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; abstract class EmailDataSource { @@ -7,5 +8,5 @@ abstract class EmailDataSource { Future sendEmail(AccountId accountId, EmailRequest emailRequest); - Future markAsRead(AccountId accountId, EmailId emailId, bool unread); + Future markAsRead(AccountId accountId, EmailId emailId, ReadActions readActions); } \ 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 62028b998..5f331fc14 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -1,5 +1,6 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.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/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; @@ -29,9 +30,9 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future markAsRead(AccountId accountId, EmailId emailId, bool unread) { + Future markAsRead(AccountId accountId, EmailId emailId, ReadActions readActions) { return Future.sync(() async { - return await emailAPI.markAsRead(accountId, emailId, unread); + return await emailAPI.markAsRead(accountId, emailId, readActions); }).catchError((error) { throw error; }); diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 1f4123fed..cdac1fc19 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -105,12 +105,10 @@ class EmailAPI { }); } - Future markAsRead(AccountId accountId, EmailId emailId, bool unread) async { + Future markAsRead(AccountId accountId, EmailId emailId, ReadActions readAction) async { final setEmailMethod = SetEmailMethod(accountId) ..addUpdates({ - emailId.id: PatchObject({ - KeyWordIdentifier.emailSeen.generatePath() : unread ? null : true - }) + emailId.id: KeyWordIdentifier.emailSeen.generateReadActionPath(readAction) }); final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation()); diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 7397a3aa1..6405cdaf6 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -1,6 +1,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.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/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -22,7 +23,7 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future markAsRead(AccountId accountId, EmailId emailId, bool unread) { - return emailDataSource.markAsRead(accountId, emailId, unread); + Future markAsRead(AccountId accountId, EmailId emailId, ReadActions readAction) { + return emailDataSource.markAsRead(accountId, emailId, readAction); } } \ No newline at end of file diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index c3ed30245..35cadbdb2 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -1,5 +1,6 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; abstract class EmailRepository { @@ -7,5 +8,5 @@ abstract class EmailRepository { Future sendEmail(AccountId accountId, EmailRequest emailRequest); - Future markAsRead(AccountId accountId, EmailId emailId, bool unread); + Future markAsRead(AccountId accountId, EmailId emailId, ReadActions readAction); } \ No newline at end of file diff --git a/lib/features/email/domain/state/mark_as_email_read_state.dart b/lib/features/email/domain/state/mark_as_email_read_state.dart index 853e5187f..7103efffa 100644 --- a/lib/features/email/domain/state/mark_as_email_read_state.dart +++ b/lib/features/email/domain/state/mark_as_email_read_state.dart @@ -1,20 +1,23 @@ import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/email/read_actions.dart'; class MarkAsEmailReadSuccess extends UIState { final EmailId emailId; + final ReadActions readActions; - MarkAsEmailReadSuccess(this.emailId); + MarkAsEmailReadSuccess(this.emailId, this.readActions); @override - List get props => []; + List get props => [emailId, readActions]; } class MarkAsEmailReadFailure extends FeatureFailure { final exception; + final ReadActions readActions; - MarkAsEmailReadFailure(this.exception); + MarkAsEmailReadFailure(this.exception, this.readActions); @override - List get props => [exception]; + List get props => [exception, readActions]; } \ No newline at end of file diff --git a/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart b/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart index 0dc503877..6bcb0dc8c 100644 --- a/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart +++ b/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart @@ -2,6 +2,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; @@ -10,12 +11,12 @@ class MarkAsEmailReadInteractor { MarkAsEmailReadInteractor(this.emailRepository); - Future> execute(AccountId accountId, EmailId emailId, bool unread) async { + Stream> execute(AccountId accountId, EmailId emailId, ReadActions readAction) async* { try { - final result = await emailRepository.markAsRead(accountId, emailId, unread); - return result ? Right(MarkAsEmailReadSuccess(emailId)) : Left(MarkAsEmailReadFailure(null)); + final result = await emailRepository.markAsRead(accountId, emailId, readAction); + yield result ? Right(MarkAsEmailReadSuccess(emailId, readAction)) : Left(MarkAsEmailReadFailure(null, readAction)); } catch (e) { - return Left(MarkAsEmailReadFailure(e)); + yield Left(MarkAsEmailReadFailure(e, readAction)); } } } \ No newline at end of file diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index 4e416ddb6..8218e602c 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -1,7 +1,5 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; @@ -13,8 +11,6 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; -import 'package:tmail_ui_user/main/actions/app_action.dart'; -import 'package:tmail_ui_user/main/actions/email_action.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -28,7 +24,6 @@ class EmailController extends BaseController { final emailAddressExpandMode = ExpandMode.COLLAPSE.obs; EmailContent? emailContent; - AppAction? emailActionCurrent; EmailController(this._getEmailContentInteractor, this._markAsEmailReadInteractor); @@ -37,12 +32,11 @@ class EmailController extends BaseController { super.onReady(); mailboxDashBoardController.selectedEmail.listen((presentationEmail) { toggleDisplayEmailAddressAction(expandMode: ExpandMode.COLLAPSE); - emailActionCurrent = null; final accountId = mailboxDashBoardController.accountId.value; if (accountId != null && presentationEmail != null) { _getEmailContentAction(accountId, presentationEmail.id); if (presentationEmail.isUnReadEmail()) { - markAsEmailRead(unread: false); + markAsEmailRead(presentationEmail, ReadActions.markAsRead); } } }); @@ -65,11 +59,19 @@ class EmailController extends BaseController { @override void onDone() { - viewState.value.map((success) { - if (success is GetEmailContentSuccess) { - emailContent = success.emailContent; - } - }); + viewState.value.fold( + (failure) { + if (failure is MarkAsEmailReadFailure) { + _markAsEmailReadFailure(failure); + } + }, + (success) { + if (success is GetEmailContentSuccess) { + emailContent = success.emailContent; + } else if (success is MarkAsEmailReadSuccess) { + _markAsEmailReadSuccess(success); + } + }); } @override @@ -80,36 +82,33 @@ class EmailController extends BaseController { emailAddressExpandMode.value = expandMode; } - void markAsEmailRead({required bool unread}) async { + void markAsEmailRead(PresentationEmail presentationEmail, ReadActions readActions) async { final accountId = mailboxDashBoardController.accountId.value; - final presentationEmail = mailboxDashBoardController.selectedEmail.value; final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; - if (accountId != null && presentationEmail != null && mailboxCurrent != null) { - _markAsEmailReadInteractor.execute(accountId, presentationEmail.id, unread) - .then((result) => result - .map((success) { - if (success is MarkAsEmailReadSuccess) { - emailActionCurrent = MarkAsEmailReadAction(presentationEmail.id, mailboxCurrent); - _updateMailboxDashBoardActionForDesktop(emailActionCurrent); - } - }) - ); + if (accountId != null && mailboxCurrent != null) { + consumeState(_markAsEmailReadInteractor.execute(accountId, presentationEmail.id, readActions)); } } - void _updateMailboxDashBoardActionForDesktop(AppAction? appAction) { - if (Get.context != null && responsiveUtils.isDesktop(Get.context!)) { - mailboxDashBoardController.setMailboxDashBoardAction(appAction); + void _markAsEmailReadSuccess(Success success) { + mailboxDashBoardController.dispatchState(Right(success)); + + if (success is MarkAsEmailReadSuccess && success.readActions == ReadActions.markAsUnread) { + backToThreadView(); } } + void _markAsEmailReadFailure(Failure failure) { + backToThreadView(); + } + bool canComposeEmail() => mailboxDashBoardController.sessionCurrent != null && mailboxDashBoardController.userProfile.value != null && mailboxDashBoardController.mapMailboxId.containsKey(PresentationMailbox.roleOutbox) && mailboxDashBoardController.selectedEmail.value != null; - void goToThreadView(BuildContext context) { - popBack(result: emailActionCurrent); + void backToThreadView() { + popBack(); } void pressEmailAction(EmailActionType emailActionType) { diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 85e465d6e..0b0fce7e8 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -22,40 +22,37 @@ class EmailView extends GetWidget { @override Widget build(BuildContext context) { - return WillPopScope( - child: Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: AppColor.primaryLightColor, - body: SafeArea( - right: false, - left: false, - child: Container( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - _buildAppBar(context), - Expanded(child: _buildEmailContent(context)), - _buildBottomBar(context), - ]) - ) - )), - onWillPop: () async { - emailController.goToThreadView(context); - return true; - }); + return Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: AppColor.primaryLightColor, + body: SafeArea( + right: false, + left: false, + child: Container( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildAppBar(context), + Expanded(child: _buildEmailContent(context)), + _buildBottomBar(context), + ]) + ) + )); } Widget _buildAppBar(BuildContext context) { return Obx(() => Padding( padding: EdgeInsets.only(left: 6, top: 6, right: 6, bottom: 6), - child: AppBarMailWidgetBuilder( - context, - imagePaths, - responsiveUtils, - emailController.mailboxDashBoardController.selectedEmail.value) - .onBackActionClick(() => emailController.goToThreadView(context)) + child: (AppBarMailWidgetBuilder( + context, + imagePaths, + responsiveUtils, + emailController.mailboxDashBoardController.selectedEmail.value) + ..onBackActionClick(() => emailController.backToThreadView()) + ..onUnreadEmailActionClick((presentationEmail) => + emailController.markAsEmailRead(presentationEmail, ReadActions.markAsUnread))) .build())); } diff --git a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart index a9e2b72dd..c74eb5f2e 100644 --- a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart +++ b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart @@ -7,9 +7,11 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; typedef OnBackActionClick = void Function(); +typedef OnUnreadEmailActionClick = void Function(PresentationEmail presentationEmail); class AppBarMailWidgetBuilder { OnBackActionClick? _onBackActionClick; + OnUnreadEmailActionClick? _onUnreadEmailActionClick; final BuildContext _context; final ImagePaths _imagePaths; @@ -23,10 +25,12 @@ class AppBarMailWidgetBuilder { this._presentationEmail, ); - AppBarMailWidgetBuilder onBackActionClick( - OnBackActionClick onBackActionClick) { + void onBackActionClick(OnBackActionClick onBackActionClick) { _onBackActionClick = onBackActionClick; - return this; + } + + void onUnreadEmailActionClick(OnUnreadEmailActionClick onUnreadEmailActionClick) { + _onUnreadEmailActionClick = onUnreadEmailActionClick; } Widget build() { @@ -68,17 +72,23 @@ class AppBarMailWidgetBuilder { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - ButtonBuilder(_imagePaths.icTrash).key(Key('button_delete_message')).build(), + ButtonBuilder(_imagePaths.icTrash).key(Key('button_move_to_trash_email')).build(), SizedBox(width: 10), - ButtonBuilder(_imagePaths.icEyeDisable).key(Key('button_hide_message')).build(), + ButtonBuilder(_imagePaths.icEyeDisable) + .key(Key('button_mark_as_unread_email')) + .onPressActionClick(() { + if (_onUnreadEmailActionClick != null && _presentationEmail != null && _presentationEmail!.isReadEmail()) { + _onUnreadEmailActionClick!(_presentationEmail!); + }}) + .build(), SizedBox(width: 10), ButtonBuilder((_presentationEmail != null && _presentationEmail!.isFlaggedEmail()) ? _imagePaths.icFlagged : _imagePaths.icFlag) - .key(Key('button_favorite_message')) + .key(Key('button_mark_as_flag_email')) .build(), SizedBox(width: 10), - ButtonBuilder(_imagePaths.icFolder).key(Key('button_add_folder_message')).build(), + ButtonBuilder(_imagePaths.icFolder).key(Key('button_move_to_mailbox_email')).build(), ] ); } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index d26988371..e46f3912a 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -4,9 +4,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart'; @@ -14,7 +14,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.d import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; -import 'package:tmail_ui_user/main/actions/email_action.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; class MailboxController extends BaseController { @@ -44,12 +44,14 @@ class MailboxController extends BaseController { } }); - mailboxDashBoardController.mailboxDashBoardAction.listen((action) { - if (action is MarkAsEmailReadAction) { - _updateCountUnReadForMailbox(action.presentationMailbox, countUnreadChange: 1, isUnread: false); - } else if (action is MarkAsMultipleEmailReadAndUnreadAction) { - _updateCountUnReadForMailbox(action.presentationMailbox, countUnreadChange: action.listEmailId.length, isUnread: action.isUnread); - } + mailboxDashBoardController.viewState.listen((state) { + state.map((success) { + if (success is MarkAsEmailReadSuccess || + success is MarkAsMultipleEmailReadAllSuccess || + success is MarkAsMultipleEmailReadHasSomeEmailFailure) { + refreshGetAllMailboxAction(); + } + }); }); } @@ -57,7 +59,6 @@ class MailboxController extends BaseController { void dispose() { super.dispose(); mailboxDashBoardController.accountId.close(); - mailboxDashBoardController.mailboxDashBoardAction.close(); } void refreshGetAllMailboxAction() { @@ -134,34 +135,6 @@ class MailboxController extends BaseController { } } - void _updateCountUnReadForMailbox( - PresentationMailbox presentationMailbox, - { - required int countUnreadChange, - required bool isUnread - } - ) { - if (presentationMailbox.hasRole()) { - final currentCountUnread = presentationMailbox.unreadEmails != null - ? presentationMailbox.unreadEmails!.value.value - : 0; - num newCountUnread = 0; - if (isUnread) { - newCountUnread = currentCountUnread + countUnreadChange; - } else { - newCountUnread = currentCountUnread > countUnreadChange ? currentCountUnread - countUnreadChange : 0; - } - final newMailbox = presentationMailbox.toPresentationMailbox(countUnRead: UnsignedInt(newCountUnread)); - final newDefaultMailboxList = defaultMailboxList - .map((mailbox) => mailbox.id == presentationMailbox.id - ? mailbox.toPresentationMailbox(countUnRead: UnsignedInt(newCountUnread)) - : mailbox) - .toList(); - defaultMailboxList.value = newDefaultMailboxList; - mailboxDashBoardController.setNewFirstSelectedMailbox(newMailbox); - } - } - void _deleteCredential() async { await _deleteCredentialInteractor.execute(); } diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index 5b2f13678..09d3490c2 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -9,7 +9,6 @@ import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/email_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart'; -import 'package:tmail_ui_user/main/actions/app_action.dart'; class MailboxDashBoardController extends BaseController { @@ -20,7 +19,6 @@ class MailboxDashBoardController extends BaseController { final selectedEmail = Rxn(); final accountId = Rxn(); final userProfile = Rxn(); - final mailboxDashBoardAction = Rxn(); Session? sessionCurrent; Map mapMailboxId = Map(); @@ -78,14 +76,6 @@ class MailboxDashBoardController extends BaseController { selectedEmail.value = newPresentationEmail; } - void setMailboxDashBoardAction(AppAction? newAction) { - mailboxDashBoardAction.value = newAction; - } - - void clearMailboxDashBoardAction() { - mailboxDashBoardAction.value = null; - } - void clearSelectedEmail() { selectedEmail.value = null; } diff --git a/lib/features/thread/domain/state/mark_as_multiple_email_read_state.dart b/lib/features/thread/domain/state/mark_as_multiple_email_read_state.dart index 67bc56927..e01d61953 100644 --- a/lib/features/thread/domain/state/mark_as_multiple_email_read_state.dart +++ b/lib/features/thread/domain/state/mark_as_multiple_email_read_state.dart @@ -1,38 +1,43 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; +import 'package:model/email/read_actions.dart'; class MarkAsMultipleEmailReadAllSuccess extends UIState { final List> resultList; + final ReadActions readActions; - MarkAsMultipleEmailReadAllSuccess(this.resultList); + MarkAsMultipleEmailReadAllSuccess(this.resultList, this.readActions); @override - List get props => [resultList]; + List get props => [resultList, readActions]; } class MarkAsMultipleEmailReadAllFailure extends FeatureFailure { final List> resultList; + final ReadActions readActions; - MarkAsMultipleEmailReadAllFailure(this.resultList); + MarkAsMultipleEmailReadAllFailure(this.resultList, this.readActions); @override - List get props => [resultList]; + List get props => [resultList, readActions]; } class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState { final List> resultList; + final ReadActions readActions; - MarkAsMultipleEmailReadHasSomeEmailFailure(this.resultList); + MarkAsMultipleEmailReadHasSomeEmailFailure(this.resultList, this.readActions); @override - List get props => [resultList]; + List get props => [resultList, readActions]; } class MarkAsMultipleEmailReadFailure extends FeatureFailure { final exception; + final ReadActions readActions; - MarkAsMultipleEmailReadFailure(this.exception); + MarkAsMultipleEmailReadFailure(this.exception, this.readActions); @override - List get props => [exception]; + List get props => [exception, readActions]; } \ No newline at end of file diff --git a/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart b/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart index fa49448b7..758efe375 100644 --- a/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart +++ b/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart @@ -2,6 +2,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; @@ -10,12 +11,18 @@ class MarkAsMultipleEmailReadInteractor { MarkAsMultipleEmailReadInteractor(this.markAsEmailReadInteractor); - Future> execute(AccountId accountId, List listEmailId, bool unread) async { + Stream> execute( + AccountId accountId, + List listEmailId, + ReadActions readAction + ) async* { try { - final listResult = await Future.wait(listEmailId.map((emailId) => - markAsEmailReadInteractor.execute(accountId, emailId, unread))); + final listResult = await Future.wait(listEmailId.map((emailId) async { + final result = await markAsEmailReadInteractor.execute(accountId, emailId, readAction).toList(); + return result.first; + })); if (listResult.length == 1) { - return listResult.first; + yield listResult.first; } else { var failedFileCount = 0; listResult.forEach((element) { @@ -24,14 +31,14 @@ class MarkAsMultipleEmailReadInteractor { } }); if (failedFileCount == 0) { - return Right(MarkAsMultipleEmailReadAllSuccess(listResult)); + yield Right(MarkAsMultipleEmailReadAllSuccess(listResult, readAction)); } else if (failedFileCount == listResult.length) { - return Left(MarkAsMultipleEmailReadAllFailure(listResult)); + yield Left(MarkAsMultipleEmailReadAllFailure(listResult, readAction)); } - return Right(MarkAsMultipleEmailReadHasSomeEmailFailure(listResult)); + yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(listResult, readAction)); } } catch (e) { - return Left(MarkAsMultipleEmailReadFailure(e)); + yield Left(MarkAsMultipleEmailReadFailure(e, readAction)); } } } \ 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 574cade91..93aa9957d 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -26,8 +26,6 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mail import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/load_more_state.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/email_context_menu_action_builder.dart'; -import 'package:tmail_ui_user/main/actions/app_action.dart'; -import 'package:tmail_ui_user/main/actions/email_action.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'; @@ -70,17 +68,13 @@ class ThreadController extends BaseController { _currentMailboxId = selectedMailbox?.id; refreshGetAllEmailAction(); } else { - final actionCurrent = mailboxDashBoardController.mailboxDashBoardAction.value; - if (actionCurrent is MarkAsEmailReadAction) { - final emailCurrent = mailboxDashBoardController.selectedEmail.value; - if (Get.context != null && responsiveUtils.isDesktop(Get.context!) && emailCurrent != null) { - _updateStateUnReadAllEmail([emailCurrent.id], isUnread: false); + mailboxDashBoardController.viewState.value.map((success) { + if (success is MarkAsEmailReadSuccess || + success is MarkAsMultipleEmailReadAllSuccess || + success is MarkAsMultipleEmailReadHasSomeEmailFailure) { + _refreshListEmailMarkAsRead(); } - mailboxDashBoardController.clearMailboxDashBoardAction(); - } else if (actionCurrent is MarkAsMultipleEmailReadAndUnreadAction) { - _updateStateUnReadAllEmail(actionCurrent.listEmailId, isUnread: actionCurrent.isUnread); - mailboxDashBoardController.clearMailboxDashBoardAction(); - } + }); } }); } @@ -100,22 +94,37 @@ class ThreadController extends BaseController { @override void onDone() { viewState.value.fold( - (failure) => _resetPositionCurrentAndLoadMoreState(), - (success) => _updateEmailList(success is GetAllEmailSuccess ? success.emailList : []) + (failure) { + if (failure is GetAllEmailFailure) { + _resetPositionCurrentAndLoadMoreState(); + } else if (failure is MarkAsEmailReadFailure || + failure is MarkAsMultipleEmailReadAllFailure || + failure is MarkAsMultipleEmailReadFailure) { + _markAsSelectedEmailReadFailure(failure); + } + }, + (success) { + if (success is GetAllEmailSuccess) { + _getAllEmailSuccess(success); + } else if (success is MarkAsEmailReadSuccess || + success is MarkAsMultipleEmailReadAllSuccess || + success is MarkAsMultipleEmailReadHasSomeEmailFailure) { + _markAsSelectedEmailReadSuccess(success); + } + } ); } @override void onError(error) { - _resetPositionCurrentAndLoadMoreState(); } - void _updateEmailList(List newListEmail) { - emailList.value += newListEmail; - - lastGetTotal = emailList.length; - - loadMoreState.value = newListEmail.isEmpty ? LoadMoreState.COMPLETED : LoadMoreState.IDLE; + void _getAllEmailSuccess(Success success) { + if (success is GetAllEmailSuccess) { + emailList.value += success.emailList; + lastGetTotal = emailList.length; + loadMoreState.value = success.emailList.isEmpty ? LoadMoreState.COMPLETED : LoadMoreState.IDLE; + } } EmailFilterCondition? _getFilterConditionCurrent() { @@ -226,90 +235,84 @@ class ThreadController extends BaseController { currentSelectMode.value = SelectMode.INACTIVE; } - void _updateStateUnReadAllEmail(List list, {required bool isUnread}) { - final newEmailList = emailList - .map((email) => list.contains(email.id) ? email.markAsReadPresentationEmail(isUnread: isUnread) : email) - .toList(); - emailList.value = newEmailList; + void _refreshListEmailMarkAsRead() { + final newLimit = emailList.isNotEmpty ? UnsignedInt(emailList.length) : ThreadConstants.defaultLimit; + loadMoreState.value = LoadMoreState.IDLE; + emailList.clear(); + + final accountId = mailboxDashBoardController.accountId.value; + + if (accountId != null) { + getAllEmailAction( + accountId, + limit: newLimit, + position: 0, + sort: _getSortCurrent(), + properties: _properties, + filter: _getFilterConditionCurrent()); + } } - void unreadSelectedEmail(List listEmail, {bool fromContextMenuAction = false}) { + void markAsSelectedEmailRead(List listEmail, {bool fromContextMenuAction = false}) { if (fromContextMenuAction) { popBack(); } - final isUnread = _isEmailAllRead(listEmail); + final readAction = _isEmailAllRead(listEmail) ? ReadActions.markAsUnread : ReadActions.markAsRead; final listEmailId = listEmail - .where((email) => isUnread ? email.isReadEmail() : email.isUnReadEmail()) + .where((email) => readAction == ReadActions.markAsUnread ? email.isReadEmail() : email.isUnReadEmail()) .map((email) => email.id) .toList(); final accountId = mailboxDashBoardController.accountId.value; final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; - if (accountId != null && mailboxCurrent != null) { - _markAsMultipleEmailReadInteractor - .execute(accountId, listEmailId, isUnread) - .then((result) => result.fold( - (failure) { - cancelSelectEmail(); - - if (failure is MarkAsEmailReadFailure - || failure is MarkAsMultipleEmailReadAllFailure - || failure is MarkAsMultipleEmailReadFailure) { - _appToast.showErrorToast(AppLocalizations.of(Get.context!).an_error_occurred); - } - }, - (success) { - cancelSelectEmail(); - final listEmailIdSuccess = _getListEmailIdMarkedAsReadSuccess(success); - - if (success is MarkAsEmailReadSuccess - || success is MarkAsMultipleEmailReadAllSuccess - || success is MarkAsMultipleEmailReadHasSomeEmailFailure) { - if (Get.context != null) { - _appToast.showSuccessToast(isUnread - ? AppLocalizations.of(Get.context!).marked_multiple_item_as_unread(listEmail.length) - : AppLocalizations.of(Get.context!).marked_multiple_item_as_read(listEmail.length)); - } - - if (listEmailIdSuccess.isNotEmpty) { - _updateStateEmailAndCountUnReadMailbox(MarkAsMultipleEmailReadAndUnreadAction(listEmailIdSuccess, mailboxCurrent, isUnread)); - } - } - })); + consumeState(_markAsMultipleEmailReadInteractor.execute(accountId, listEmailId, readAction)); } } - List _getListEmailIdMarkedAsReadSuccess(Success success) { - final listEmailIdSuccess = []; + void _markAsSelectedEmailReadSuccess(Success success) { + cancelSelectEmail(); + + List listEmailId = []; + ReadActions? readActions; if (success is MarkAsEmailReadSuccess) { - listEmailIdSuccess.add(success.emailId); + listEmailId.add(success.emailId); + readActions = success.readActions; } else if (success is MarkAsMultipleEmailReadAllSuccess) { success.resultList.forEach((either) { either.map((success) { if (success is MarkAsEmailReadSuccess) { - listEmailIdSuccess.add(success.emailId); + listEmailId.add(success.emailId); } }); }); + readActions = success.readActions; } else if (success is MarkAsMultipleEmailReadHasSomeEmailFailure) { success.resultList.forEach((either) { either.map((success) { if (success is MarkAsEmailReadSuccess) { - listEmailIdSuccess.add(success.emailId); + listEmailId.add(success.emailId); } }); }); + readActions = success.readActions; } - return listEmailIdSuccess; + if (Get.context != null && readActions != null) { + _appToast.showSuccessToast(readActions == ReadActions.markAsUnread + ? AppLocalizations.of(Get.context!).marked_multiple_item_as_unread(listEmailId.length) + : AppLocalizations.of(Get.context!).marked_multiple_item_as_read(listEmailId.length)); + } + + mailboxDashBoardController.dispatchState(Right(success)); } - void _updateStateEmailAndCountUnReadMailbox(AppAction? appAction) { - mailboxDashBoardController.setMailboxDashBoardAction(appAction); + void _markAsSelectedEmailReadFailure(Failure failure) { + cancelSelectEmail(); + _appToast.showErrorToast(AppLocalizations.of(Get.context!).an_error_occurred); } void openContextMenuSelectedEmail(BuildContext context, ImagePaths imagePaths, List listEmail) { @@ -322,20 +325,20 @@ class ThreadController extends BaseController { return [ _moveToTrashAction(context, imagePaths, listEmail), _moveToMailboxAction(context, imagePaths, listEmail), - _markAsSeenAction(context, imagePaths, listEmail), + _markAsReadAction(context, imagePaths, listEmail), _markAsFlagAction(context, imagePaths, listEmail), _moveToSpamAction(context, imagePaths, listEmail), SizedBox(height: 40), ]; } - Widget _markAsSeenAction(BuildContext context, ImagePaths imagePaths, List listEmail) { + Widget _markAsReadAction(BuildContext context, ImagePaths imagePaths, List listEmail) { return (EmailContextMenuActionBuilder( - Key('mark_as_seen_context_menu_action'), + Key('mark_as_read_context_menu_action'), SvgPicture.asset(imagePaths.icEyeDisable, width: 24, height: 24, fit: BoxFit.fill), _isEmailAllRead(listEmail) ? AppLocalizations.of(context).mark_as_unread : AppLocalizations.of(context).mark_as_read, listEmail) - ..onActionClick((data) => unreadSelectedEmail(data, fromContextMenuAction: true))) + ..onActionClick((data) => markAsSelectedEmailRead(data, fromContextMenuAction: true))) .build(); } @@ -383,13 +386,8 @@ class ThreadController extends BaseController { mailboxDashBoardController.openDrawer(); } - void goToEmail(BuildContext context) async { - final action = await push(AppRoutes.EMAIL); - if (action is MarkAsEmailReadAction) { - _updateStateUnReadAllEmail([action.emailId], isUnread: false); - mailboxDashBoardController.setMailboxDashBoardAction(action); - } - mailboxDashBoardController.clearSelectedEmail(); + void goToEmail(BuildContext context) { + push(AppRoutes.EMAIL); } void composeEmailAction() { diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index d9e5556bf..1a62c8a17 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -76,7 +76,7 @@ class ThreadView extends GetWidget { controller.getListEmailSelected()) ..addCloseActionClick(() => controller.cancelSelectEmail()) ..addRemoveEmailActionClick((listEmail) => {}) - ..addUnreadEmailActionClick((listEmail) => controller.unreadSelectedEmail(listEmail)) + ..addOnMarkAsEmailReadActionClick((listEmail) => controller.markAsSelectedEmailRead(listEmail)) ..addOpenContextMenuActionClick((listEmail) => controller.openContextMenuSelectedEmail(context, imagePaths, listEmail))) .build())); } diff --git a/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart b/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart index c4b08ab51..2cb4d8274 100644 --- a/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart +++ b/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart @@ -6,13 +6,13 @@ import 'package:model/email/presentation_email.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; typedef OnCloseActionClick = void Function(); -typedef OnUnreadEmailActionClick = void Function(List listEmail); +typedef OnMarkAsEmailReadActionClick = void Function(List listEmail); typedef OnRemoveEmailActionClick = void Function(List listEmail); typedef OnOpenContextMenuActionClick = void Function(List listEmail); class AppBarThreadSelectModeActiveBuilder { OnCloseActionClick? _onCloseActionClick; - OnUnreadEmailActionClick? _onUnreadEmailActionClick; + OnMarkAsEmailReadActionClick? _onMarkAsEmailReadActionClick; OnRemoveEmailActionClick? _onRemoveEmailActionClick; OnOpenContextMenuActionClick? _onOpenContextMenuActionClick; @@ -26,8 +26,8 @@ class AppBarThreadSelectModeActiveBuilder { _onCloseActionClick = onCloseActionClick; } - void addUnreadEmailActionClick(OnUnreadEmailActionClick onUnreadEmailActionClick) { - _onUnreadEmailActionClick = onUnreadEmailActionClick; + void addOnMarkAsEmailReadActionClick(OnMarkAsEmailReadActionClick onMarkAsEmailReadActionClick) { + _onMarkAsEmailReadActionClick = onMarkAsEmailReadActionClick; } void addRemoveEmailActionClick(OnRemoveEmailActionClick onRemoveEmailActionClick) { @@ -94,8 +94,8 @@ class AppBarThreadSelectModeActiveBuilder { SizedBox(width: 10), ButtonBuilder(_imagePaths.icEyeDisable).key(Key('button_unread_email_selected')) .onPressActionClick(() { - if (_onUnreadEmailActionClick != null) { - _onUnreadEmailActionClick!(_listEmail); + if (_onMarkAsEmailReadActionClick != null) { + _onMarkAsEmailReadActionClick!(_listEmail); }}) .build(), SizedBox(width: 10), diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 860655f45..11a5a7b2a 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1,133 +1,162 @@ { - "@@last_modified": "2021-07-01T16:29:46.979874", + "@@last_modified": "2021-09-15T13:25:41.117609", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login_text_slogan": "Team Mail", "@login_text_slogan": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "prefix_https": "https://", "@prefix_https": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "username": "username", "@username": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "password": "password", "@password": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login": "Login", "@login": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login_text_login_to_continue": "Please login to continue", "@login_text_login_to_continue": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "unknown_error_login_message": "Unknown error occurred, please try again", "@unknown_error_login_message": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "search_folder": "Search folder", "@search_folder": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "storage": "STORAGE", "@storage": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "my_folders": "MY FOLDERS", "@my_folders": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "new_folder": "New folder", "@new_folder": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "reply_all": "Reply all", "@reply_all": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "reply": "Reply", "@reply": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "forward": "Forward", "@forward": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "no_emails": "No emails", "@no_emails": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "no_mail_selected": "No email selected", "@no_mail_selected": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "from_email_address_prefix": "From", "@from_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "to_email_address_prefix": "To", "@to_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "unread_email_notification": "new", "@unread_email_notification": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "bcc_email_address_prefix": "Bcc", "@bcc_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "cc_email_address_prefix": "Cc", "@cc_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "hint_text_email_address": "Name or email address", "@hint_text_email_address": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "subject_email": "Subject", "@subject_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "hint_content_email_composer": "Start writing your email here", "@hint_content_email_composer": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "header_email_quoted": "On {sentDate}, from {emailAddress}", "@header_email_quoted": { "type": "text", + "placeholders_order": [ + "sentDate", + "emailAddress" + ], "placeholders": { "sentDate": {}, "emailAddress": {} @@ -136,36 +165,45 @@ "prefix_reply_email": "Re:", "@prefix_reply_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "prefix_forward_email": "Fwd:", "@prefix_forward_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "your_email_being_sent": "Your email being sent...", "@your_email_being_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "your_email_should_have_at_least_one_recipient": "Your email should have at least one recipient", "@your_email_should_have_at_least_one_recipient": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "message_sent": "Message sent", "@message_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "error_message_sent": "Error message sent", "@error_message_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "count_email_selected": "{count} selected", "@count_email_selected": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -173,36 +211,45 @@ "mark_as_unread": "Mark as unread", "@mark_as_unread": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_read": "Mark as read", "@mark_as_read": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_trash": "Move to trash", "@move_to_trash": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_mailbox": "Move to mailbox", "@move_to_mailbox": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_flag": "Star", "@mark_as_flag": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_spam": "Move to spam", "@move_to_spam": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "marked_multiple_item_as_read": "Marked {count} item as read", "@marked_multiple_item_as_read": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -210,6 +257,9 @@ "marked_multiple_item_as_unread": "Marked {count} item as unread", "@marked_multiple_item_as_unread": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -217,6 +267,7 @@ "an_error_occurred": "Error! An error occurred. Please try again later.", "@an_error_occurred": { "type": "text", + "placeholders_order": [], "placeholders": {} } } \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 860655f45..11a5a7b2a 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -1,133 +1,162 @@ { - "@@last_modified": "2021-07-01T16:29:46.979874", + "@@last_modified": "2021-09-15T13:25:41.117609", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login_text_slogan": "Team Mail", "@login_text_slogan": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "prefix_https": "https://", "@prefix_https": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "username": "username", "@username": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "password": "password", "@password": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login": "Login", "@login": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login_text_login_to_continue": "Please login to continue", "@login_text_login_to_continue": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "unknown_error_login_message": "Unknown error occurred, please try again", "@unknown_error_login_message": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "search_folder": "Search folder", "@search_folder": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "storage": "STORAGE", "@storage": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "my_folders": "MY FOLDERS", "@my_folders": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "new_folder": "New folder", "@new_folder": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "reply_all": "Reply all", "@reply_all": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "reply": "Reply", "@reply": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "forward": "Forward", "@forward": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "no_emails": "No emails", "@no_emails": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "no_mail_selected": "No email selected", "@no_mail_selected": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "from_email_address_prefix": "From", "@from_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "to_email_address_prefix": "To", "@to_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "unread_email_notification": "new", "@unread_email_notification": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "bcc_email_address_prefix": "Bcc", "@bcc_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "cc_email_address_prefix": "Cc", "@cc_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "hint_text_email_address": "Name or email address", "@hint_text_email_address": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "subject_email": "Subject", "@subject_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "hint_content_email_composer": "Start writing your email here", "@hint_content_email_composer": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "header_email_quoted": "On {sentDate}, from {emailAddress}", "@header_email_quoted": { "type": "text", + "placeholders_order": [ + "sentDate", + "emailAddress" + ], "placeholders": { "sentDate": {}, "emailAddress": {} @@ -136,36 +165,45 @@ "prefix_reply_email": "Re:", "@prefix_reply_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "prefix_forward_email": "Fwd:", "@prefix_forward_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "your_email_being_sent": "Your email being sent...", "@your_email_being_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "your_email_should_have_at_least_one_recipient": "Your email should have at least one recipient", "@your_email_should_have_at_least_one_recipient": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "message_sent": "Message sent", "@message_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "error_message_sent": "Error message sent", "@error_message_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "count_email_selected": "{count} selected", "@count_email_selected": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -173,36 +211,45 @@ "mark_as_unread": "Mark as unread", "@mark_as_unread": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_read": "Mark as read", "@mark_as_read": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_trash": "Move to trash", "@move_to_trash": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_mailbox": "Move to mailbox", "@move_to_mailbox": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_flag": "Star", "@mark_as_flag": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_spam": "Move to spam", "@move_to_spam": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "marked_multiple_item_as_read": "Marked {count} item as read", "@marked_multiple_item_as_read": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -210,6 +257,9 @@ "marked_multiple_item_as_unread": "Marked {count} item as unread", "@marked_multiple_item_as_unread": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -217,6 +267,7 @@ "an_error_occurred": "Error! An error occurred. Please try again later.", "@an_error_occurred": { "type": "text", + "placeholders_order": [], "placeholders": {} } } \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index bfa2ffaf0..11a5a7b2a 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-09-15T11:00:57.061103", + "@@last_modified": "2021-09-15T13:25:41.117609", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -198,29 +198,12 @@ "placeholders_order": [], "placeholders": {} }, - "your_email_being_sent": "Your email being sent...", - "@your_email_being_sent": { - "type": "text", - "placeholders": {} - }, - "your_email_should_have_at_least_one_recipient": "Your email should have at least one recipient", - "@your_email_should_have_at_least_one_recipient": { - "type": "text", - "placeholders": {} - }, - "message_sent": "Message sent", - "@message_sent": { - "type": "text", - "placeholders": {} - }, - "error_message_sent": "Error message sent", - "@error_message_sent": { - "type": "text", - "placeholders": {} - }, "count_email_selected": "{count} selected", "@count_email_selected": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -228,36 +211,45 @@ "mark_as_unread": "Mark as unread", "@mark_as_unread": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_read": "Mark as read", "@mark_as_read": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_trash": "Move to trash", "@move_to_trash": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_mailbox": "Move to mailbox", "@move_to_mailbox": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_flag": "Star", "@mark_as_flag": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_spam": "Move to spam", "@move_to_spam": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "marked_multiple_item_as_read": "Marked {count} item as read", "@marked_multiple_item_as_read": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -265,6 +257,9 @@ "marked_multiple_item_as_unread": "Marked {count} item as unread", "@marked_multiple_item_as_unread": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -272,6 +267,7 @@ "an_error_occurred": "Error! An error occurred. Please try again later.", "@an_error_occurred": { "type": "text", + "placeholders_order": [], "placeholders": {} } } \ No newline at end of file diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 860655f45..11a5a7b2a 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -1,133 +1,162 @@ { - "@@last_modified": "2021-07-01T16:29:46.979874", + "@@last_modified": "2021-09-15T13:25:41.117609", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login_text_slogan": "Team Mail", "@login_text_slogan": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "prefix_https": "https://", "@prefix_https": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "username": "username", "@username": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "password": "password", "@password": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login": "Login", "@login": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login_text_login_to_continue": "Please login to continue", "@login_text_login_to_continue": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "unknown_error_login_message": "Unknown error occurred, please try again", "@unknown_error_login_message": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "search_folder": "Search folder", "@search_folder": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "storage": "STORAGE", "@storage": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "my_folders": "MY FOLDERS", "@my_folders": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "new_folder": "New folder", "@new_folder": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "reply_all": "Reply all", "@reply_all": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "reply": "Reply", "@reply": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "forward": "Forward", "@forward": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "no_emails": "No emails", "@no_emails": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "no_mail_selected": "No email selected", "@no_mail_selected": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "from_email_address_prefix": "From", "@from_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "to_email_address_prefix": "To", "@to_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "unread_email_notification": "new", "@unread_email_notification": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "bcc_email_address_prefix": "Bcc", "@bcc_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "cc_email_address_prefix": "Cc", "@cc_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "hint_text_email_address": "Name or email address", "@hint_text_email_address": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "subject_email": "Subject", "@subject_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "hint_content_email_composer": "Start writing your email here", "@hint_content_email_composer": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "header_email_quoted": "On {sentDate}, from {emailAddress}", "@header_email_quoted": { "type": "text", + "placeholders_order": [ + "sentDate", + "emailAddress" + ], "placeholders": { "sentDate": {}, "emailAddress": {} @@ -136,36 +165,45 @@ "prefix_reply_email": "Re:", "@prefix_reply_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "prefix_forward_email": "Fwd:", "@prefix_forward_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "your_email_being_sent": "Your email being sent...", "@your_email_being_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "your_email_should_have_at_least_one_recipient": "Your email should have at least one recipient", "@your_email_should_have_at_least_one_recipient": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "message_sent": "Message sent", "@message_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "error_message_sent": "Error message sent", "@error_message_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "count_email_selected": "{count} selected", "@count_email_selected": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -173,36 +211,45 @@ "mark_as_unread": "Mark as unread", "@mark_as_unread": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_read": "Mark as read", "@mark_as_read": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_trash": "Move to trash", "@move_to_trash": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_mailbox": "Move to mailbox", "@move_to_mailbox": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_flag": "Star", "@mark_as_flag": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_spam": "Move to spam", "@move_to_spam": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "marked_multiple_item_as_read": "Marked {count} item as read", "@marked_multiple_item_as_read": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -210,6 +257,9 @@ "marked_multiple_item_as_unread": "Marked {count} item as unread", "@marked_multiple_item_as_unread": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -217,6 +267,7 @@ "an_error_occurred": "Error! An error occurred. Please try again later.", "@an_error_occurred": { "type": "text", + "placeholders_order": [], "placeholders": {} } } \ No newline at end of file diff --git a/lib/l10n/intl_vi.arb b/lib/l10n/intl_vi.arb index 860655f45..11a5a7b2a 100644 --- a/lib/l10n/intl_vi.arb +++ b/lib/l10n/intl_vi.arb @@ -1,133 +1,162 @@ { - "@@last_modified": "2021-07-01T16:29:46.979874", + "@@last_modified": "2021-09-15T13:25:41.117609", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login_text_slogan": "Team Mail", "@login_text_slogan": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "prefix_https": "https://", "@prefix_https": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "username": "username", "@username": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "password": "password", "@password": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login": "Login", "@login": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "login_text_login_to_continue": "Please login to continue", "@login_text_login_to_continue": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "unknown_error_login_message": "Unknown error occurred, please try again", "@unknown_error_login_message": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "search_folder": "Search folder", "@search_folder": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "storage": "STORAGE", "@storage": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "my_folders": "MY FOLDERS", "@my_folders": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "new_folder": "New folder", "@new_folder": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "reply_all": "Reply all", "@reply_all": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "reply": "Reply", "@reply": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "forward": "Forward", "@forward": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "no_emails": "No emails", "@no_emails": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "no_mail_selected": "No email selected", "@no_mail_selected": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "from_email_address_prefix": "From", "@from_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "to_email_address_prefix": "To", "@to_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "unread_email_notification": "new", "@unread_email_notification": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "bcc_email_address_prefix": "Bcc", "@bcc_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "cc_email_address_prefix": "Cc", "@cc_email_address_prefix": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "hint_text_email_address": "Name or email address", "@hint_text_email_address": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "subject_email": "Subject", "@subject_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "hint_content_email_composer": "Start writing your email here", "@hint_content_email_composer": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "header_email_quoted": "On {sentDate}, from {emailAddress}", "@header_email_quoted": { "type": "text", + "placeholders_order": [ + "sentDate", + "emailAddress" + ], "placeholders": { "sentDate": {}, "emailAddress": {} @@ -136,36 +165,45 @@ "prefix_reply_email": "Re:", "@prefix_reply_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "prefix_forward_email": "Fwd:", "@prefix_forward_email": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "your_email_being_sent": "Your email being sent...", "@your_email_being_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "your_email_should_have_at_least_one_recipient": "Your email should have at least one recipient", "@your_email_should_have_at_least_one_recipient": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "message_sent": "Message sent", "@message_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "error_message_sent": "Error message sent", "@error_message_sent": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "count_email_selected": "{count} selected", "@count_email_selected": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -173,36 +211,45 @@ "mark_as_unread": "Mark as unread", "@mark_as_unread": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_read": "Mark as read", "@mark_as_read": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_trash": "Move to trash", "@move_to_trash": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_mailbox": "Move to mailbox", "@move_to_mailbox": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "mark_as_flag": "Star", "@mark_as_flag": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "move_to_spam": "Move to spam", "@move_to_spam": { "type": "text", + "placeholders_order": [], "placeholders": {} }, "marked_multiple_item_as_read": "Marked {count} item as read", "@marked_multiple_item_as_read": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -210,6 +257,9 @@ "marked_multiple_item_as_unread": "Marked {count} item as unread", "@marked_multiple_item_as_unread": { "type": "text", + "placeholders_order": [ + "count" + ], "placeholders": { "count": {} } @@ -217,6 +267,7 @@ "an_error_occurred": "Error! An error occurred. Please try again later.", "@an_error_occurred": { "type": "text", + "placeholders_order": [], "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/actions/app_action.dart b/lib/main/actions/app_action.dart deleted file mode 100644 index 32cef7853..000000000 --- a/lib/main/actions/app_action.dart +++ /dev/null @@ -1,8 +0,0 @@ - -import 'package:equatable/equatable.dart'; - -abstract class AppAction with EquatableMixin {} - -abstract class ActionOnline extends AppAction {} - -abstract class ActionOffline extends AppAction {} \ No newline at end of file diff --git a/lib/main/actions/email_action.dart b/lib/main/actions/email_action.dart deleted file mode 100644 index 133212945..000000000 --- a/lib/main/actions/email_action.dart +++ /dev/null @@ -1,25 +0,0 @@ - -import 'package:jmap_dart_client/jmap/mail/email/email.dart'; -import 'package:model/mailbox/presentation_mailbox.dart'; -import 'package:tmail_ui_user/main/actions/app_action.dart'; - -class MarkAsEmailReadAction extends ActionOffline { - final EmailId emailId; - final PresentationMailbox presentationMailbox; - - MarkAsEmailReadAction(this.emailId, this.presentationMailbox); - - @override - List get props => [emailId, presentationMailbox]; -} - -class MarkAsMultipleEmailReadAndUnreadAction extends ActionOffline { - final List listEmailId; - final PresentationMailbox presentationMailbox; - final bool isUnread; - - MarkAsMultipleEmailReadAndUnreadAction(this.listEmailId, this.presentationMailbox, this.isUnread); - - @override - List get props => [listEmailId, presentationMailbox, isUnread]; -} \ No newline at end of file diff --git a/model/lib/email/read_actions.dart b/model/lib/email/read_actions.dart new file mode 100644 index 000000000..ad13816f1 --- /dev/null +++ b/model/lib/email/read_actions.dart @@ -0,0 +1,5 @@ + +enum ReadActions { + markAsRead, + markAsUnread +} \ No newline at end of file diff --git a/model/lib/extensions/keyword_identifier_extension.dart b/model/lib/extensions/keyword_identifier_extension.dart index 14e47d00d..227b23396 100644 --- a/model/lib/extensions/keyword_identifier_extension.dart +++ b/model/lib/extensions/keyword_identifier_extension.dart @@ -1,8 +1,15 @@ import 'package:jmap_dart_client/jmap/core/patch_object.dart'; import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; +import 'package:model/email/read_actions.dart'; extension KeyWordIdentifierExtension on KeyWordIdentifier { - String generatePath() { + String _generatePath() { return '${PatchObject.keywordsProperty}/$value'; } + + PatchObject generateReadActionPath(ReadActions readActions) { + return PatchObject({ + _generatePath(): readActions == ReadActions.markAsRead ? true : null + }); + } } \ No newline at end of file diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart index e3b346cad..b6ebfb3b9 100644 --- a/model/lib/extensions/presentation_email_extension.dart +++ b/model/lib/extensions/presentation_email_extension.dart @@ -14,10 +14,10 @@ extension PresentationEmailExtension on PresentationEmail { return ''; } - PresentationEmail markAsReadPresentationEmail({required bool isUnread}) { + PresentationEmail markAsReadPresentationEmail(ReadActions readActions) { var newKeyWord = keywords; - if (isUnread) { + if (readActions == ReadActions.markAsUnread) { newKeyWord?.removeWhere((key, value) => key == KeyWordIdentifier.emailSeen); } else { if (newKeyWord == null) { diff --git a/model/lib/model.dart b/model/lib/model.dart index 7d88be7ff..b33cc4ac9 100644 --- a/model/lib/model.dart +++ b/model/lib/model.dart @@ -27,6 +27,7 @@ export 'email/prefix_email_address.dart'; export 'email/email_action_type.dart'; export 'email/presentation_email_address.dart'; export 'email/email_address_cache.dart'; +export 'email/read_actions.dart'; // Extensions export 'extensions/email_address_extension.dart';