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: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/view_as_dialog_action_mixin.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/tmail_autocomplete_bindings.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));
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>(),
));
}
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/main/routes/route_navigation.dart';
typedef OnSelectedMailboxCallback = Function(PresentationMailbox? destinationMailbox);
class DestinationPickerController extends BaseMailboxController {
final GetAllMailboxInteractor _getAllMailboxInteractor;
@@ -31,8 +33,12 @@ class DestinationPickerController extends BaseMailboxController {
final searchQuery = SearchQuery.initial().obs;
final mailboxCategoriesExpandMode = MailboxCategoriesExpandMode.initial().obs;
DestinationPickerArguments? arguments;
AccountId? accountId;
MailboxId? mailboxIdSelected;
OnSelectedMailboxCallback? onSelectedMailboxCallback;
VoidCallback? onDismissDestinationPicker;
final searchInputController = TextEditingController();
final searchFocus = FocusNode();
@@ -45,11 +51,10 @@ class DestinationPickerController extends BaseMailboxController {
@override
void onReady() {
super.onReady();
final arguments = Get.arguments;
if (arguments != null && arguments is DestinationPickerArguments) {
mailboxAction.value = arguments.mailboxAction;
mailboxIdSelected = arguments.mailboxIdSelected;
accountId = arguments.accountId;
if (arguments != null) {
mailboxAction.value = arguments!.mailboxAction;
mailboxIdSelected = arguments!.mailboxIdSelected;
accountId = arguments!.accountId;
getAllMailboxAction();
}
}
@@ -160,10 +165,18 @@ class DestinationPickerController extends BaseMailboxController {
}
void selectMailboxAction(PresentationMailbox? destinationMailbox) {
popBack(result: destinationMailbox);
if (BuildUtils.isWeb) {
onSelectedMailboxCallback?.call(destinationMailbox);
} else {
popBack(result: destinationMailbox);
}
}
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_svg/flutter_svg.dart';
import 'package:get/get.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:tmail_ui_user/features/base/mixin/app_loader_mixin.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 _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
Widget build(BuildContext context) {
MailboxActions? actions;
MailboxId? mailboxIdSelected;
final arguments = Get.arguments;
if (arguments != null && arguments is DestinationPickerArguments) {
actions = arguments.mailboxAction;
mailboxIdSelected = arguments.mailboxIdSelected;
}
MailboxActions? actions = controller.arguments?.mailboxAction;
MailboxId? mailboxIdSelected = controller.arguments?.mailboxIdSelected;
return PointerInterceptor(
child: GestureDetector(
@@ -501,10 +501,23 @@ class EmailController extends BaseController with AppLoaderMixin {
final accountId = mailboxDashBoardController.accountId.value;
if (currentMailbox != null && accountId != null) {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail)
);
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(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox && mailboxDashBoardController.sessionCurrent != null) {
if (destinationMailbox.isTrash) {
@@ -531,6 +544,47 @@ class EmailController extends BaseController with AppLoaderMixin {
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));
}
}
@@ -538,7 +538,7 @@ class MailboxController extends BaseMailboxController {
}
void pressMailboxSelectionAction(
BuildContext context,
BuildContext context,
MailboxActions actions,
List<PresentationMailbox> selectedMailboxList
) {
@@ -553,7 +553,7 @@ class MailboxController extends BaseMailboxController {
_markAsReadMailboxAction(context, selectedMailboxList.first);
break;
case MailboxActions.move:
_moveMailboxAction(selectedMailboxList.first);
_moveMailboxAction(context, selectedMailboxList.first);
break;
default:
break;
@@ -702,7 +702,7 @@ class MailboxController extends BaseMailboxController {
_cancelSelectMailbox();
popBack();
}
void _switchBackToMailboxDefault() {
final inboxMailbox = findMailboxNodeByRole(PresentationMailbox.roleInbox);
mailboxDashBoardController.setSelectedMailbox(inboxMailbox?.item);
@@ -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;
if (accountId != null) {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(
final arguments = DestinationPickerArguments(
accountId,
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,
MailboxActions.move,
mailboxIdSelected: mailboxSelected.id));
MoveAction.moving,
mailboxSelected,
destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox);
if (destinationMailbox is PresentationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
? null : destinationMailbox;
_handleMovingMailbox(
accountId,
MoveAction.moving,
mailboxSelected,
destinationMailbox: mailboxDestination);
_cancelSelectMailbox();
_cancelSelectMailbox();
}
}
}
}
@@ -944,7 +959,7 @@ class MailboxController extends BaseMailboxController {
}
void handleMailboxAction(
BuildContext context,
BuildContext context,
MailboxActions actions,
PresentationMailbox mailbox
) {
@@ -958,7 +973,7 @@ class MailboxController extends BaseMailboxController {
_openDialogRenameMailboxAction(context, mailbox);
break;
case MailboxActions.move:
_moveMailboxAction(mailbox);
_moveMailboxAction(context, mailbox);
break;
case MailboxActions.markAsRead:
_markAsReadMailboxAction(context, mailbox);
@@ -142,21 +142,36 @@ class MailboxCreatorController extends BaseController {
FocusScope.of(context).unfocus();
if (accountId != null) {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(
accountId!,
MailboxActions.create,
mailboxIdSelected: selectedMailbox.value?.id)
);
final arguments = DestinationPickerArguments(
accountId!,
MailboxActions.create,
mailboxIdSelected: selectedMailbox.value?.id);
if (destinationMailbox is PresentationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox;
if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox;
selectedMailbox.value = mailboxDestination;
_createListMailboxNameAsStringInMailboxLocation();
selectedMailbox.value = mailboxDestination;
_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 {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(
_mailboxDashBoardController.accountId.value!,
MailboxActions.select,
mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id));
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 (destinationMailbox is PresentationMailbox) {
searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
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(
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(
BuildContext context,
List<PresentationEmail> listEmails,
PresentationMailbox mailboxCurrent
PresentationMailbox currentMailbox
) async {
if (accountId.value != null) {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId.value!, MailboxActions.moveEmail));
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(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.isTrash) {
@@ -644,6 +658,44 @@ class MailboxDashBoardController extends ReloadableController {
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,
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
mouseCursor: SystemMouseCursors.click,
onTap: () => controller.selectedMailBox()),
onTap: () => controller.selectedMailBox(context)),
Row(children: [
Expanded(child: _buildFilterField(
textEditingController: controller.dateFilterInputController,
@@ -192,17 +192,33 @@ class RulesFilterCreatorController extends BaseMailboxController {
}
void selectMailbox(BuildContext context) async {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(
_accountId!,
MailboxActions.selectForRuleAction));
if (_accountId != null) {
final arguments = DestinationPickerArguments(
_accountId!,
MailboxActions.selectForRuleAction);
if (destinationMailbox is PresentationMailbox) {
mailboxSelected.value = destinationMailbox;
errorRuleActionValue.value = _getErrorStringByInputValue(
context,
mailboxSelected.value?.name?.name);
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(
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/success.dart';
import 'package:core/utils/app_logger.dart';
@@ -415,21 +416,33 @@ class SearchEmailController extends BaseController
}
void selectMailboxForSearchFilter(BuildContext context, PresentationMailbox? mailbox) async {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(
mailboxDashBoardController.accountId.value!,
MailboxActions.select,
mailboxIdSelected: mailbox?.id));
final arguments = DestinationPickerArguments(
mailboxDashBoardController.accountId.value!,
MailboxActions.select,
mailboxIdSelected: mailbox?.id);
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);
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) {
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);
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById);
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(listEmails, mailboxContainCurrent);
moveSelectedMultipleEmailToMailbox(context, listEmails, mailboxContainCurrent);
}
break;
case EmailActionType.moveToTrash:
@@ -1,9 +1,11 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.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/dialog/confirmation_dialog_builder.dart';
import 'package:core/utils/build_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.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/mailbox/presentation_mailbox.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/email/domain/model/move_action.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/route_navigation.dart';
mixin EmailActionController {
mixin EmailActionController on ViewAsDialogActionMixin {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>();
@@ -107,10 +110,24 @@ mixin EmailActionController {
final accountId = mailboxDashBoardController.accountId.value;
if (currentMailbox != null && accountId != null) {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail)
);
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(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.isTrash) {
@@ -137,6 +154,45 @@ mixin EmailActionController {
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);
}
void moveSelectedMultipleEmailToMailbox(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) {
mailboxDashBoardController.moveSelectedMultipleEmailToMailbox(listEmails, mailboxCurrent);
void moveSelectedMultipleEmailToMailbox(
BuildContext context,
List<PresentationEmail> listEmails,
PresentationMailbox mailboxCurrent
) {
mailboxDashBoardController.moveSelectedMultipleEmailToMailbox(
context,
listEmails,
mailboxCurrent);
}
void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) {
@@ -635,15 +635,28 @@ class ThreadController extends BaseController {
}
void moveSelectedMultipleEmailToMailbox(
BuildContext context,
List<PresentationEmail> listEmail,
PresentationMailbox currentMailbox
) async {
if (_accountId != null) {
final listEmailIds = listEmail.map((email) => email.id).toList();
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(_accountId!, MailboxActions.moveEmail)
);
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(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.isTrash) {
@@ -670,6 +683,45 @@ class ThreadController extends BaseController {
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)
: currentMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(selectionEmail, mailboxContainCurrent);
moveSelectedMultipleEmailToMailbox(context, selectionEmail, mailboxContainCurrent);
}
break;
case EmailActionType.moveToTrash:
@@ -1079,10 +1131,24 @@ class ThreadController extends BaseController {
final accountId = mailboxDashBoardController.accountId.value;
if (currentMailbox != null && accountId != null) {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail)
);
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(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
if (destinationMailbox.isTrash) {
@@ -1109,6 +1175,47 @@ class ThreadController extends BaseController {
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';
class AppPages {
static final pages = [
static final pagesOnlyOnMobile = [
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,
opaque: false,
page: () {
ComposerBindings().dependencies();
return DeferredWidget(composer.loadLibrary, () => composer.ComposerView());
}),
page: () => DeferredWidget(composer.loadLibrary, () => composer.ComposerView()),
binding: ComposerBindings()),
GetPage(
name: AppRoutes.destinationPicker,
opaque: false,
page: () => DeferredWidget(destination_picker.loadLibrary, () => destination_picker.DestinationPickerView()),
binding: DestinationPickerBindings()),
name: AppRoutes.destinationPicker,
opaque: false,
page: () => DeferredWidget(destination_picker.loadLibrary, () => destination_picker.DestinationPickerView()),
binding: DestinationPickerBindings()),
];
static final pages = [
GetPage(
name: AppRoutes.mailboxCreator,
opaque: false,
page: () => DeferredWidget(mailbox_creator.loadLibrary, () => mailbox_creator.MailboxCreatorView()),
binding: MailboxCreatorBindings()),
name: AppRoutes.home,
page: () => const HomeView(),
binding: HomeBindings()),
GetPage(
name: AppRoutes.settings,
page: () => DeferredWidget(manage_account_dashboard.loadLibrary, () => manage_account_dashboard.ManageAccountDashBoardView()),
binding: ManageAccountDashBoardBindings()),
name: AppRoutes.login,
page: () => DeferredWidget(login.loadLibrary, () => login.LoginView()),
binding: LoginBindings()),
GetPage(
name: AppRoutes.identityCreator,
opaque: false,
page: () => DeferredWidget(identity_creator.loadLibrary, () => identity_creator.IdentityCreatorView()),
binding: IdentityCreatorBindings()),
name: AppRoutes.session,
page: () => DeferredWidget(session.loadLibrary, () => session.SessionView()),
binding: SessionPageBindings()),
GetPage(
name: AppRoutes.rulesFilterCreator,
opaque: false,
page: () => DeferredWidget(
rules_filter_creator.loadLibrary,
() => rules_filter_creator.RuleFilterCreatorView()),
binding: RulesFilterCreatorBindings()),
name: AppRoutes.dashboard,
page: () => DeferredWidget(mailbox_dashboard.loadLibrary, () => mailbox_dashboard.MailboxDashBoardView()),
binding: MailboxDashBoardBindings()),
GetPage(
name: AppRoutes.emailsForwardCreator,
opaque: false,
page: () => DeferredWidget(
emails_forward_creator.loadLibrary,
() => emails_forward_creator.EmailsForwardCreatorView()),
binding: EmailsForwardCreatorBindings()),
name: AppRoutes.mailboxCreator,
opaque: false,
page: () => DeferredWidget(mailbox_creator.loadLibrary, () => mailbox_creator.MailboxCreatorView()),
binding: MailboxCreatorBindings()),
GetPage(
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(
name: AppRoutes.contact,
opaque: false,
page: () => DeferredWidget(
contact_view.loadLibrary,
() => contact_view.ContactView()),
page: () => DeferredWidget(contact_view.loadLibrary, () => contact_view.ContactView()),
binding: ContactBindings()),
];
if (!BuildUtils.isWeb)
...pagesOnlyOnMobile
];
}
+2 -3
View File
@@ -3,13 +3,12 @@ abstract class AppRoutes {
static const login = '/login';
static const session = '/session';
static const dashboard = '/dashboard';
static const composer = '/composer';
static const destinationPicker = '/destination_picker';
static const settings = '/settings';
static const composer = '/composer';
static const destinationPicker = '/destination_picker';
static const mailboxCreator = '$dashboard/mailbox_creator';
static const contact = '$dashboard/contact';
static const identityCreator = '$settings/identity_creator';
static const rulesFilterCreator = '$settings/rules_filter_creator';
static const emailsForwardCreator = '$settings/emails_forward_creator';