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) {
if (BuildUtils.isWeb) {
onSelectedMailboxCallback?.call(destinationMailbox);
} else {
popBack(result: destinationMailbox); popBack(result: destinationMailbox);
} }
}
void closeDestinationPicker() { void closeDestinationPicker() {
if (BuildUtils.isWeb) {
onDismissDestinationPicker?.call();
} else {
popBack(); 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 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( final destinationMailbox = await push(
AppRoutes.destinationPicker, AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) 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,
arguments: DestinationPickerArguments(
accountId, accountId,
MailboxActions.move, MailboxActions.move,
mailboxIdSelected: mailboxSelected.id)); mailboxIdSelected: mailboxSelected.id);
if (destinationMailbox is PresentationMailbox) { if (BuildUtils.isWeb) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox showDialogDestinationPicker(
? null : destinationMailbox; context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_handleMovingMailbox( _handleMovingMailbox(
accountId, accountId,
MoveAction.moving, MoveAction.moving,
mailboxSelected, mailboxSelected,
destinationMailbox: mailboxDestination); destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox);
_cancelSelectMailbox(); _cancelSelectMailbox();
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) {
_handleMovingMailbox(
accountId,
MoveAction.moving,
mailboxSelected,
destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox);
_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,13 +142,27 @@ 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,
arguments: DestinationPickerArguments(
accountId!, accountId!,
MailboxActions.create, MailboxActions.create,
mailboxIdSelected: selectedMailbox.value?.id) mailboxIdSelected: selectedMailbox.value?.id);
);
if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox;
selectedMailbox.value = mailboxDestination;
_createListMailboxNameAsStringInMailboxLocation();
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
@@ -160,6 +174,7 @@ class MailboxCreatorController extends BaseController {
} }
} }
} }
}
void createNewMailbox(BuildContext context) { void createNewMailbox(BuildContext context) {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
@@ -134,13 +134,27 @@ class AdvancedFilterController extends BaseController {
); );
} }
void selectedMailBox() async { void selectedMailBox(BuildContext context) async {
final accountId = _mailboxDashBoardController.accountId.value;
if (accountId != null) {
final arguments = DestinationPickerArguments(
accountId,
MailboxActions.select,
mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id);
if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
});
} else {
final destinationMailbox = await push( final destinationMailbox = await push(
AppRoutes.destinationPicker, AppRoutes.destinationPicker,
arguments: DestinationPickerArguments( arguments: arguments);
_mailboxDashBoardController.accountId.value!,
MailboxActions.select,
mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id));
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
searchController.updateFilterEmail(mailbox: destinationMailbox); searchController.updateFilterEmail(mailbox: destinationMailbox);
@@ -148,6 +162,8 @@ class AdvancedFilterController extends BaseController {
StringConvert.writeNullToEmpty(destinationMailbox.name?.name); StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
} }
} }
}
}
void applyAdvancedSearchFilter(BuildContext context) { void applyAdvancedSearchFilter(BuildContext context) {
_updateFilterEmailFromAdvancedSearchView(); _updateFilterEmailFromAdvancedSearchView();
@@ -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 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( final destinationMailbox = await push(
AppRoutes.destinationPicker, AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId.value!, MailboxActions.moveEmail)); 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,11 +192,25 @@ class RulesFilterCreatorController extends BaseMailboxController {
} }
void selectMailbox(BuildContext context) async { void selectMailbox(BuildContext context) async {
if (_accountId != null) {
final arguments = DestinationPickerArguments(
_accountId!,
MailboxActions.selectForRuleAction);
if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
mailboxSelected.value = destinationMailbox;
errorRuleActionValue.value = _getErrorStringByInputValue(
context,
mailboxSelected.value?.name?.name);
});
} else {
final destinationMailbox = await push( final destinationMailbox = await push(
AppRoutes.destinationPicker, AppRoutes.destinationPicker,
arguments: DestinationPickerArguments( arguments: arguments);
_accountId!,
MailboxActions.selectForRuleAction));
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
mailboxSelected.value = destinationMailbox; mailboxSelected.value = destinationMailbox;
@@ -205,6 +219,8 @@ class RulesFilterCreatorController extends BaseMailboxController {
mailboxSelected.value?.name?.name); mailboxSelected.value?.name?.name);
} }
} }
}
}
void createNewRuleFilter(BuildContext context) async { void createNewRuleFilter(BuildContext context) async {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
@@ -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,24 +416,36 @@ 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,
arguments: DestinationPickerArguments(
mailboxDashBoardController.accountId.value!, mailboxDashBoardController.accountId.value!,
MailboxActions.select, MailboxActions.select,
mailboxIdSelected: mailbox?.id)); mailboxIdSelected: mailbox?.id);
if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox;
if (mailbox?.id != mailboxSelected?.id) {
simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected);
_searchEmailAction(context);
}
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox;
? null
: destinationMailbox;
if (mailbox?.id != mailboxSelected?.id) { if (mailbox?.id != mailboxSelected?.id) {
simpleSearchFilter.value = simpleSearchFilter.value simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected);
.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected);
_searchEmailAction(context); _searchEmailAction(context);
} }
} }
} }
}
void selectContactForSearchFilter( void selectContactForSearchFilter(
BuildContext context, BuildContext 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 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( final destinationMailbox = await push(
AppRoutes.destinationPicker, AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) 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);
if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_dispatchMoveToMultipleAction(
_accountId!,
listEmail.listEmailIds,
currentMailbox,
destinationMailbox);
});
} else {
final destinationMailbox = await push( final destinationMailbox = await push(
AppRoutes.destinationPicker, AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(_accountId!, MailboxActions.moveEmail) 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 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( final destinationMailbox = await push(
AppRoutes.destinationPicker, AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) 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));
} }
} }
+23 -23
View File
@@ -31,6 +31,19 @@ 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 pagesOnlyOnMobile = [
GetPage(
name: AppRoutes.composer,
opaque: false,
page: () => DeferredWidget(composer.loadLibrary, () => composer.ComposerView()),
binding: ComposerBindings()),
GetPage(
name: AppRoutes.destinationPicker,
opaque: false,
page: () => DeferredWidget(destination_picker.loadLibrary, () => destination_picker.DestinationPickerView()),
binding: DestinationPickerBindings()),
];
static final pages = [ static final pages = [
GetPage( GetPage(
name: AppRoutes.home, name: AppRoutes.home,
@@ -48,19 +61,6 @@ class AppPages {
name: AppRoutes.dashboard, name: AppRoutes.dashboard,
page: () => DeferredWidget(mailbox_dashboard.loadLibrary, () => mailbox_dashboard.MailboxDashBoardView()), page: () => DeferredWidget(mailbox_dashboard.loadLibrary, () => mailbox_dashboard.MailboxDashBoardView()),
binding: MailboxDashBoardBindings()), binding: MailboxDashBoardBindings()),
if (!BuildUtils.isWeb)
GetPage(
name: AppRoutes.composer,
opaque: false,
page: () {
ComposerBindings().dependencies();
return DeferredWidget(composer.loadLibrary, () => composer.ComposerView());
}),
GetPage(
name: AppRoutes.destinationPicker,
opaque: false,
page: () => DeferredWidget(destination_picker.loadLibrary, () => destination_picker.DestinationPickerView()),
binding: DestinationPickerBindings()),
GetPage( GetPage(
name: AppRoutes.mailboxCreator, name: AppRoutes.mailboxCreator,
opaque: false, opaque: false,
@@ -68,33 +68,33 @@ class AppPages {
binding: MailboxCreatorBindings()), binding: MailboxCreatorBindings()),
GetPage( GetPage(
name: AppRoutes.settings, name: AppRoutes.settings,
page: () => DeferredWidget(manage_account_dashboard.loadLibrary, () => manage_account_dashboard.ManageAccountDashBoardView()), page: () => DeferredWidget(manage_account_dashboard.loadLibrary,
() => manage_account_dashboard.ManageAccountDashBoardView()),
binding: ManageAccountDashBoardBindings()), binding: ManageAccountDashBoardBindings()),
GetPage( GetPage(
name: AppRoutes.identityCreator, name: AppRoutes.identityCreator,
opaque: false, opaque: false,
page: () => DeferredWidget(identity_creator.loadLibrary, () => identity_creator.IdentityCreatorView()), page: () => DeferredWidget(identity_creator.loadLibrary,
() => identity_creator.IdentityCreatorView()),
binding: IdentityCreatorBindings()), binding: IdentityCreatorBindings()),
GetPage( GetPage(
name: AppRoutes.rulesFilterCreator, name: AppRoutes.rulesFilterCreator,
opaque: false, opaque: false,
page: () => DeferredWidget( page: () => DeferredWidget(rules_filter_creator.loadLibrary,
rules_filter_creator.loadLibrary,
() => rules_filter_creator.RuleFilterCreatorView()), () => rules_filter_creator.RuleFilterCreatorView()),
binding: RulesFilterCreatorBindings()), binding: RulesFilterCreatorBindings()),
GetPage( GetPage(
name: AppRoutes.emailsForwardCreator, name: AppRoutes.emailsForwardCreator,
opaque: false, opaque: false,
page: () => DeferredWidget( page: () => DeferredWidget(emails_forward_creator.loadLibrary,
emails_forward_creator.loadLibrary,
() => emails_forward_creator.EmailsForwardCreatorView()), () => emails_forward_creator.EmailsForwardCreatorView()),
binding: EmailsForwardCreatorBindings()), 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';