TF-1427 Abstraction mailbox method action

This commit is contained in:
dab246
2023-02-09 15:06:16 +07:00
committed by Dat Vu
parent 4f8da9cb31
commit e2c0cb52a6
15 changed files with 465 additions and 332 deletions
+236 -3
View File
@@ -1,16 +1,47 @@
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/presentation/views/dialog/edit_text_dialog_builder.dart';
import 'package:core/presentation/views/modal_sheets/edit_text_modal_sheet_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'; 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:model/mailbox/select_mode.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
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';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
abstract class BaseMailboxController extends BaseController { abstract class BaseMailboxController extends BaseController {
final TreeBuilder _treeBuilder; final TreeBuilder _treeBuilder;
final VerifyNameInteractor verifyNameInteractor;
jmap.State? currentMailboxState;
BaseMailboxController(this._treeBuilder); BaseMailboxController(
this._treeBuilder,
this.verifyNameInteractor
);
final personalMailboxTree = MailboxTree(MailboxNode.root()).obs; final personalMailboxTree = MailboxTree(MailboxNode.root()).obs;
final defaultMailboxTree = MailboxTree(MailboxNode.root()).obs; final defaultMailboxTree = MailboxTree(MailboxNode.root()).obs;
@@ -159,4 +190,206 @@ abstract class BaseMailboxController extends BaseController {
MailboxNode get teamMailboxesRootNode => teamMailboxesTree.value.root; MailboxNode get teamMailboxesRootNode => teamMailboxesTree.value.root;
} List<String> getListMailboxNameInParentMailbox(PresentationMailbox parentMailbox) {
if (parentMailbox.parentId == null) {
final allChildrenAtMailboxLocation = (defaultMailboxTree.value.root.childrenItems ?? <MailboxNode>[])
+ (personalMailboxTree.value.root.childrenItems ?? <MailboxNode>[])
+ (teamMailboxesTree.value.root.childrenItems ?? <MailboxNode>[]);
if (allChildrenAtMailboxLocation.isNotEmpty) {
final listMailboxNameAsStringExist = allChildrenAtMailboxLocation
.where((mailboxNode) => mailboxNode.nameNotEmpty)
.map((mailboxNode) => mailboxNode.mailboxNameAsString)
.toList();
return listMailboxNameAsStringExist;
} else {
return [];
}
} else {
final mailboxNodeLocation = findMailboxNodeById(parentMailbox.parentId!);
if (mailboxNodeLocation != null && mailboxNodeLocation.childrenItems?.isNotEmpty == true) {
final allChildrenAtMailboxLocation = mailboxNodeLocation.childrenItems!;
final listMailboxNameAsStringExist = allChildrenAtMailboxLocation
.where((mailboxNode) => mailboxNode.nameNotEmpty)
.map((mailboxNode) => mailboxNode.mailboxNameAsString)
.toList();
return listMailboxNameAsStringExist;
} else {
return [];
}
}
}
String? verifyMailboxNameAction(
BuildContext context,
String newName,
List<String> listMailboxName,
MailboxActions mailboxActions
) {
return verifyNameInteractor.execute(newName, [
EmptyNameValidator(),
DuplicateNameValidator(listMailboxName),
]).fold((failure) {
if (failure is VerifyNameFailure) {
return failure.getMessage(context, actions: mailboxActions);
} else {
return null;
}
}, (success) => null);
}
void openDialogRenameMailboxAction(
BuildContext context,
PresentationMailbox presentationMailbox,
ResponsiveUtils responsiveUtils, {
required Function(PresentationMailbox mailbox, MailboxName newMailboxName) onRenameMailboxAction
}) {
final listMailboxName = getListMailboxNameInParentMailbox(presentationMailbox);
if (responsiveUtils.isMobile(context)) {
(EditTextModalSheetBuilder()
..key(const Key('rename_mailbox_dialog'))
..title(AppLocalizations.of(context).rename_mailbox)
..cancelText(AppLocalizations.of(context).cancel)
..boxConstraints(responsiveUtils.isLandscapeMobile(context)
? const BoxConstraints(maxWidth: 400)
: null)
..onConfirmAction(
AppLocalizations.of(context).rename,
(value) => onRenameMailboxAction(presentationMailbox, MailboxName(value))
)
..setErrorString((value) {
return verifyMailboxNameAction(
context,
value,
listMailboxName,
MailboxActions.rename
);
})
..setTextController(TextEditingController.fromValue(
TextEditingValue(
text: presentationMailbox.name?.name ?? '',
selection: TextSelection(
baseOffset: 0,
extentOffset: presentationMailbox.name?.name.length ?? 0
)
)))
).show(context);
} else {
showDialog(
context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (context) =>
PointerInterceptor(child: (EditTextDialogBuilder()
..key(const Key('rename_mailbox_dialog'))
..title(AppLocalizations.of(context).rename_mailbox)
..cancelText(AppLocalizations.of(context).cancel)
..setErrorString((value) {
return verifyMailboxNameAction(
context,
value,
listMailboxName,
MailboxActions.rename
);
})
..setTextController(TextEditingController.fromValue(
TextEditingValue(
text: presentationMailbox.name?.name ?? '',
selection: TextSelection(
baseOffset: 0,
extentOffset: presentationMailbox.name?.name.length ?? 0
)
))
)
..onConfirmButtonAction(
AppLocalizations.of(context).rename,
(value) => onRenameMailboxAction(presentationMailbox, MailboxName(value))
)
).build())
);
}
}
void moveMailboxAction(
BuildContext context,
PresentationMailbox mailboxSelected,
MailboxDashBoardController dashBoardController, {
required Function(PresentationMailbox mailboxSelected, PresentationMailbox? destinationMailbox) onMovingMailboxAction
}) async {
final accountId = dashBoardController.accountId.value;
final session = dashBoardController.sessionCurrent;
if (accountId != null && session != null) {
final arguments = DestinationPickerArguments(
accountId,
MailboxActions.move,
session,
mailboxIdSelected: mailboxSelected.id
);
if (BuildUtils.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
onMovingMailboxAction(
mailboxSelected,
destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox
);
}
);
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) {
onMovingMailboxAction(
mailboxSelected,
destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox
);
}
}
}
}
void openConfirmationDialogDeleteMailboxAction(
BuildContext context,
ResponsiveUtils responsiveUtils,
ImagePaths imagePaths,
PresentationMailbox presentationMailbox, {
required Function(PresentationMailbox mailbox) onDeleteMailboxAction
}) {
if (responsiveUtils.isLandscapeMobile(context) || responsiveUtils.isPortraitMobile(context)) {
(ConfirmationDialogActionSheetBuilder(context)
..messageText(AppLocalizations.of(context).message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? ''))
..onCancelAction(AppLocalizations.of(context).cancel, () => popBack())
..onConfirmAction(AppLocalizations.of(context).delete, () => onDeleteMailboxAction(presentationMailbox))
).show();
} else {
showDialog(
context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (context) => PointerInterceptor(
child: (ConfirmDialogBuilder(imagePaths)
..key(const Key('confirm_dialog_delete_mailbox'))
..title(AppLocalizations.of(context).delete_mailboxes)
..content(AppLocalizations.of(context).message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? ''))
..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog, fit: BoxFit.fill))
..colorConfirmButton(AppColor.colorConfirmActionDialog)
..styleTextConfirmButton(const TextStyle(
fontSize: 17,
fontWeight: FontWeight.w500,
color: AppColor.colorActionDeleteConfirmDialog
))
..onCloseButtonAction(() => popBack())
..onConfirmButtonAction(AppLocalizations.of(context).delete, () => onDeleteMailboxAction(presentationMailbox))
..onCancelButtonAction(AppLocalizations.of(context).cancel, () => popBack())
).build())
);
}
}
}
@@ -0,0 +1,45 @@
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
mixin MailboxActionHandlerMixin {
void openMailboxInNewTabAction(PresentationMailbox mailbox) {
final mailboxRouteWeb = RouteUtils.generateRouteBrowser(
AppRoutes.dashboard,
NavigationRouter(mailboxId: mailbox.id)
);
log('MailboxActionHandlerMixin::openMailboxInNewTabAction(): mailboxRouteWeb: $mailboxRouteWeb');
AppUtils.launchLink(mailboxRouteWeb.toString());
}
void markAsReadMailboxAction(
BuildContext context,
PresentationMailbox presentationMailbox,
MailboxDashBoardController dashboardController,
{
Function(BuildContext)? onCallbackAction
}
) {
final accountId = dashboardController.accountId.value;
final mailboxId = presentationMailbox.id;
final mailboxName = presentationMailbox.name;
final countEmailsUnread = presentationMailbox.unreadEmails?.value.value ?? 0;
if (accountId != null && mailboxName != null) {
dashboardController.markAsReadMailbox(
accountId,
mailboxId,
mailboxName,
countEmailsUnread.toInt()
);
onCallbackAction?.call(context);
}
}
}
@@ -44,12 +44,12 @@ class DestinationPickerBindings extends BaseBindings {
@override @override
void bindingsController() { void bindingsController() {
Get.lazyPut(() => DestinationPickerController( Get.lazyPut(() => DestinationPickerController(
Get.find<GetAllMailboxInteractor>(), Get.find<GetAllMailboxInteractor>(),
Get.find<SearchMailboxInteractor>(), Get.find<SearchMailboxInteractor>(),
Get.find<CreateNewMailboxInteractor>(), Get.find<CreateNewMailboxInteractor>(),
Get.find<RefreshAllMailboxInteractor>(), Get.find<RefreshAllMailboxInteractor>(),
Get.find<VerifyNameInteractor>(), Get.find<TreeBuilder>(),
Get.find<TreeBuilder>(), Get.find<VerifyNameInteractor>(),
)); ));
} }
@@ -34,6 +34,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
@@ -59,7 +60,6 @@ class DestinationPickerController extends BaseMailboxController {
final SearchMailboxInteractor _searchMailboxInteractor; final SearchMailboxInteractor _searchMailboxInteractor;
final CreateNewMailboxInteractor _createNewMailboxInteractor; final CreateNewMailboxInteractor _createNewMailboxInteractor;
final RefreshAllMailboxInteractor _refreshAllMailboxInteractor; final RefreshAllMailboxInteractor _refreshAllMailboxInteractor;
final VerifyNameInteractor _verifyNameInteractor;
final mailboxAction = Rxn<MailboxActions>(); final mailboxAction = Rxn<MailboxActions>();
final listMailboxSearched = <PresentationMailbox>[].obs; final listMailboxSearched = <PresentationMailbox>[].obs;
@@ -88,9 +88,9 @@ class DestinationPickerController extends BaseMailboxController {
this._searchMailboxInteractor, this._searchMailboxInteractor,
this._createNewMailboxInteractor, this._createNewMailboxInteractor,
this._refreshAllMailboxInteractor, this._refreshAllMailboxInteractor,
this._verifyNameInteractor, TreeBuilder treeBuilder,
treeBuilder, VerifyNameInteractor verifyNameInteractor,
) : super(treeBuilder); ) : super(treeBuilder, verifyNameInteractor);
@override @override
void onInit() { void onInit() {
@@ -201,7 +201,7 @@ class DestinationPickerController extends BaseMailboxController {
return null; return null;
} }
return _verifyNameInteractor.execute( return verifyNameInteractor.execute(
nameMailbox, nameMailbox,
[ [
EmptyNameValidator(), EmptyNameValidator(),
@@ -282,8 +282,8 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
mailboxActions: actions, mailboxActions: actions,
mailboxIdAlreadySelected: mailboxIdSelected, mailboxIdAlreadySelected: mailboxIdSelected,
mailboxDisplayed: MailboxDisplayed.destinationPicker) mailboxDisplayed: MailboxDisplayed.destinationPicker)
..addOnOpenMailboxFolderClick((node) => _pickMailboxNode(context, node)) ..addOnClickOpenMailboxNodeAction((node) => _pickMailboxNode(context, node))
..addOnExpandFolderActionClick((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) ..addOnClickExpandMailboxNodeAction((mailboxNode) => controller.toggleMailboxFolder(mailboxNode))
).build(), ).build(),
children: _buildListChildTileWidget( children: _buildListChildTileWidget(
context, context,
@@ -300,7 +300,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
mailboxDisplayed: MailboxDisplayed.destinationPicker, mailboxDisplayed: MailboxDisplayed.destinationPicker,
mailboxIdAlreadySelected: mailboxIdSelected, mailboxIdAlreadySelected: mailboxIdSelected,
mailboxActions: actions) mailboxActions: actions)
..addOnOpenMailboxFolderClick((node) => _pickMailboxNode(context, node)) ..addOnClickOpenMailboxNodeAction((node) => _pickMailboxNode(context, node))
).build(); ).build();
}}) }})
.toList() ?? <Widget>[]; .toList() ?? <Widget>[];
@@ -49,17 +49,17 @@ class MailboxBindings extends BaseBindings {
@override @override
void bindingsController() { void bindingsController() {
Get.put(MailboxController( Get.put(MailboxController(
Get.find<GetAllMailboxInteractor>(), Get.find<GetAllMailboxInteractor>(),
Get.find<RefreshAllMailboxInteractor>(), Get.find<RefreshAllMailboxInteractor>(),
Get.find<CreateNewMailboxInteractor>(), Get.find<CreateNewMailboxInteractor>(),
Get.find<SearchMailboxInteractor>(), Get.find<SearchMailboxInteractor>(),
Get.find<DeleteMultipleMailboxInteractor>(), Get.find<DeleteMultipleMailboxInteractor>(),
Get.find<VerifyNameInteractor>(), Get.find<RenameMailboxInteractor>(),
Get.find<RenameMailboxInteractor>(), Get.find<MoveMailboxInteractor>(),
Get.find<MoveMailboxInteractor>(), Get.find<SubscribeMailboxInteractor>(),
Get.find<SubscribeMailboxInteractor>(), Get.find<SubscribeMultipleMailboxInteractor>(),
Get.find<SubscribeMultipleMailboxInteractor>(), Get.find<TreeBuilder>(),
Get.find<TreeBuilder>(), Get.find<VerifyNameInteractor>()
)); ));
} }
@@ -17,10 +17,10 @@ import 'package:model/model.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:rxdart/transformers.dart'; import 'package:rxdart/transformers.dart';
import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart'; import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart';
import 'package:tmail_ui_user/features/base/mixin/mailbox_action_handler_mixin.dart';
import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.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/state/delete_email_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
@@ -59,19 +59,17 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_bindings.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
@@ -83,10 +81,9 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class MailboxController extends BaseMailboxController { class MailboxController extends BaseMailboxController with MailboxActionHandlerMixin {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final _appToast = Get.find<AppToast>(); final _appToast = Get.find<AppToast>();
@@ -99,7 +96,6 @@ class MailboxController extends BaseMailboxController {
final CreateNewMailboxInteractor _createNewMailboxInteractor; final CreateNewMailboxInteractor _createNewMailboxInteractor;
final SearchMailboxInteractor _searchMailboxInteractor; final SearchMailboxInteractor _searchMailboxInteractor;
final DeleteMultipleMailboxInteractor _deleteMultipleMailboxInteractor; final DeleteMultipleMailboxInteractor _deleteMultipleMailboxInteractor;
final VerifyNameInteractor _verifyNameInteractor;
final RenameMailboxInteractor _renameMailboxInteractor; final RenameMailboxInteractor _renameMailboxInteractor;
final MoveMailboxInteractor _moveMailboxInteractor; final MoveMailboxInteractor _moveMailboxInteractor;
final SubscribeMailboxInteractor _subscribeMailboxInteractor; final SubscribeMailboxInteractor _subscribeMailboxInteractor;
@@ -116,9 +112,6 @@ class MailboxController extends BaseMailboxController {
final searchFocus = FocusNode(); final searchFocus = FocusNode();
final mailboxListScrollController = ScrollController(); final mailboxListScrollController = ScrollController();
jmap.State? _currentMailboxState;
List<String> listMailboxNameAsStringExist = <String>[];
PresentationMailbox? get selectedMailbox => mailboxDashBoardController.selectedMailbox.value; PresentationMailbox? get selectedMailbox => mailboxDashBoardController.selectedMailbox.value;
PresentationEmail? get selectedEmail => mailboxDashBoardController.selectedEmail.value; PresentationEmail? get selectedEmail => mailboxDashBoardController.selectedEmail.value;
@@ -129,13 +122,13 @@ class MailboxController extends BaseMailboxController {
this._createNewMailboxInteractor, this._createNewMailboxInteractor,
this._searchMailboxInteractor, this._searchMailboxInteractor,
this._deleteMultipleMailboxInteractor, this._deleteMultipleMailboxInteractor,
this._verifyNameInteractor,
this._renameMailboxInteractor, this._renameMailboxInteractor,
this._moveMailboxInteractor, this._moveMailboxInteractor,
this._subscribeMailboxInteractor, this._subscribeMailboxInteractor,
this._subscribeMultipleMailboxInteractor, this._subscribeMultipleMailboxInteractor,
treeBuilder, TreeBuilder treeBuilder,
) : super(treeBuilder); VerifyNameInteractor verifyNameInteractor,
) : super(treeBuilder, verifyNameInteractor);
@override @override
void onInit() { void onInit() {
@@ -168,10 +161,10 @@ class MailboxController extends BaseMailboxController {
super.onData(newState); super.onData(newState);
newState.map((success) async { newState.map((success) async {
if (success is GetAllMailboxSuccess) { if (success is GetAllMailboxSuccess) {
_currentMailboxState = success.currentMailboxState; currentMailboxState = success.currentMailboxState;
_buildMailboxTreeHasSubscribed(success.mailboxList); _buildMailboxTreeHasSubscribed(success.mailboxList);
} else if (success is RefreshChangesAllMailboxSuccess) { } else if (success is RefreshChangesAllMailboxSuccess) {
_currentMailboxState = success.currentMailboxState; currentMailboxState = success.currentMailboxState;
_refreshMailboxTreeHasSubscribed(success.mailboxList); _refreshMailboxTreeHasSubscribed(success.mailboxList);
} }
}); });
@@ -278,7 +271,7 @@ class MailboxController extends BaseMailboxController {
ever(mailboxDashBoardController.dashBoardAction, (action) { ever(mailboxDashBoardController.dashBoardAction, (action) {
if (action is ClearSearchEmailAction) { if (action is ClearSearchEmailAction) {
_switchBackToMailboxDefault(); _switchBackToMailboxDefault();
} else if (action is OpenSpamMailboxAction) { } else if (action is OpenMailboxAction) {
openMailbox(action.context, action.presentationMailbox); openMailbox(action.context, action.presentationMailbox);
} }
}); });
@@ -290,7 +283,7 @@ class MailboxController extends BaseMailboxController {
} }
mailboxDashBoardController.clearMailboxUIAction(); mailboxDashBoardController.clearMailboxUIAction();
} else if (action is RefreshChangeMailboxAction) { } else if (action is RefreshChangeMailboxAction) {
if (action.newState != _currentMailboxState) { if (action.newState != currentMailboxState) {
refreshMailboxChanges(); refreshMailboxChanges();
} }
mailboxDashBoardController.clearMailboxUIAction(); mailboxDashBoardController.clearMailboxUIAction();
@@ -340,7 +333,7 @@ class MailboxController extends BaseMailboxController {
void refreshMailboxChanges({jmap.State? currentMailboxState}) { void refreshMailboxChanges({jmap.State? currentMailboxState}) {
mailboxDashBoardController.showSpamReportBanner(); mailboxDashBoardController.showSpamReportBanner();
log('MailboxController::refreshMailboxChanges(): currentMailboxState: $currentMailboxState'); log('MailboxController::refreshMailboxChanges(): currentMailboxState: $currentMailboxState');
final newMailboxState = currentMailboxState ?? _currentMailboxState; final newMailboxState = currentMailboxState ?? this.currentMailboxState;
log('MailboxController::refreshMailboxChanges(): newMailboxState: $newMailboxState'); log('MailboxController::refreshMailboxChanges(): newMailboxState: $newMailboxState');
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent; final session = mailboxDashBoardController.sessionCurrent;
@@ -605,7 +598,8 @@ class MailboxController extends BaseMailboxController {
void enableSearch() { void enableSearch() {
_cancelSelectMailbox(); _cancelSelectMailbox();
searchState.value = searchState.value.enableSearchState(); SearchMailboxBindings().dependencies();
mailboxDashBoardController.searchMailboxActivated.value = true;
} }
void disableSearch() { void disableSearch() {
@@ -705,58 +699,34 @@ class MailboxController extends BaseMailboxController {
_openConfirmationDialogDeleteMultipleMailboxAction(context, selectedMailboxList); _openConfirmationDialogDeleteMultipleMailboxAction(context, selectedMailboxList);
break; break;
case MailboxActions.rename: case MailboxActions.rename:
_openDialogRenameMailboxAction(context, selectedMailboxList.first); openDialogRenameMailboxAction(
context,
selectedMailboxList.first,
_responsiveUtils,
onRenameMailboxAction: _renameMailboxAction
);
break; break;
case MailboxActions.markAsRead: case MailboxActions.markAsRead:
_markAsReadMailboxAction(context, selectedMailboxList.first); markAsReadMailboxAction(
context,
selectedMailboxList.first,
mailboxDashBoardController,
onCallbackAction: closeMailboxScreen
);
break; break;
case MailboxActions.move: case MailboxActions.move:
_moveMailboxAction(context, selectedMailboxList.first); moveMailboxAction(
context,
selectedMailboxList.first,
mailboxDashBoardController,
onMovingMailboxAction: _invokeMovingMailboxAction
);
break; break;
default: default:
break; break;
} }
} }
void _openConfirmationDialogDeleteMailboxAction(
BuildContext context,
PresentationMailbox presentationMailbox
) {
if (_responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context)) {
(ConfirmationDialogActionSheetBuilder(context)
..messageText(AppLocalizations.of(context)
.message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? ''))
..onCancelAction(AppLocalizations.of(context).cancel, () =>
popBack())
..onConfirmAction(AppLocalizations.of(context).delete, () =>
_deleteMailboxAction(presentationMailbox)))
.show();
} else {
showDialog(
context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths)
..key(const Key('confirm_dialog_delete_mailbox'))
..title(AppLocalizations.of(context).delete_mailboxes)
..content(AppLocalizations.of(context)
.message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? ''))
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog,
fit: BoxFit.fill))
..colorConfirmButton(AppColor.colorConfirmActionDialog)
..styleTextConfirmButton(const TextStyle(
fontSize: 17,
fontWeight: FontWeight.w500,
color: AppColor.colorActionDeleteConfirmDialog))
..onCloseButtonAction(() => popBack())
..onConfirmButtonAction(AppLocalizations.of(context).delete, () =>
_deleteMailboxAction(presentationMailbox))
..onCancelButtonAction(AppLocalizations.of(context).cancel, () =>
popBack()))
.build()));
}
}
void _deleteMailboxAction(PresentationMailbox presentationMailbox) { void _deleteMailboxAction(PresentationMailbox presentationMailbox) {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent; final session = mailboxDashBoardController.sessionCurrent;
@@ -881,141 +851,19 @@ class MailboxController extends BaseMailboxController {
} }
} }
void _openDialogRenameMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) { void _renameMailboxAction(PresentationMailbox presentationMailbox, MailboxName newMailboxName) {
_createListMailboxNameAsStringInMailboxParent(presentationMailbox);
if (_responsiveUtils.isMobile(context)) {
(EditTextModalSheetBuilder()
..key(const Key('rename_mailbox_modal_sheet'))
..title(AppLocalizations.of(context).rename_mailbox)
..cancelText(AppLocalizations.of(context).cancel)
..boxConstraints(_responsiveUtils.isLandscapeMobile(context)
? const BoxConstraints(maxWidth: 400)
: null)
..onConfirmAction(AppLocalizations.of(context).rename,
(value) => _renameMailboxAction(presentationMailbox, value))
..setErrorString((value) => getErrorInputNameStringRenameMailbox(context, value))
..setTextController(TextEditingController.fromValue(
TextEditingValue(
text: presentationMailbox.name?.name ?? '',
selection: TextSelection(
baseOffset: 0,
extentOffset: presentationMailbox.name?.name.length ?? 0
)
))))
.show(context);
} else {
showDialog(
context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (BuildContext context) =>
PointerInterceptor(child: (EditTextDialogBuilder()
..key(const Key('rename_mailbox_dialog'))
..title(AppLocalizations.of(context).rename_mailbox)
..cancelText(AppLocalizations.of(context).cancel)
..setErrorString((value) => getErrorInputNameStringRenameMailbox(context, value))
..setTextController(TextEditingController.fromValue(
TextEditingValue(
text: presentationMailbox.name?.name ?? '',
selection: TextSelection(
baseOffset: 0,
extentOffset: presentationMailbox.name?.name.length ?? 0
)
)))
..onConfirmButtonAction(AppLocalizations.of(context).rename,
(value) => _renameMailboxAction(presentationMailbox, value)))
.build()));
}
}
String? getErrorInputNameStringRenameMailbox(BuildContext context, String newName) {
return _verifyNameInteractor.execute(
newName,
[
EmptyNameValidator(),
DuplicateNameValidator(listMailboxNameAsStringExist),
]
).fold(
(failure) {
if (failure is VerifyNameFailure) {
return failure.getMessage(context, actions: MailboxActions.rename);
} else {
return null;
}
},
(success) => null
);
}
void _renameMailboxAction(PresentationMailbox presentationMailbox, String newName) {
final accountId = mailboxDashBoardController.accountId.value; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { if (accountId != null) {
consumeState(_renameMailboxInteractor.execute( consumeState(_renameMailboxInteractor.execute(
accountId, accountId,
RenameMailboxRequest(presentationMailbox.id, MailboxName(newName)))); RenameMailboxRequest(presentationMailbox.id, newMailboxName))
);
} }
_cancelSelectMailbox(); _cancelSelectMailbox();
} }
void _markAsReadMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
final accountId = mailboxDashBoardController.accountId.value;
final mailboxId = presentationMailbox.id;
final mailboxName = presentationMailbox.name;
final countEmailsUnread = presentationMailbox.unreadEmails?.value.value ?? 0;
if (accountId != null && mailboxName != null) {
mailboxDashBoardController.markAsReadMailbox(
accountId,
mailboxId,
mailboxName,
countEmailsUnread.toInt());
closeMailboxScreen(context);
}
}
void _moveMailboxAction(BuildContext context, PresentationMailbox mailboxSelected) async {
final accountId = mailboxDashBoardController.accountId.value;
final _session = mailboxDashBoardController.sessionCurrent;
if (accountId != null) {
final arguments = DestinationPickerArguments(
accountId,
MailboxActions.move,
_session,
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,
MoveAction.moving,
mailboxSelected,
destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox);
_cancelSelectMailbox();
}
}
}
}
void _handleMovingMailbox( void _handleMovingMailbox(
AccountId accountId, AccountId accountId,
MoveAction moveAction, MoveAction moveAction,
@@ -1069,36 +917,6 @@ class MailboxController extends BaseMailboxController {
} }
} }
void _createListMailboxNameAsStringInMailboxParent(PresentationMailbox mailboxRenamed) {
if (mailboxRenamed.parentId == null) {
final allChildrenAtMailboxLocation = (
defaultMailboxTree.value.root.childrenItems ?? <MailboxNode>[])
+ (personalMailboxTree.value.root.childrenItems ?? <MailboxNode>[])
+ (teamMailboxesTree.value.root.childrenItems ?? <MailboxNode>[]);
if (allChildrenAtMailboxLocation.isNotEmpty) {
listMailboxNameAsStringExist = allChildrenAtMailboxLocation
.where((mailboxNode) => mailboxNode.nameNotEmpty)
.map((mailboxNode) => mailboxNode.mailboxNameAsString)
.toList();
} else {
listMailboxNameAsStringExist = [];
}
} else {
final mailboxNodeLocation = findMailboxNodeById(mailboxRenamed.parentId!);
if (mailboxNodeLocation != null && mailboxNodeLocation.childrenItems?.isNotEmpty == true) {
final allChildrenAtMailboxLocation = mailboxNodeLocation.childrenItems!;
listMailboxNameAsStringExist = allChildrenAtMailboxLocation
.where((mailboxNode) => mailboxNode.nameNotEmpty)
.map((mailboxNode) => mailboxNode.mailboxNameAsString)
.toList();
} else {
listMailboxNameAsStringExist = [];
}
}
log('MailboxController::_createListMailboxNameAsStringInMailboxLocation(): $listMailboxNameAsStringExist');
}
void toggleMailboxCategories(MailboxCategories categories) { void toggleMailboxCategories(MailboxCategories categories) {
switch(categories) { switch(categories) {
case MailboxCategories.exchange: case MailboxCategories.exchange:
@@ -1149,16 +967,37 @@ class MailboxController extends BaseMailboxController {
switch(actions) { switch(actions) {
case MailboxActions.delete: case MailboxActions.delete:
_openConfirmationDialogDeleteMailboxAction(context, mailbox); openConfirmationDialogDeleteMailboxAction(
context,
_responsiveUtils,
_imagePaths,
mailbox,
onDeleteMailboxAction: _deleteMailboxAction
);
break; break;
case MailboxActions.rename: case MailboxActions.rename:
_openDialogRenameMailboxAction(context, mailbox); openDialogRenameMailboxAction(
context,
mailbox,
_responsiveUtils,
onRenameMailboxAction: _renameMailboxAction
);
break; break;
case MailboxActions.move: case MailboxActions.move:
_moveMailboxAction(context, mailbox); moveMailboxAction(
context,
mailbox,
mailboxDashBoardController,
onMovingMailboxAction: _invokeMovingMailboxAction
);
break; break;
case MailboxActions.markAsRead: case MailboxActions.markAsRead:
_markAsReadMailboxAction(context, mailbox); markAsReadMailboxAction(
context,
mailbox,
mailboxDashBoardController,
onCallbackAction: closeMailboxScreen
);
break; break;
case MailboxActions.openInNewTab: case MailboxActions.openInNewTab:
openMailboxInNewTabAction(mailbox); openMailboxInNewTabAction(mailbox);
@@ -1175,13 +1014,17 @@ class MailboxController extends BaseMailboxController {
} }
} }
void openMailboxInNewTabAction(PresentationMailbox mailbox) { void _invokeMovingMailboxAction(PresentationMailbox mailboxSelected, PresentationMailbox? destinationMailbox) {
final mailboxRouteWeb = RouteUtils.generateRouteBrowser( final accountId = mailboxDashBoardController.accountId.value;
AppRoutes.dashboard, if (accountId != null) {
NavigationRouter(mailboxId: mailbox.id) _handleMovingMailbox(
); accountId,
log('MailboxController::openMailboxInNewTabAction(): mailboxRouteWeb: $mailboxRouteWeb'); MoveAction.moving,
AppUtils.launchLink(mailboxRouteWeb.toString()); mailboxSelected,
destinationMailbox: destinationMailbox
);
_cancelSelectMailbox();
}
} }
void _updateSelectedMailboxRouteOnBrowser() { void _updateSelectedMailboxRouteOnBrowser() {
@@ -226,13 +226,16 @@ class MailboxView extends GetWidget<MailboxController> {
Row( Row(
children: [ children: [
buildIconWeb( buildIconWeb(
iconSize: 20, minSize: 40,
minSize: 40, iconPadding: EdgeInsets.zero,
iconPadding: EdgeInsets.zero, icon: SvgPicture.asset(
splashRadius: 15, _imagePaths.icSearchBar,
icon: SvgPicture.asset(_imagePaths.icSearchBar, color: AppColor.colorTextButton, fit: BoxFit.fill), color: AppColor.colorTextButton,
fit: BoxFit.fill
),
tooltip: AppLocalizations.of(context).search_folder, tooltip: AppLocalizations.of(context).search_folder,
onTap: () => controller.enableSearch()), onTap: controller.enableSearch
),
buildIconWeb( buildIconWeb(
minSize: 40, minSize: 40,
iconSize: 20, iconSize: 20,
@@ -391,18 +394,18 @@ class MailboxView extends GetWidget<MailboxController> {
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
parent: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, parent: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode,
allSelectMode: controller.currentSelectMode.value) allSelectMode: controller.currentSelectMode.value)
..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item)) ..addOnLongPressMailboxNodeAction((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item))
..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item))
..addOnExpandFolderActionClick((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) ..addOnClickExpandMailboxNodeAction((mailboxNode) => controller.toggleMailboxFolder(mailboxNode))
..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode))) ..addOnSelectMailboxNodeAction((mailboxNode) => controller.selectMailboxNode(mailboxNode)))
.build()), .build()),
children: _buildListChildTileWidget(context, mailboxNode) children: _buildListChildTileWidget(context, mailboxNode)
).build() ).build()
: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, : Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode,
allSelectMode: controller.currentSelectMode.value) allSelectMode: controller.currentSelectMode.value)
..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item)) ..addOnLongPressMailboxNodeAction((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item))
..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item))
..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode))) ..addOnSelectMailboxNodeAction((mailboxNode) => controller.selectMailboxNode(mailboxNode)))
.build()) .build())
).toList() ?? <Widget>[]; ).toList() ?? <Widget>[];
} }
@@ -466,7 +469,7 @@ class MailboxView extends GetWidget<MailboxController> {
allSelectMode: controller.currentSelectMode.value, allSelectMode: controller.currentSelectMode.value,
lastMailboxIdInSearchedList: controller.listMailboxSearched.last.id) lastMailboxIdInSearchedList: controller.listMailboxSearched.last.id)
..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox)) ..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox))
..addOnSelectMailboxActionClick((mailbox) => controller.selectMailboxSearched(context, mailbox))) ..addOnSelectMailboxAction((mailbox) => controller.selectMailboxSearched(context, mailbox)))
.build()) .build())
) )
)); ));
@@ -153,12 +153,15 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
child: Row( child: Row(
children: [ children: [
buildIconWeb( buildIconWeb(
minSize: 40, minSize: 40,
iconSize: 20, iconPadding: EdgeInsets.zero,
iconPadding: EdgeInsets.zero, icon: SvgPicture.asset(
splashRadius: 15, _imagePaths.icSearchBar,
icon: SvgPicture.asset(_imagePaths.icSearchBar, color: AppColor.colorTextButton, fit: BoxFit.fill), color: AppColor.colorTextButton,
onTap: () => controller.enableSearch()), fit: BoxFit.fill
),
onTap: controller.enableSearch
),
buildIconWeb( buildIconWeb(
minSize: 40, minSize: 40,
iconSize: 20, iconSize: 20,
@@ -295,27 +298,27 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
parent: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, parent: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode,
mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value) mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value)
..addOnOpenMailboxFolderClick((mailboxNode) => ..addOnClickOpenMailboxNodeAction((mailboxNode) =>
controller.openMailbox(context, mailboxNode.item)) controller.openMailbox(context, mailboxNode.item))
..addOnExpandFolderActionClick((mailboxNode) => ..addOnClickExpandMailboxNodeAction((mailboxNode) =>
controller.toggleMailboxFolder(mailboxNode)) controller.toggleMailboxFolder(mailboxNode))
..addOnMenuActionClick((position, mailboxNode) => ..addOnClickOpenMenuMailboxNodeAction((position, mailboxNode) =>
_openMailboxMenuAction(context, position, mailboxNode.item)) _openMailboxMenuAction(context, position, mailboxNode.item))
..addOnSelectMailboxFolderClick((mailboxNode) => ..addOnSelectMailboxNodeAction((mailboxNode) =>
controller.selectMailboxNode(mailboxNode)) controller.selectMailboxNode(mailboxNode))
..addOnDragItemAccepted(_handleDragItemAccepted)) ..addOnDragEmailToMailboxAccepted(_handleDragItemAccepted))
.build()), .build()),
children: _buildListChildTileWidget(context, mailboxNode) children: _buildListChildTileWidget(context, mailboxNode)
).build() ).build()
: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, : Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode,
mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value) mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value)
..addOnOpenMailboxFolderClick((mailboxNode) => ..addOnClickOpenMailboxNodeAction((mailboxNode) =>
controller.openMailbox(context, mailboxNode.item)) controller.openMailbox(context, mailboxNode.item))
..addOnMenuActionClick((position, mailboxNode) => ..addOnClickOpenMenuMailboxNodeAction((position, mailboxNode) =>
_openMailboxMenuAction(context, position, mailboxNode.item)) _openMailboxMenuAction(context, position, mailboxNode.item))
..addOnSelectMailboxFolderClick((mailboxNode) => ..addOnSelectMailboxNodeAction((mailboxNode) =>
controller.selectMailboxNode(mailboxNode)) controller.selectMailboxNode(mailboxNode))
..addOnDragItemAccepted(_handleDragItemAccepted)) ..addOnDragEmailToMailboxAccepted(_handleDragItemAccepted))
.build()) .build())
).toList() ?? <Widget>[]; ).toList() ?? <Widget>[];
} }
@@ -392,10 +395,10 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
_imagePaths, _imagePaths,
_responsiveUtils, _responsiveUtils,
listMailbox[index]) listMailbox[index])
..addOnDragItemAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction) ..addOnDragEmailToMailboxAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction)
..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox)) ..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox))
..addOnMenuActionClick((position, mailbox) => _openMailboxMenuAction(context, position, mailbox)) ..addOnMenuActionClick((position, mailbox) => _openMailboxMenuAction(context, position, mailbox))
..addOnSelectMailboxActionClick((mailbox) => controller.selectMailboxSearched(context, mailbox))) ..addOnSelectMailboxAction((mailbox) => controller.selectMailboxSearched(context, mailbox)))
.build())) .build()))
); );
} }
@@ -427,7 +430,7 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
if (_responsiveUtils.isScreenWithShortestSide(context)) { if (_responsiveUtils.isScreenWithShortestSide(context)) {
controller.openContextMenuAction( controller.openContextMenuAction(
context, context,
_bottomSheetIdentityActionTiles( _bottomSheetMailboxActionTiles(
context, context,
mailbox, mailbox,
listContextMenuItemAction)); listContextMenuItemAction));
@@ -442,7 +445,7 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
} }
} }
List<Widget> _bottomSheetIdentityActionTiles( List<Widget> _bottomSheetMailboxActionTiles(
BuildContext context, BuildContext context,
PresentationMailbox mailbox, PresentationMailbox mailbox,
List<ContextMenuItemMailboxAction> contextMenuActions List<ContextMenuItemMailboxAction> contextMenuActions
@@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
typedef OnClickOpenMailboxAction = void Function(PresentationMailbox);
typedef OnClickOpenMenuMailboxAction = void Function(RelativeRect, PresentationMailbox);
typedef OnSelectMailboxAction = void Function(PresentationMailbox);
typedef OnDragEmailToMailboxAccepted = void Function(List<PresentationEmail>, PresentationMailbox);
typedef OnClickExpandMailboxNodeAction = void Function(MailboxNode);
typedef OnClickOpenMailboxNodeAction = void Function(MailboxNode);
typedef OnSelectMailboxNodeAction = void Function(MailboxNode);
typedef OnClickOpenMenuMailboxNodeAction = void Function(RelativeRect, MailboxNode);
typedef OnLongPressMailboxNodeAction = void Function(MailboxNode);
@@ -8,15 +8,9 @@ import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_ma
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnExpandFolderActionClick = void Function(MailboxNode);
typedef OnOpenMailboxFolderClick = void Function(MailboxNode);
typedef OnSelectMailboxFolderClick = void Function(MailboxNode);
typedef OnMenuActionClick = void Function(RelativeRect, MailboxNode);
typedef OnDragItemAccepted = void Function(List<PresentationEmail>, PresentationMailbox);
typedef OnLongPressMailboxFolderClick = void Function(MailboxNode);
class MailBoxFolderTileBuilder { class MailBoxFolderTileBuilder {
final _responsiveUtils = Get.find<ResponsiveUtils>(); final _responsiveUtils = Get.find<ResponsiveUtils>();
@@ -31,13 +25,13 @@ class MailBoxFolderTileBuilder {
final MailboxActions? mailboxActions; final MailboxActions? mailboxActions;
final MailboxId? mailboxIdAlreadySelected; final MailboxId? mailboxIdAlreadySelected;
OnExpandFolderActionClick? _onExpandFolderActionClick; OnClickExpandMailboxNodeAction? _onExpandFolderActionClick;
OnOpenMailboxFolderClick? _onOpenMailboxFolderClick; OnClickOpenMailboxNodeAction? _onOpenMailboxFolderClick;
OnSelectMailboxFolderClick? _onSelectMailboxFolderClick; OnSelectMailboxNodeAction? _onSelectMailboxFolderClick;
OnMenuActionClick? _onMenuActionClick; OnClickOpenMenuMailboxNodeAction? _onMenuActionClick;
OnDragItemAccepted? _onDragItemAccepted; OnDragEmailToMailboxAccepted? _onDragItemAccepted;
OnLongPressMailboxFolderClick? _onLongPressMailboxFolderClick; OnLongPressMailboxNodeAction? _onLongPressSpamReport;
bool isHoverItem = false; bool isHoverItem = false;
MailBoxFolderTileBuilder( MailBoxFolderTileBuilder(
@@ -54,28 +48,28 @@ class MailBoxFolderTileBuilder {
} }
); );
void addOnExpandFolderActionClick(OnExpandFolderActionClick onExpandFolderActionClick) { void addOnClickExpandMailboxNodeAction(OnClickExpandMailboxNodeAction onExpandFolderActionClick) {
_onExpandFolderActionClick = onExpandFolderActionClick; _onExpandFolderActionClick = onExpandFolderActionClick;
} }
void addOnOpenMailboxFolderClick(OnOpenMailboxFolderClick onOpenMailboxFolderClick) { void addOnClickOpenMailboxNodeAction(OnClickOpenMailboxNodeAction onOpenMailboxFolderClick) {
_onOpenMailboxFolderClick = onOpenMailboxFolderClick; _onOpenMailboxFolderClick = onOpenMailboxFolderClick;
} }
void addOnSelectMailboxFolderClick(OnSelectMailboxFolderClick onSelectMailboxFolderClick) { void addOnSelectMailboxNodeAction(OnSelectMailboxNodeAction onSelectMailboxFolderClick) {
_onSelectMailboxFolderClick = onSelectMailboxFolderClick; _onSelectMailboxFolderClick = onSelectMailboxFolderClick;
} }
void addOnMenuActionClick(OnMenuActionClick onMenuActionClick) { void addOnClickOpenMenuMailboxNodeAction(OnClickOpenMenuMailboxNodeAction onMenuActionClick) {
_onMenuActionClick = onMenuActionClick; _onMenuActionClick = onMenuActionClick;
} }
void addOnDragItemAccepted(OnDragItemAccepted onDragItemAccepted) { void addOnDragEmailToMailboxAccepted(OnDragEmailToMailboxAccepted onDragItemAccepted) {
_onDragItemAccepted = onDragItemAccepted; _onDragItemAccepted = onDragItemAccepted;
} }
void addOnLongPressMailboxFolderClick(OnLongPressMailboxFolderClick onLongPressMailboxFolderClick) { void addOnLongPressMailboxNodeAction(OnLongPressMailboxNodeAction onLongPressSpamReport) {
_onLongPressMailboxFolderClick = onLongPressMailboxFolderClick; _onLongPressSpamReport = onLongPressSpamReport;
} }
Widget build() => DragTarget<List<PresentationEmail>>( Widget build() => DragTarget<List<PresentationEmail>>(
@@ -6,11 +6,7 @@ import 'package:model/model.dart';
import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
typedef OnOpenMailboxActionClick = void Function(PresentationMailbox);
typedef OnSelectMailboxActionClick = void Function(PresentationMailbox);
typedef OnOpenMenuActionClick = void Function(RelativeRect, PresentationMailbox);
typedef OnDragItemAccepted = void Function(List<PresentationEmail>, PresentationMailbox);
class MailboxSearchTileBuilder { class MailboxSearchTileBuilder {
@@ -27,10 +23,10 @@ class MailboxSearchTileBuilder {
bool isHoverItem = false; bool isHoverItem = false;
OnOpenMailboxActionClick? _onOpenMailboxActionClick; OnClickOpenMailboxAction? _onOpenMailboxActionClick;
OnSelectMailboxActionClick? _onSelectMailboxActionClick; OnSelectMailboxAction? _onSelectMailboxActionClick;
OnOpenMenuActionClick? _onMenuActionClick; OnClickOpenMenuMailboxAction? _onMenuActionClick;
OnDragItemAccepted? _onDragItemAccepted; OnDragEmailToMailboxAccepted? _onDragItemAccepted;
MailboxSearchTileBuilder( MailboxSearchTileBuilder(
this._context, this._context,
@@ -47,19 +43,19 @@ class MailboxSearchTileBuilder {
} }
); );
void addOnOpenMailboxAction(OnOpenMailboxActionClick onOpenMailboxActionClick) { void addOnOpenMailboxAction(OnClickOpenMailboxAction onOpenMailboxActionClick) {
_onOpenMailboxActionClick = onOpenMailboxActionClick; _onOpenMailboxActionClick = onOpenMailboxActionClick;
} }
void addOnSelectMailboxActionClick(OnSelectMailboxActionClick onSelectMailboxActionClick) { void addOnSelectMailboxAction(OnSelectMailboxAction onSelectMailboxActionClick) {
_onSelectMailboxActionClick = onSelectMailboxActionClick; _onSelectMailboxActionClick = onSelectMailboxActionClick;
} }
void addOnMenuActionClick(OnOpenMenuActionClick onOpenMenuActionClick) { void addOnMenuActionClick(OnClickOpenMenuMailboxAction onOpenMenuActionClick) {
_onMenuActionClick = onOpenMenuActionClick; _onMenuActionClick = onOpenMenuActionClick;
} }
void addOnDragItemAccepted(OnDragItemAccepted onDragItemAccepted) { void addOnDragEmailToMailboxAccepted(OnDragEmailToMailboxAccepted onDragItemAccepted) {
_onDragItemAccepted = onDragItemAccepted; _onDragItemAccepted = onDragItemAccepted;
} }
@@ -9,7 +9,7 @@ class VerifyNameViewState extends UIState {
} }
class VerifyNameFailure extends FeatureFailure { class VerifyNameFailure extends FeatureFailure {
final exception; final dynamic exception;
VerifyNameFailure(this.exception); VerifyNameFailure(this.exception);
@override @override
@@ -34,9 +34,9 @@ class RulesFilterCreatorBindings extends BaseBindings {
@override @override
void bindingsController() { void bindingsController() {
Get.lazyPut(() => RulesFilterCreatorController( Get.lazyPut(() => RulesFilterCreatorController(
Get.find<VerifyNameInteractor>(),
Get.find<GetAllMailboxInteractor>(), Get.find<GetAllMailboxInteractor>(),
Get.find<TreeBuilder>() Get.find<TreeBuilder>(),
Get.find<VerifyNameInteractor>()
)); ));
} }
@@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/destination_picker/presentation/model/des
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
@@ -44,7 +45,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
final _appToast = Get.find<AppToast>(); final _appToast = Get.find<AppToast>();
final VerifyNameInteractor _verifyNameInteractor;
final GetAllMailboxInteractor _getAllMailboxInteractor; final GetAllMailboxInteractor _getAllMailboxInteractor;
GetAllRulesInteractor? _getAllRulesInteractor; GetAllRulesInteractor? _getAllRulesInteractor;
@@ -76,10 +76,10 @@ class RulesFilterCreatorController extends BaseMailboxController {
List<TMailRule>? _listEmailRule; List<TMailRule>? _listEmailRule;
RulesFilterCreatorController( RulesFilterCreatorController(
this._verifyNameInteractor,
this._getAllMailboxInteractor, this._getAllMailboxInteractor,
treeBuilder TreeBuilder treeBuilder,
) : super(treeBuilder); VerifyNameInteractor verifyNameInteractor,
) : super(treeBuilder, verifyNameInteractor);
@override @override
void onInit() { void onInit() {
@@ -206,7 +206,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
} }
String? _getErrorStringByInputValue(BuildContext context, String? inputValue) { String? _getErrorStringByInputValue(BuildContext context, String? inputValue) {
return _verifyNameInteractor.execute(inputValue, [EmptyNameValidator()]).fold( return verifyNameInteractor.execute(inputValue, [EmptyNameValidator()]).fold(
(failure) { (failure) {
if (failure is VerifyNameFailure) { if (failure is VerifyNameFailure) {
return failure.getMessageRulesFilter(context); return failure.getMessageRulesFilter(context);