TF-1328 Implement archiveMessage in thread and singleEmail

(cherry picked from commit 83b45fdb3f3138e59b7882a8fdb77e522e753f3e)
This commit is contained in:
hieubt
2023-12-26 12:19:11 +07:00
committed by Dat H. Pham
parent 92ea5865aa
commit 53922c19d2
6 changed files with 71 additions and 54 deletions
@@ -1003,6 +1003,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
case EmailActionType.unsubscribe: case EmailActionType.unsubscribe:
_unsubscribeEmail(context, presentationEmail); _unsubscribeEmail(context, presentationEmail);
break; break;
case EmailActionType.archiveMessage:
archiveMessage(context, presentationEmail);
break;
default: default:
break; break;
} }
@@ -1480,4 +1483,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
) )
); );
} }
void archiveMessage(BuildContext context, PresentationEmail email) {
mailboxDashBoardController.archiveMessage(context, email);
}
} }
@@ -23,7 +23,6 @@ import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_draft
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.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_read_state.dart';
@@ -1347,25 +1346,4 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
mailboxDashBoardController.emptySpamFolderAction(spamFolderId: presentationMailbox.id); mailboxDashBoardController.emptySpamFolderAction(spamFolderId: presentationMailbox.id);
} }
} }
void archiveMessage(PresentationEmail email) {
final mailboxContain = email.findMailboxContain(mailboxDashBoardController.mapMailboxById);
if (mailboxContain != null) {
final archiveMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleArchive);
if (archiveMailboxId != null) {
final moveToArchiveMailboxRequest = MoveToMailboxRequest(
{mailboxContain.id: [email.id!]},
archiveMailboxId,
MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath:findNodePath(archiveMailboxId)
);
mailboxDashBoardController.moveToMailbox(
mailboxDashBoardController.sessionCurrent!,
mailboxDashBoardController.accountId.value!,
moveToArchiveMailboxRequest
);
}
}
}
} }
@@ -2393,6 +2393,28 @@ class MailboxDashBoardController extends ReloadableController {
return false; return false;
} }
void archiveMessage(BuildContext context, PresentationEmail email) {
final mailboxContain = email.findMailboxContain(mapMailboxById);
if (mailboxContain != null) {
final archiveMailboxId = getMailboxIdByRole(PresentationMailbox.roleArchive);
final archiveMailboxPath = mapMailboxById[archiveMailboxId]?.getDisplayName(context);
if (archiveMailboxId != null) {
final moveToArchiveMailboxRequest = MoveToMailboxRequest(
{mailboxContain.id: [email.id!]},
archiveMailboxId,
MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: archiveMailboxPath
);
moveToMailbox(
sessionCurrent!,
accountId.value!,
moveToArchiveMailboxRequest
);
}
}
}
@override @override
void onClose() { void onClose() {
_emailReceiveManager.closeEmailReceiveManagerStream(); _emailReceiveManager.closeEmailReceiveManagerStream();
@@ -287,4 +287,8 @@ mixin EmailActionController {
void openEmailInNewTabAction(BuildContext context, PresentationEmail email) { void openEmailInNewTabAction(BuildContext context, PresentationEmail email) {
AppUtils.launchLink(email.routeWebAsString); AppUtils.launchLink(email.routeWebAsString);
} }
void archiveMessage(BuildContext context, PresentationEmail email) {
mailboxDashBoardController.archiveMessage(context, email);
}
} }
@@ -1183,11 +1183,13 @@ class ThreadController extends BaseController with EmailActionController {
if (direction == DismissDirection.startToEnd) { if (direction == DismissDirection.startToEnd) {
ReadActions readActions = !email.hasRead ? ReadActions.markAsRead : ReadActions.markAsUnread; ReadActions readActions = !email.hasRead ? ReadActions.markAsRead : ReadActions.markAsUnread;
markAsEmailRead(email, readActions, MarkReadAction.swipeOnThread); markAsEmailRead(email, readActions, MarkReadAction.swipeOnThread);
} else if (direction == DismissDirection.endToStart) {
archiveMessage(context, email);
} }
return false; return false;
} }
DismissDirection getSwipeDirection(bool isWebDesktop, SelectMode selectMode) { DismissDirection getSwipeDirection(bool isWebDesktop, SelectMode selectMode, PresentationEmail email) {
if (isWebDesktop) { if (isWebDesktop) {
return DismissDirection.none; return DismissDirection.none;
} }
@@ -1196,9 +1198,13 @@ class ThreadController extends BaseController with EmailActionController {
return DismissDirection.none; return DismissDirection.none;
} }
return DismissDirection.startToEnd; return isInArchiveMailbox(email)
? DismissDirection.startToEnd
: DismissDirection.horizontal;
} }
bool isInArchiveMailbox(PresentationEmail email) => email.mailboxContain?.isArchive == true;
void scrollToTop() { void scrollToTop() {
if (listEmailController.hasClients) { if (listEmailController.hasClients) {
listEmailController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.fastOutSlowIn); listEmailController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
@@ -495,33 +495,33 @@ class ThreadView extends GetWidget<ThreadController>
), ),
secondaryBackground: controller.isInArchiveMailbox(presentationEmail) == false secondaryBackground: controller.isInArchiveMailbox(presentationEmail) == false
? Container( ? Container(
color: AppColor.colorItemRecipientSelected, color: AppColor.colorItemRecipientSelected,
padding: const EdgeInsetsDirectional.only(end: 16), padding: const EdgeInsetsDirectional.only(end: 16),
child: Align( child: Align(
alignment: AlignmentDirectional.centerEnd, alignment: AlignmentDirectional.centerEnd,
child: Row( child: Row(
children: [ children: [
const Spacer(), const Spacer(),
CircleAvatar( CircleAvatar(
backgroundColor: AppColor.colorSpamReportBannerBackground, backgroundColor: AppColor.colorSpamReportBannerBackground,
radius: 24, radius: 24,
child: SvgPicture.asset( child: SvgPicture.asset(
controller.imagePaths.icMailboxArchived, controller.imagePaths.icMailboxArchived,
fit: BoxFit.fill, fit: BoxFit.fill,
) )
),
const SizedBox(width: 11),
Text(
AppLocalizations.of(context).archiveMessage,
style: const TextStyle(
fontSize: 15,
color: AppColor.primaryColor,
), ),
), const SizedBox(width: 11),
], Text(
AppLocalizations.of(context).archiveMessage,
style: const TextStyle(
fontSize: 15,
color: AppColor.primaryColor,
),
),
],
),
), ),
), )
)
: null, : null,
confirmDismiss: (direction) => controller.swipeEmailAction(context, presentationEmail, direction), confirmDismiss: (direction) => controller.swipeEmailAction(context, presentationEmail, direction),
child: EmailTileBuilder( child: EmailTileBuilder(
@@ -730,13 +730,13 @@ class ThreadView extends GetWidget<ThreadController>
AppLocalizations.of(context).archiveMessage, AppLocalizations.of(context).archiveMessage,
email, email,
iconLeftPadding: controller.responsiveUtils.isMobile(context) iconLeftPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? const EdgeInsetsDirectional.only(start: 12, end: 16)
: const EdgeInsets.only(right: 12), : const EdgeInsetsDirectional.only(start: 12),
iconRightPadding: controller.responsiveUtils.isMobile(context) iconRightPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? const EdgeInsetsDirectional.only(start: 12)
: EdgeInsets.zero : EdgeInsets.zero
) )
..onActionClick((email) => controller.archiveMessage(email)) ..onActionClick((email) => controller.archiveMessage(context, email))
).build(); ).build();
} }
@@ -821,7 +821,7 @@ class ThreadView extends GetWidget<ThreadController>
), ),
onCallbackAction: () { onCallbackAction: () {
popBack(); popBack();
controller.archiveMessage(email); controller.archiveMessage(context, email);
} }
) )
); );