diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 5de0ae2c1..ef08b2c18 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -40,8 +40,11 @@ class EmailView extends GetWidget with NetworkConnectionMixin { ? AppColor.colorBgDesktop : Colors.white, body: Row(children: [ - if (responsiveUtils.isMailboxDashboardSplitView(context)) - const VerticalDivider(color: AppColor.lineItemListColor, width: 1, thickness: 0.2), + if (_supportVerticalDivider(context)) + const VerticalDivider( + color: AppColor.lineItemListColor, + width: 1, + thickness: 0.2), Expanded(child: SafeArea( right: responsiveUtils.isLandscapeMobile(context), left: responsiveUtils.isLandscapeMobile(context), @@ -60,24 +63,7 @@ class EmailView extends GetWidget with NetworkConnectionMixin { : EdgeInsets.zero, child: Column(children: [ _buildAppBar(context), - Obx(() { - if (controller.mailboxDashBoardController.vacationResponse.value?.vacationResponderIsValid == true && - (responsiveUtils.isMobile(context) || - responsiveUtils.isTablet(context) || - responsiveUtils.isLandscapeMobile(context))) { - return Padding( - padding: const EdgeInsets.only(bottom: 5), - child: VacationNotificationMessageWidget( - radius: 0, - margin: EdgeInsets.zero, - vacationResponse: controller.mailboxDashBoardController.vacationResponse.value!, - actionGotoVacationSetting: () => controller.mailboxDashBoardController.goToVacationSetting(), - actionEndNow: () => controller.mailboxDashBoardController.disableVacationResponder()), - ); - } else { - return const SizedBox.shrink(); - } - }), + _buildVacationNotificationMessage(context), if (responsiveUtils.isWebDesktop(context)) const SizedBox(height: 5), Obx(() { @@ -100,18 +86,51 @@ class EmailView extends GetWidget with NetworkConnectionMixin { ); } + bool _supportVerticalDivider(BuildContext context) { + if (BuildUtils.isWeb) { + return responsiveUtils.isTabletLarge(context); + } else { + return responsiveUtils.isLandscapeTablet(context) || responsiveUtils.isDesktop(context); + } + } + Widget _buildDivider({EdgeInsets? edgeInsets}){ return Padding( padding: edgeInsets ?? const EdgeInsets.symmetric(horizontal: 16), child: const Divider(color: AppColor.colorDividerEmailView, height: 0.5)); } + Widget _buildVacationNotificationMessage(BuildContext context) { + return Obx(() { + final vacation = controller.mailboxDashBoardController.vacationResponse.value; + if (vacation?.vacationResponderIsValid == true && + (responsiveUtils.isMobile(context) || + responsiveUtils.isTablet(context) || + responsiveUtils.isLandscapeMobile(context))) { + return Padding( + padding: const EdgeInsets.only(bottom: 5), + child: VacationNotificationMessageWidget( + radius: 0, + margin: EdgeInsets.zero, + vacationResponse: vacation!, + actionGotoVacationSetting: () => controller.mailboxDashBoardController.goToVacationSetting(), + actionEndNow: () => controller.mailboxDashBoardController.disableVacationResponder()), + ); + } else { + return const SizedBox.shrink(); + } + }); + } + Widget _buildAppBar(BuildContext context) { return Obx(() => Padding( padding: const EdgeInsets.only(top: 6), child: AppBarMailWidgetBuilder( controller.currentEmail, - controller.currentMailbox, + currentMailbox: controller.mailboxDashBoardController.searchController.isSearchEmailRunning + ? controller.currentEmail?.findMailboxContain(controller.mailboxDashBoardController.mapMailbox) + : controller.currentMailbox, + isSearchIsRunning: controller.mailboxDashBoardController.searchController.isSearchEmailRunning, onBackActionClick: () => controller.closeEmailView(context), onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action), diff --git a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart index aab1f653f..bdc6500ae 100644 --- a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart +++ b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart @@ -15,19 +15,21 @@ class AppBarMailWidgetBuilder extends StatelessWidget { final _responsiveUtils = Get.find(); final PresentationEmail? _presentationEmail; - final PresentationMailbox? _currentMailbox; + final PresentationMailbox? currentMailbox; + final bool isSearchIsRunning; final OnBackActionClick? onBackActionClick; final OnEmailActionClick? onEmailActionClick; final OnMoreActionClick? onMoreActionClick; AppBarMailWidgetBuilder( this._presentationEmail, - this._currentMailbox, { Key? key, + this.currentMailbox, this.onBackActionClick, this.onEmailActionClick, - this.onMoreActionClick + this.onMoreActionClick, + this.isSearchIsRunning = false, } ) : super(key: key); @@ -39,7 +41,7 @@ class AppBarMailWidgetBuilder extends StatelessWidget { color: Colors.transparent, padding: const EdgeInsets.only(left: 8), child: Row(children: [ - if (_responsiveUtils.mailboxDashboardHasMailboxAndEmailView(context)) + if (_supportDisplayMailboxNameTitle(context)) Material( color: Colors.transparent, child: InkWell( @@ -63,7 +65,7 @@ class AppBarMailWidgetBuilder extends StatelessWidget { constraints: BoxConstraints( maxWidth: _responsiveUtils.getSizeScreenWidth(context) - 250), child: Text( - _currentMailbox?.name?.name.capitalizeFirstEach ?? '', + currentMailbox?.name?.name.capitalizeFirstEach ?? '', maxLines: 1, overflow: CommonTextStyle.defaultTextOverFlow, softWrap: CommonTextStyle.defaultSoftWrap, @@ -80,6 +82,20 @@ class AppBarMailWidgetBuilder extends StatelessWidget { ); } + bool _supportDisplayMailboxNameTitle(BuildContext context) { + if (BuildUtils.isWeb) { + return _responsiveUtils.isDesktop(context) || + _responsiveUtils.isMobile(context) || + _responsiveUtils.isTablet(context) || + isSearchIsRunning; + } else { + return _responsiveUtils.isPortraitMobile(context) || + _responsiveUtils.isLandscapeMobile(context) || + _responsiveUtils.isTablet(context) || + isSearchIsRunning; + } + } + Widget _buildListOptionButton(BuildContext context) { return Row( children: [ @@ -104,18 +120,18 @@ class AppBarMailWidgetBuilder extends StatelessWidget { : EmailActionType.markAsStarred)), buildIconWeb( icon: SvgPicture.asset( - _currentMailbox?.role == PresentationMailbox.roleTrash + currentMailbox?.role == PresentationMailbox.roleTrash ? _imagePaths.icDeleteComposer : _imagePaths.icDelete, color: AppColor.colorDefaultButton, width: 24, height: 24, fit: BoxFit.fill), - tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash + tooltip: currentMailbox?.role != PresentationMailbox.roleTrash ? AppLocalizations.of(context).move_to_trash : AppLocalizations.of(context).delete_permanently, onTap: () { - if (_currentMailbox?.role != PresentationMailbox.roleTrash) { + if (currentMailbox?.role != PresentationMailbox.roleTrash) { onEmailActionClick?.call( _presentationEmail!, EmailActionType.moveToTrash); diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index 78cc24e26..3934b4512 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -165,6 +165,8 @@ class SearchController extends BaseController { bool isAdvanceSearchActive() => isAdvancedSearchHasApply.isTrue; + bool get isSearchEmailRunning => isSearchActive() || isAdvanceSearchActive(); + void enableSearch() { searchState.value = searchState.value.enableSearchState(); } diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index fdf725f3d..aa6346555 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -955,10 +955,15 @@ class ThreadController extends BaseController { } } - void pressEmailAction(BuildContext context, EmailActionType actionType, PresentationEmail selectedEmail) { + void pressEmailAction( + BuildContext context, + EmailActionType actionType, + PresentationEmail selectedEmail, + {PresentationMailbox? mailboxContain} + ) { switch(actionType) { case EmailActionType.preview: - if (mailboxDashBoardController.selectedMailbox.value?.role == PresentationMailbox.roleDrafts) { + if (mailboxContain?.isDrafts == true) { editEmail(selectedEmail); } else { previewEmail(context, selectedEmail); diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 87c2cf408..fdf18e28a 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -573,7 +573,14 @@ class ThreadView extends GetWidget with AppLoaderMixin, controller.searchController.searchState.value.searchStatus, controller.searchQuery, advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue) - ..addOnPressEmailActionClick((action, email) => controller.pressEmailAction(context, action, email)) + ..addOnPressEmailActionClick((action, email) => + controller.pressEmailAction( + context, + action, + email, + mailboxContain: controller.searchController.isSearchEmailRunning + ? email.findMailboxContain(controller.mailboxDashBoardController.mapMailbox) + : controller.currentMailbox)) ..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context) ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))) @@ -672,12 +679,18 @@ class ThreadView extends GetWidget with AppLoaderMixin, } Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) { + final mailboxContain = controller.searchController.isSearchEmailRunning + ? email.findMailboxContain(controller.mailboxDashBoardController.mapMailbox) + : controller.currentMailbox; return (EmailActionCupertinoActionSheetActionBuilder( const Key('mark_as_spam_or_un_spam_action'), SvgPicture.asset( - controller.currentMailbox?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam, - width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton), - controller.currentMailbox?.isSpam == true + mailboxContain?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam, + width: 28, + height: 28, + fit: BoxFit.fill, + color: AppColor.colorTextButton), + mailboxContain?.isSpam == true ? AppLocalizations.of(context).remove_from_spam : AppLocalizations.of(context).mark_as_spam, email, @@ -688,10 +701,11 @@ class ThreadView extends GetWidget with AppLoaderMixin, ? const EdgeInsets.only(right: 12) : EdgeInsets.zero) ..onActionClick((email) => controller.pressEmailAction(context, - controller.currentMailbox?.isSpam == true + mailboxContain?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam, - email))) + email, + mailboxContain: mailboxContain))) .build(); } diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart index a200f2373..bfbea7991 100644 --- a/model/lib/extensions/presentation_email_extension.dart +++ b/model/lib/extensions/presentation_email_extension.dart @@ -147,4 +147,17 @@ extension PresentationEmailExtension on PresentationEmail { selectMode: selectMode, ); } + + PresentationMailbox? findMailboxContain(Map mapMailbox) { + final newMailboxIds = mailboxIds; + newMailboxIds?.removeWhere((key, value) => !value); + + if (newMailboxIds?.isNotEmpty == true) { + final firstMailboxId = newMailboxIds!.keys.first; + if (mapMailbox.containsKey(firstMailboxId)) { + return mapMailbox[firstMailboxId]; + } + } + return null; + } } \ No newline at end of file