diff --git a/lib/features/email/presentation/action/email_ui_action.dart b/lib/features/email/presentation/action/email_ui_action.dart index 3d8ee6ae5..3a2ae4ae5 100644 --- a/lib/features/email/presentation/action/email_ui_action.dart +++ b/lib/features/email/presentation/action/email_ui_action.dart @@ -1,6 +1,6 @@ -import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/base/action/ui_action.dart'; class EmailUIAction extends UIAction { static final idle = EmailUIAction(); @@ -20,4 +20,6 @@ class RefreshChangeEmailAction extends EmailUIAction { List get props => [newState]; } +class CloseEmailDetailedViewToRedirectToTheInboxAction extends EmailUIAction {} + class CloseEmailDetailedViewAction extends EmailUIAction {} \ No newline at end of file diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 234ead2fc..525f4b2ae 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:io'; +import 'package:better_open_file/better_open_file.dart' as open_file; import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; @@ -19,7 +20,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mdn/disposition.dart'; import 'package:jmap_dart_client/jmap/mdn/mdn.dart'; import 'package:model/model.dart'; -import 'package:better_open_file/better_open_file.dart' as open_file; import 'package:permission_handler/permission_handler.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:share_plus/share_plus.dart'; @@ -31,14 +31,6 @@ import 'package:tmail_ui_user/features/email/domain/extensions/list_attachments_ import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart'; -import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart'; -import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_interactor.dart'; -import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; -import 'package:tmail_ui_user/features/email/presentation/bindings/calendar_event_interactor_bindings.dart'; -import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart'; -import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart'; @@ -49,7 +41,9 @@ import 'package:tmail_ui_user/features/email/domain/state/get_email_content_stat import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/send_receipt_to_sender_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/download_attachments_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart'; @@ -57,8 +51,14 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/send_receipt_to_sender_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_interactor.dart'; +import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; +import 'package:tmail_ui_user/features/email/presentation/bindings/calendar_event_interactor_bindings.dart'; +import 'package:tmail_ui_user/features/email/presentation/controller/email_supervisor_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; +import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart'; import 'package:tmail_ui_user/features/email/presentation/model/email_unsubscribe.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_list/attachment_list_bottom_sheet_builder.dart'; @@ -223,7 +223,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { ); ever(mailboxDashBoardController.emailUIAction, (action) { - if (action is CloseEmailDetailedViewAction) { + if (action is CloseEmailDetailedViewToRedirectToTheInboxAction) { if (emailSupervisorController.supportedPageView.isTrue) { emailSupervisorController.popEmailQueue(_currentEmailId); emailSupervisorController.setCurrentEmailIndex(-1); @@ -234,6 +234,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin { mailboxDashBoardController.clearSelectedEmail(); mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread); mailboxDashBoardController.clearEmailUIAction(); + } else if (action is CloseEmailDetailedViewAction && currentContext != null) { + closeEmailView(currentContext!); + mailboxDashBoardController.clearEmailUIAction(); } }); diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 523708e44..5ae72894b 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -21,14 +21,14 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/email_ac import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_event_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_styles.dart'; -import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_app_bar_widget.dart'; -import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_bottom_bar_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_action_banner_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_information_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_attachments_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_subject_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_app_bar_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_bottom_bar_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_empty_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_loading_bar_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/information_sender_and_receiver_builder.dart'; @@ -45,208 +45,205 @@ class EmailView extends GetWidget { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () => controller.backButtonPressedCallbackAction.call(context), - child: Scaffold( - backgroundColor: controller.responsiveUtils.isWebDesktop(context) - ? AppColor.colorBgDesktop - : Colors.white, - appBar: PlatformInfo.isIOS - ? PreferredSize( - preferredSize: const Size(double.infinity, 100), - child: Obx(() { - if (controller.currentEmail != null) { - return SafeArea( - top: false, - bottom: false, - child: EmailViewAppBarWidget( - key: const Key('email_view_app_bar_widget'), - presentationEmail: controller.currentEmail!, - mailboxContain: _getMailboxContain(controller.currentEmail!), - isSearchActivated: controller.mailboxDashBoardController.searchController.isSearchEmailRunning, - onBackAction: () => controller.closeEmailView(context), - onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action), - onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(context: context, presentationEmail: presentationEmail, position: position) - ), - ); - } else { - return const SizedBox.shrink(); - } - }) - ) - : null, - body: SafeArea( - right: controller.responsiveUtils.isLandscapeMobile(context), - left: controller.responsiveUtils.isLandscapeMobile(context), - bottom: !PlatformInfo.isIOS, - child: Container( - clipBehavior: Clip.antiAlias, - decoration: controller.responsiveUtils.isWebDesktop(context) - ? BoxDecoration( - borderRadius: BorderRadius.circular(20), - border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), - color: Colors.white) - : const BoxDecoration(color: Colors.white), - margin: _getMarginEmailView(context), + return Scaffold( + backgroundColor: controller.responsiveUtils.isWebDesktop(context) + ? AppColor.colorBgDesktop + : Colors.white, + appBar: PlatformInfo.isIOS + ? PreferredSize( + preferredSize: const Size(double.infinity, 100), child: Obx(() { - final currentEmail = controller.currentEmail; - if (currentEmail != null) { - return Column(children: [ - if (!PlatformInfo.isIOS) - Obx(() => EmailViewAppBarWidget( - key: const Key('email_view_app_bar_widget'), - presentationEmail: currentEmail, - mailboxContain: _getMailboxContain(currentEmail), - isSearchActivated: controller.mailboxDashBoardController.searchController.isSearchEmailRunning, - onBackAction: () => controller.closeEmailView(context), - onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action), - onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(context: context, presentationEmail: presentationEmail, position: position), - optionsWidget: PlatformInfo.isWeb && controller.emailSupervisorController.supportedPageView.isTrue - ? _buildNavigatorPageViewWidgets(context) - : null, - )), - Obx(() { - final vacation = controller.mailboxDashBoardController.vacationResponse.value; - if (vacation?.vacationResponderIsValid == true && - ( - controller.responsiveUtils.isMobile(context) || - controller.responsiveUtils.isTablet(context) || - controller.responsiveUtils.isLandscapeMobile(context) - ) - ) { - return VacationNotificationMessageWidget( - margin: const EdgeInsets.only(left: 12, right: 12, bottom: 5), - vacationResponse: vacation!, - actionGotoVacationSetting: controller.mailboxDashBoardController.goToVacationSetting, - actionEndNow: controller.mailboxDashBoardController.disableVacationResponder - ); - } else { - return const SizedBox.shrink(); - } - }), - Expanded( - child: Obx(() { - if (controller.emailSupervisorController.supportedPageView.isTrue) { - final currentListEmail = controller.emailSupervisorController.currentListEmail; - return PageView.builder( - physics: controller.emailSupervisorController.scrollPhysicsPageView.value, - itemCount: currentListEmail.length, - allowImplicitScrolling: true, - controller: controller.emailSupervisorController.pageController, - onPageChanged: controller.emailSupervisorController.onPageChanged, - itemBuilder: (context, index) { - final currentEmail = currentListEmail[index]; - if (PlatformInfo.isMobile) { - return SingleChildScrollView( - physics : const ClampingScrollPhysics(), - child: Container( - width: double.infinity, - alignment: Alignment.center, - color: Colors.white, - child: Obx(() => _buildEmailMessage( - context: context, - presentationEmail: currentEmail, - calendarEvent: controller.calendarEvent.value, - )) - ) - ); - } else { - return Obx(() { - final calendarEvent = controller.calendarEvent.value; - if (currentEmail.hasCalendarEvent && calendarEvent != null) { - return Padding( - padding: const EdgeInsetsDirectional.symmetric(horizontal: 4), - child: ScrollbarListView( - scrollController: controller.emailContentScrollController, - child: SingleChildScrollView( - physics : const ClampingScrollPhysics(), - controller: controller.emailContentScrollController, - child: Container( - width: double.infinity, - alignment: Alignment.center, - color: Colors.white, - child: _buildEmailMessage( - context: context, - presentationEmail: currentEmail, - calendarEvent: calendarEvent, - emailAddressSender: currentEmail.listEmailAddressSender.getListAddress(), - ) - ) - ), - ), - ); - } else { - return _buildEmailMessage( - context: context, - presentationEmail: currentEmail, - ); - } - }); - } - } - ); - } else { - if (PlatformInfo.isMobile) { - return SingleChildScrollView( - physics : const ClampingScrollPhysics(), - child: Container( - width: double.infinity, - alignment: Alignment.center, - color: Colors.white, - child: Obx(() => _buildEmailMessage( - context: context, - presentationEmail: currentEmail, - calendarEvent: controller.calendarEvent.value, - )) - ) - ); - } else { - return Obx(() { - final calendarEvent = controller.calendarEvent.value; - if (currentEmail.hasCalendarEvent && calendarEvent != null) { - return Padding( - padding: const EdgeInsetsDirectional.symmetric(horizontal: 4), - child: ScrollbarListView( - scrollController: controller.emailContentScrollController, - child: SingleChildScrollView( - physics : const ClampingScrollPhysics(), - controller: controller.emailContentScrollController, - child: Container( - width: double.infinity, - alignment: Alignment.center, - color: Colors.white, - child: _buildEmailMessage( - context: context, - presentationEmail: currentEmail, - calendarEvent: calendarEvent, - emailAddressSender: currentEmail.listEmailAddressSender.getListAddress(), - ) - ) - ), - ), - ); - } else { - return _buildEmailMessage( - context: context, - presentationEmail: currentEmail, - ); - } - }); - } - } - }), + if (controller.currentEmail != null) { + return SafeArea( + top: false, + bottom: false, + child: EmailViewAppBarWidget( + key: const Key('email_view_app_bar_widget'), + presentationEmail: controller.currentEmail!, + mailboxContain: _getMailboxContain(controller.currentEmail!), + isSearchActivated: controller.mailboxDashBoardController.searchController.isSearchEmailRunning, + onBackAction: () => controller.closeEmailView(context), + onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action), + onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(context: context, presentationEmail: presentationEmail, position: position) ), - EmailViewBottomBarWidget( - key: const Key('email_view_button_bar'), - presentationEmail: currentEmail, - emailActionCallback: controller.pressEmailAction - ), - ]); + ); } else { - return const EmailViewEmptyWidget(); + return const SizedBox.shrink(); } }) ) + : null, + body: SafeArea( + right: controller.responsiveUtils.isLandscapeMobile(context), + left: controller.responsiveUtils.isLandscapeMobile(context), + bottom: !PlatformInfo.isIOS, + child: Container( + clipBehavior: Clip.antiAlias, + decoration: controller.responsiveUtils.isWebDesktop(context) + ? BoxDecoration( + borderRadius: BorderRadius.circular(20), + border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), + color: Colors.white) + : const BoxDecoration(color: Colors.white), + margin: _getMarginEmailView(context), + child: Obx(() { + final currentEmail = controller.currentEmail; + if (currentEmail != null) { + return Column(children: [ + if (!PlatformInfo.isIOS) + Obx(() => EmailViewAppBarWidget( + key: const Key('email_view_app_bar_widget'), + presentationEmail: currentEmail, + mailboxContain: _getMailboxContain(currentEmail), + isSearchActivated: controller.mailboxDashBoardController.searchController.isSearchEmailRunning, + onBackAction: () => controller.closeEmailView(context), + onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action), + onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(context: context, presentationEmail: presentationEmail, position: position), + optionsWidget: PlatformInfo.isWeb && controller.emailSupervisorController.supportedPageView.isTrue + ? _buildNavigatorPageViewWidgets(context) + : null, + )), + Obx(() { + final vacation = controller.mailboxDashBoardController.vacationResponse.value; + if (vacation?.vacationResponderIsValid == true && + ( + controller.responsiveUtils.isMobile(context) || + controller.responsiveUtils.isTablet(context) || + controller.responsiveUtils.isLandscapeMobile(context) + ) + ) { + return VacationNotificationMessageWidget( + margin: const EdgeInsets.only(left: 12, right: 12, bottom: 5), + vacationResponse: vacation!, + actionGotoVacationSetting: controller.mailboxDashBoardController.goToVacationSetting, + actionEndNow: controller.mailboxDashBoardController.disableVacationResponder + ); + } else { + return const SizedBox.shrink(); + } + }), + Expanded( + child: Obx(() { + if (controller.emailSupervisorController.supportedPageView.isTrue) { + final currentListEmail = controller.emailSupervisorController.currentListEmail; + return PageView.builder( + physics: controller.emailSupervisorController.scrollPhysicsPageView.value, + itemCount: currentListEmail.length, + allowImplicitScrolling: true, + controller: controller.emailSupervisorController.pageController, + onPageChanged: controller.emailSupervisorController.onPageChanged, + itemBuilder: (context, index) { + final currentEmail = currentListEmail[index]; + if (PlatformInfo.isMobile) { + return SingleChildScrollView( + physics : const ClampingScrollPhysics(), + child: Container( + width: double.infinity, + alignment: Alignment.center, + color: Colors.white, + child: Obx(() => _buildEmailMessage( + context: context, + presentationEmail: currentEmail, + calendarEvent: controller.calendarEvent.value, + )) + ) + ); + } else { + return Obx(() { + final calendarEvent = controller.calendarEvent.value; + if (currentEmail.hasCalendarEvent && calendarEvent != null) { + return Padding( + padding: const EdgeInsetsDirectional.symmetric(horizontal: 4), + child: ScrollbarListView( + scrollController: controller.emailContentScrollController, + child: SingleChildScrollView( + physics : const ClampingScrollPhysics(), + controller: controller.emailContentScrollController, + child: Container( + width: double.infinity, + alignment: Alignment.center, + color: Colors.white, + child: _buildEmailMessage( + context: context, + presentationEmail: currentEmail, + calendarEvent: calendarEvent, + emailAddressSender: currentEmail.listEmailAddressSender.getListAddress(), + ) + ) + ), + ), + ); + } else { + return _buildEmailMessage( + context: context, + presentationEmail: currentEmail, + ); + } + }); + } + } + ); + } else { + if (PlatformInfo.isMobile) { + return SingleChildScrollView( + physics : const ClampingScrollPhysics(), + child: Container( + width: double.infinity, + alignment: Alignment.center, + color: Colors.white, + child: Obx(() => _buildEmailMessage( + context: context, + presentationEmail: currentEmail, + calendarEvent: controller.calendarEvent.value, + )) + ) + ); + } else { + return Obx(() { + final calendarEvent = controller.calendarEvent.value; + if (currentEmail.hasCalendarEvent && calendarEvent != null) { + return Padding( + padding: const EdgeInsetsDirectional.symmetric(horizontal: 4), + child: ScrollbarListView( + scrollController: controller.emailContentScrollController, + child: SingleChildScrollView( + physics : const ClampingScrollPhysics(), + controller: controller.emailContentScrollController, + child: Container( + width: double.infinity, + alignment: Alignment.center, + color: Colors.white, + child: _buildEmailMessage( + context: context, + presentationEmail: currentEmail, + calendarEvent: calendarEvent, + emailAddressSender: currentEmail.listEmailAddressSender.getListAddress(), + ) + ) + ), + ), + ); + } else { + return _buildEmailMessage( + context: context, + presentationEmail: currentEmail, + ); + } + }); + } + } + }), + ), + EmailViewBottomBarWidget( + key: const Key('email_view_button_bar'), + presentationEmail: currentEmail, + emailActionCallback: controller.pressEmailAction + ), + ]); + } else { + return const EmailViewEmptyWidget(); + } + }) ) ) ); 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 63d824852..a1d8b7035 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; +import 'package:back_button_interceptor/back_button_interceptor.dart'; import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; @@ -260,6 +261,7 @@ class MailboxDashBoardController extends ReloadableController { @override void onInit() { _registerStreamListener(); + BackButtonInterceptor.add(onBackButtonInterceptor); super.onInit(); } @@ -2084,7 +2086,7 @@ class MailboxDashBoardController extends ReloadableController { void redirectToInboxAction() { log('MailboxDashBoardController::redirectToInboxAction:'); if (dashboardRoute.value == DashboardRoutes.emailDetailed) { - dispatchEmailUIAction(CloseEmailDetailedViewAction()); + dispatchEmailUIAction(CloseEmailDetailedViewToRedirectToTheInboxAction()); } final inboxId = getMailboxIdByRole(PresentationMailbox.roleInbox); @@ -2224,6 +2226,25 @@ class MailboxDashBoardController extends ReloadableController { setSelectedEmail(email.toPresentationEmail()); } + bool onBackButtonInterceptor(bool stopDefaultButtonEvent, RouteInfo routeInfo) { + log('MailboxDashBoardController::onBackButtonInterceptor:stopDefaultButtonEvent: $stopDefaultButtonEvent | routeInfo: ${routeInfo.routeWhenAdded}'); + switch(dashboardRoute.value) { + case DashboardRoutes.emailDetailed: + dispatchEmailUIAction(CloseEmailDetailedViewAction()); + return true; + case DashboardRoutes.thread: + if (searchController.isSearchEmailRunning) { + dispatchMailboxUIAction(SelectMailboxDefaultAction()); + } else { + pushAndPopAll(AppRoutes.home); + } + return true; + default: + break; + } + return false; + } + @override void onClose() { _emailReceiveManager.closeEmailReceiveManagerStream(); @@ -2234,6 +2255,7 @@ class MailboxDashBoardController extends ReloadableController { _refreshActionEventController.close(); _notificationManager.closeStream(); _fcmService.closeStream(); + BackButtonInterceptor.remove(onBackButtonInterceptor); MailboxDashBoardBindings().deleteController(); super.onClose(); } diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 79ea22be4..7afc8ebc0 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -6,8 +6,8 @@ import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; -import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart'; import 'package:tmail_ui_user/features/base/mixin/popup_menu_widget_mixin.dart'; +import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart'; import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart'; @@ -48,136 +48,133 @@ class ThreadView extends GetWidget @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () => controller.backButtonPressedCallbackAction(context), - child: GestureDetector( - onTap: () => FocusManager.instance.primaryFocus?.unfocus(), - child: Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: Colors.white, - body: Portal( - child: Row(children: [ - if (supportVerticalDivider(context)) - const VerticalDivider(color: AppColor.colorDividerVertical, width: 1), - Expanded(child: SafeArea( - right: controller.responsiveUtils.isLandscapeMobile(context), - left: controller.responsiveUtils.isLandscapeMobile(context), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!controller.responsiveUtils.isWebDesktop(context)) - ... [ - Obx(() { - return AppBarThreadWidget( - mailboxSelected: controller.currentMailbox, - listEmailSelected: controller.mailboxDashBoardController.emailsInCurrentMailbox.listEmailSelected, - selectMode: controller.mailboxDashBoardController.currentSelectMode.value, - filterOption: controller.mailboxDashBoardController.filterMessageOption.value, - openMailboxAction: controller.openMailboxLeftMenu, - cancelEditThreadAction: controller.cancelSelectEmail, - editThreadAction: controller.enableSelectionEmail, - emailSelectionAction: (actionType, selectionEmail) { - return controller.pressEmailSelectionAction( + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: Colors.white, + body: Portal( + child: Row(children: [ + if (supportVerticalDivider(context)) + const VerticalDivider(color: AppColor.colorDividerVertical, width: 1), + Expanded(child: SafeArea( + right: controller.responsiveUtils.isLandscapeMobile(context), + left: controller.responsiveUtils.isLandscapeMobile(context), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!controller.responsiveUtils.isWebDesktop(context)) + ... [ + Obx(() { + return AppBarThreadWidget( + mailboxSelected: controller.currentMailbox, + listEmailSelected: controller.mailboxDashBoardController.emailsInCurrentMailbox.listEmailSelected, + selectMode: controller.mailboxDashBoardController.currentSelectMode.value, + filterOption: controller.mailboxDashBoardController.filterMessageOption.value, + openMailboxAction: controller.openMailboxLeftMenu, + cancelEditThreadAction: controller.cancelSelectEmail, + editThreadAction: controller.enableSelectionEmail, + emailSelectionAction: (actionType, selectionEmail) { + return controller.pressEmailSelectionAction( + context, + actionType, + selectionEmail + ); + }, + onContextMenuFilterEmailAction: controller.responsiveUtils.isScreenWithShortestSide(context) + ? (filterOption) => controller.openContextMenuAction( context, - actionType, - selectionEmail - ); - }, - onContextMenuFilterEmailAction: controller.responsiveUtils.isScreenWithShortestSide(context) - ? (filterOption) => controller.openContextMenuAction( + _filterMessagesCupertinoActionTile(context, filterOption) + ) + : null, + onPopupMenuFilterEmailAction: !controller.responsiveUtils.isScreenWithShortestSide(context) + ? (filterOption, position) => controller.openPopupMenuAction( + context, + position, + popupMenuFilterEmailActionTile( context, - _filterMessagesCupertinoActionTile(context, filterOption) + filterOption, + (option) => controller.filterMessagesAction(context, option) ) - : null, - onPopupMenuFilterEmailAction: !controller.responsiveUtils.isScreenWithShortestSide(context) - ? (filterOption, position) => controller.openPopupMenuAction( - context, - position, - popupMenuFilterEmailActionTile( - context, - filterOption, - (option) => controller.filterMessagesAction(context, option) - ) - ) - : null - ); + ) + : null + ); + }), + if (!PlatformInfo.isWeb) + Obx(() { + if (!controller.networkConnectionController.isNetworkConnectionAvailable()) { + return const Padding( + padding: EdgeInsetsDirectional.only(bottom: 8), + child: NetworkConnectionBannerWidget()); + } else { + return const SizedBox.shrink(); + } }), - if (!PlatformInfo.isWeb) - Obx(() { - if (!controller.networkConnectionController.isNetworkConnectionAvailable()) { - return const Padding( - padding: EdgeInsetsDirectional.only(bottom: 8), - child: NetworkConnectionBannerWidget()); - } else { - return const SizedBox.shrink(); - } - }), - _buildSearchBarView(context), - const SpamReportBannerWidget(), - const QuotasBannerWidget(), - _buildVacationNotificationMessage(context), - ], - Obx(() { - if (controller.mailboxDashBoardController.isEmptyTrashBannerEnabledOnMobile(context)) { - return Padding( - padding: const EdgeInsetsDirectional.symmetric( - horizontal: BannerEmptyTrashStyles.mobileMargin - ), - child: BannerEmptyTrashWidget( - onTapAction: () => controller.deleteSelectionEmailsPermanently(context, DeleteActionType.all) - ), - ); - } else { - return const SizedBox.shrink(); - } - }), - Obx(() { - if (controller.mailboxDashBoardController.isEmptySpamBannerEnabledOnMobile(context)) { - return Padding( - padding: const EdgeInsetsDirectional.symmetric( - horizontal: BannerDeleteAllSpamEmailsStyles.mobileMargin - ), - child: BannerDeleteAllSpamEmailsWidget( - onTapAction: () => controller.mailboxDashBoardController.openDialogEmptySpamFolder(context) - ), - ); - } else { - return const SizedBox.shrink(); - } - }), - if (!controller.responsiveUtils.isDesktop(context)) - _buildMarkAsMailboxReadLoading(context), - Obx(() => ThreadViewLoadingBarWidget(viewState: controller.viewState.value)), - Expanded(child: _buildListEmail(context)), - Obx(() => ThreadViewBottomLoadingBarWidget(viewState: controller.viewState.value)), - _buildListButtonSelectionForMobile(context), - ] - ) - )) - ]), - ), - floatingActionButton: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Container( - padding: const EdgeInsetsDirectional.only(end: 4.0), - child: ScrollToTopButtonWidget( - scrollController: controller.listEmailController, - onTap: controller.scrollToTop, - responsiveUtils: controller.responsiveUtils, - icon: SvgPicture.asset( - controller.imagePaths.icArrowUpOutline, - width: ScrollToTopButtonWidgetStyles.iconWidth, - height: ScrollToTopButtonWidgetStyles.iconHeight, - fit: BoxFit.fill, - colorFilter: Colors.white.asFilter(), - ), + _buildSearchBarView(context), + const SpamReportBannerWidget(), + const QuotasBannerWidget(), + _buildVacationNotificationMessage(context), + ], + Obx(() { + if (controller.mailboxDashBoardController.isEmptyTrashBannerEnabledOnMobile(context)) { + return Padding( + padding: const EdgeInsetsDirectional.symmetric( + horizontal: BannerEmptyTrashStyles.mobileMargin + ), + child: BannerEmptyTrashWidget( + onTapAction: () => controller.deleteSelectionEmailsPermanently(context, DeleteActionType.all) + ), + ); + } else { + return const SizedBox.shrink(); + } + }), + Obx(() { + if (controller.mailboxDashBoardController.isEmptySpamBannerEnabledOnMobile(context)) { + return Padding( + padding: const EdgeInsetsDirectional.symmetric( + horizontal: BannerDeleteAllSpamEmailsStyles.mobileMargin + ), + child: BannerDeleteAllSpamEmailsWidget( + onTapAction: () => controller.mailboxDashBoardController.openDialogEmptySpamFolder(context) + ), + ); + } else { + return const SizedBox.shrink(); + } + }), + if (!controller.responsiveUtils.isDesktop(context)) + _buildMarkAsMailboxReadLoading(context), + Obx(() => ThreadViewLoadingBarWidget(viewState: controller.viewState.value)), + Expanded(child: _buildListEmail(context)), + Obx(() => ThreadViewBottomLoadingBarWidget(viewState: controller.viewState.value)), + _buildListButtonSelectionForMobile(context), + ] + ) + )) + ]), + ), + floatingActionButton: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + padding: const EdgeInsetsDirectional.only(end: 4.0), + child: ScrollToTopButtonWidget( + scrollController: controller.listEmailController, + onTap: controller.scrollToTop, + responsiveUtils: controller.responsiveUtils, + icon: SvgPicture.asset( + controller.imagePaths.icArrowUpOutline, + width: ScrollToTopButtonWidgetStyles.iconWidth, + height: ScrollToTopButtonWidgetStyles.iconHeight, + fit: BoxFit.fill, + colorFilter: Colors.white.asFilter(), ), ), - const SizedBox(height: 24), - _buildFloatingButtonCompose(context), - ], - ), + ), + const SizedBox(height: 24), + _buildFloatingButtonCompose(context), + ], ), ), ); diff --git a/pubspec.lock b/pubspec.lock index e1afb1209..95ae92144 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + back_button_interceptor: + dependency: "direct main" + description: + name: back_button_interceptor + sha256: ba7d4f4d801e2f1367db35ecf8870cf954cd2c434a9e6208b10fe527b34eb873 + url: "https://pub.dev" + source: hosted + version: "7.0.0" better_open_file: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index c9d7f44a3..a9442f152 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -223,6 +223,8 @@ dependencies: flutter_image_compress: 2.1.0 + back_button_interceptor: 7.0.0 + dev_dependencies: flutter_test: sdk: flutter