TF-3385 Update mark as read and star
This commit is contained in:
@@ -49,6 +49,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
||||
Properties? propertiesCreated,
|
||||
Properties? propertiesUpdated,
|
||||
bool getLatestChanges = true,
|
||||
bool skipCache = false,
|
||||
}
|
||||
) async* {
|
||||
log('ThreadRepositoryImpl::getAllEmail(): filter = ${emailFilter?.mailboxId}');
|
||||
@@ -88,7 +89,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
||||
);
|
||||
}
|
||||
yield networkEmailResponse;
|
||||
} else {
|
||||
} else if (!skipCache) {
|
||||
yield localEmailResponse;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ abstract class ThreadRepository {
|
||||
Properties? propertiesCreated,
|
||||
Properties? propertiesUpdated,
|
||||
bool getLatestChanges = true,
|
||||
bool skipCache = false,
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -1,20 +1,24 @@
|
||||
import 'package:core/presentation/state/failure.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';
|
||||
|
||||
class LoadingMarkAsMultipleEmailReadAll extends UIState {}
|
||||
|
||||
class MarkAsMultipleEmailReadAllSuccess extends UIState {
|
||||
final int countMarkAsReadSuccess;
|
||||
final List<EmailId> emailIds;
|
||||
final ReadActions readActions;
|
||||
final MailboxId? mailboxId;
|
||||
|
||||
MarkAsMultipleEmailReadAllSuccess(
|
||||
this.countMarkAsReadSuccess,
|
||||
this.readActions,
|
||||
this.emailIds,
|
||||
this.readActions,
|
||||
this.mailboxId,
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [countMarkAsReadSuccess, readActions];
|
||||
List<Object?> get props => [emailIds, readActions, mailboxId];
|
||||
}
|
||||
|
||||
class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
|
||||
@@ -27,16 +31,18 @@ class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
|
||||
}
|
||||
|
||||
class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState {
|
||||
final int countMarkAsReadSuccess;
|
||||
final List<EmailId> successEmailIds;
|
||||
final ReadActions readActions;
|
||||
final MailboxId? mailboxId;
|
||||
|
||||
MarkAsMultipleEmailReadHasSomeEmailFailure(
|
||||
this.countMarkAsReadSuccess,
|
||||
this.successEmailIds,
|
||||
this.readActions,
|
||||
this.mailboxId,
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [countMarkAsReadSuccess, readActions];
|
||||
List<Object?> get props => [successEmailIds, readActions, mailboxId];
|
||||
}
|
||||
|
||||
class MarkAsMultipleEmailReadFailure extends FeatureFailure {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:core/presentation/state/failure.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';
|
||||
|
||||
class LoadingMarkAsStarMultipleEmailAll extends UIState {}
|
||||
@@ -7,14 +8,16 @@ class LoadingMarkAsStarMultipleEmailAll extends UIState {}
|
||||
class MarkAsStarMultipleEmailAllSuccess extends UIState {
|
||||
final int countMarkStarSuccess;
|
||||
final MarkStarAction markStarAction;
|
||||
final List<EmailId> emailIds;
|
||||
|
||||
MarkAsStarMultipleEmailAllSuccess(
|
||||
this.countMarkStarSuccess,
|
||||
this.markStarAction,
|
||||
this.emailIds,
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [countMarkStarSuccess, markStarAction];
|
||||
List<Object?> get props => [countMarkStarSuccess, markStarAction, emailIds];
|
||||
}
|
||||
|
||||
class MarkAsStarMultipleEmailAllFailure extends FeatureFailure {
|
||||
@@ -29,14 +32,16 @@ class MarkAsStarMultipleEmailAllFailure extends FeatureFailure {
|
||||
class MarkAsStarMultipleEmailHasSomeEmailFailure extends UIState {
|
||||
final int countMarkStarSuccess;
|
||||
final MarkStarAction markStarAction;
|
||||
final List<EmailId> successEmailIds;
|
||||
|
||||
MarkAsStarMultipleEmailHasSomeEmailFailure(
|
||||
this.countMarkStarSuccess,
|
||||
this.markStarAction,
|
||||
this.successEmailIds,
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [countMarkStarSuccess, markStarAction];
|
||||
List<Object?> get props => [countMarkStarSuccess, markStarAction, successEmailIds];
|
||||
}
|
||||
|
||||
class MarkAsStarMultipleEmailFailure extends FeatureFailure {
|
||||
|
||||
@@ -27,6 +27,7 @@ class GetEmailsInMailboxInteractor {
|
||||
Properties? propertiesCreated,
|
||||
Properties? propertiesUpdated,
|
||||
bool getLatestChanges = true,
|
||||
bool skipCache = false,
|
||||
}
|
||||
) async* {
|
||||
try {
|
||||
@@ -41,7 +42,8 @@ class GetEmailsInMailboxInteractor {
|
||||
emailFilter: emailFilter,
|
||||
propertiesCreated: propertiesCreated,
|
||||
propertiesUpdated: propertiesUpdated,
|
||||
getLatestChanges: getLatestChanges)
|
||||
getLatestChanges: getLatestChanges,
|
||||
skipCache: skipCache)
|
||||
.map((emailResponse) => _toGetEmailState(
|
||||
emailResponse: emailResponse,
|
||||
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/core/session/session.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: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';
|
||||
@@ -17,7 +18,8 @@ class MarkAsMultipleEmailReadInteractor {
|
||||
Session session,
|
||||
AccountId accountId,
|
||||
List<EmailId> emailIds,
|
||||
ReadActions readAction
|
||||
ReadActions readAction,
|
||||
MailboxId? mailboxId,
|
||||
) async* {
|
||||
try {
|
||||
yield Right(LoadingMarkAsMultipleEmailReadAll());
|
||||
@@ -31,15 +33,17 @@ class MarkAsMultipleEmailReadInteractor {
|
||||
|
||||
if (emailIds.length == result.emailIdsSuccess.length) {
|
||||
yield Right(MarkAsMultipleEmailReadAllSuccess(
|
||||
result.emailIdsSuccess.length,
|
||||
readAction,
|
||||
result.emailIdsSuccess,
|
||||
readAction,
|
||||
mailboxId,
|
||||
));
|
||||
} else if (result.emailIdsSuccess.isEmpty) {
|
||||
yield Left(MarkAsMultipleEmailReadAllFailure(readAction));
|
||||
} else {
|
||||
yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(
|
||||
result.emailIdsSuccess.length,
|
||||
readAction,
|
||||
result.emailIdsSuccess,
|
||||
readAction,
|
||||
mailboxId,
|
||||
));
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
@@ -26,15 +26,17 @@ class MarkAsStarMultipleEmailInteractor {
|
||||
|
||||
if (emailIds.length == result.emailIdsSuccess.length) {
|
||||
yield Right(MarkAsStarMultipleEmailAllSuccess(
|
||||
emailIds.length,
|
||||
markStarAction,
|
||||
emailIds.length,
|
||||
markStarAction,
|
||||
result.emailIdsSuccess,
|
||||
));
|
||||
} else if (result.emailIdsSuccess.isEmpty) {
|
||||
yield Left(MarkAsStarMultipleEmailAllFailure(markStarAction));
|
||||
} else {
|
||||
yield Right(MarkAsStarMultipleEmailHasSomeEmailFailure(
|
||||
result.emailIdsSuccess.length,
|
||||
markStarAction,
|
||||
result.emailIdsSuccess.length,
|
||||
markStarAction,
|
||||
result.emailIdsSuccess,
|
||||
));
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
@@ -233,6 +233,7 @@ mixin EmailActionController {
|
||||
presentationEmail.id!,
|
||||
readActions,
|
||||
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: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/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/utils/email_utils.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/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/search/email_sort_order_type.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_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/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_changes_all_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();
|
||||
}
|
||||
});
|
||||
|
||||
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() {
|
||||
@@ -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:');
|
||||
if (_session != null &&_accountId != null) {
|
||||
consumeState(_getEmailsInMailboxInteractor.execute(
|
||||
@@ -460,6 +522,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
propertiesCreated: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
|
||||
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
|
||||
getLatestChanges: getLatestChanges,
|
||||
skipCache: skipCache,
|
||||
));
|
||||
} else {
|
||||
consumeState(Stream.value(Left(GetAllEmailFailure(NotFoundSessionException()))));
|
||||
@@ -508,7 +571,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
if (searchController.isSearchEmailRunning) {
|
||||
_searchEmail(limit: limitEmailFetched);
|
||||
} else {
|
||||
_getAllEmailAction();
|
||||
_getAllEmailAction(skipCache: true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -792,6 +855,9 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
}
|
||||
|
||||
void cancelSelectEmail() {
|
||||
if (mailboxDashBoardController.currentSelectMode.value == SelectMode.INACTIVE) {
|
||||
return;
|
||||
}
|
||||
final newEmailList = mailboxDashBoardController.emailsInCurrentMailbox
|
||||
.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE))
|
||||
.toList();
|
||||
|
||||
Reference in New Issue
Block a user