TF-1074 Handle go to path /destination_picker

This commit is contained in:
dab246
2022-10-24 23:39:05 +07:00
committed by Dat H. Pham
parent d3124f055b
commit daddeb78dc
17 changed files with 601 additions and 170 deletions
+3 -1
View File
@@ -7,12 +7,14 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart
import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/view_as_dialog_action_mixin.dart';
import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart'; import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart';
abstract class BaseController extends GetxController with MessageDialogActionMixin, PopupContextMenuActionMixin { abstract class BaseController extends GetxController
with MessageDialogActionMixin, PopupContextMenuActionMixin, ViewAsDialogActionMixin {
final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle)); final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
FpsCallback? fpsCallback; FpsCallback? fpsCallback;
@@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_bindings.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_view.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
mixin ViewAsDialogActionMixin {
void showDialogDestinationPicker({
required BuildContext context,
required DestinationPickerArguments arguments,
required Function(PresentationMailbox) onSelectedMailbox
}) {
DestinationPickerBindings().dependencies();
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierLabel: '',
barrierColor: Colors.black54,
pageBuilder: (context, animation, secondaryAnimation) {
return DestinationPickerView.fromArguments(
arguments,
onDismissCallback: () {
DestinationPickerBindings().dispose();
popBack();
},
onSelectedMailboxCallback: (destinationMailbox) {
DestinationPickerBindings().dispose();
popBack();
if (destinationMailbox is PresentationMailbox) {
onSelectedMailbox.call(destinationMailbox);
}
});
});
}
}
@@ -83,4 +83,8 @@ class DestinationPickerBindings extends BaseBindings {
Get.find<StateDataSource>(), Get.find<StateDataSource>(),
)); ));
} }
void dispose() {
Get.delete<DestinationPickerController>();
}
} }
@@ -20,6 +20,8 @@ import 'package:tmail_ui_user/features/thread/presentation/model/search_state.da
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
typedef OnSelectedMailboxCallback = Function(PresentationMailbox? destinationMailbox);
class DestinationPickerController extends BaseMailboxController { class DestinationPickerController extends BaseMailboxController {
final GetAllMailboxInteractor _getAllMailboxInteractor; final GetAllMailboxInteractor _getAllMailboxInteractor;
@@ -31,8 +33,12 @@ class DestinationPickerController extends BaseMailboxController {
final searchQuery = SearchQuery.initial().obs; final searchQuery = SearchQuery.initial().obs;
final mailboxCategoriesExpandMode = MailboxCategoriesExpandMode.initial().obs; final mailboxCategoriesExpandMode = MailboxCategoriesExpandMode.initial().obs;
DestinationPickerArguments? arguments;
AccountId? accountId; AccountId? accountId;
MailboxId? mailboxIdSelected; MailboxId? mailboxIdSelected;
OnSelectedMailboxCallback? onSelectedMailboxCallback;
VoidCallback? onDismissDestinationPicker;
final searchInputController = TextEditingController(); final searchInputController = TextEditingController();
final searchFocus = FocusNode(); final searchFocus = FocusNode();
@@ -45,11 +51,10 @@ class DestinationPickerController extends BaseMailboxController {
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
final arguments = Get.arguments; if (arguments != null) {
if (arguments != null && arguments is DestinationPickerArguments) { mailboxAction.value = arguments!.mailboxAction;
mailboxAction.value = arguments.mailboxAction; mailboxIdSelected = arguments!.mailboxIdSelected;
mailboxIdSelected = arguments.mailboxIdSelected; accountId = arguments!.accountId;
accountId = arguments.accountId;
getAllMailboxAction(); getAllMailboxAction();
} }
} }
@@ -160,10 +165,18 @@ class DestinationPickerController extends BaseMailboxController {
} }
void selectMailboxAction(PresentationMailbox? destinationMailbox) { void selectMailboxAction(PresentationMailbox? destinationMailbox) {
popBack(result: destinationMailbox); if (BuildUtils.isWeb) {
onSelectedMailboxCallback?.call(destinationMailbox);
} else {
popBack(result: destinationMailbox);
}
} }
void closeDestinationPicker() { void closeDestinationPicker() {
popBack(); if (BuildUtils.isWeb) {
onDismissDestinationPicker?.call();
} else {
popBack();
}
} }
} }
@@ -1,9 +1,19 @@
import 'package:core/core.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:core/presentation/views/list/tree_view.dart';
import 'package:core/presentation/views/search/search_bar_view.dart';
import 'package:core/utils/build_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/expand_mode.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart';
@@ -25,17 +35,29 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
final _imagePaths = Get.find<ImagePaths>(); final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>(); final _responsiveUtils = Get.find<ResponsiveUtils>();
DestinationPickerView({Key? key}) : super(key: key); @override
final controller = Get.find<DestinationPickerController>();
DestinationPickerView({Key? key}) : super(key: key) {
controller.arguments = Get.arguments;
}
DestinationPickerView.fromArguments(
DestinationPickerArguments arguments, {
Key? key,
OnSelectedMailboxCallback? onSelectedMailboxCallback,
VoidCallback? onDismissCallback
}) : super(key: key) {
controller.arguments = arguments;
controller.onSelectedMailboxCallback = onSelectedMailboxCallback;
controller.onDismissDestinationPicker = onDismissCallback;
controller.onInit();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
MailboxActions? actions; MailboxActions? actions = controller.arguments?.mailboxAction;
MailboxId? mailboxIdSelected; MailboxId? mailboxIdSelected = controller.arguments?.mailboxIdSelected;
final arguments = Get.arguments;
if (arguments != null && arguments is DestinationPickerArguments) {
actions = arguments.mailboxAction;
mailboxIdSelected = arguments.mailboxIdSelected;
}
return PointerInterceptor( return PointerInterceptor(
child: GestureDetector( child: GestureDetector(
@@ -501,10 +501,23 @@ class EmailController extends BaseController with AppLoaderMixin {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (currentMailbox != null && accountId != null) { if (currentMailbox != null && accountId != null) {
final destinationMailbox = await push( final arguments = DestinationPickerArguments(accountId, MailboxActions.moveEmail);
AppRoutes.destinationPicker, if (BuildUtils.isWeb) {
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) showDialogDestinationPicker(
); context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_dispatchMoveToAction(
context,
accountId,
email,
currentMailbox,
destinationMailbox);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox && mailboxDashBoardController.sessionCurrent != null) { if (destinationMailbox != null && destinationMailbox is PresentationMailbox && mailboxDashBoardController.sessionCurrent != null) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
@@ -531,6 +544,47 @@ class EmailController extends BaseController with AppLoaderMixin {
destinationPath: destinationMailbox.mailboxPath)); destinationPath: destinationMailbox.mailboxPath));
} }
} }
if (destinationMailbox is PresentationMailbox) {
_dispatchMoveToAction(
context,
accountId,
email,
currentMailbox,
destinationMailbox);
}
}
}
}
void _dispatchMoveToAction(
BuildContext context,
AccountId accountId,
PresentationEmail emailSelected,
PresentationMailbox currentMailbox,
PresentationMailbox destinationMailbox
) {
if (destinationMailbox.isTrash) {
_moveToTrashAction(context, accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) {
_moveToSpamAction(context, accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToSpam));
} else {
_moveToMailbox(accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
} }
} }
@@ -553,7 +553,7 @@ class MailboxController extends BaseMailboxController {
_markAsReadMailboxAction(context, selectedMailboxList.first); _markAsReadMailboxAction(context, selectedMailboxList.first);
break; break;
case MailboxActions.move: case MailboxActions.move:
_moveMailboxAction(selectedMailboxList.first); _moveMailboxAction(context, selectedMailboxList.first);
break; break;
default: default:
break; break;
@@ -812,26 +812,41 @@ class MailboxController extends BaseMailboxController {
} }
} }
void _moveMailboxAction(PresentationMailbox mailboxSelected) async { void _moveMailboxAction(BuildContext context, PresentationMailbox mailboxSelected) async {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { if (accountId != null) {
final destinationMailbox = await push( final arguments = DestinationPickerArguments(
AppRoutes.destinationPicker, accountId,
arguments: DestinationPickerArguments( MailboxActions.move,
mailboxIdSelected: mailboxSelected.id);
if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_handleMovingMailbox(
accountId,
MoveAction.moving,
mailboxSelected,
destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox);
_cancelSelectMailbox();
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) {
_handleMovingMailbox(
accountId, accountId,
MailboxActions.move, MoveAction.moving,
mailboxIdSelected: mailboxSelected.id)); mailboxSelected,
destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox);
if (destinationMailbox is PresentationMailbox) { _cancelSelectMailbox();
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox }
? null : destinationMailbox;
_handleMovingMailbox(
accountId,
MoveAction.moving,
mailboxSelected,
destinationMailbox: mailboxDestination);
_cancelSelectMailbox();
} }
} }
} }
@@ -958,7 +973,7 @@ class MailboxController extends BaseMailboxController {
_openDialogRenameMailboxAction(context, mailbox); _openDialogRenameMailboxAction(context, mailbox);
break; break;
case MailboxActions.move: case MailboxActions.move:
_moveMailboxAction(mailbox); _moveMailboxAction(context, mailbox);
break; break;
case MailboxActions.markAsRead: case MailboxActions.markAsRead:
_markAsReadMailboxAction(context, mailbox); _markAsReadMailboxAction(context, mailbox);
@@ -142,21 +142,36 @@ class MailboxCreatorController extends BaseController {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (accountId != null) { if (accountId != null) {
final destinationMailbox = await push( final arguments = DestinationPickerArguments(
AppRoutes.destinationPicker, accountId!,
arguments: DestinationPickerArguments( MailboxActions.create,
accountId!, mailboxIdSelected: selectedMailbox.value?.id);
MailboxActions.create,
mailboxIdSelected: selectedMailbox.value?.id)
);
if (destinationMailbox is PresentationMailbox) { if (BuildUtils.isWeb) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox showDialogDestinationPicker(
? null context: context,
: destinationMailbox; arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox;
selectedMailbox.value = mailboxDestination; selectedMailbox.value = mailboxDestination;
_createListMailboxNameAsStringInMailboxLocation(); _createListMailboxNameAsStringInMailboxLocation();
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox;
selectedMailbox.value = mailboxDestination;
_createListMailboxNameAsStringInMailboxLocation();
}
} }
} }
} }
@@ -134,18 +134,34 @@ class AdvancedFilterController extends BaseController {
); );
} }
void selectedMailBox() async { void selectedMailBox(BuildContext context) async {
final destinationMailbox = await push( final accountId = _mailboxDashBoardController.accountId.value;
AppRoutes.destinationPicker, if (accountId != null) {
arguments: DestinationPickerArguments( final arguments = DestinationPickerArguments(
_mailboxDashBoardController.accountId.value!, accountId,
MailboxActions.select, MailboxActions.select,
mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id)); mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id);
if (destinationMailbox is PresentationMailbox) { if (BuildUtils.isWeb) {
searchController.updateFilterEmail(mailbox: destinationMailbox); showDialogDestinationPicker(
mailBoxFilterInputController.text = context: context,
StringConvert.writeNullToEmpty(destinationMailbox.name?.name); arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) {
searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
}
}
} }
} }
@@ -611,13 +611,27 @@ class MailboxDashBoardController extends ReloadableController {
} }
void moveSelectedMultipleEmailToMailbox( void moveSelectedMultipleEmailToMailbox(
BuildContext context,
List<PresentationEmail> listEmails, List<PresentationEmail> listEmails,
PresentationMailbox mailboxCurrent PresentationMailbox currentMailbox
) async { ) async {
if (accountId.value != null) { if (accountId.value != null) {
final destinationMailbox = await push( final arguments = DestinationPickerArguments(accountId.value!, MailboxActions.moveEmail);
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId.value!, MailboxActions.moveEmail)); if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_dispatchMoveToMultipleAction(
accountId.value!,
listEmails.listEmailIds,
currentMailbox, destinationMailbox);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
@@ -644,6 +658,44 @@ class MailboxDashBoardController extends ReloadableController {
destinationPath: destinationMailbox.mailboxPath)); destinationPath: destinationMailbox.mailboxPath));
} }
} }
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
_dispatchMoveToMultipleAction(
accountId.value!,
listEmails.listEmailIds,
currentMailbox, destinationMailbox);
}
}
}
}
void _dispatchMoveToMultipleAction(
AccountId accountId,
List<EmailId> listEmailIds,
PresentationMailbox currentMailbox,
PresentationMailbox destinationMailbox
) {
if (destinationMailbox.isTrash) {
_moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest(
listEmailIds,
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) {
_moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest(
listEmailIds,
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToSpam));
} else {
_moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest(
listEmailIds,
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
} }
} }
@@ -70,7 +70,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
currentFocusNode: controller.focusManager.mailboxFieldFocusNode, currentFocusNode: controller.focusManager.mailboxFieldFocusNode,
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode, nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
mouseCursor: SystemMouseCursors.click, mouseCursor: SystemMouseCursors.click,
onTap: () => controller.selectedMailBox()), onTap: () => controller.selectedMailBox(context)),
Row(children: [ Row(children: [
Expanded(child: _buildFilterField( Expanded(child: _buildFilterField(
textEditingController: controller.dateFilterInputController, textEditingController: controller.dateFilterInputController,
@@ -192,17 +192,33 @@ class RulesFilterCreatorController extends BaseMailboxController {
} }
void selectMailbox(BuildContext context) async { void selectMailbox(BuildContext context) async {
final destinationMailbox = await push( if (_accountId != null) {
AppRoutes.destinationPicker, final arguments = DestinationPickerArguments(
arguments: DestinationPickerArguments( _accountId!,
_accountId!, MailboxActions.selectForRuleAction);
MailboxActions.selectForRuleAction));
if (destinationMailbox is PresentationMailbox) { if (BuildUtils.isWeb) {
mailboxSelected.value = destinationMailbox; showDialogDestinationPicker(
errorRuleActionValue.value = _getErrorStringByInputValue( context: context,
context, arguments: arguments,
mailboxSelected.value?.name?.name); onSelectedMailbox: (destinationMailbox) {
mailboxSelected.value = destinationMailbox;
errorRuleActionValue.value = _getErrorStringByInputValue(
context,
mailboxSelected.value?.name?.name);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) {
mailboxSelected.value = destinationMailbox;
errorRuleActionValue.value = _getErrorStringByInputValue(
context,
mailboxSelected.value?.name?.name);
}
}
} }
} }
@@ -1,4 +1,5 @@
import 'package:core/core.dart';
import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
@@ -415,21 +416,33 @@ class SearchEmailController extends BaseController
} }
void selectMailboxForSearchFilter(BuildContext context, PresentationMailbox? mailbox) async { void selectMailboxForSearchFilter(BuildContext context, PresentationMailbox? mailbox) async {
final destinationMailbox = await push( final arguments = DestinationPickerArguments(
AppRoutes.destinationPicker, mailboxDashBoardController.accountId.value!,
arguments: DestinationPickerArguments( MailboxActions.select,
mailboxDashBoardController.accountId.value!, mailboxIdSelected: mailbox?.id);
MailboxActions.select,
mailboxIdSelected: mailbox?.id));
if (destinationMailbox is PresentationMailbox) { if (BuildUtils.isWeb) {
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox showDialogDestinationPicker(
? null context: context,
: destinationMailbox; arguments: arguments,
if (mailbox?.id != mailboxSelected?.id) { onSelectedMailbox: (destinationMailbox) {
simpleSearchFilter.value = simpleSearchFilter.value final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox;
.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected); if (mailbox?.id != mailboxSelected?.id) {
_searchEmailAction(context); simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected);
_searchEmailAction(context);
}
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) {
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox;
if (mailbox?.id != mailboxSelected?.id) {
simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected);
_searchEmailAction(context);
}
} }
} }
} }
@@ -642,7 +655,7 @@ class SearchEmailController extends BaseController
cancelSelectionMode(context); cancelSelectionMode(context);
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById);
if (mailboxContainCurrent != null) { if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(listEmails, mailboxContainCurrent); moveSelectedMultipleEmailToMailbox(context, listEmails, mailboxContainCurrent);
} }
break; break;
case EmailActionType.moveToTrash: case EmailActionType.moveToTrash:
@@ -1,9 +1,11 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart'; import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart'; import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart';
import 'package:core/utils/build_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -14,6 +16,7 @@ import 'package:model/email/presentation_email.dart';
import 'package:model/email/read_actions.dart'; import 'package:model/email/read_actions.dart';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/mixin/view_as_dialog_action_mixin.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.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_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/model/move_to_mailbox_request.dart';
@@ -26,7 +29,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
mixin EmailActionController { mixin EmailActionController on ViewAsDialogActionMixin {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>(); final responsiveUtils = Get.find<ResponsiveUtils>();
@@ -107,10 +110,24 @@ mixin EmailActionController {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (currentMailbox != null && accountId != null) { if (currentMailbox != null && accountId != null) {
final destinationMailbox = await push( final arguments = DestinationPickerArguments(accountId, MailboxActions.moveEmail);
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) if (BuildUtils.isWeb) {
); showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_dispatchMoveToAction(
context,
accountId,
email,
currentMailbox,
destinationMailbox);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
@@ -137,6 +154,45 @@ mixin EmailActionController {
destinationPath: destinationMailbox.mailboxPath)); destinationPath: destinationMailbox.mailboxPath));
} }
} }
_dispatchMoveToAction(
context,
accountId,
email,
currentMailbox,
destinationMailbox);
}
}
}
void _dispatchMoveToAction(
BuildContext context,
AccountId accountId,
PresentationEmail emailSelected,
PresentationMailbox currentMailbox,
PresentationMailbox destinationMailbox
) {
if (destinationMailbox.isTrash) {
moveToSpamAction(accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) {
moveToSpamAction(accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToSpam));
} else {
_moveToMailboxAction(accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
} }
} }
@@ -200,8 +256,15 @@ mixin EmailActionController {
mailboxDashBoardController.markAsStarSelectedMultipleEmail(listEmails, markStarAction); mailboxDashBoardController.markAsStarSelectedMultipleEmail(listEmails, markStarAction);
} }
void moveSelectedMultipleEmailToMailbox(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) { void moveSelectedMultipleEmailToMailbox(
mailboxDashBoardController.moveSelectedMultipleEmailToMailbox(listEmails, mailboxCurrent); BuildContext context,
List<PresentationEmail> listEmails,
PresentationMailbox mailboxCurrent
) {
mailboxDashBoardController.moveSelectedMultipleEmailToMailbox(
context,
listEmails,
mailboxCurrent);
} }
void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) { void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) {
@@ -635,15 +635,28 @@ class ThreadController extends BaseController {
} }
void moveSelectedMultipleEmailToMailbox( void moveSelectedMultipleEmailToMailbox(
BuildContext context,
List<PresentationEmail> listEmail, List<PresentationEmail> listEmail,
PresentationMailbox currentMailbox PresentationMailbox currentMailbox
) async { ) async {
if (_accountId != null) { if (_accountId != null) {
final listEmailIds = listEmail.map((email) => email.id).toList(); final arguments = DestinationPickerArguments(_accountId!, MailboxActions.moveEmail);
final destinationMailbox = await push(
AppRoutes.destinationPicker, if (BuildUtils.isWeb) {
arguments: DestinationPickerArguments(_accountId!, MailboxActions.moveEmail) showDialogDestinationPicker(
); context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_dispatchMoveToMultipleAction(
_accountId!,
listEmail.listEmailIds,
currentMailbox,
destinationMailbox);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
@@ -670,6 +683,45 @@ class ThreadController extends BaseController {
destinationPath: destinationMailbox.mailboxPath)); destinationPath: destinationMailbox.mailboxPath));
} }
} }
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
_dispatchMoveToMultipleAction(
_accountId!,
listEmail.listEmailIds,
currentMailbox,
destinationMailbox);
}
}
}
}
void _dispatchMoveToMultipleAction(
AccountId accountId,
List<EmailId> listEmailIds,
PresentationMailbox currentMailbox,
PresentationMailbox destinationMailbox
) {
if (destinationMailbox.isTrash) {
_moveSelectedEmailMultipleToTrashAction(accountId, MoveToMailboxRequest(
listEmailIds,
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) {
_moveSelectedEmailMultipleToSpamAction(accountId, MoveToMailboxRequest(
listEmailIds,
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToSpam));
} else {
_moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest(
listEmailIds,
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
} }
} }
@@ -984,7 +1036,7 @@ class ThreadController extends BaseController {
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById)
: currentMailbox; : currentMailbox;
if (mailboxContainCurrent != null) { if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(selectionEmail, mailboxContainCurrent); moveSelectedMultipleEmailToMailbox(context, selectionEmail, mailboxContainCurrent);
} }
break; break;
case EmailActionType.moveToTrash: case EmailActionType.moveToTrash:
@@ -1079,10 +1131,24 @@ class ThreadController extends BaseController {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (currentMailbox != null && accountId != null) { if (currentMailbox != null && accountId != null) {
final destinationMailbox = await push( final arguments = DestinationPickerArguments(accountId, MailboxActions.moveEmail);
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) if (BuildUtils.isWeb) {
); showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_dispatchMoveToAction(
context,
accountId,
email,
currentMailbox,
destinationMailbox);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.isTrash) { if (destinationMailbox.isTrash) {
@@ -1109,6 +1175,47 @@ class ThreadController extends BaseController {
destinationPath: destinationMailbox.mailboxPath)); destinationPath: destinationMailbox.mailboxPath));
} }
} }
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
_dispatchMoveToAction(
context,
accountId,
email,
currentMailbox,
destinationMailbox);
}
}
}
}
void _dispatchMoveToAction(
BuildContext context,
AccountId accountId,
PresentationEmail emailSelected,
PresentationMailbox currentMailbox,
PresentationMailbox destinationMailbox
) {
if (destinationMailbox.isTrash) {
_moveToTrashAction(accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) {
_moveToSpamAction(accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToSpam));
} else {
_moveToMailboxAction(accountId, MoveToMailboxRequest(
[emailSelected.id],
currentMailbox.id,
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
} }
} }
+53 -53
View File
@@ -31,70 +31,70 @@ import 'package:tmail_ui_user/main/pages/deferred_widget.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart';
class AppPages { class AppPages {
static final pages = [ static final pagesOnlyOnMobile = [
GetPage( GetPage(
name: AppRoutes.home,
page: () => const HomeView(),
binding: HomeBindings()),
GetPage(
name: AppRoutes.login,
page: () => DeferredWidget(login.loadLibrary, () => login.LoginView()),
binding: LoginBindings()),
GetPage(
name: AppRoutes.session,
page: () => DeferredWidget(session.loadLibrary, () => session.SessionView()),
binding: SessionPageBindings()),
GetPage(
name: AppRoutes.dashboard,
page: () => DeferredWidget(mailbox_dashboard.loadLibrary, () => mailbox_dashboard.MailboxDashBoardView()),
binding: MailboxDashBoardBindings()),
if (!BuildUtils.isWeb)
GetPage(
name: AppRoutes.composer, name: AppRoutes.composer,
opaque: false, opaque: false,
page: () { page: () => DeferredWidget(composer.loadLibrary, () => composer.ComposerView()),
ComposerBindings().dependencies(); binding: ComposerBindings()),
return DeferredWidget(composer.loadLibrary, () => composer.ComposerView());
}),
GetPage( GetPage(
name: AppRoutes.destinationPicker, name: AppRoutes.destinationPicker,
opaque: false, opaque: false,
page: () => DeferredWidget(destination_picker.loadLibrary, () => destination_picker.DestinationPickerView()), page: () => DeferredWidget(destination_picker.loadLibrary, () => destination_picker.DestinationPickerView()),
binding: DestinationPickerBindings()), binding: DestinationPickerBindings()),
];
static final pages = [
GetPage( GetPage(
name: AppRoutes.mailboxCreator, name: AppRoutes.home,
opaque: false, page: () => const HomeView(),
page: () => DeferredWidget(mailbox_creator.loadLibrary, () => mailbox_creator.MailboxCreatorView()), binding: HomeBindings()),
binding: MailboxCreatorBindings()),
GetPage( GetPage(
name: AppRoutes.settings, name: AppRoutes.login,
page: () => DeferredWidget(manage_account_dashboard.loadLibrary, () => manage_account_dashboard.ManageAccountDashBoardView()), page: () => DeferredWidget(login.loadLibrary, () => login.LoginView()),
binding: ManageAccountDashBoardBindings()), binding: LoginBindings()),
GetPage( GetPage(
name: AppRoutes.identityCreator, name: AppRoutes.session,
opaque: false, page: () => DeferredWidget(session.loadLibrary, () => session.SessionView()),
page: () => DeferredWidget(identity_creator.loadLibrary, () => identity_creator.IdentityCreatorView()), binding: SessionPageBindings()),
binding: IdentityCreatorBindings()),
GetPage( GetPage(
name: AppRoutes.rulesFilterCreator, name: AppRoutes.dashboard,
opaque: false, page: () => DeferredWidget(mailbox_dashboard.loadLibrary, () => mailbox_dashboard.MailboxDashBoardView()),
page: () => DeferredWidget( binding: MailboxDashBoardBindings()),
rules_filter_creator.loadLibrary,
() => rules_filter_creator.RuleFilterCreatorView()),
binding: RulesFilterCreatorBindings()),
GetPage( GetPage(
name: AppRoutes.emailsForwardCreator, name: AppRoutes.mailboxCreator,
opaque: false, opaque: false,
page: () => DeferredWidget( page: () => DeferredWidget(mailbox_creator.loadLibrary, () => mailbox_creator.MailboxCreatorView()),
emails_forward_creator.loadLibrary, binding: MailboxCreatorBindings()),
() => emails_forward_creator.EmailsForwardCreatorView()), GetPage(
binding: EmailsForwardCreatorBindings()), name: AppRoutes.settings,
page: () => DeferredWidget(manage_account_dashboard.loadLibrary,
() => manage_account_dashboard.ManageAccountDashBoardView()),
binding: ManageAccountDashBoardBindings()),
GetPage(
name: AppRoutes.identityCreator,
opaque: false,
page: () => DeferredWidget(identity_creator.loadLibrary,
() => identity_creator.IdentityCreatorView()),
binding: IdentityCreatorBindings()),
GetPage(
name: AppRoutes.rulesFilterCreator,
opaque: false,
page: () => DeferredWidget(rules_filter_creator.loadLibrary,
() => rules_filter_creator.RuleFilterCreatorView()),
binding: RulesFilterCreatorBindings()),
GetPage(
name: AppRoutes.emailsForwardCreator,
opaque: false,
page: () => DeferredWidget(emails_forward_creator.loadLibrary,
() => emails_forward_creator.EmailsForwardCreatorView()),
binding: EmailsForwardCreatorBindings()),
GetPage( GetPage(
name: AppRoutes.contact, name: AppRoutes.contact,
opaque: false, opaque: false,
page: () => DeferredWidget( page: () => DeferredWidget(contact_view.loadLibrary, () => contact_view.ContactView()),
contact_view.loadLibrary,
() => contact_view.ContactView()),
binding: ContactBindings()), binding: ContactBindings()),
]; if (!BuildUtils.isWeb)
...pagesOnlyOnMobile
];
} }
+2 -3
View File
@@ -3,13 +3,12 @@ abstract class AppRoutes {
static const login = '/login'; static const login = '/login';
static const session = '/session'; static const session = '/session';
static const dashboard = '/dashboard'; static const dashboard = '/dashboard';
static const composer = '/composer';
static const destinationPicker = '/destination_picker';
static const settings = '/settings'; static const settings = '/settings';
static const composer = '/composer';
static const destinationPicker = '/destination_picker';
static const mailboxCreator = '$dashboard/mailbox_creator'; static const mailboxCreator = '$dashboard/mailbox_creator';
static const contact = '$dashboard/contact'; static const contact = '$dashboard/contact';
static const identityCreator = '$settings/identity_creator'; static const identityCreator = '$settings/identity_creator';
static const rulesFilterCreator = '$settings/rules_filter_creator'; static const rulesFilterCreator = '$settings/rules_filter_creator';
static const emailsForwardCreator = '$settings/emails_forward_creator'; static const emailsForwardCreator = '$settings/emails_forward_creator';