TF-4053 Implement move folder content on mailbox list view
This commit is contained in:
+108
@@ -0,0 +1,108 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_defaul
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_folder_content_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart';
|
||||
@@ -60,6 +61,7 @@ class MailboxBindings extends BaseBindings {
|
||||
Get.find<SubscribeMultipleMailboxInteractor>(),
|
||||
Get.find<SubaddressingInteractor>(),
|
||||
Get.find<CreateDefaultMailboxInteractor>(),
|
||||
Get.find<MoveFolderContentInteractor>(),
|
||||
Get.find<TreeBuilder>(),
|
||||
Get.find<VerifyNameInteractor>(),
|
||||
Get.find<GetAllMailboxInteractor>(),
|
||||
@@ -111,6 +113,7 @@ class MailboxBindings extends BaseBindings {
|
||||
Get.lazyPut(() => SubscribeMultipleMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => SubaddressingInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => CreateDefaultMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
Get.lazyPut(() => MoveFolderContentInteractor(Get.find<MailboxRepository>()));
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -49,6 +49,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_s
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/move_folder_content_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_all_mailboxes_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
|
||||
@@ -60,6 +61,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_defaul
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_folder_content_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart';
|
||||
@@ -67,6 +69,7 @@ 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';
|
||||
@@ -74,6 +77,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_catego
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_action_reactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
|
||||
@@ -116,8 +120,10 @@ class MailboxController extends BaseMailboxController
|
||||
final SubscribeMultipleMailboxInteractor _subscribeMultipleMailboxInteractor;
|
||||
final SubaddressingInteractor _subaddressingInteractor;
|
||||
final CreateDefaultMailboxInteractor _createDefaultMailboxInteractor;
|
||||
final MoveFolderContentInteractor _moveFolderContentInteractor;
|
||||
|
||||
IOSSharingManager? _iosSharingManager;
|
||||
late MailboxActionReactor mailboxActionReactor;
|
||||
|
||||
final _activeScrollTop = RxBool(false);
|
||||
final _activeScrollBottom = RxBool(true);
|
||||
@@ -147,6 +153,7 @@ class MailboxController extends BaseMailboxController
|
||||
this._subscribeMultipleMailboxInteractor,
|
||||
this._subaddressingInteractor,
|
||||
this._createDefaultMailboxInteractor,
|
||||
this._moveFolderContentInteractor,
|
||||
TreeBuilder treeBuilder,
|
||||
VerifyNameInteractor verifyNameInteractor,
|
||||
GetAllMailboxInteractor getAllMailboxInteractor,
|
||||
@@ -162,6 +169,9 @@ class MailboxController extends BaseMailboxController
|
||||
void onInit() {
|
||||
_registerObxStreamListener();
|
||||
_initWebSocketQueueHandler();
|
||||
mailboxActionReactor = MailboxActionReactor(
|
||||
_moveFolderContentInteractor,
|
||||
);
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@@ -186,7 +196,6 @@ class MailboxController extends BaseMailboxController
|
||||
|
||||
@override
|
||||
void handleSuccessViewState(Success success) {
|
||||
super.handleSuccessViewState(success);
|
||||
if (success is GetAllMailboxSuccess) {
|
||||
_handleGetAllMailboxSuccess(success);
|
||||
} else if (success is CreateNewMailboxSuccess) {
|
||||
@@ -209,12 +218,15 @@ class MailboxController extends BaseMailboxController
|
||||
handleSubAddressingSuccess(success);
|
||||
} else if (success is CreateDefaultMailboxAllSuccess) {
|
||||
_handleCreateDefaultFolderIfMissingSuccess(success);
|
||||
} else if (success is MoveFolderContentSuccess) {
|
||||
handleMoveFolderContentSuccess(success);
|
||||
} else {
|
||||
super.handleSuccessViewState(success);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void handleFailureViewState(Failure failure) {
|
||||
super.handleFailureViewState(failure);
|
||||
if (failure is CreateNewMailboxFailure) {
|
||||
_createNewMailboxFailure(failure);
|
||||
} else if (failure is RenameMailboxFailure) {
|
||||
@@ -223,6 +235,10 @@ class MailboxController extends BaseMailboxController
|
||||
_deleteMailboxFailure(failure);
|
||||
} else if (failure is SubaddressingFailure) {
|
||||
handleSubAddressingFailure(failure);
|
||||
} else if (failure is MoveFolderContentFailure) {
|
||||
handleMoveFolderContentFailure(failure);
|
||||
} else {
|
||||
super.handleFailureViewState(failure);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1178,6 +1194,8 @@ class MailboxController extends BaseMailboxController
|
||||
mailboxDashBoardController.gotoEmailRecovery();
|
||||
break;
|
||||
case MailboxActions.moveFolderContent:
|
||||
performMoveFolderContent(context: context, mailboxSelected: mailbox);
|
||||
mailboxDashBoardController.closeMailboxMenuDrawer();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -37,6 +37,7 @@ extension MailboxActionsExtension on MailboxActions {
|
||||
return AppLocalizations.of(context).selectParentFolder;
|
||||
case MailboxActions.moveEmail:
|
||||
case MailboxActions.move:
|
||||
case MailboxActions.moveFolderContent:
|
||||
return AppLocalizations.of(context).moveTo;
|
||||
case MailboxActions.select:
|
||||
case MailboxActions.selectForRuleAction:
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_folder_content_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_folder_content_interactor.dart';
|
||||
|
||||
class MailboxActionReactor {
|
||||
MailboxActionReactor(this._moveFolderContentInteractor);
|
||||
|
||||
final MoveFolderContentInteractor _moveFolderContentInteractor;
|
||||
|
||||
Stream<Either<Failure, Success>> moveFolderContent({
|
||||
required Session session,
|
||||
required AccountId accountId,
|
||||
required MoveFolderContentRequest moveRequest,
|
||||
StreamController<Either<Failure, Success>>? onProgressController,
|
||||
}) {
|
||||
return _moveFolderContentInteractor.execute(
|
||||
session: session,
|
||||
accountId: accountId,
|
||||
request: moveRequest,
|
||||
onProgressController: onProgressController,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user