TF-3759 Update style popup context menu for email more action on thread view

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-06-13 13:44:12 +07:00
committed by Dat H. Pham
parent 0a7ec53885
commit 5fe264c670
8 changed files with 173 additions and 139 deletions
+42 -128
View File
@@ -10,8 +10,10 @@ import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/popup_menu_widget_mixin.dart';
import 'package:tmail_ui_user/features/base/widget/clean_messages_banner.dart';
import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart';
import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_menu_item_action_widget.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/email/presentation/model/context_item_email_action.dart';
import 'package:tmail_ui_user/features/email/presentation/model/popup_menu_item_email_action.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/clear_mailbox_state.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/extensions/open_and_close_composer_extension.dart';
@@ -622,23 +624,25 @@ class ThreadView extends GetWidget<ThreadController>
PresentationEmail presentationEmail,
RelativeRect? position
) {
final mailboxContain = presentationEmail.mailboxContain;
final isDrafts = mailboxContain?.isDrafts ?? false;
final isChildOfTeamMailboxes =
mailboxContain?.isChildOfTeamMailboxes ?? false;
final isSpam = mailboxContain?.isSpam ?? false;
final isArchive = mailboxContain?.isArchive ?? false;
final isTemplates = mailboxContain?.isTemplates ?? false;
final listEmailActions = [
EmailActionType.openInNewTab,
if (!isDrafts && !isChildOfTeamMailboxes)
isSpam ? EmailActionType.unSpam : EmailActionType.moveToSpam,
if (!isArchive) EmailActionType.archiveMessage,
if (!isDrafts && !isTemplates) EmailActionType.editAsNewEmail,
];
if (listEmailActions.isEmpty) return;
if (controller.responsiveUtils.isScreenWithShortestSide(context)) {
final mailboxContain = presentationEmail.mailboxContain;
final listEmailActions = [
EmailActionType.openInNewTab,
if (mailboxContain?.isDrafts == false && mailboxContain?.isChildOfTeamMailboxes == false)
mailboxContain?.isSpam == true
? EmailActionType.unSpam
: EmailActionType.moveToSpam,
if (mailboxContain?.isArchive == false)
EmailActionType.archiveMessage,
if (mailboxContain?.isDrafts == false && mailboxContain?.isTemplates == false)
EmailActionType.editAsNewEmail,
];
if (listEmailActions.isEmpty) return;
final contextMenuActions = listEmailActions
.map((action) => ContextItemEmailAction(
action,
@@ -659,10 +663,31 @@ class ThreadView extends GetWidget<ThreadController>
},
);
} else {
final popupMenuActions = listEmailActions.map((actionType) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: PopupMenuItemActionWidget(
menuAction: PopupMenuItemEmailAction(
actionType,
AppLocalizations.of(context),
controller.imagePaths,
),
menuActionClick: (menuAction) {
popBack();
controller.handleEmailActionType(
menuAction.action,
presentationEmail,
mailboxContain: mailboxContain,
);
},
),
);
}).toList();
controller.openPopupMenuAction(
context,
position,
_popupMenuActionTile(context, presentationEmail)
popupMenuActions,
);
}
}
@@ -737,117 +762,6 @@ class ThreadView extends GetWidget<ThreadController>
));
}
List<PopupMenuEntry> _popupMenuActionTile(BuildContext context, PresentationEmail email) {
final mailboxContain = email.mailboxContain;
return [
_buildOpenInNewTabPopupMenuItem(context, email, mailboxContain),
if (mailboxContain?.isDrafts == false && mailboxContain?.isChildOfTeamMailboxes == false)
_buildMarkAsSpamPopupMenuItem(context, email, mailboxContain),
if (mailboxContain?.isArchive == false)
_buildArchiveMessagePopupMenuItem(context, email),
if (mailboxContain?.isDrafts == false && mailboxContain?.isTemplates == false)
_buildEditAsNewEmailPopupMenuItem(AppLocalizations.of(context), email),
];
}
PopupMenuEntry _buildMarkAsSpamPopupMenuItem(
BuildContext context,
PresentationEmail email,
PresentationMailbox? mailboxContain
) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: popupItem(
mailboxContain?.isSpam == true ? controller.imagePaths.icNotSpam : controller.imagePaths.icSpam,
mailboxContain?.isSpam == true
? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam,
colorIcon: AppColor.colorTextButton,
styleName: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black
),
onCallbackAction: () => controller.handleEmailActionType(
mailboxContain?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam,
email,
mailboxContain: mailboxContain,
)
)
);
}
PopupMenuEntry _buildOpenInNewTabPopupMenuItem(
BuildContext context,
PresentationEmail email,
PresentationMailbox? mailboxContain
) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: popupItem(
controller.imagePaths.icOpenInNewTab,
AppLocalizations.of(context).openInNewTab,
colorIcon: AppColor.colorTextButton,
styleName: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black
),
onCallbackAction: () {
popBack();
controller.openEmailInNewTabAction(email);
}
)
);
}
PopupMenuEntry _buildArchiveMessagePopupMenuItem(
BuildContext context,
PresentationEmail email
) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: popupItem(
controller.imagePaths.icMailboxArchived,
AppLocalizations.of(context).archiveMessage,
colorIcon: AppColor.colorTextButton,
styleName: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black
),
onCallbackAction: () {
popBack();
controller.archiveMessage(context, email);
}
)
);
}
PopupMenuEntry _buildEditAsNewEmailPopupMenuItem(
AppLocalizations appLocalizations,
PresentationEmail email,
) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: popupItem(
controller.imagePaths.icEdit,
appLocalizations.editAsNewEmail,
colorIcon: AppColor.colorTextButton,
styleName: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black
),
onCallbackAction: () {
popBack();
controller.editAsNewEmail(email);
}
)
);
}
Widget _buildMailboxActionProgressBanner(BuildContext context) {
return Obx(() {
return _MailboxActionProgressBanner(