TF-3941 Thread Detail Thread level mark read/star, archive and spam

This commit is contained in:
DatDang
2025-08-05 14:15:03 +07:00
committed by Dat H. Pham
parent f44118af48
commit b7cd3f7179
35 changed files with 902 additions and 552 deletions
@@ -207,9 +207,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
: _threadDetailController?.emailIdsPresentation[_currentEmailId];
}
bool get isOnlyEmailInThread =>
_threadDetailController?.emailIdsPresentation.length == 1;
bool get calendarEventProcessing => viewState.value.fold(
(failure) => false,
(success) => success is CalendarEventReplying);
+26 -29
View File
@@ -252,40 +252,37 @@ class EmailView extends GetWidget<SingleEmailController> {
onEmailActionClick: (presentationEmail, actionType) => controller.handleEmailAction(context, presentationEmail, actionType),
isInsideThreadDetailView: isInsideThreadDetailView,
emailLoaded: controller.currentEmailLoaded.value,
onMoreActionClick: controller.isOnlyEmailInThread
? null
: (presentationEmail, position) => controller.emailActionReactor.handleMoreEmailAction(
mailboxContain: controller.getMailboxContain(presentationEmail),
presentationEmail: presentationEmail,
position: position,
responsiveUtils: controller.responsiveUtils,
imagePaths: controller.imagePaths,
username: controller.session?.username,
handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action),
additionalActions: [
EmailActionType.forward,
EmailActionType.replyAll,
EmailActionType.replyToList,
EmailActionType.printAll,
if (controller.responsiveUtils.isMobile(context))
EmailActionType.moveToMailbox,
if (!controller.responsiveUtils.isDesktop(context)) ...[
EmailActionType.markAsStarred,
EmailActionType.unMarkAsStarred,
EmailActionType.moveToTrash,
EmailActionType.deletePermanently,
],
],
emailIsRead: presentationEmail.hasRead,
openBottomSheetContextMenu: controller.mailboxDashBoardController.openBottomSheetContextMenu,
openPopupMenu: controller.mailboxDashBoardController.openPopupMenu,
),
onMoreActionClick: (presentationEmail, position) => controller.emailActionReactor.handleMoreEmailAction(
mailboxContain: controller.getMailboxContain(presentationEmail),
presentationEmail: presentationEmail,
position: position,
responsiveUtils: controller.responsiveUtils,
imagePaths: controller.imagePaths,
username: controller.session?.username,
handleEmailAction: (email, action) => controller.handleEmailAction(context, email, action),
additionalActions: [
EmailActionType.forward,
EmailActionType.replyAll,
EmailActionType.replyToList,
EmailActionType.printAll,
if (controller.responsiveUtils.isMobile(context))
EmailActionType.moveToMailbox,
if (!controller.responsiveUtils.isDesktop(context)) ...[
EmailActionType.markAsStarred,
EmailActionType.unMarkAsStarred,
EmailActionType.moveToTrash,
EmailActionType.deletePermanently,
],
],
emailIsRead: presentationEmail.hasRead,
openBottomSheetContextMenu: controller.mailboxDashBoardController.openBottomSheetContextMenu,
openPopupMenu: controller.mailboxDashBoardController.openPopupMenu,
),
onToggleThreadDetailCollapseExpand: onToggleThreadDetailCollapseExpand,
onTapAvatarActionClick: onToggleThreadDetailCollapseExpand,
mailboxContain: presentationEmail.findMailboxContain(
controller.mailboxDashBoardController.mapMailboxById,
),
isOnlyEmailInThread: controller.isOnlyEmailInThread,
)),
if (!controller.responsiveUtils.isMobile(context))
const SizedBox(height: 24),
@@ -23,6 +23,16 @@ extension EmailExtension on Email {
}
}
bool checkEmailValidForThreadDetail(
MailboxId sentMailboxId,
String ownEmailAddress) {
return id != null && (
!inSentMailbox(sentMailboxId)
|| !fromMe(ownEmailAddress)
|| !recipientsHasMe(ownEmailAddress)
);
}
bool inSentMailbox(MailboxId sentMailboxId) {
return mailboxIds?[sentMailboxId] == true;
}
@@ -35,7 +35,6 @@ class EmailViewAppBarWidget extends StatelessWidget {
final EdgeInsetsGeometry? iconPadding;
final EdgeInsetsGeometry? iconMargin;
final EdgeInsetsGeometry? padding;
final bool isOnlyEmailInThread;
EmailViewAppBarWidget({
Key? key,
@@ -53,7 +52,6 @@ class EmailViewAppBarWidget extends StatelessWidget {
this.iconPadding,
this.iconMargin,
this.padding,
this.isOnlyEmailInThread = false,
}) : super(key: key);
@override
@@ -266,8 +264,7 @@ class EmailViewAppBarWidget extends StatelessWidget {
_getMarkStarButton(appLocalizations),
_getDeleteButton(appLocalizations),
],
if (!isOnlyEmailInThread)
_getMoreButton(appLocalizations, isScreenWithShortestSide),
_getMoreButton(appLocalizations, isScreenWithShortestSide),
];
}
}
@@ -44,7 +44,6 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget {
final OnTapAvatarActionClick? onTapAvatarActionClick;
final PresentationMailbox? mailboxContain;
final bool showUnreadVisualization;
final bool isOnlyEmailInThread;
const InformationSenderAndReceiverBuilder({
Key? key,
@@ -64,7 +63,6 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget {
this.onTapAvatarActionClick,
this.mailboxContain,
this.showUnreadVisualization = false,
this.isOnlyEmailInThread = false,
}) : super(key: key);
@override
@@ -201,7 +199,6 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget {
iconPadding: const EdgeInsets.all(8),
iconMargin: EdgeInsets.zero,
padding: EdgeInsets.zero,
isOnlyEmailInThread: isOnlyEmailInThread,
),
),
),