TF-153 Combine moveToMailbox and moveToTrash to moveToMailbox using EmailActionType object

This commit is contained in:
dab246
2022-04-15 15:51:37 +07:00
committed by Dat H. Pham
parent 60aabfb6d1
commit 16c5aed64e
45 changed files with 268 additions and 722 deletions
@@ -17,7 +17,6 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/email_controller.dart';
import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
@@ -76,7 +75,6 @@ class EmailBindings extends BaseBindings {
Get.find<EmailRepository>(),
Get.find<CredentialRepository>(),
));
Get.lazyPut(() => MoveToTrashInteractor(Get.find<EmailRepository>()));
}
@override
@@ -15,8 +15,8 @@ import 'package:permission_handler/permission_handler.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.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/download_attachment_for_web_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart';
@@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_action.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -91,7 +92,7 @@ class EmailController extends BaseController {
_resetToOriginalValue();
if (presentationEmail != null) {
_getEmailContentAction(presentationEmail.id);
if (presentationEmail.isUnReadEmail()) {
if (!presentationEmail.hasRead) {
markAsEmailRead(presentationEmail, ReadActions.markAsRead);
}
}
@@ -331,7 +332,7 @@ class EmailController extends BaseController {
}
}
void moveToMailboxAction(BuildContext context, PresentationEmail email) async {
void moveToMailbox(BuildContext context, PresentationEmail email) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
final accountId = mailboxDashBoardController.accountId.value;
@@ -343,75 +344,73 @@ class EmailController extends BaseController {
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.role == PresentationMailbox.roleTrash) {
_moveToTrash(context, accountId, MoveToTrashRequest(
_moveToTrashAction(context, accountId, MoveToMailboxRequest(
[email.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moveToTrash));
MoveAction.moving,
EmailActionType.moveToTrash));
} else {
_moveToMailbox(accountId, MoveRequest(
_moveToMailbox(accountId, MoveToMailboxRequest(
[email.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moveTo,
MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
}
}
}
}
void _moveToMailbox(AccountId accountId, MoveRequest moveRequest) {
void _moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) {
consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest));
}
void _moveToMailboxSuccess(Success success) {
void _moveToMailboxSuccess(MoveToMailboxSuccess success) {
mailboxDashBoardController.dispatchState(Right(success));
if (success is MoveToMailboxSuccess
&& success.moveAction == MoveAction.moveTo
&& currentContext != null && currentOverlayContext != null) {
if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) {
_appToast.showToastWithAction(
currentOverlayContext!,
AppLocalizations.of(currentContext!).moved_to_mailbox(success.destinationPath ?? ''),
AppLocalizations.of(currentContext!).undo_action,
() {
final newMoveRequest = MoveRequest(
[success.emailId],
success.destinationMailboxId,
success.currentMailboxId,
MoveAction.undo);
_undoMoveToMailbox(newMoveRequest);
success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath),
AppLocalizations.of(currentContext!).undo_action, () {
_undoMoveToMailbox(MoveToMailboxRequest(
[success.emailId],
success.destinationMailboxId,
success.currentMailboxId,
MoveAction.undo,
success.emailActionType));
}
);
}
}
void _undoMoveToMailbox(MoveRequest newMoveRequest) {
void _undoMoveToMailbox(MoveToMailboxRequest newMoveRequest) {
final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) {
_moveToMailbox(accountId, newMoveRequest);
}
}
void moveToTrashAction(BuildContext context, PresentationEmail email) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
void moveToTrash(BuildContext context, PresentationEmail email) async {
final accountId = mailboxDashBoardController.accountId.value;
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash];
final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash);
if (currentMailbox != null && accountId != null && trashMailboxId != null) {
_moveToTrash(context, accountId, MoveToTrashRequest(
if (accountId != null && currentMailbox != null && trashMailboxId != null) {
_moveToTrashAction(context, accountId, MoveToMailboxRequest(
[email.id],
currentMailbox.id,
currentMailbox!.id,
trashMailboxId,
MoveAction.moveToTrash)
MoveAction.moving,
EmailActionType.moveToTrash)
);
}
}
void _moveToTrash(BuildContext context, AccountId accountId, MoveToTrashRequest moveRequest) {
void _moveToTrashAction(BuildContext context, AccountId accountId, MoveToMailboxRequest moveRequest) {
backToThreadView(context);
mailboxDashBoardController.moveToTrash(accountId, moveRequest);
mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
}
void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async {
@@ -435,17 +434,17 @@ class EmailController extends BaseController {
popBack();
markAsEmailRead(presentationEmail, ReadActions.markAsUnread);
break;
case EmailActionType.markAsStar:
case EmailActionType.markAsStarred:
markAsStarEmail(presentationEmail, MarkStarAction.markStar);
break;
case EmailActionType.markAsUnStar:
case EmailActionType.unMarkAsStarred:
markAsStarEmail(presentationEmail, MarkStarAction.unMarkStar);
break;
case EmailActionType.move:
moveToMailboxAction(context, presentationEmail);
case EmailActionType.moveToMailbox:
moveToMailbox(context, presentationEmail);
break;
case EmailActionType.moveToTrash:
moveToTrashAction(context, presentationEmail);
moveToTrash(context, presentationEmail);
break;
case EmailActionType.deletePermanently:
deleteEmailPermanently(context, presentationEmail);
@@ -122,23 +122,12 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio
Widget _buildAppBar(BuildContext context) {
return Obx(() => Padding(
padding: EdgeInsets.only(top: 6),
child: (AppBarMailWidgetBuilder(
context,
imagePaths,
responsiveUtils,
emailController.currentEmail,
emailController.currentMailbox)
child: (AppBarMailWidgetBuilder(context, imagePaths, responsiveUtils, emailController.currentEmail, emailController.currentMailbox)
..onBackActionClick(() => emailController.backToThreadView(context))
..addOnEmailActionClick((email, action) => emailController.handleEmailAction(context, email, action))
..addOnMoreActionClick((email, position) => responsiveUtils.isMobileDevice(context)
? emailController.openMoreMenuEmailAction(
context,
_emailActionMoreActionTile(context, email),
cancelButton: _buildCancelButton(context))
: emailController.openMoreMenuEmailActionForTablet(
context,
position,
_popupMenuEmailActionTile(context, email))))
..addOnMoreActionClick((email, position) => responsiveUtils.isMobile(context)
? emailController.openMoreMenuEmailAction(context, _emailActionMoreActionTile(context, email), cancelButton: _buildCancelButton(context))
: emailController.openMoreMenuEmailActionForTablet(context, position, _popupMenuEmailActionTile(context, email))))
.build()));
}
@@ -554,7 +543,7 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio
List<Widget> _emailActionMoreActionTile(BuildContext context, PresentationEmail email) {
return <Widget>[
_unreadEmailAction(context, email),
_markAsEmailUnreadAction(context, email),
];
}
@@ -567,9 +556,9 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio
);
}
Widget _unreadEmailAction(BuildContext context, PresentationEmail email) {
Widget _markAsEmailUnreadAction(BuildContext context, PresentationEmail email) {
return (EmailActionCupertinoActionSheetActionBuilder(
Key('email_action_unread_action'),
Key('mark_as_unread_action'),
SvgPicture.asset(imagePaths.icUnreadEmail, width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton),
AppLocalizations.of(context).mark_as_unread,
email,
@@ -585,7 +574,7 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio
List<PopupMenuEntry> _popupMenuEmailActionTile(BuildContext context, PresentationEmail email) {
return [
PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _unreadEmailAction(context, email)),
PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _markAsEmailUnreadAction(context, email)),
];
}
}
@@ -53,10 +53,8 @@ class AppBarMailWidgetBuilder {
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (_conditionShow(_context))
_buildBackButton(),
if (_conditionShow(_context))
Expanded(child: _buildMailboxName()),
if (_conditionShow(_context)) _buildBackButton(),
if (_conditionShow(_context)) Expanded(child: _buildMailboxName()),
if (_presentationEmail != null) _buildListOptionButton(),
]
)
@@ -98,21 +96,12 @@ class AppBarMailWidgetBuilder {
buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icMoveEmail, fit: BoxFit.fill),
tooltip: AppLocalizations.of(_context).move_message,
onTap: () {
if (_presentationEmail != null) {
_onEmailActionClick?.call(_presentationEmail!, EmailActionType.move);
}
}),
onTap: () => _onEmailActionClick?.call(_presentationEmail!, EmailActionType.moveToMailbox)),
buildIconWeb(
icon: SvgPicture.asset((_presentationEmail != null && _presentationEmail!.isFlaggedEmail()) ? _imagePaths.icStar : _imagePaths.icUnStar, fit: BoxFit.fill),
tooltip: (_presentationEmail != null && _presentationEmail!.isFlaggedEmail())
? AppLocalizations.of(_context).mark_as_unstar
: AppLocalizations.of(_context).mark_as_star,
onTap: () {
if (_presentationEmail != null) {
_onEmailActionClick?.call(_presentationEmail!, _presentationEmail!.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar);
}
}),
icon: SvgPicture.asset(_presentationEmail!.hasStarred ? _imagePaths.icStar : _imagePaths.icUnStar, fit: BoxFit.fill),
tooltip: _presentationEmail!.hasStarred ? AppLocalizations.of(_context).not_starred : AppLocalizations.of(_context).mark_as_starred,
onTap: () => _onEmailActionClick?.call(_presentationEmail!,
_presentationEmail!.hasStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred)),
buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDeleteEmail, fit: BoxFit.fill),
tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash