diff --git a/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart b/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart index e3efd6950..beb3f1cb0 100644 --- a/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart +++ b/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart @@ -26,6 +26,7 @@ import 'package:model/email/presentation_email.dart'; import 'package:model/email/read_actions.dart'; import 'package:model/extensions/email_address_extension.dart'; import 'package:model/extensions/list_email_address_extension.dart'; +import 'package:model/extensions/mailbox_id_extension.dart'; import 'package:model/extensions/presentation_email_extension.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; @@ -713,9 +714,11 @@ class EmailActionReactor { PresentationMailbox? selectedMailbox, bool isSearchEmailRunning = false, }) { - if (selectedMailbox == null || isSearchEmailRunning) { + if (selectedMailbox == null || + isSearchEmailRunning || + selectedMailbox.id.isFavoriteMailboxId == true) { return presentationEmail.findMailboxContain(mapMailbox); - } + } return selectedMailbox; } diff --git a/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart b/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart index e67f0b272..a43d1cff4 100644 --- a/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart +++ b/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart @@ -12,6 +12,7 @@ import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_app_bar_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_back_button.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; typedef OnEmailActionClick = void Function(PresentationEmail, EmailActionType); @@ -81,7 +82,7 @@ class EmailViewAppBarWidget extends StatelessWidget { child: EmailViewBackButton( imagePaths: _imagePaths, onBackAction: onBackAction, - mailboxContain: mailboxContain, + backButtonLabel: mailboxContain?.getDisplayName(context) ?? '', isSearchActivated: isSearchActivated, maxWidth: constraints.maxWidth, ), diff --git a/lib/features/email/presentation/widgets/email_view_back_button.dart b/lib/features/email/presentation/widgets/email_view_back_button.dart index 311255b2a..93836c0b1 100644 --- a/lib/features/email/presentation/widgets/email_view_back_button.dart +++ b/lib/features/email/presentation/widgets/email_view_back_button.dart @@ -3,9 +3,7 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:core/utils/direction_utils.dart'; import 'package:flutter/material.dart'; -import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_back_button_styles.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class EmailViewBackButton extends StatelessWidget { @@ -14,7 +12,7 @@ class EmailViewBackButton extends StatelessWidget { final bool isSearchActivated; final VoidCallback onBackAction; final double maxWidth; - final PresentationMailbox? mailboxContain; + final String backButtonLabel; const EmailViewBackButton({ super.key, @@ -22,14 +20,14 @@ class EmailViewBackButton extends StatelessWidget { required this.onBackAction, required this.isSearchActivated, required this.maxWidth, - this.mailboxContain, + required this.backButtonLabel, }); @override Widget build(BuildContext context) { if (!isSearchActivated) { return TMailButtonWidget( - text: mailboxContain?.getDisplayName(context) ?? '', + text: backButtonLabel, icon: DirectionUtils.isDirectionRTLByLanguage(context) ? imagePaths.icArrowRight : imagePaths.icBack, diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 61c1695e7..595e4a30f 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1347,7 +1347,8 @@ class MailboxDashBoardController extends ReloadableController .where((email) => email.id != null) .map((e) => MapEntry(e.id!, e.hasRead)) ); - if (searchController.isSearchEmailRunning){ + if (searchController.isSearchEmailRunning || + selectedMailbox.value?.id.isFavoriteMailboxId == true) { final Map> mapListEmailSelectedByMailBoxId = {}; for (var element in listEmails) { final mailbox = element.findMailboxContain(mapMailboxById); diff --git a/lib/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart b/lib/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart index 4e0e585b6..96979f099 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart @@ -5,6 +5,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/extensions/list_presentation_email_extension.dart'; +import 'package:model/extensions/mailbox_id_extension.dart'; import 'package:model/extensions/presentation_email_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; @@ -48,7 +49,8 @@ extension HandleActionTypeForEmailSelection on MailboxDashBoardController { final mapEmailIdsByMailboxId = >{}; - if (searchController.isSearchEmailRunning) { + if (searchController.isSearchEmailRunning || + selectedMailbox.value?.id.isFavoriteMailboxId == true) { for (final email in emails) { final mailboxId = email.firstMailboxIdAvailable; final emailId = email.id; diff --git a/lib/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart index c3634a7b9..65a401859 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart @@ -2,6 +2,7 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/email/presentation_email.dart'; +import 'package:model/extensions/mailbox_id_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; extension MoveEmailsToMailboxExtension on MailboxDashBoardController { @@ -9,7 +10,10 @@ extension MoveEmailsToMailboxExtension on MailboxDashBoardController { required Map> originalMailboxIdsWithEmailIds, required MailboxId destinationMailboxId, }) { - if (destinationMailboxId == selectedMailbox.value?.id) return; + if (destinationMailboxId == selectedMailbox.value?.id || + selectedMailbox.value?.id.isFavoriteMailboxId == true) { + return; + } final currentEmails = List.from( emailsInCurrentMailbox, diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 08d8b4f43..422f5aef2 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -180,7 +180,7 @@ class ThreadController extends BaseController with EmailActionController { openingEmail.value = true; } else if (success is GetEmailByIdSuccess) { openingEmail.value = false; - if (searchController.isSearchEmailRunning) { + if (isSearchActive) { _openEmailSearchedFromLocationBar( email: success.email, searchQuery: searchQuery @@ -362,7 +362,7 @@ class ThreadController extends BaseController with EmailActionController { }); ever(mailboxDashBoardController.viewState, (viewState) { - if (mailboxDashBoardController.searchController.isSearchEmailRunning) return; + if (isSearchActive) return; final reactionState = viewState.getOrElse(() => UIState.idle); if (reactionState is MarkAsMailboxReadAllSuccess) { _handleMarkEmailsAsReadByMailboxId(reactionState.mailboxId); @@ -1036,7 +1036,7 @@ class ThreadController extends BaseController with EmailActionController { leadingSVGIcon: newFilterOption.getIconToast(imagePaths)); } - if (searchController.isSearchEmailRunning) { + if (isSearchActive) { _searchEmail(); } else { refreshAllEmail(); @@ -1125,7 +1125,7 @@ class ThreadController extends BaseController with EmailActionController { mapMailboxById: mailboxDashBoardController.mapMailboxById, selectedMailbox: selectedMailbox, searchQuery: searchController.searchQuery, - isSearchEmailRunning: searchController.isSearchEmailRunning + isSearchEmailRunning: isSearchActive, ); mailboxDashBoardController.updateEmailList(newEmailListSynced); if (mailboxDashBoardController.isSelectionEnabled()) { @@ -1184,7 +1184,7 @@ class ThreadController extends BaseController with EmailActionController { mapMailboxById: mailboxDashBoardController.mapMailboxById, selectedMailbox: selectedMailbox, searchQuery: searchController.searchQuery, - isSearchEmailRunning: searchController.isSearchEmailRunning + isSearchEmailRunning: isSearchActive, ); mailboxDashBoardController.emailsInCurrentMailbox.addAll(resultEmailSearchList); } @@ -1225,7 +1225,7 @@ class ThreadController extends BaseController with EmailActionController { moveEmailsToTrash(selectionEmail); break; case EmailActionType.deletePermanently: - final mailboxContainCurrent = searchController.isSearchEmailRunning + final mailboxContainCurrent = isSearchActive ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) : selectedMailbox; if (mailboxContainCurrent != null && currentContext != null) { @@ -1351,13 +1351,13 @@ class ThreadController extends BaseController with EmailActionController { AppRoutes.dashboard, router: NavigationRouter( emailId: currentEmail.id, - mailboxId: searchController.isSearchEmailRunning + mailboxId: isSearchActive ? currentEmail.mailboxContain?.mailboxId : selectedMailboxId, - searchQuery: searchController.isSearchEmailRunning + searchQuery: isSearchActive ? searchQuery : null, - dashboardType: searchController.isSearchEmailRunning + dashboardType: isSearchActive ? DashboardType.search : DashboardType.normal ) diff --git a/lib/features/thread_detail/presentation/thread_detail_view.dart b/lib/features/thread_detail/presentation/thread_detail_view.dart index 8c0c93d84..50c53dd10 100644 --- a/lib/features/thread_detail/presentation/thread_detail_view.dart +++ b/lib/features/thread_detail/presentation/thread_detail_view.dart @@ -6,11 +6,11 @@ import 'package:core/utils/platform_info.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/base/widget/keyboard/keyboard_handler_wrapper.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_app_bar_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_bottom_bar_widget.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart'; @@ -40,7 +40,7 @@ class ThreadDetailView extends GetWidget { isSearchRunning: controller.isSearchRunning, closeThreadDetailAction: controller.closeThreadDetailAction, isThreadDetailEnabled: controller.isThreadDetailEnabled, - mailboxContain: _getMailboxContain(), + backButtonLabel: _getBackButtonLabel(context), threadActionReady: controller.emailsInThreadDetailInfo.isNotEmpty, threadDetailIsStarred: controller.threadDetailIsStarred, threadDetailCanPermanentlyDelete: controller.threadDetailCanPermanentlyDelete, @@ -235,12 +235,15 @@ class ThreadDetailView extends GetWidget { } } - PresentationMailbox? _getMailboxContain() { + String _getBackButtonLabel(BuildContext context) { if (controller.isSearchRunning) { - return null; + return ''; } - - return controller.mailboxDashBoardController.selectedMailbox.value; + return controller + .mailboxDashBoardController + .selectedMailbox + .value + ?.getDisplayName(context) ?? ''; } bool showLoadingView(Either viewState) { diff --git a/lib/features/thread_detail/presentation/widgets/thread_detail_app_bar.dart b/lib/features/thread_detail/presentation/widgets/thread_detail_app_bar.dart index a24f48fe5..d6e112425 100644 --- a/lib/features/thread_detail/presentation/widgets/thread_detail_app_bar.dart +++ b/lib/features/thread_detail/presentation/widgets/thread_detail_app_bar.dart @@ -5,7 +5,6 @@ import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:model/email/email_action_type.dart'; -import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_app_bar_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_back_button.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -25,7 +24,7 @@ class ThreadDetailAppBar extends StatelessWidget { required this.threadDetailIsStarred, required this.isThreadDetailEnabled, required this.threadDetailCanPermanentlyDelete, - this.mailboxContain, + required this.backButtonLabel, this.optionWidgets = const [], this.onThreadActionClick, this.onThreadMoreActionClick, @@ -40,7 +39,7 @@ class ThreadDetailAppBar extends StatelessWidget { final bool threadDetailIsStarred; final bool isThreadDetailEnabled; final bool threadDetailCanPermanentlyDelete; - final PresentationMailbox? mailboxContain; + final String backButtonLabel; final List optionWidgets; final OnThreadActionClick? onThreadActionClick; final OnThreadMoreActionClick? onThreadMoreActionClick; @@ -100,7 +99,7 @@ class ThreadDetailAppBar extends StatelessWidget { Widget backButton = EmailViewBackButton( imagePaths: imagePaths, onBackAction: closeThreadDetailAction, - mailboxContain: mailboxContain, + backButtonLabel: backButtonLabel, isSearchActivated: isSearchRunning, maxWidth: constraints.maxWidth, );