TF-4053 Implement move folder content on mailbox search view

This commit is contained in:
dab246
2025-10-29 15:19:16 +07:00
committed by Dat H. Pham
parent 58c05c38b2
commit cb3fa99d68
6 changed files with 177 additions and 113 deletions
@@ -1,108 +0,0 @@
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter/cupertino.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/move_folder_content_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/move_folder_content_state.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
extension HandleMoveFolderContentExtension on MailboxController {
void performMoveFolderContent({
required BuildContext context,
required PresentationMailbox mailboxSelected,
}) {
final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent;
if (accountId == null || session == null) {
consumeState(
Stream.value(
Left(MoveFolderContentFailure(NotFoundAccountIdException())),
),
);
return;
}
moveFolderContentAction(
context: context,
accountId: accountId,
session: session,
mailboxSelected: mailboxSelected,
onMoveFolderContentAction: (currentMailbox, destinationMailbox) {
consumeState(mailboxActionReactor.moveFolderContent(
session: session,
accountId: accountId,
moveRequest: MoveFolderContentRequest(
moveAction: MoveAction.moving,
mailboxId: currentMailbox.id,
destinationMailboxId: destinationMailbox.id,
destinationMailboxDisplayName:
destinationMailbox.getDisplayName(context),
markAsRead: destinationMailbox.isSpam,
totalEmails: currentMailbox.countTotalEmails,
),
onProgressController:
mailboxDashBoardController.progressStateController,
));
},
);
}
void handleMoveFolderContentSuccess(MoveFolderContentSuccess success) {
mailboxDashBoardController.syncViewStateMailboxActionProgress(
newState: Right(UIState.idle),
);
final moveFolderRequest = success.request;
if (moveFolderRequest.moveAction == MoveAction.moving) {
toastManager.showMessageSuccessWithAction(
success: success,
onActionCallback: () {
_undoMoveFolderContentAction(
newMoveRequest: MoveFolderContentRequest(
moveAction: MoveAction.undo,
mailboxId: moveFolderRequest.destinationMailboxId,
destinationMailboxId: moveFolderRequest.mailboxId,
destinationMailboxDisplayName: '',
totalEmails: moveFolderRequest.totalEmails,
),
);
},
);
}
}
void _undoMoveFolderContentAction({
required MoveFolderContentRequest newMoveRequest,
}) {
final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent;
if (accountId == null || session == null) {
consumeState(
Stream.value(
Left(MoveFolderContentFailure(NotFoundAccountIdException())),
),
);
return;
}
consumeState(mailboxActionReactor.moveFolderContent(
session: session,
accountId: accountId,
moveRequest: newMoveRequest,
onProgressController: mailboxDashBoardController.progressStateController,
));
}
void handleMoveFolderContentFailure(MoveFolderContentFailure failure) {
mailboxDashBoardController.syncViewStateMailboxActionProgress(
newState: Right(UIState.idle),
);
toastManager.showMessageFailure(failure);
}
}
@@ -69,7 +69,6 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/subaddressing_int
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/handle_move_folder_content_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
@@ -219,7 +218,12 @@ class MailboxController extends BaseMailboxController
} else if (success is CreateDefaultMailboxAllSuccess) {
_handleCreateDefaultFolderIfMissingSuccess(success);
} else if (success is MoveFolderContentSuccess) {
handleMoveFolderContentSuccess(success);
handleMoveFolderContentSuccess(
success: success,
mailboxActionReactor: mailboxActionReactor,
dashboardController: mailboxDashBoardController,
baseMailboxController: this,
);
} else {
super.handleSuccessViewState(success);
}
@@ -236,7 +240,11 @@ class MailboxController extends BaseMailboxController
} else if (failure is SubaddressingFailure) {
handleSubAddressingFailure(failure);
} else if (failure is MoveFolderContentFailure) {
handleMoveFolderContentFailure(failure);
handleMoveFolderContentFailure(
failure: failure,
dashboardController: mailboxDashBoardController,
toastManager: toastManager,
);
} else {
super.handleFailureViewState(failure);
}
@@ -1194,7 +1202,13 @@ class MailboxController extends BaseMailboxController
mailboxDashBoardController.gotoEmailRecovery();
break;
case MailboxActions.moveFolderContent:
performMoveFolderContent(context: context, mailboxSelected: mailbox);
performMoveFolderContent(
context: context,
mailboxSelected: mailbox,
mailboxActionReactor: mailboxActionReactor,
dashboardController: mailboxDashBoardController,
baseMailboxController: this,
);
mailboxDashBoardController.closeMailboxMenuDrawer();
break;
default: