TF-934 Implement open email in new tab

This commit is contained in:
dab246
2022-11-14 16:30:25 +07:00
committed by Dat H. Pham
parent 83f8049c48
commit 4f981878c3
13 changed files with 432 additions and 251 deletions
+114 -112
View File
@@ -6,6 +6,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/mixin/popup_menu_widget_mixin.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_email_address_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/app_bar_mail_widget_builder.dart';
@@ -16,7 +17,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/extensions/va
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class EmailView extends GetWidget<SingleEmailController> {
class EmailView extends GetWidget<SingleEmailController>
with PopupMenuWidgetMixin {
static const double maxSizeFullDisplayEmailAddressArrowDownButton = 30.0;
@@ -766,49 +768,58 @@ class EmailView extends GetWidget<SingleEmailController> {
Widget _markAsEmailUnreadAction(BuildContext context, PresentationEmail email) {
return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_unread_action'),
SvgPicture.asset(
imagePaths.icUnreadEmail,
width: 24,
height: 24,
fit: BoxFit.fill,
color: AppColor.colorTextButton),
AppLocalizations.of(context).mark_as_unread,
email,
iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12),
iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12)
: EdgeInsets.zero)
..onActionClick((email) => controller.handleEmailAction(context, email, EmailActionType.markAsUnread)))
.build();
const Key('mark_as_unread_action'),
SvgPicture.asset(
imagePaths.icUnreadEmail,
width: 24,
height: 24,
fit: BoxFit.fill,
color: AppColor.colorTextButton
),
AppLocalizations.of(context).mark_as_unread,
email,
iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12),
iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12)
: EdgeInsets.zero)
..onActionClick((email) => controller.handleEmailAction(
context,
email,
EmailActionType.markAsUnread)
)
).build();
}
Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) {
final currentMailbox = controller.getMailboxContain(email);
return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_spam_or_un_spam_action'),
SvgPicture.asset(
currentMailbox?.isSpam == true ? imagePaths.icNotSpam : imagePaths.icMailboxSpam,
width: 24,
height: 24,
fit: BoxFit.fill,
color: AppColor.colorTextButton),
currentMailbox?.isSpam == true
? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam,
email,
iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12),
iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12)
: EdgeInsets.zero)
..onActionClick((email) => controller.handleEmailAction(context, email,
currentMailbox?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam)))
.build();
const Key('mark_as_spam_or_un_spam_action'),
SvgPicture.asset(
currentMailbox?.isSpam == true ? imagePaths.icNotSpam : imagePaths.icSpam,
width: 24,
height: 24,
fit: BoxFit.fill,
color: AppColor.colorTextButton
),
currentMailbox?.isSpam == true
? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam,
email,
iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12),
iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12)
: EdgeInsets.zero)
..onActionClick((email) => controller.handleEmailAction(
context,
email,
currentMailbox?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam)
)
).build();
}
Widget _quickCreatingRuleAction(BuildContext context, PresentationEmail email) {
@@ -833,85 +844,76 @@ class EmailView extends GetWidget<SingleEmailController> {
}
List<PopupMenuEntry> _popupMenuEmailActionTile(BuildContext context, PresentationEmail email) {
final mailboxContain = controller.getMailboxContain(email);
return [
PopupMenuItem(
padding: EdgeInsets.zero,
child: _markAsEmailUnreadPopupItemAction(context, email)),
PopupMenuItem(
padding: EdgeInsets.zero,
child: _markAsEmailSpamOrUnSpamPopupItemAction(context, email)),
PopupMenuItem(
padding: EdgeInsets.zero,
child: _quickCreatingRulePopupItemAction(context, email)),
_markAsEmailUnreadPopupItemAction(context, email),
_markAsEmailSpamOrUnSpamPopupItemAction(context, email, mailboxContain),
_quickCreatingRulePopupItemAction(context, email)
];
}
Widget _markAsEmailUnreadPopupItemAction(BuildContext context, PresentationEmail email) {
return _popupMenuItem(
icon: imagePaths.icUnreadEmail,
title: AppLocalizations.of(context).mark_as_unread,
onTapCallback: () => controller.handleEmailAction(context, email, EmailActionType.markAsUnread)
);
}
Widget _markAsEmailSpamOrUnSpamPopupItemAction(BuildContext context, PresentationEmail email) {
final currentMailbox = controller.getMailboxContain(email);
return _popupMenuItem(
icon: currentMailbox?.isSpam == true
? imagePaths.icNotSpam
: imagePaths.icMailboxSpam,
title: currentMailbox?.isSpam == true
? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam,
onTapCallback: () => controller.handleEmailAction(
context,
email,
currentMailbox?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam)
);
}
Widget _quickCreatingRulePopupItemAction(BuildContext context, PresentationEmail email) {
return _popupMenuItem(
icon: imagePaths.icQuickCreatingRule,
title: AppLocalizations.of(context).quickCreatingRule,
onTapCallback: () => controller.quickCreatingRule(context, email.from!.first)
);
}
Widget _popupMenuItem({
required String icon,
required String title,
Function()? onTapCallback
}) {
return Material(
color: Colors.transparent,
child: InkWell(
onTap: onTapCallback,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: SizedBox(
width: 300,
height: 44,
child: Row(children: [
SvgPicture.asset(
icon,
width: 20,
height: 20,
color: AppColor.colorTextButton,
fit: BoxFit.fill),
const SizedBox(width: 12),
Expanded(child: Text(
title,
style: const TextStyle(
fontSize: 15,
color: Colors.black,
fontWeight: FontWeight.normal)
)),
])
),
PopupMenuEntry _markAsEmailUnreadPopupItemAction(BuildContext context, PresentationEmail email) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: popupItem(
imagePaths.icUnreadEmail,
AppLocalizations.of(context).mark_as_unread,
colorIcon: AppColor.colorTextButton,
styleName: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black
),
onCallbackAction: () => controller.handleEmailAction(
context,
email,
EmailActionType.markAsUnread
)
),
)
);
}
PopupMenuEntry _markAsEmailSpamOrUnSpamPopupItemAction(
BuildContext context,
PresentationEmail email,
PresentationMailbox? mailboxContain
) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: popupItem(
mailboxContain?.isSpam == true ? imagePaths.icNotSpam : 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.handleEmailAction(
context,
email,
mailboxContain?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam
)
)
);
}
PopupMenuEntry _quickCreatingRulePopupItemAction(BuildContext context, PresentationEmail email) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: popupItem(
imagePaths.icQuickCreatingRule,
AppLocalizations.of(context).quickCreatingRule,
colorIcon: AppColor.colorTextButton,
styleName: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black
),
onCallbackAction: () => controller.quickCreatingRule(context, email.from!.first)
)
);
}
}