TF-3385 Update mark as read and star
This commit is contained in:
@@ -568,4 +568,41 @@ abstract class BaseMailboxController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateUnreadCountOfMailboxById(
|
||||||
|
MailboxId mailboxId, {
|
||||||
|
required int unreadChanges,
|
||||||
|
}) {
|
||||||
|
final mailboxTrees = [
|
||||||
|
defaultMailboxTree,
|
||||||
|
personalMailboxTree,
|
||||||
|
teamMailboxesTree,
|
||||||
|
];
|
||||||
|
|
||||||
|
for (var mailboxTree in mailboxTrees) {
|
||||||
|
if (mailboxTree.value.updateMailboxUnreadCountById(mailboxId, unreadChanges)) {
|
||||||
|
mailboxTree.refresh();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearUnreadCount(MailboxId mailboxId) {
|
||||||
|
final mailboxTrees = [
|
||||||
|
defaultMailboxTree,
|
||||||
|
personalMailboxTree,
|
||||||
|
teamMailboxesTree,
|
||||||
|
];
|
||||||
|
|
||||||
|
for (var mailboxTree in mailboxTrees) {
|
||||||
|
final selectedNode = mailboxTree.value.findNode((node) => node.item.id == mailboxId);
|
||||||
|
if (selectedNode == null) continue;
|
||||||
|
final currentUnreadCount = selectedNode.item.unreadEmails?.value.value.toInt();
|
||||||
|
teamMailboxesTree.value.updateMailboxUnreadCountById(
|
||||||
|
mailboxId,
|
||||||
|
-(currentUnreadCount ?? 0));
|
||||||
|
teamMailboxesTree.refresh();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/email/read_actions.dart';
|
import 'package:model/email/read_actions.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
||||||
|
|
||||||
@@ -8,15 +9,17 @@ class MarkAsEmailReadSuccess extends UIState {
|
|||||||
final EmailId emailId;
|
final EmailId emailId;
|
||||||
final ReadActions readActions;
|
final ReadActions readActions;
|
||||||
final MarkReadAction markReadAction;
|
final MarkReadAction markReadAction;
|
||||||
|
final MailboxId? mailboxId;
|
||||||
|
|
||||||
MarkAsEmailReadSuccess(
|
MarkAsEmailReadSuccess(
|
||||||
this.emailId,
|
this.emailId,
|
||||||
this.readActions,
|
this.readActions,
|
||||||
this.markReadAction,
|
this.markReadAction,
|
||||||
|
this.mailboxId,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [emailId, readActions, markReadAction];
|
List<Object?> get props => [emailId, readActions, markReadAction, mailboxId];
|
||||||
}
|
}
|
||||||
|
|
||||||
class MarkAsEmailReadFailure extends FeatureFailure {
|
class MarkAsEmailReadFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/email/mark_star_action.dart';
|
import 'package:model/email/mark_star_action.dart';
|
||||||
|
|
||||||
class MarkAsStarEmailSuccess extends UIState {
|
class MarkAsStarEmailSuccess extends UIState {
|
||||||
final MarkStarAction markStarAction;
|
final MarkStarAction markStarAction;
|
||||||
|
final EmailId emailId;
|
||||||
|
|
||||||
MarkAsStarEmailSuccess(this.markStarAction);
|
MarkAsStarEmailSuccess(this.markStarAction, this.emailId);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [markStarAction];
|
List<Object?> get props => [markStarAction, emailId];
|
||||||
}
|
}
|
||||||
|
|
||||||
class MarkAsStarEmailFailure extends FeatureFailure {
|
class MarkAsStarEmailFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:dartz/dartz.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/account_id.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/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/email/read_actions.dart';
|
import 'package:model/email/read_actions.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
@@ -20,6 +21,7 @@ class MarkAsEmailReadInteractor {
|
|||||||
EmailId emailId,
|
EmailId emailId,
|
||||||
ReadActions readAction,
|
ReadActions readAction,
|
||||||
MarkReadAction markReadAction,
|
MarkReadAction markReadAction,
|
||||||
|
MailboxId? mailboxId,
|
||||||
) async* {
|
) async* {
|
||||||
try {
|
try {
|
||||||
final result = await _emailRepository.markAsRead(
|
final result = await _emailRepository.markAsRead(
|
||||||
@@ -36,7 +38,8 @@ class MarkAsEmailReadInteractor {
|
|||||||
result.emailIdsSuccess.first,
|
result.emailIdsSuccess.first,
|
||||||
readAction,
|
readAction,
|
||||||
markReadAction,
|
markReadAction,
|
||||||
));
|
mailboxId,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left(MarkAsEmailReadFailure(readAction, exception: e));
|
yield Left(MarkAsEmailReadFailure(readAction, exception: e));
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class MarkAsStarEmailInteractor {
|
|||||||
[emailId],
|
[emailId],
|
||||||
markStarAction,
|
markStarAction,
|
||||||
);
|
);
|
||||||
yield Right(MarkAsStarEmailSuccess(markStarAction));
|
yield Right(MarkAsStarEmailSuccess(markStarAction, emailId));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left(MarkAsStarEmailFailure(markStarAction, exception: e));
|
yield Left(MarkAsStarEmailFailure(markStarAction, exception: e));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.d
|
|||||||
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_email_rule_filter_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_email_rule_filter_request.dart';
|
||||||
@@ -663,11 +664,18 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
presentationEmail.id!,
|
presentationEmail.id!,
|
||||||
readActions,
|
readActions,
|
||||||
markReadAction,
|
markReadAction,
|
||||||
|
presentationEmail.mailboxContain?.mailboxId,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handleMarkAsEmailReadCompleted(ReadActions readActions) {
|
void _handleMarkAsEmailReadCompleted(ReadActions readActions) {
|
||||||
|
if (_currentEmailId != null) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
[_currentEmailId!],
|
||||||
|
readAction: ReadActions.markAsRead,
|
||||||
|
);
|
||||||
|
}
|
||||||
if (readActions == ReadActions.markAsUnread) {
|
if (readActions == ReadActions.markAsUnread) {
|
||||||
closeEmailView(context: currentContext);
|
closeEmailView(context: currentContext);
|
||||||
}
|
}
|
||||||
@@ -1083,7 +1091,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
|
|||||||
|
|
||||||
void _markAsEmailStarSuccess(MarkAsStarEmailSuccess success) {
|
void _markAsEmailStarSuccess(MarkAsStarEmailSuccess success) {
|
||||||
final newEmail = currentEmail?.updateKeywords({
|
final newEmail = currentEmail?.updateKeywords({
|
||||||
KeyWordIdentifier.emailFlagged: true,
|
KeyWordIdentifier.emailFlagged: success.markStarAction == MarkStarAction.markStar,
|
||||||
});
|
});
|
||||||
mailboxDashBoardController.setSelectedEmail(newEmail);
|
mailboxDashBoardController.setSelectedEmail(newEmail);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||||
|
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/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
||||||
|
|
||||||
@@ -24,8 +25,10 @@ class UpdatingMarkAsMailboxReadState extends UIState {
|
|||||||
class MarkAsMailboxReadAllSuccess extends UIActionState {
|
class MarkAsMailboxReadAllSuccess extends UIActionState {
|
||||||
|
|
||||||
final String mailboxDisplayName;
|
final String mailboxDisplayName;
|
||||||
|
final MailboxId mailboxId;
|
||||||
|
|
||||||
MarkAsMailboxReadAllSuccess(this.mailboxDisplayName,
|
MarkAsMailboxReadAllSuccess(this.mailboxDisplayName,
|
||||||
|
this.mailboxId,
|
||||||
{
|
{
|
||||||
jmap.State? currentEmailState,
|
jmap.State? currentEmailState,
|
||||||
jmap.State? currentMailboxState,
|
jmap.State? currentMailboxState,
|
||||||
@@ -35,6 +38,7 @@ class MarkAsMailboxReadAllSuccess extends UIActionState {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [
|
List<Object?> get props => [
|
||||||
mailboxDisplayName,
|
mailboxDisplayName,
|
||||||
|
mailboxId,
|
||||||
...super.props
|
...super.props
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -43,16 +47,22 @@ class MarkAsMailboxReadHasSomeEmailFailure extends UIState {
|
|||||||
|
|
||||||
final String mailboxDisplayName;
|
final String mailboxDisplayName;
|
||||||
final int countEmailsRead;
|
final int countEmailsRead;
|
||||||
|
final MailboxId mailboxId;
|
||||||
|
final List<EmailId> successEmailIds;
|
||||||
|
|
||||||
MarkAsMailboxReadHasSomeEmailFailure(
|
MarkAsMailboxReadHasSomeEmailFailure(
|
||||||
this.mailboxDisplayName,
|
this.mailboxDisplayName,
|
||||||
this.countEmailsRead,
|
this.countEmailsRead,
|
||||||
|
this.mailboxId,
|
||||||
|
this.successEmailIds,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [
|
List<Object?> get props => [
|
||||||
mailboxDisplayName,
|
mailboxDisplayName,
|
||||||
countEmailsRead,
|
countEmailsRead,
|
||||||
|
mailboxId,
|
||||||
|
successEmailIds,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,11 +34,13 @@ class MarkAsMailboxReadInteractor {
|
|||||||
onProgressController);
|
onProgressController);
|
||||||
|
|
||||||
if (totalEmailUnread == listEmails.length) {
|
if (totalEmailUnread == listEmails.length) {
|
||||||
yield Right(MarkAsMailboxReadAllSuccess(mailboxDisplayName));
|
yield Right(MarkAsMailboxReadAllSuccess(mailboxDisplayName, mailboxId));
|
||||||
} else if (listEmails.isNotEmpty) {
|
} else if (listEmails.isNotEmpty) {
|
||||||
yield Right(MarkAsMailboxReadHasSomeEmailFailure(
|
yield Right(MarkAsMailboxReadHasSomeEmailFailure(
|
||||||
mailboxDisplayName,
|
mailboxDisplayName,
|
||||||
listEmails.length,
|
listEmails.length,
|
||||||
|
mailboxId,
|
||||||
|
listEmails,
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
yield Left(MarkAsMailboxReadAllFailure(mailboxDisplayName: mailboxDisplayName));
|
yield Left(MarkAsMailboxReadAllFailure(mailboxDisplayName: mailboxDisplayName));
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart';
|
|||||||
import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart';
|
import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart';
|
||||||
import 'package:tmail_ui_user/features/base/mixin/mailbox_action_handler_mixin.dart';
|
import 'package:tmail_ui_user/features/base/mixin/mailbox_action_handler_mixin.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
||||||
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
|
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
|
||||||
@@ -36,6 +37,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.da
|
|||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_all_mailboxes_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_all_mailboxes_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
|
||||||
@@ -70,6 +72,7 @@ import 'package:tmail_ui_user/features/push_notification/presentation/websocket/
|
|||||||
import 'package:tmail_ui_user/features/push_notification/presentation/websocket/web_socket_queue_handler.dart';
|
import 'package:tmail_ui_user/features/push_notification/presentation/websocket/web_socket_queue_handler.dart';
|
||||||
import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_bindings.dart';
|
import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.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/app_routes.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
|
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
|
||||||
@@ -255,6 +258,71 @@ class MailboxController extends BaseMailboxController
|
|||||||
mailboxDashBoardController.clearMailboxUIAction();
|
mailboxDashBoardController.clearMailboxUIAction();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ever(mailboxDashBoardController.viewState, (viewState) {
|
||||||
|
final reactionState = viewState.getOrElse(() => UIState.idle);
|
||||||
|
if (reactionState is MarkAsEmailReadSuccess) {
|
||||||
|
_handleMarkEmailsAsReadOrUnread(
|
||||||
|
affectedMailboxId: reactionState.mailboxId,
|
||||||
|
readCount: reactionState.readActions == ReadActions.markAsRead
|
||||||
|
? 1
|
||||||
|
: null,
|
||||||
|
unreadCount: reactionState.readActions == ReadActions.markAsUnread
|
||||||
|
? 1
|
||||||
|
: null,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMultipleEmailReadAllSuccess) {
|
||||||
|
_handleMarkEmailsAsReadOrUnread(
|
||||||
|
affectedMailboxId: reactionState.mailboxId,
|
||||||
|
readCount: reactionState.readActions == ReadActions.markAsRead
|
||||||
|
? reactionState.emailIds.length
|
||||||
|
: null,
|
||||||
|
unreadCount: reactionState.readActions == ReadActions.markAsUnread
|
||||||
|
? reactionState.emailIds.length
|
||||||
|
: null,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||||
|
_handleMarkEmailsAsReadOrUnread(
|
||||||
|
affectedMailboxId: reactionState.mailboxId,
|
||||||
|
readCount: reactionState.readActions == ReadActions.markAsRead
|
||||||
|
? reactionState.successEmailIds.length
|
||||||
|
: null,
|
||||||
|
unreadCount: reactionState.readActions == ReadActions.markAsUnread
|
||||||
|
? reactionState.successEmailIds.length
|
||||||
|
: null,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMailboxReadAllSuccess) {
|
||||||
|
_handleMarkMailboxAsRead(
|
||||||
|
affectedMailboxId: reactionState.mailboxId,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMailboxReadHasSomeEmailFailure) {
|
||||||
|
_handleMarkEmailsAsReadOrUnread(
|
||||||
|
affectedMailboxId: reactionState.mailboxId,
|
||||||
|
readCount: reactionState.successEmailIds.length,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleMarkEmailsAsReadOrUnread({
|
||||||
|
required MailboxId? affectedMailboxId,
|
||||||
|
int? readCount,
|
||||||
|
int? unreadCount,
|
||||||
|
}) {
|
||||||
|
if (affectedMailboxId == null) return;
|
||||||
|
|
||||||
|
updateUnreadCountOfMailboxById(
|
||||||
|
affectedMailboxId,
|
||||||
|
unreadChanges: (unreadCount ?? 0) - (readCount ?? 0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleMarkMailboxAsRead({
|
||||||
|
required MailboxId? affectedMailboxId,
|
||||||
|
}) {
|
||||||
|
if (affectedMailboxId == null) return;
|
||||||
|
|
||||||
|
clearUnreadCount(affectedMailboxId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _initWebSocketQueueHandler() {
|
void _initWebSocketQueueHandler() {
|
||||||
@@ -638,6 +706,10 @@ class MailboxController extends BaseMailboxController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _renameMailboxSuccess(RenameMailboxSuccess success) {
|
||||||
|
updateMailboxNameById(success.request.mailboxId, success.request.newName);
|
||||||
|
}
|
||||||
|
|
||||||
void _renameMailboxFailure(RenameMailboxFailure failure) {
|
void _renameMailboxFailure(RenameMailboxFailure failure) {
|
||||||
if (currentOverlayContext != null && currentContext != null) {
|
if (currentOverlayContext != null && currentContext != null) {
|
||||||
final exception = failure.exception;
|
final exception = failure.exception;
|
||||||
|
|||||||
@@ -93,16 +93,18 @@ class MailboxTree with EquatableMixin {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateMailboxUnreadCountById(MailboxId mailboxId, int unreadCount) {
|
bool updateMailboxUnreadCountById(MailboxId mailboxId, int unreadCount) {
|
||||||
final matchedNode = findNode((node) => node.item.id == mailboxId);
|
final matchedNode = findNode((node) => node.item.id == mailboxId);
|
||||||
if (matchedNode != null) {
|
if (matchedNode != null) {
|
||||||
final currentUnreadCount = matchedNode.item.unreadEmails?.value.value ?? 0;
|
final currentUnreadCount = matchedNode.item.unreadEmails?.value.value ?? 0;
|
||||||
final updatedUnreadCount = currentUnreadCount + unreadCount;
|
final updatedUnreadCount = currentUnreadCount + unreadCount;
|
||||||
if (updatedUnreadCount < 0) return;
|
if (updatedUnreadCount < 0) return true;
|
||||||
matchedNode.item = matchedNode.item.copyWith(
|
matchedNode.item = matchedNode.item.copyWith(
|
||||||
unreadEmails: UnreadEmails(UnsignedInt(updatedUnreadCount)),
|
unreadEmails: UnreadEmails(UnsignedInt(updatedUnreadCount)),
|
||||||
);
|
);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
String? getNodePath(MailboxId mailboxId) {
|
String? getNodePath(MailboxId mailboxId) {
|
||||||
|
|||||||
+4
-1
@@ -884,6 +884,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
EmailId emailId,
|
EmailId emailId,
|
||||||
ReadActions readActions,
|
ReadActions readActions,
|
||||||
MarkReadAction markReadAction,
|
MarkReadAction markReadAction,
|
||||||
|
MailboxId? mailboxId,
|
||||||
) {
|
) {
|
||||||
if (accountId.value != null && sessionCurrent != null) {
|
if (accountId.value != null && sessionCurrent != null) {
|
||||||
consumeState(_markAsEmailReadInteractor.execute(
|
consumeState(_markAsEmailReadInteractor.execute(
|
||||||
@@ -892,6 +893,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
emailId,
|
emailId,
|
||||||
readActions,
|
readActions,
|
||||||
markReadAction,
|
markReadAction,
|
||||||
|
mailboxId,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -923,6 +925,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
accountId.value!,
|
accountId.value!,
|
||||||
listEmailNeedMarkAsRead.listEmailIds,
|
listEmailNeedMarkAsRead.listEmailIds,
|
||||||
readActions,
|
readActions,
|
||||||
|
listPresentationEmail.firstOrNull?.mailboxContain?.mailboxId,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -960,7 +963,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
message,
|
message,
|
||||||
actionName: AppLocalizations.of(currentContext!).undo,
|
actionName: AppLocalizations.of(currentContext!).undo,
|
||||||
onActionClick: () {
|
onActionClick: () {
|
||||||
markAsEmailRead(success.emailId, undoAction, MarkReadAction.undo);
|
markAsEmailRead(success.emailId, undoAction, MarkReadAction.undo, success.mailboxId);
|
||||||
},
|
},
|
||||||
leadingSVGIcon: imagePaths.icToastSuccessMessage,
|
leadingSVGIcon: imagePaths.icToastSuccessMessage,
|
||||||
backgroundColor: AppColor.toastSuccessBackgroundColor,
|
backgroundColor: AppColor.toastSuccessBackgroundColor,
|
||||||
|
|||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
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:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
|
|
||||||
|
extension UpdateCurrentEmailsFlagsExtension on MailboxDashBoardController {
|
||||||
|
void updateEmailFlagByEmailIds(
|
||||||
|
List<EmailId> emailIds, {
|
||||||
|
ReadActions? readAction,
|
||||||
|
MarkStarAction? markStarAction,
|
||||||
|
}) {
|
||||||
|
if (readAction == null && markStarAction == null) return;
|
||||||
|
|
||||||
|
for (var email in emailsInCurrentMailbox) {
|
||||||
|
if (!emailIds.contains(email.id)) continue;
|
||||||
|
|
||||||
|
switch (readAction) {
|
||||||
|
case ReadActions.markAsRead:
|
||||||
|
_updateKeyword(email, KeyWordIdentifier.emailSeen, true);
|
||||||
|
break;
|
||||||
|
case ReadActions.markAsUnread:
|
||||||
|
_updateKeyword(email, KeyWordIdentifier.emailSeen, false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (markStarAction) {
|
||||||
|
case MarkStarAction.markStar:
|
||||||
|
_updateKeyword(email, KeyWordIdentifier.emailFlagged, true);
|
||||||
|
break;
|
||||||
|
case MarkStarAction.unMarkStar:
|
||||||
|
_updateKeyword(email, KeyWordIdentifier.emailFlagged, false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emailsInCurrentMailbox.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _updateKeyword(
|
||||||
|
PresentationEmail presentationEmail,
|
||||||
|
KeyWordIdentifier keyword,
|
||||||
|
bool value,
|
||||||
|
) {
|
||||||
|
if (value) {
|
||||||
|
presentationEmail.keywords?[keyword] = true;
|
||||||
|
} else {
|
||||||
|
presentationEmail.keywords?.remove(keyword);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,6 +33,8 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_e
|
|||||||
import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart';
|
import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
||||||
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
||||||
@@ -44,6 +46,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
||||||
@@ -60,6 +63,8 @@ import 'package:tmail_ui_user/features/search/email/presentation/model/search_mo
|
|||||||
import 'package:tmail_ui_user/features/search/email/presentation/search_email_bindings.dart';
|
import 'package:tmail_ui_user/features/search/email/presentation/search_email_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
|
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
||||||
@@ -260,6 +265,41 @@ class SearchEmailController extends BaseController
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ever(mailboxDashBoardController.viewState, (viewState) {
|
||||||
|
final reactionState = viewState.getOrElse(() => UIState.idle);
|
||||||
|
if (reactionState is MarkAsEmailReadSuccess) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
[reactionState.emailId],
|
||||||
|
readAction: reactionState.readActions,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMultipleEmailReadAllSuccess) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.emailIds,
|
||||||
|
readAction: reactionState.readActions,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.successEmailIds,
|
||||||
|
readAction: reactionState.readActions,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsStarEmailSuccess) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
[reactionState.emailId],
|
||||||
|
markStarAction: reactionState.markStarAction,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsStarMultipleEmailAllSuccess) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.emailIds,
|
||||||
|
markStarAction: reactionState.markStarAction,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsStarMultipleEmailHasSomeEmailFailure) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.successEmailIds,
|
||||||
|
markStarAction: reactionState.markStarAction,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void _refreshEmailChanges({jmap.State? newState}) {
|
void _refreshEmailChanges({jmap.State? newState}) {
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.da
|
|||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart';
|
||||||
@@ -185,6 +186,18 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
|
|||||||
_refreshMailboxChanges(newState: action.newState);
|
_refreshMailboxChanges(newState: action.newState);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ever(dashboardController.viewState, (viewState) {
|
||||||
|
final reactionState = viewState.getOrElse(() => UIState.idle);
|
||||||
|
if (reactionState is MarkAsMailboxReadAllSuccess) {
|
||||||
|
clearUnreadCount(reactionState.mailboxId);
|
||||||
|
} else if (reactionState is MarkAsMailboxReadHasSomeEmailFailure) {
|
||||||
|
updateUnreadCountOfMailboxById(
|
||||||
|
reactionState.mailboxId,
|
||||||
|
unreadChanges: -reactionState.countEmailsRead,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void _getAllMailboxAction() {
|
void _getAllMailboxAction() {
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
Properties? propertiesCreated,
|
Properties? propertiesCreated,
|
||||||
Properties? propertiesUpdated,
|
Properties? propertiesUpdated,
|
||||||
bool getLatestChanges = true,
|
bool getLatestChanges = true,
|
||||||
|
bool skipCache = false,
|
||||||
}
|
}
|
||||||
) async* {
|
) async* {
|
||||||
log('ThreadRepositoryImpl::getAllEmail(): filter = ${emailFilter?.mailboxId}');
|
log('ThreadRepositoryImpl::getAllEmail(): filter = ${emailFilter?.mailboxId}');
|
||||||
@@ -88,7 +89,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
yield networkEmailResponse;
|
yield networkEmailResponse;
|
||||||
} else {
|
} else if (!skipCache) {
|
||||||
yield localEmailResponse;
|
yield localEmailResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ abstract class ThreadRepository {
|
|||||||
Properties? propertiesCreated,
|
Properties? propertiesCreated,
|
||||||
Properties? propertiesUpdated,
|
Properties? propertiesUpdated,
|
||||||
bool getLatestChanges = true,
|
bool getLatestChanges = true,
|
||||||
|
bool skipCache = false,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,24 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/email/read_actions.dart';
|
import 'package:model/email/read_actions.dart';
|
||||||
|
|
||||||
class LoadingMarkAsMultipleEmailReadAll extends UIState {}
|
class LoadingMarkAsMultipleEmailReadAll extends UIState {}
|
||||||
|
|
||||||
class MarkAsMultipleEmailReadAllSuccess extends UIState {
|
class MarkAsMultipleEmailReadAllSuccess extends UIState {
|
||||||
final int countMarkAsReadSuccess;
|
final List<EmailId> emailIds;
|
||||||
final ReadActions readActions;
|
final ReadActions readActions;
|
||||||
|
final MailboxId? mailboxId;
|
||||||
|
|
||||||
MarkAsMultipleEmailReadAllSuccess(
|
MarkAsMultipleEmailReadAllSuccess(
|
||||||
this.countMarkAsReadSuccess,
|
this.emailIds,
|
||||||
this.readActions,
|
this.readActions,
|
||||||
|
this.mailboxId,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [countMarkAsReadSuccess, readActions];
|
List<Object?> get props => [emailIds, readActions, mailboxId];
|
||||||
}
|
}
|
||||||
|
|
||||||
class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
|
class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
|
||||||
@@ -27,16 +31,18 @@ class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState {
|
class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState {
|
||||||
final int countMarkAsReadSuccess;
|
final List<EmailId> successEmailIds;
|
||||||
final ReadActions readActions;
|
final ReadActions readActions;
|
||||||
|
final MailboxId? mailboxId;
|
||||||
|
|
||||||
MarkAsMultipleEmailReadHasSomeEmailFailure(
|
MarkAsMultipleEmailReadHasSomeEmailFailure(
|
||||||
this.countMarkAsReadSuccess,
|
this.successEmailIds,
|
||||||
this.readActions,
|
this.readActions,
|
||||||
|
this.mailboxId,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [countMarkAsReadSuccess, readActions];
|
List<Object?> get props => [successEmailIds, readActions, mailboxId];
|
||||||
}
|
}
|
||||||
|
|
||||||
class MarkAsMultipleEmailReadFailure extends FeatureFailure {
|
class MarkAsMultipleEmailReadFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/email/mark_star_action.dart';
|
import 'package:model/email/mark_star_action.dart';
|
||||||
|
|
||||||
class LoadingMarkAsStarMultipleEmailAll extends UIState {}
|
class LoadingMarkAsStarMultipleEmailAll extends UIState {}
|
||||||
@@ -7,14 +8,16 @@ class LoadingMarkAsStarMultipleEmailAll extends UIState {}
|
|||||||
class MarkAsStarMultipleEmailAllSuccess extends UIState {
|
class MarkAsStarMultipleEmailAllSuccess extends UIState {
|
||||||
final int countMarkStarSuccess;
|
final int countMarkStarSuccess;
|
||||||
final MarkStarAction markStarAction;
|
final MarkStarAction markStarAction;
|
||||||
|
final List<EmailId> emailIds;
|
||||||
|
|
||||||
MarkAsStarMultipleEmailAllSuccess(
|
MarkAsStarMultipleEmailAllSuccess(
|
||||||
this.countMarkStarSuccess,
|
this.countMarkStarSuccess,
|
||||||
this.markStarAction,
|
this.markStarAction,
|
||||||
|
this.emailIds,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [countMarkStarSuccess, markStarAction];
|
List<Object?> get props => [countMarkStarSuccess, markStarAction, emailIds];
|
||||||
}
|
}
|
||||||
|
|
||||||
class MarkAsStarMultipleEmailAllFailure extends FeatureFailure {
|
class MarkAsStarMultipleEmailAllFailure extends FeatureFailure {
|
||||||
@@ -29,14 +32,16 @@ class MarkAsStarMultipleEmailAllFailure extends FeatureFailure {
|
|||||||
class MarkAsStarMultipleEmailHasSomeEmailFailure extends UIState {
|
class MarkAsStarMultipleEmailHasSomeEmailFailure extends UIState {
|
||||||
final int countMarkStarSuccess;
|
final int countMarkStarSuccess;
|
||||||
final MarkStarAction markStarAction;
|
final MarkStarAction markStarAction;
|
||||||
|
final List<EmailId> successEmailIds;
|
||||||
|
|
||||||
MarkAsStarMultipleEmailHasSomeEmailFailure(
|
MarkAsStarMultipleEmailHasSomeEmailFailure(
|
||||||
this.countMarkStarSuccess,
|
this.countMarkStarSuccess,
|
||||||
this.markStarAction,
|
this.markStarAction,
|
||||||
|
this.successEmailIds,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [countMarkStarSuccess, markStarAction];
|
List<Object?> get props => [countMarkStarSuccess, markStarAction, successEmailIds];
|
||||||
}
|
}
|
||||||
|
|
||||||
class MarkAsStarMultipleEmailFailure extends FeatureFailure {
|
class MarkAsStarMultipleEmailFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class GetEmailsInMailboxInteractor {
|
|||||||
Properties? propertiesCreated,
|
Properties? propertiesCreated,
|
||||||
Properties? propertiesUpdated,
|
Properties? propertiesUpdated,
|
||||||
bool getLatestChanges = true,
|
bool getLatestChanges = true,
|
||||||
|
bool skipCache = false,
|
||||||
}
|
}
|
||||||
) async* {
|
) async* {
|
||||||
try {
|
try {
|
||||||
@@ -41,7 +42,8 @@ class GetEmailsInMailboxInteractor {
|
|||||||
emailFilter: emailFilter,
|
emailFilter: emailFilter,
|
||||||
propertiesCreated: propertiesCreated,
|
propertiesCreated: propertiesCreated,
|
||||||
propertiesUpdated: propertiesUpdated,
|
propertiesUpdated: propertiesUpdated,
|
||||||
getLatestChanges: getLatestChanges)
|
getLatestChanges: getLatestChanges,
|
||||||
|
skipCache: skipCache)
|
||||||
.map((emailResponse) => _toGetEmailState(
|
.map((emailResponse) => _toGetEmailState(
|
||||||
emailResponse: emailResponse,
|
emailResponse: emailResponse,
|
||||||
currentMailboxId: emailFilter?.mailboxId
|
currentMailboxId: emailFilter?.mailboxId
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:dartz/dartz.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/account_id.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/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
@@ -17,7 +18,8 @@ class MarkAsMultipleEmailReadInteractor {
|
|||||||
Session session,
|
Session session,
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
List<EmailId> emailIds,
|
List<EmailId> emailIds,
|
||||||
ReadActions readAction
|
ReadActions readAction,
|
||||||
|
MailboxId? mailboxId,
|
||||||
) async* {
|
) async* {
|
||||||
try {
|
try {
|
||||||
yield Right(LoadingMarkAsMultipleEmailReadAll());
|
yield Right(LoadingMarkAsMultipleEmailReadAll());
|
||||||
@@ -31,15 +33,17 @@ class MarkAsMultipleEmailReadInteractor {
|
|||||||
|
|
||||||
if (emailIds.length == result.emailIdsSuccess.length) {
|
if (emailIds.length == result.emailIdsSuccess.length) {
|
||||||
yield Right(MarkAsMultipleEmailReadAllSuccess(
|
yield Right(MarkAsMultipleEmailReadAllSuccess(
|
||||||
result.emailIdsSuccess.length,
|
result.emailIdsSuccess,
|
||||||
readAction,
|
readAction,
|
||||||
|
mailboxId,
|
||||||
));
|
));
|
||||||
} else if (result.emailIdsSuccess.isEmpty) {
|
} else if (result.emailIdsSuccess.isEmpty) {
|
||||||
yield Left(MarkAsMultipleEmailReadAllFailure(readAction));
|
yield Left(MarkAsMultipleEmailReadAllFailure(readAction));
|
||||||
} else {
|
} else {
|
||||||
yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(
|
yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(
|
||||||
result.emailIdsSuccess.length,
|
result.emailIdsSuccess,
|
||||||
readAction,
|
readAction,
|
||||||
|
mailboxId,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -26,15 +26,17 @@ class MarkAsStarMultipleEmailInteractor {
|
|||||||
|
|
||||||
if (emailIds.length == result.emailIdsSuccess.length) {
|
if (emailIds.length == result.emailIdsSuccess.length) {
|
||||||
yield Right(MarkAsStarMultipleEmailAllSuccess(
|
yield Right(MarkAsStarMultipleEmailAllSuccess(
|
||||||
emailIds.length,
|
emailIds.length,
|
||||||
markStarAction,
|
markStarAction,
|
||||||
|
result.emailIdsSuccess,
|
||||||
));
|
));
|
||||||
} else if (result.emailIdsSuccess.isEmpty) {
|
} else if (result.emailIdsSuccess.isEmpty) {
|
||||||
yield Left(MarkAsStarMultipleEmailAllFailure(markStarAction));
|
yield Left(MarkAsStarMultipleEmailAllFailure(markStarAction));
|
||||||
} else {
|
} else {
|
||||||
yield Right(MarkAsStarMultipleEmailHasSomeEmailFailure(
|
yield Right(MarkAsStarMultipleEmailHasSomeEmailFailure(
|
||||||
result.emailIdsSuccess.length,
|
result.emailIdsSuccess.length,
|
||||||
markStarAction,
|
markStarAction,
|
||||||
|
result.emailIdsSuccess,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ mixin EmailActionController {
|
|||||||
presentationEmail.id!,
|
presentationEmail.id!,
|
||||||
readActions,
|
readActions,
|
||||||
markReadAction,
|
markReadAction,
|
||||||
|
presentationEmail.mailboxContain?.mailboxId,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,11 +20,15 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
|||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
|
||||||
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search;
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search;
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
||||||
@@ -45,6 +49,8 @@ import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/get_email_by_id_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/get_email_by_id_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/refresh_all_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/refresh_all_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
@@ -331,6 +337,59 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
mailboxDashBoardController.clearEmailUIAction();
|
mailboxDashBoardController.clearEmailUIAction();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ever(mailboxDashBoardController.viewState, (viewState) {
|
||||||
|
final reactionState = viewState.getOrElse(() => UIState.idle);
|
||||||
|
if (reactionState is MarkAsEmailReadSuccess) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
[reactionState.emailId],
|
||||||
|
readAction: reactionState.readActions,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMultipleEmailReadAllSuccess) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.emailIds,
|
||||||
|
readAction: reactionState.readActions,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.successEmailIds,
|
||||||
|
readAction: reactionState.readActions,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsMailboxReadAllSuccess) {
|
||||||
|
_handleMarkEmailsAsReadByMailboxId(reactionState.mailboxId);
|
||||||
|
} else if (reactionState is MarkAsMailboxReadHasSomeEmailFailure) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.successEmailIds,
|
||||||
|
readAction: ReadActions.markAsRead,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsStarEmailSuccess) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
[reactionState.emailId],
|
||||||
|
markStarAction: reactionState.markStarAction,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsStarMultipleEmailAllSuccess) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.emailIds,
|
||||||
|
markStarAction: reactionState.markStarAction,
|
||||||
|
);
|
||||||
|
} else if (reactionState is MarkAsStarMultipleEmailHasSomeEmailFailure) {
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
reactionState.successEmailIds,
|
||||||
|
markStarAction: reactionState.markStarAction,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleMarkEmailsAsReadByMailboxId(MailboxId mailboxId) {
|
||||||
|
if (mailboxDashBoardController.selectedMailbox.value?.id != mailboxId) return;
|
||||||
|
|
||||||
|
for (var presentationEmail in mailboxDashBoardController.emailsInCurrentMailbox) {
|
||||||
|
if (presentationEmail.mailboxContain?.id != mailboxId) continue;
|
||||||
|
|
||||||
|
presentationEmail.keywords?[KeyWordIdentifier.emailSeen] = true;
|
||||||
|
}
|
||||||
|
mailboxDashBoardController.emailsInCurrentMailbox.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _registerBrowserResizeListener() {
|
void _registerBrowserResizeListener() {
|
||||||
@@ -444,7 +503,10 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _getAllEmailAction({bool getLatestChanges = true}) {
|
void _getAllEmailAction({
|
||||||
|
bool getLatestChanges = true,
|
||||||
|
bool skipCache = false,
|
||||||
|
}) {
|
||||||
log('ThreadController::_getAllEmailAction:');
|
log('ThreadController::_getAllEmailAction:');
|
||||||
if (_session != null &&_accountId != null) {
|
if (_session != null &&_accountId != null) {
|
||||||
consumeState(_getEmailsInMailboxInteractor.execute(
|
consumeState(_getEmailsInMailboxInteractor.execute(
|
||||||
@@ -460,6 +522,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
propertiesCreated: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
|
propertiesCreated: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
|
||||||
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
|
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
|
||||||
getLatestChanges: getLatestChanges,
|
getLatestChanges: getLatestChanges,
|
||||||
|
skipCache: skipCache,
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
consumeState(Stream.value(Left(GetAllEmailFailure(NotFoundSessionException()))));
|
consumeState(Stream.value(Left(GetAllEmailFailure(NotFoundSessionException()))));
|
||||||
@@ -508,7 +571,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
if (searchController.isSearchEmailRunning) {
|
if (searchController.isSearchEmailRunning) {
|
||||||
_searchEmail(limit: limitEmailFetched);
|
_searchEmail(limit: limitEmailFetched);
|
||||||
} else {
|
} else {
|
||||||
_getAllEmailAction();
|
_getAllEmailAction(skipCache: true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -792,6 +855,9 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cancelSelectEmail() {
|
void cancelSelectEmail() {
|
||||||
|
if (mailboxDashBoardController.currentSelectMode.value == SelectMode.INACTIVE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
final newEmailList = mailboxDashBoardController.emailsInCurrentMailbox
|
final newEmailList = mailboxDashBoardController.emailsInCurrentMailbox
|
||||||
.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE))
|
.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE))
|
||||||
.toList();
|
.toList();
|
||||||
|
|||||||
+150
@@ -0,0 +1,150 @@
|
|||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
|
||||||
|
import 'package:mockito/annotations.dart';
|
||||||
|
import 'package:mockito/mockito.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:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
|
||||||
|
|
||||||
|
import 'update_current_emails_flags_extension_test.mocks.dart';
|
||||||
|
|
||||||
|
@GenerateNiceMocks([MockSpec<MailboxDashBoardController>()])
|
||||||
|
void main() {
|
||||||
|
const numberOfEmails = 3;
|
||||||
|
late List<EmailId> emailIds;
|
||||||
|
final mailboxDashBoardController = MockMailboxDashBoardController();
|
||||||
|
|
||||||
|
setUp(() {
|
||||||
|
emailIds = List.generate(
|
||||||
|
numberOfEmails,
|
||||||
|
(index) => EmailId(Id('email-id-$index')),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
group('updateEmailFlagByEmailIds test:', () {
|
||||||
|
test(
|
||||||
|
'should mark emails as read',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final readEmailIds = emailIds.sublist(1);
|
||||||
|
when(mailboxDashBoardController.emailsInCurrentMailbox).thenReturn(
|
||||||
|
emailIds.map((emailId) => PresentationEmail(
|
||||||
|
id: emailId,
|
||||||
|
keywords: {},
|
||||||
|
)).toList().obs,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
mailboxDashBoardController.emailsInCurrentMailbox.every(
|
||||||
|
(presentationEmail) => !presentationEmail.hasRead,
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
|
||||||
|
// act
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
readEmailIds,
|
||||||
|
readAction: ReadActions.markAsRead,
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[0].hasRead, false);
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[1].hasRead, true);
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[2].hasRead, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should mark emails as unread',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final unreadEmailIds = emailIds.sublist(1);
|
||||||
|
when(mailboxDashBoardController.emailsInCurrentMailbox).thenReturn(
|
||||||
|
emailIds.map((emailId) => PresentationEmail(
|
||||||
|
id: emailId,
|
||||||
|
keywords: {KeyWordIdentifier.emailSeen: true},
|
||||||
|
)).toList().obs,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
mailboxDashBoardController.emailsInCurrentMailbox.every(
|
||||||
|
(presentationEmail) => presentationEmail.hasRead,
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
|
||||||
|
// act
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
unreadEmailIds,
|
||||||
|
readAction: ReadActions.markAsUnread,
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[0].hasRead, true);
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[1].hasRead, false);
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[2].hasRead, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should mark emails as starred',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final starredEmailIds = emailIds.sublist(1);
|
||||||
|
when(mailboxDashBoardController.emailsInCurrentMailbox).thenReturn(
|
||||||
|
emailIds.map((emailId) => PresentationEmail(
|
||||||
|
id: emailId,
|
||||||
|
keywords: {},
|
||||||
|
)).toList().obs,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
mailboxDashBoardController.emailsInCurrentMailbox.every(
|
||||||
|
(presentationEmail) => !presentationEmail.hasStarred,
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
|
||||||
|
// act
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
starredEmailIds,
|
||||||
|
markStarAction: MarkStarAction.markStar,
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[0].hasStarred, false);
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[1].hasStarred, true);
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[2].hasStarred, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should mark emails as unstarred',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
final unstarredEmailIds = emailIds.sublist(1);
|
||||||
|
when(mailboxDashBoardController.emailsInCurrentMailbox).thenReturn(
|
||||||
|
emailIds.map((emailId) => PresentationEmail(
|
||||||
|
id: emailId,
|
||||||
|
keywords: {KeyWordIdentifier.emailFlagged: true},
|
||||||
|
)).toList().obs,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
mailboxDashBoardController.emailsInCurrentMailbox.every(
|
||||||
|
(presentationEmail) => presentationEmail.hasStarred,
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
|
||||||
|
// act
|
||||||
|
mailboxDashBoardController.updateEmailFlagByEmailIds(
|
||||||
|
unstarredEmailIds,
|
||||||
|
markStarAction: MarkStarAction.unMarkStar,
|
||||||
|
);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[0].hasStarred, true);
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[1].hasStarred, false);
|
||||||
|
expect(mailboxDashBoardController.emailsInCurrentMailbox[2].hasStarred, false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user