TF-78 Update state email and count unread current mailbox when mark as read & unread multiple selected email
This commit is contained in:
@@ -1,8 +1,10 @@
|
|||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
|
||||||
class MarkAsEmailReadSuccess extends UIState {
|
class MarkAsEmailReadSuccess extends UIState {
|
||||||
|
final EmailId emailId;
|
||||||
|
|
||||||
MarkAsEmailReadSuccess();
|
MarkAsEmailReadSuccess(this.emailId);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [];
|
List<Object?> get props => [];
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class MarkAsEmailReadInteractor {
|
|||||||
Future<Either<Failure, Success>> execute(AccountId accountId, EmailId emailId, bool unread) async {
|
Future<Either<Failure, Success>> execute(AccountId accountId, EmailId emailId, bool unread) async {
|
||||||
try {
|
try {
|
||||||
final result = await emailRepository.markAsRead(accountId, emailId, unread);
|
final result = await emailRepository.markAsRead(accountId, emailId, unread);
|
||||||
return result ? Right(MarkAsEmailReadSuccess()) : Left(MarkAsEmailReadFailure(null));
|
return result ? Right(MarkAsEmailReadSuccess(emailId)) : Left(MarkAsEmailReadFailure(null));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return Left(MarkAsEmailReadFailure(e));
|
return Left(MarkAsEmailReadFailure(e));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,8 +46,9 @@ class MailboxController extends BaseController {
|
|||||||
|
|
||||||
mailboxDashBoardController.mailboxDashBoardAction.listen((action) {
|
mailboxDashBoardController.mailboxDashBoardAction.listen((action) {
|
||||||
if (action is MarkAsEmailReadAction) {
|
if (action is MarkAsEmailReadAction) {
|
||||||
_updateCountUnReadAllMailbox(action.presentationMailbox);
|
_updateCountUnReadForMailbox(action.presentationMailbox, countUnreadChange: 1, isUnread: false);
|
||||||
mailboxDashBoardController.clearMailboxDashBoardAction();
|
} else if (action is MarkAsMultipleEmailReadAndUnreadAction) {
|
||||||
|
_updateCountUnReadForMailbox(action.presentationMailbox, countUnreadChange: action.listEmailId.length, isUnread: action.isUnread);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -133,15 +134,27 @@ class MailboxController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _updateCountUnReadAllMailbox(PresentationMailbox presentationMailbox) {
|
void _updateCountUnReadForMailbox(
|
||||||
|
PresentationMailbox presentationMailbox,
|
||||||
|
{
|
||||||
|
required int countUnreadChange,
|
||||||
|
required bool isUnread
|
||||||
|
}
|
||||||
|
) {
|
||||||
if (presentationMailbox.hasRole()) {
|
if (presentationMailbox.hasRole()) {
|
||||||
final newCountUnRead = presentationMailbox.unreadEmails != null
|
final currentCountUnread = presentationMailbox.unreadEmails != null
|
||||||
? presentationMailbox.unreadEmails!.value.value - 1
|
? presentationMailbox.unreadEmails!.value.value
|
||||||
: 0;
|
: 0;
|
||||||
final newMailbox = presentationMailbox.toPresentationMailbox(countUnRead: UnsignedInt(newCountUnRead));
|
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
|
final newDefaultMailboxList = defaultMailboxList
|
||||||
.map((mailbox) => mailbox.id == presentationMailbox.id
|
.map((mailbox) => mailbox.id == presentationMailbox.id
|
||||||
? mailbox.toPresentationMailbox(countUnRead: UnsignedInt(newCountUnRead))
|
? mailbox.toPresentationMailbox(countUnRead: UnsignedInt(newCountUnread))
|
||||||
: mailbox)
|
: mailbox)
|
||||||
.toList();
|
.toList();
|
||||||
defaultMailboxList.value = newDefaultMailboxList;
|
defaultMailboxList.value = newDefaultMailboxList;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ 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/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/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/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/actions/email_action.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';
|
||||||
@@ -69,9 +70,16 @@ class ThreadController extends BaseController {
|
|||||||
_currentMailboxId = selectedMailbox?.id;
|
_currentMailboxId = selectedMailbox?.id;
|
||||||
refreshGetAllEmailAction();
|
refreshGetAllEmailAction();
|
||||||
} else {
|
} else {
|
||||||
final emailCurrent = mailboxDashBoardController.selectedEmail.value;
|
final actionCurrent = mailboxDashBoardController.mailboxDashBoardAction.value;
|
||||||
if (Get.context != null && responsiveUtils.isDesktop(Get.context!) && emailCurrent != null) {
|
if (actionCurrent is MarkAsEmailReadAction) {
|
||||||
_updateStateUnReadEmail(emailCurrent.id, unRead: false);
|
final emailCurrent = mailboxDashBoardController.selectedEmail.value;
|
||||||
|
if (Get.context != null && responsiveUtils.isDesktop(Get.context!) && emailCurrent != null) {
|
||||||
|
_updateStateUnReadAllEmail([emailCurrent.id], isUnread: false);
|
||||||
|
}
|
||||||
|
mailboxDashBoardController.clearMailboxDashBoardAction();
|
||||||
|
} else if (actionCurrent is MarkAsMultipleEmailReadAndUnreadAction) {
|
||||||
|
_updateStateUnReadAllEmail(actionCurrent.listEmailId, isUnread: actionCurrent.isUnread);
|
||||||
|
mailboxDashBoardController.clearMailboxDashBoardAction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -218,9 +226,9 @@ class ThreadController extends BaseController {
|
|||||||
currentSelectMode.value = SelectMode.INACTIVE;
|
currentSelectMode.value = SelectMode.INACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _updateStateUnReadEmail(EmailId emailId, {required bool unRead}) {
|
void _updateStateUnReadAllEmail(List<EmailId> list, {required bool isUnread}) {
|
||||||
final newEmailList = emailList
|
final newEmailList = emailList
|
||||||
.map((email) => email.id == emailId ? email.markAsReadPresentationEmail(unRead: unRead) : email)
|
.map((email) => list.contains(email.id) ? email.markAsReadPresentationEmail(isUnread: isUnread) : email)
|
||||||
.toList();
|
.toList();
|
||||||
emailList.value = newEmailList;
|
emailList.value = newEmailList;
|
||||||
}
|
}
|
||||||
@@ -238,8 +246,9 @@ class ThreadController extends BaseController {
|
|||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
final accountId = mailboxDashBoardController.accountId.value;
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
|
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
|
||||||
|
|
||||||
if (accountId != null) {
|
if (accountId != null && mailboxCurrent != null) {
|
||||||
_markAsMultipleEmailReadInteractor
|
_markAsMultipleEmailReadInteractor
|
||||||
.execute(accountId, listEmailId, isUnread)
|
.execute(accountId, listEmailId, isUnread)
|
||||||
.then((result) => result.fold(
|
.then((result) => result.fold(
|
||||||
@@ -254,6 +263,7 @@ class ThreadController extends BaseController {
|
|||||||
},
|
},
|
||||||
(success) {
|
(success) {
|
||||||
cancelSelectEmail();
|
cancelSelectEmail();
|
||||||
|
final listEmailIdSuccess = _getListEmailIdMarkedAsReadSuccess(success);
|
||||||
|
|
||||||
if (success is MarkAsEmailReadSuccess
|
if (success is MarkAsEmailReadSuccess
|
||||||
|| success is MarkAsMultipleEmailReadAllSuccess
|
|| success is MarkAsMultipleEmailReadAllSuccess
|
||||||
@@ -263,11 +273,45 @@ class ThreadController extends BaseController {
|
|||||||
? AppLocalizations.of(Get.context!).marked_multiple_item_as_unread(listEmail.length)
|
? AppLocalizations.of(Get.context!).marked_multiple_item_as_unread(listEmail.length)
|
||||||
: AppLocalizations.of(Get.context!).marked_multiple_item_as_read(listEmail.length));
|
: AppLocalizations.of(Get.context!).marked_multiple_item_as_read(listEmail.length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (listEmailIdSuccess.isNotEmpty) {
|
||||||
|
_updateStateEmailAndCountUnReadMailbox(MarkAsMultipleEmailReadAndUnreadAction(listEmailIdSuccess, mailboxCurrent, isUnread));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<EmailId> _getListEmailIdMarkedAsReadSuccess(Success success) {
|
||||||
|
final listEmailIdSuccess = <EmailId>[];
|
||||||
|
|
||||||
|
if (success is MarkAsEmailReadSuccess) {
|
||||||
|
listEmailIdSuccess.add(success.emailId);
|
||||||
|
} else if (success is MarkAsMultipleEmailReadAllSuccess) {
|
||||||
|
success.resultList.forEach((either) {
|
||||||
|
either.map((success) {
|
||||||
|
if (success is MarkAsEmailReadSuccess) {
|
||||||
|
listEmailIdSuccess.add(success.emailId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else if (success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||||
|
success.resultList.forEach((either) {
|
||||||
|
either.map((success) {
|
||||||
|
if (success is MarkAsEmailReadSuccess) {
|
||||||
|
listEmailIdSuccess.add(success.emailId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return listEmailIdSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _updateStateEmailAndCountUnReadMailbox(AppAction? appAction) {
|
||||||
|
mailboxDashBoardController.setMailboxDashBoardAction(appAction);
|
||||||
|
}
|
||||||
|
|
||||||
void openContextMenuSelectedEmail(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
void openContextMenuSelectedEmail(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
||||||
(ContextMenuBuilder(context)
|
(ContextMenuBuilder(context)
|
||||||
..addTiles(_contextMenuActionList(context, imagePaths, listEmail)))
|
..addTiles(_contextMenuActionList(context, imagePaths, listEmail)))
|
||||||
@@ -342,7 +386,7 @@ class ThreadController extends BaseController {
|
|||||||
void goToEmail(BuildContext context) async {
|
void goToEmail(BuildContext context) async {
|
||||||
final action = await push(AppRoutes.EMAIL);
|
final action = await push(AppRoutes.EMAIL);
|
||||||
if (action is MarkAsEmailReadAction) {
|
if (action is MarkAsEmailReadAction) {
|
||||||
_updateStateUnReadEmail(action.emailId, unRead: false);
|
_updateStateUnReadAllEmail([action.emailId], isUnread: false);
|
||||||
mailboxDashBoardController.setMailboxDashBoardAction(action);
|
mailboxDashBoardController.setMailboxDashBoardAction(action);
|
||||||
}
|
}
|
||||||
mailboxDashBoardController.clearSelectedEmail();
|
mailboxDashBoardController.clearSelectedEmail();
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
|||||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||||
import 'package:tmail_ui_user/main/actions/app_action.dart';
|
import 'package:tmail_ui_user/main/actions/app_action.dart';
|
||||||
|
|
||||||
class MarkAsEmailReadAction extends ActionOnline {
|
class MarkAsEmailReadAction extends ActionOffline {
|
||||||
final EmailId emailId;
|
final EmailId emailId;
|
||||||
final PresentationMailbox presentationMailbox;
|
final PresentationMailbox presentationMailbox;
|
||||||
|
|
||||||
@@ -12,3 +12,14 @@ class MarkAsEmailReadAction extends ActionOnline {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [emailId, presentationMailbox];
|
List<Object?> get props => [emailId, presentationMailbox];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class MarkAsMultipleEmailReadAndUnreadAction extends ActionOffline {
|
||||||
|
final List<EmailId> listEmailId;
|
||||||
|
final PresentationMailbox presentationMailbox;
|
||||||
|
final bool isUnread;
|
||||||
|
|
||||||
|
MarkAsMultipleEmailReadAndUnreadAction(this.listEmailId, this.presentationMailbox, this.isUnread);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [listEmailId, presentationMailbox, isUnread];
|
||||||
|
}
|
||||||
@@ -14,10 +14,10 @@ extension PresentationEmailExtension on PresentationEmail {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
PresentationEmail markAsReadPresentationEmail({required bool unRead}) {
|
PresentationEmail markAsReadPresentationEmail({required bool isUnread}) {
|
||||||
var newKeyWord = keywords;
|
var newKeyWord = keywords;
|
||||||
|
|
||||||
if (unRead) {
|
if (isUnread) {
|
||||||
newKeyWord?.removeWhere((key, value) => key == KeyWordIdentifier.emailSeen);
|
newKeyWord?.removeWhere((key, value) => key == KeyWordIdentifier.emailSeen);
|
||||||
} else {
|
} else {
|
||||||
if (newKeyWord == null) {
|
if (newKeyWord == null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user