From 8413615e29e5dc356ac2097008349df4a20e7d19 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 20 Sep 2021 16:11:49 +0700 Subject: [PATCH] TF-79 Create popmenu for tablet --- .../views/button/button_builder.dart | 12 ++ .../presentation/destination_picker_view.dart | 21 ++- .../app_bar_destination_picker_builder.dart | 2 +- .../data/datasource/email_datasource.dart | 1 - .../email/data/network/email_api.dart | 1 - .../domain/repository/email_repository.dart | 1 - .../email/presentation/email_bindings.dart | 4 +- .../email/presentation/email_controller.dart | 6 - .../email/presentation/email_view.dart | 5 +- .../widgets/app_bar_mail_widget_builder.dart | 6 +- .../mailbox/presentation/mailbox_view.dart | 22 ++- .../mailbox_button_new_folder_builder.dart | 16 +-- .../widgets/mailbox_folder_tile_builder.dart | 130 +++++++++--------- .../widgets/mailbox_tile_builder.dart | 13 +- .../thread/presentation/thread_bindings.dart | 2 - .../presentation/thread_controller.dart | 65 +++------ .../thread/presentation/thread_view.dart | 45 +++--- ...bar_thread_select_mode_active_builder.dart | 21 ++- .../extensions/list_email_id_extension.dart | 4 + .../presentation_email_extension.dart | 22 --- model/lib/model.dart | 1 - 21 files changed, 177 insertions(+), 223 deletions(-) diff --git a/core/lib/presentation/views/button/button_builder.dart b/core/lib/presentation/views/button/button_builder.dart index 74747961f..2693b7237 100644 --- a/core/lib/presentation/views/button/button_builder.dart +++ b/core/lib/presentation/views/button/button_builder.dart @@ -6,9 +6,11 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_svg/flutter_svg.dart'; typedef OnPressActionClick = void Function(); +typedef OnTapDownActionClick = void Function(TapDownDetails details); class ButtonBuilder { OnPressActionClick? _onPressActionClick; + OnTapDownActionClick? _onTapActionClick; String? _icon; String? _text; @@ -51,6 +53,11 @@ class ButtonBuilder { return this; } + ButtonBuilder onTapActionClick(OnTapDownActionClick onTapActionClick) { + _onTapActionClick = onTapActionClick; + return this; + } + Widget build() { return Container( key: _key, @@ -65,6 +72,11 @@ class ButtonBuilder { _onPressActionClick!(); } }, + onTapDown: (detail) { + if (_onTapActionClick != null) { + _onTapActionClick!(detail); + } + }, ) ) ); diff --git a/lib/features/destination_picker/presentation/destination_picker_view.dart b/lib/features/destination_picker/presentation/destination_picker_view.dart index b3be3a8de..166bebe52 100644 --- a/lib/features/destination_picker/presentation/destination_picker_view.dart +++ b/lib/features/destination_picker/presentation/destination_picker_view.dart @@ -41,7 +41,10 @@ class DestinationPickerView extends GetWidget { child: Column( children: [ _buildAppBar(context), - Expanded(child: _buildBodyDestinationPicker(context)) + Expanded(child: + Container( + color: AppColor.bgMailboxListMail, + child: _buildBodyDestinationPicker(context))) ], ) ) @@ -54,12 +57,9 @@ class DestinationPickerView extends GetWidget { } Widget _buildAppBar(BuildContext context) { - return Padding( - padding: EdgeInsets.only(left: 24, right: 12), - child: (AppBarDestinationPickerBuilder(context, _imagePaths, _responsiveUtils) - ..addCloseActionClick(() => controller.closeDestinationPicker())) - .build() - ); + return (AppBarDestinationPickerBuilder(context, _imagePaths, _responsiveUtils) + ..addCloseActionClick(() => controller.closeDestinationPicker())) + .build(); } Widget _buildBodyDestinationPicker(BuildContext context) { @@ -89,7 +89,8 @@ class DestinationPickerView extends GetWidget { return Obx(() => controller.viewState.value.fold( (failure) => SizedBox.shrink(), (success) => success is LoadingState - ? Center(child: Padding( + ? Center( + child: Padding( padding: EdgeInsets.only(top: 16), child: SizedBox( width: 24, @@ -117,15 +118,13 @@ class DestinationPickerView extends GetWidget { if (success is GetAllMailboxSuccess) { final defaultMailboxList = success.defaultMailboxList; return ListView.builder( - padding: EdgeInsets.only(top: 16, right: 10), + padding: EdgeInsets.only(top: 16, left: 8, right: 10), key: Key('default_mailbox_list'), itemCount: defaultMailboxList.length, shrinkWrap: true, primary: false, itemBuilder: (context, index) => (MailboxTileBuilder( - context, _imagePaths, - _responsiveUtils, defaultMailboxList[index], mailboxDisplayed: MailboxDisplayed.destinationPicker) ..onOpenMailboxAction((mailbox) => diff --git a/lib/features/destination_picker/presentation/widgets/app_bar_destination_picker_builder.dart b/lib/features/destination_picker/presentation/widgets/app_bar_destination_picker_builder.dart index 4b3695224..90bc8c26b 100644 --- a/lib/features/destination_picker/presentation/widgets/app_bar_destination_picker_builder.dart +++ b/lib/features/destination_picker/presentation/widgets/app_bar_destination_picker_builder.dart @@ -23,7 +23,7 @@ class AppBarDestinationPickerBuilder { return Container( key: Key('app_bar_destination_picker'), alignment: Alignment.center, - padding: EdgeInsets.symmetric(vertical: 8), + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 12), color: Colors.white, child: MediaQuery( data: MediaQueryData(padding: EdgeInsets.zero), diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 0f153b558..1ac9922e7 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -30,7 +30,6 @@ abstract class EmailDataSource { Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest); - Future markAsImportant(AccountId accountId, EmailId emailId, ImportantAction importantAction); Future> markAsStar( AccountId accountId, List emails, diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 4e142321a..3439e551e 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -220,7 +220,6 @@ class EmailAPI { }); } - Future markAsImportant(AccountId accountId, EmailId emailId, ImportantAction importantAction) async { Future> markAsStar(AccountId accountId, List emails, MarkStarAction markStarAction) async { final emailIds = emails.map((email) => email.id).toList(); diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 4e6dc860f..fb9ca9f64 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -29,7 +29,6 @@ abstract class EmailRepository { Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest); - Future markAsImportant(AccountId accountId, EmailId emailId, ImportantAction importantAction); Future> markAsStar( AccountId accountId, List emails, diff --git a/lib/features/email/presentation/email_bindings.dart b/lib/features/email/presentation/email_bindings.dart index b5a35d7f5..16fdcd87a 100644 --- a/lib/features/email/presentation/email_bindings.dart +++ b/lib/features/email/presentation/email_bindings.dart @@ -36,7 +36,6 @@ class EmailBindings extends Bindings { Get.find(), Get.find())); Get.lazyPut(() => MoveToMailboxInteractor(Get.find())); - Get.lazyPut(() => MarkAsEmailImportantInteractor(Get.find())); Get.lazyPut(() => MarkAsStarEmailInteractor(Get.find())); Get.put(EmailController( Get.find(), @@ -45,8 +44,7 @@ class EmailBindings extends Bindings { Get.find(), Get.find(), Get.find(), - Get.find())); - Get.find(), + Get.find(), Get.find())); } } \ No newline at end of file diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index 1a2eefbce..47ffbf8cb 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -17,7 +17,6 @@ import 'package:tmail_ui_user/features/email/domain/state/download_attachments_s import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_email_content_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/mark_as_email_important_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/usecases/download_attachments_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; @@ -45,7 +44,6 @@ class EmailController extends BaseController { final AppToast _appToast; final ExportAttachmentInteractor _exportAttachmentInteractor; final MoveToMailboxInteractor _moveToMailboxInteractor; - final MarkAsEmailImportantInteractor _markAsEmailImportantInteractor; final MarkAsStarEmailInteractor _markAsStarEmailInteractor; final emailAddressExpandMode = ExpandMode.COLLAPSE.obs; @@ -61,7 +59,6 @@ class EmailController extends BaseController { this._appToast, this._exportAttachmentInteractor, this._moveToMailboxInteractor, - this._markAsEmailImportantInteractor, this._markAsStarEmailInteractor, ); @@ -119,8 +116,6 @@ class EmailController extends BaseController { _exportAttachmentSuccessAction(success); } else if (success is MoveToMailboxSuccess) { _moveToMailboxSuccess(success); - } else if (success is MarkAsEmailImportantSuccess) { - _markAsEmailImportantSuccess(success); } else if (success is MarkAsStarEmailSuccess) { _markAsEmailStarSuccess(success); } @@ -313,7 +308,6 @@ class EmailController extends BaseController { } } - void markAsEmailImportant(PresentationEmail presentationEmail) async { void markAsStarEmail(PresentationEmail presentationEmail) async { final accountId = mailboxDashBoardController.accountId.value; final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 2076c7f48..3e749e79c 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -58,10 +58,7 @@ class EmailView extends GetView { ..onUnreadEmailActionClick((presentationEmail) => emailController.markAsEmailRead(presentationEmail, ReadActions.markAsUnread)) ..addOnMoveToMailboxActionClick((presentationEmail) => - emailController.openDestinationPickerView(presentationEmail))) - emailController.markAsEmailRead(presentationEmail, ReadActions.markAsUnread)) - ..addOnMarkAsImportantActionClick((presentationEmail) => - emailController.markAsEmailImportant(presentationEmail))) + emailController.openDestinationPickerView(presentationEmail)) ..addOnMarkAsStarActionClick((presentationEmail) => emailController.markAsStarEmail(presentationEmail))) .build())); 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 d6c49c159..aa038d58d 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 @@ -9,14 +9,12 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart'; typedef OnBackActionClick = void Function(); typedef OnUnreadEmailActionClick = void Function(PresentationEmail presentationEmail); typedef OnMoveToMailboxActionClick = void Function(PresentationEmail presentationEmail); -typedef OnMarkAsImportantActionClick = void Function(PresentationEmail presentationEmail); typedef OnMarkAsStarActionClick = void Function(PresentationEmail presentationEmail); class AppBarMailWidgetBuilder { OnBackActionClick? _onBackActionClick; OnUnreadEmailActionClick? _onUnreadEmailActionClick; OnMoveToMailboxActionClick? _onMoveToMailboxActionClick; - OnMarkAsImportantActionClick? _onMarkAsImportantActionClick; OnMarkAsStarActionClick? _markAsStarActionClick; final BuildContext _context; @@ -43,8 +41,6 @@ class AppBarMailWidgetBuilder { _onMoveToMailboxActionClick = onMoveToMailboxActionClick; } - void addOnMarkAsImportantActionClick(OnMarkAsImportantActionClick onMarkAsImportantActionClick) { - _onMarkAsImportantActionClick = onMarkAsImportantActionClick; void addOnMarkAsStarActionClick(OnMarkAsStarActionClick onMarkAsStarActionClick) { _markAsStarActionClick = onMarkAsStarActionClick; } @@ -101,7 +97,7 @@ class AppBarMailWidgetBuilder { ButtonBuilder((_presentationEmail != null && _presentationEmail!.isFlaggedEmail()) ? _imagePaths.icFlagged : _imagePaths.icFlag) - .key(Key('button_mark_as_email_important')) + .key(Key('button_mark_as_star_email')) .onPressActionClick(() { if (_markAsStarActionClick != null && _presentationEmail != null) { _markAsStarActionClick!(_presentationEmail!); diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index b138ef769..41886849a 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -98,7 +98,7 @@ class MailboxView extends GetWidget { Widget _buildSearchFormWidget(BuildContext context) { return Padding( - padding: EdgeInsets.only(top: 16, bottom: 12, left: 16, right: 16), + padding: EdgeInsets.only(top: 16, left: 16, right: 16), child: SearchFormWidgetBuilder(context, imagePaths) .onNewSearchQuery((searchQuery) => {}) .build()); @@ -111,8 +111,8 @@ class MailboxView extends GetWidget { ? Center(child: Padding( padding: EdgeInsets.only(top: 16), child: SizedBox( - width: 30, - height: 30, + width: 24, + height: 24, child: CircularProgressIndicator(color: AppColor.primaryColor)))) : SizedBox.shrink())); } @@ -128,7 +128,7 @@ class MailboxView extends GetWidget { : SizedBox.shrink()), Padding( padding: EdgeInsets.only( - left: responsiveUtils.isMobile(context) ? 40 : 32, + left: 25, top: 20), child: Text( AppLocalizations.of(context).my_folders, @@ -137,12 +137,12 @@ class MailboxView extends GetWidget { ), Padding( padding: EdgeInsets.only( - left: responsiveUtils.isMobile(context) ? 16 : 2, + left: 8, right: 16, top: 10), - child: MailboxNewFolderTileBuilder(context, responsiveUtils) - .addIcon(imagePaths.icMailboxNewFolder) - .addName(AppLocalizations.of(context).new_folder) + child: (MailboxNewFolderTileBuilder() + ..addIcon(imagePaths.icMailboxNewFolder) + ..addName(AppLocalizations.of(context).new_folder)) .build() ), _buildFolderMailbox(context), @@ -159,9 +159,7 @@ class MailboxView extends GetWidget { primary: false, itemBuilder: (context, index) => Obx(() => (MailboxTileBuilder( - context, imagePaths, - responsiveUtils, defaultMailbox[index], selectMode: controller.getSelectMode( defaultMailbox[index], @@ -173,9 +171,9 @@ class MailboxView extends GetWidget { Widget _buildFolderMailbox(BuildContext context) { return Obx(() => controller.folderMailboxNodeList.isNotEmpty ? Transform( - transform: Matrix4.translationValues(responsiveUtils.isMobile(context) ? 0.0 : -15.0, 0.0, 0.0), + transform: Matrix4.translationValues(-4.0, 0.0, 0.0), child: Padding( - padding: EdgeInsets.only(left: 4, right: 16), + padding: EdgeInsets.only(right: 12), child: TreeView( startExpanded: false, key: Key('folder_mailbox_list'), diff --git a/lib/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart index 7b985e774..9f0a4dbe1 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart @@ -9,29 +9,23 @@ typedef OnOpenMailboxNewFolderActionClick = void Function(); class MailboxNewFolderTileBuilder { - final BuildContext _context; - final ResponsiveUtils _responsiveUtils; - String? _icon; String? _name; OnOpenMailboxNewFolderActionClick? _onOpenMailboxFolderActionClick; - MailboxNewFolderTileBuilder(this._context, this._responsiveUtils); + MailboxNewFolderTileBuilder(); - MailboxNewFolderTileBuilder addIcon(String icon) { + void addIcon(String icon) { _icon = icon; - return this; } - MailboxNewFolderTileBuilder addName(String name) { + void addName(String name) { _name = name; - return this; } - MailboxNewFolderTileBuilder onOpenMailboxFolderAction(OnOpenMailboxNewFolderActionClick onOpenMailboxFolderActionClick) { + void onOpenMailboxFolderAction(OnOpenMailboxNewFolderActionClick onOpenMailboxFolderActionClick) { _onOpenMailboxFolderActionClick = onOpenMailboxFolderActionClick; - return this; } Widget build() { @@ -55,7 +49,7 @@ class MailboxNewFolderTileBuilder { } }, leading: Padding( - padding: EdgeInsets.only(left: _responsiveUtils.isMobile(_context) ? 42 : 34), + padding: EdgeInsets.only(left: 34), child: _icon != null ? SvgPicture.asset(_icon!, width: 24, height: 24, color: AppColor.mailboxIconColor, fit: BoxFit.fill) : SizedBox.shrink()), diff --git a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart index 982dee3f6..e702c5478 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -42,72 +42,74 @@ class MailBoxFolderTileBuilder { } Widget build() { - return Container( - key: Key('mailbox_folder_tile'), - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular( mailboxDisplayed == MailboxDisplayed.mailbox ? 16 : 0), - color: mailboxDisplayed == MailboxDisplayed.mailbox - ? selectMode == SelectMode.ACTIVE ? AppColor.mailboxSelectedBackgroundColor : AppColor.mailboxBackgroundColor - : AppColor.bgMailboxListMail - ), - child: MediaQuery( - data: MediaQueryData(padding: EdgeInsets.zero), - child: ListTile( - onTap: () { - if (_onSelectMailboxFolderClick != null) { - _onSelectMailboxFolderClick!(_mailboxNode); - } - }, - contentPadding: EdgeInsets.zero, - leading: Padding( - padding: EdgeInsets.only(left: mailboxDisplayed == MailboxDisplayed.mailbox - ? _responsiveUtils.isMobile(_context) ? 40 : 34 - : 34), - child: SvgPicture.asset( - _imagePaths.icMailboxFolder, - width: 24, - height: 24, - color: selectMode == SelectMode.ACTIVE - ? AppColor.mailboxSelectedIconColor - : AppColor.mailboxIconColor, - fit: BoxFit.fill)), - title: Padding( - padding: EdgeInsets.only(left: 8), - child: Text( - _mailboxNode.item.name!.name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 15, + return Theme( + data: ThemeData( + splashColor: Colors.transparent, + highlightColor: Colors.transparent), + child: Container( + key: Key('mailbox_folder_tile'), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( mailboxDisplayed == MailboxDisplayed.mailbox ? 16 : 0), + color: mailboxDisplayed == MailboxDisplayed.mailbox + ? selectMode == SelectMode.ACTIVE ? AppColor.mailboxSelectedBackgroundColor : AppColor.mailboxBackgroundColor + : AppColor.bgMailboxListMail + ), + child: MediaQuery( + data: MediaQueryData(padding: EdgeInsets.zero), + child: ListTile( + onTap: () { + if (_onSelectMailboxFolderClick != null) { + _onSelectMailboxFolderClick!(_mailboxNode); + } + }, + contentPadding: EdgeInsets.zero, + leading: Padding( + padding: EdgeInsets.only(left: 26), + child: SvgPicture.asset( + _imagePaths.icMailboxFolder, + width: 24, + height: 24, color: selectMode == SelectMode.ACTIVE - ? AppColor.mailboxSelectedTextColor - : AppColor.mailboxTextColor, - fontWeight: mailboxDisplayed == MailboxDisplayed.mailbox ? FontWeight.bold : FontWeight.w500), - )), - trailing: Padding( - padding: EdgeInsets.only( - right: mailboxDisplayed == MailboxDisplayed.mailbox - ? _responsiveUtils.isMobile(_context) ? 36 : 8 - : 36, - left: mailboxDisplayed == MailboxDisplayed.mailbox ? 16 : 16), - child: _mailboxNode.hasChildren() - ? GestureDetector( - onTap: () { - if (_onExpandFolderActionClick != null) { - _onExpandFolderActionClick!(_mailboxNode); + ? AppColor.mailboxSelectedIconColor + : AppColor.mailboxIconColor, + fit: BoxFit.fill)), + title: Padding( + padding: EdgeInsets.only(left: 8), + child: Text( + _mailboxNode.item.name!.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 15, + color: selectMode == SelectMode.ACTIVE + ? AppColor.mailboxSelectedTextColor + : AppColor.mailboxTextColor, + fontWeight: mailboxDisplayed == MailboxDisplayed.mailbox ? FontWeight.bold : FontWeight.w500), + )), + trailing: Padding( + padding: EdgeInsets.only( + right: mailboxDisplayed == MailboxDisplayed.mailbox + ? _responsiveUtils.isMobile(_context) ? 0 : 8 + : 0, + left: 16), + child: _mailboxNode.hasChildren() + ? IconButton( + color: AppColor.primaryColor, + icon: SvgPicture.asset( + _mailboxNode.expandMode == ExpandMode.EXPAND ? _imagePaths.icExpandFolder : _imagePaths.icFolderArrow, + color: selectMode == SelectMode.ACTIVE + ? AppColor.mailboxSelectedIconColor + : AppColor.mailboxIconColor, + fit: BoxFit.fill), + onPressed: () { + if (_onExpandFolderActionClick != null) { + _onExpandFolderActionClick!(_mailboxNode); + } } - }, - child: SvgPicture.asset( - _mailboxNode.expandMode == ExpandMode.EXPAND ? _imagePaths.icExpandFolder : _imagePaths.icFolderArrow, - width: _mailboxNode.expandMode == ExpandMode.EXPAND ? 8 : 12, - height: _mailboxNode.expandMode == ExpandMode.EXPAND ? 8 : 12, - color: selectMode == SelectMode.ACTIVE - ? AppColor.mailboxSelectedIconColor - : AppColor.mailboxIconColor, - fit: BoxFit.fill), - ) - : SizedBox.shrink()) + ) + : SizedBox.shrink()) + ) ) ) ); diff --git a/lib/features/mailbox/presentation/widgets/mailbox_tile_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_tile_builder.dart index a840e6b09..25fb3593d 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_tile_builder.dart @@ -14,17 +14,13 @@ class MailboxTileBuilder { final PresentationMailbox _presentationMailbox; final SelectMode selectMode; - final BuildContext _context; final ImagePaths _imagePaths; - final ResponsiveUtils _responsiveUtils; final MailboxDisplayed mailboxDisplayed; OnOpenMailboxActionClick? _onOpenMailboxActionClick; MailboxTileBuilder( - this._context, this._imagePaths, - this._responsiveUtils, this._presentationMailbox, { this.selectMode = SelectMode.INACTIVE, @@ -53,8 +49,6 @@ class MailboxTileBuilder { child: MediaQuery( data: MediaQueryData(padding: EdgeInsets.zero), child: ListTile( - focusColor: AppColor.primaryLightColor, - hoverColor: AppColor.primaryLightColor, contentPadding: EdgeInsets.zero, onTap: () => { if (_onOpenMailboxActionClick != null) { @@ -62,10 +56,7 @@ class MailboxTileBuilder { } }, leading: Padding( - padding: EdgeInsets.only(left: mailboxDisplayed == MailboxDisplayed.mailbox - ? _responsiveUtils.isMobile(_context) ? 40 : 20 - : 40 - ), + padding: EdgeInsets.only(left: 24), child: SvgPicture.asset( '${_presentationMailbox.getMailboxIcon(_imagePaths)}', width: 24, @@ -89,7 +80,7 @@ class MailboxTileBuilder { )), trailing: mailboxDisplayed == MailboxDisplayed.mailbox ? Padding( - padding: EdgeInsets.only(right: _responsiveUtils.isMobile(_context) ? 36 : 24, left: 16), + padding: EdgeInsets.only(right: 24, left: 16), child: Text( '${_presentationMailbox.getCountUnReadEmails()}', maxLines: 1, diff --git a/lib/features/thread/presentation/thread_bindings.dart b/lib/features/thread/presentation/thread_bindings.dart index fd00c0003..8fe608c9e 100644 --- a/lib/features/thread/presentation/thread_bindings.dart +++ b/lib/features/thread/presentation/thread_bindings.dart @@ -38,7 +38,6 @@ class ThreadBindings extends Bindings { Get.lazyPut(() => MarkAsMultipleEmailReadInteractor(Get.find())); Get.lazyPut(() => MoveToMailboxInteractor(Get.find())); Get.lazyPut(() => MoveMultipleEmailToMailboxInteractor(Get.find())); - Get.lazyPut(() => MarkAsMultipleEmailReadInteractor(Get.find())); Get.lazyPut(() => MarkAsStarEmailInteractor(Get.find())); Get.lazyPut(() => MarkAsStarMultipleEmailInteractor(Get.find())); Get.put(ThreadController( @@ -48,7 +47,6 @@ class ThreadBindings extends Bindings { Get.find(), Get.find(), Get.find(), - Get.find(), Get.find(), Get.find(), )); diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index cc6e9dee5..e0155c56b 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -8,6 +8,7 @@ import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; 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/email/email_comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart'; @@ -16,11 +17,9 @@ import 'package:model/model.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/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_important_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/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_important_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; @@ -47,7 +46,6 @@ class ThreadController extends BaseController { final ResponsiveUtils responsiveUtils; final ScrollController listEmailController; final MoveMultipleEmailToMailboxInteractor _moveMultipleEmailToMailboxInteractor; - final MarkAsEmailImportantInteractor _markAsEmailImportantInteractor; final MarkAsStarEmailInteractor _markAsStarEmailInteractor; final MarkAsStarMultipleEmailInteractor _markAsStarMultipleEmailInteractor; @@ -71,7 +69,6 @@ class ThreadController extends BaseController { this._markAsMultipleEmailReadInteractor, this._appToast, this._moveMultipleEmailToMailboxInteractor, - this._markAsEmailImportantInteractor, this._markAsStarEmailInteractor, this._markAsStarMultipleEmailInteractor, ); @@ -102,23 +99,9 @@ class ThreadController extends BaseController { } else if (success is MoveToMailboxSuccess) { _refreshListEmail(); mailboxDashBoardController.clearState(); - } - }); - } else { - mailboxDashBoardController.viewState.value.map((success) { - if (success is MarkAsEmailReadSuccess || - success is MarkAsMultipleEmailReadAllSuccess || - success is MarkAsMultipleEmailReadHasSomeEmailFailure) { - _refreshListEmail(); - } - }); - } - }); - - mailboxDashBoardController.viewState.listen((state) { - state.map((success) { - if (success is MarkAsStarEmailSuccess) { + } else if (success is MarkAsStarEmailSuccess) { _refreshListEmail(); + mailboxDashBoardController.clearState(); } }); }); @@ -155,8 +138,6 @@ class ThreadController extends BaseController { } else if (success is MoveMultipleEmailToMailboxAllSuccess || success is MoveMultipleEmailToMailboxHasSomeEmailFailure) { _moveSelectedMultipleEmailToMailboxSuccess(success); - } else if (success is MarkAsEmailImportantSuccess) { - _markAsEmailImportantSuccess(success); } else if (success is MarkAsStarEmailSuccess) { _markAsStarEmailSuccess(success); } else if (success is MarkAsStarMultipleEmailAllSuccess @@ -173,27 +154,14 @@ class ThreadController extends BaseController { void _getAllEmailSuccess(Success success) { if (success is GetAllEmailSuccess) { - emailList.addAll(success.emailList); + if (loadMoreState.value == LoadMoreState.LOADING) { + emailList.addAll(success.emailList); + } else { + emailList.value = success.emailList; + } + lastGetTotal = emailList.length; loadMoreState.value = success.emailList.isEmpty ? LoadMoreState.COMPLETED : LoadMoreState.IDLE; - - mailboxDashBoardController.viewState.value.map((success) { - if (success is MarkAsStarEmailSuccess) { - _updateValueCurrentEmail(); - mailboxDashBoardController.clearState(); - } - }); - } - } - - void _updateValueCurrentEmail() { - if (mailboxDashBoardController.selectedEmail.value != null) { - try { - final newSelectedEmail = emailList.firstWhere( - (email) => email.id == mailboxDashBoardController.selectedEmail.value!.id, - orElse: null); - mailboxDashBoardController.setSelectedEmail(newSelectedEmail); - } catch(e){} } } @@ -237,7 +205,6 @@ class ThreadController extends BaseController { loadMoreState.value = LoadMoreState.IDLE; positionCurrent = 0; dispatchState(Right(LoadingState())); - emailList.value = []; final accountId = mailboxDashBoardController.accountId.value; @@ -311,7 +278,6 @@ class ThreadController extends BaseController { final newLimit = emailList.isNotEmpty ? UnsignedInt(emailList.length) : ThreadConstants.defaultLimit; loadMoreState.value = LoadMoreState.IDLE; dispatchState(Right(LoadingState())); - emailList.value = []; final accountId = mailboxDashBoardController.accountId.value; @@ -331,7 +297,7 @@ class ThreadController extends BaseController { popBack(); } - final readAction = isEmailAllRead(listPresentationEmail) ? ReadActions.markAsUnread : ReadActions.markAsRead; + final readAction = isAllEmailRead(listPresentationEmail) ? ReadActions.markAsUnread : ReadActions.markAsRead; final accountId = mailboxDashBoardController.accountId.value; final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; @@ -459,7 +425,16 @@ class ThreadController extends BaseController { } } - void markAsEmailImportant(PresentationEmail presentationEmail) { + void openPopupMenuSelectedEmail(BuildContext context, RelativeRect position, List popupMenuItems) async { + await showMenu( + context: context, + position: position, + color: Colors.white, + elevation: 5, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + items: popupMenuItems); + } + void markAsStarEmail(PresentationEmail presentationEmail) { final accountId = mailboxDashBoardController.accountId.value; final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 7bf1e95d3..9add01ab4 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -73,13 +73,17 @@ class ThreadView extends GetWidget { return Obx(() => Padding( padding: EdgeInsets.only(left: 15, right: 12), child: (AppBarThreadSelectModeActiveBuilder( - context, - imagePaths, - controller.getListEmailSelected()) + context, + imagePaths, + controller.getListEmailSelected(), + responsiveUtils) ..addCloseActionClick(() => controller.cancelSelectEmail()) ..addRemoveEmailActionClick((listEmail) => {}) ..addOnMarkAsEmailReadActionClick((listEmail) => controller.markAsSelectedEmailRead(listEmail)) - ..addOpenContextMenuActionClick((listEmail) => controller.openContextMenuSelectedEmail(context, _contextMenuEmailActionTile(context, listEmail)))) + ..addOpenContextMenuActionClick((listEmail) => + controller.openContextMenuSelectedEmail(context, _contextMenuEmailActionTile(context, listEmail))) + ..addOnOpenPopupMenuActionClick((listEmail, position) => + controller.openPopupMenuSelectedEmail(context, position, _popupMenuEmailActionTile(context, listEmail)))) .build())); } @@ -114,9 +118,6 @@ class ThreadView extends GetWidget { listEmail) ..onActionClick((data) => {})) .build(); - AppLocalizations.of(context).move_to_trash, listEmail) - ..onActionClick((data) => {})) - .build(); } Widget _moveToMailboxAction(BuildContext context, List listEmail) { @@ -133,12 +134,6 @@ class ThreadView extends GetWidget { final markStarAction = controller.isAllEmailMarkAsStar(listEmail) ? MarkStarAction.unMarkStar : MarkStarAction.markStar; return (EmailContextMenuActionBuilder( - Key('mark_as_flag_context_menu_action'), - SvgPicture.asset(imagePaths.icFlag, width: 24, height: 24, fit: BoxFit.fill), - AppLocalizations.of(context).mark_as_flag, - listEmail) - ..onActionClick((data) => {})) - .build(); Key('mark_as_star_context_menu_action'), SvgPicture.asset( markStarAction == MarkStarAction.markStar ? imagePaths.icFlag : imagePaths.icFlagged, @@ -161,9 +156,16 @@ class ThreadView extends GetWidget { listEmail) ..onActionClick((data) => {})) .build(); - AppLocalizations.of(context).move_to_spam, listEmail) - ..onActionClick((data) => {})) - .build(); + } + + List _popupMenuEmailActionTile(BuildContext context, List listEmail) { + return [ + PopupMenuItem(child: _moveToTrashAction(context, listEmail)), + PopupMenuItem(child: _moveToMailboxAction(context, listEmail)), + PopupMenuItem(child: _markAsReadAction(context, listEmail)), + PopupMenuItem(child: _markAsStarAction(context, listEmail)), + PopupMenuItem(child: _moveToSpamAction(context, listEmail)), + ]; } Widget _buildLoadingView() { @@ -173,8 +175,8 @@ class ThreadView extends GetWidget { ? Center(child: Padding( padding: EdgeInsets.only(top: 16, bottom: 16), child: SizedBox( - width: 30, - height: 30, + width: 24, + height: 24, child: CircularProgressIndicator(color: AppColor.primaryColor)))) : SizedBox.shrink())); } @@ -184,8 +186,8 @@ class ThreadView extends GetWidget { ? Center(child: Padding( padding: EdgeInsets.only(top: 16, bottom: 16), child: SizedBox( - width: 30, - height: 30, + width: 24, + height: 24, child: CircularProgressIndicator(color: AppColor.primaryColor)))) : SizedBox.shrink()); } @@ -237,7 +239,8 @@ class ThreadView extends GetWidget { responsiveUtils, controller.currentSelectMode.value) ..onOpenEmailAction((selectedEmail) => controller.previewEmail(context, selectedEmail)) - ..onSelectEmailAction((selectedEmail) => controller.selectEmail(context, selectedEmail))) + ..onSelectEmailAction((selectedEmail) => controller.selectEmail(context, selectedEmail)) + ..addOnMarkAsStarEmailActionClick((selectedEmail) => controller.markAsStarEmail(selectedEmail))) .build()), )); } diff --git a/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart b/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart index 2cb4d8274..79da0ac92 100644 --- a/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart +++ b/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart @@ -9,18 +9,21 @@ typedef OnCloseActionClick = void Function(); typedef OnMarkAsEmailReadActionClick = void Function(List listEmail); typedef OnRemoveEmailActionClick = void Function(List listEmail); typedef OnOpenContextMenuActionClick = void Function(List listEmail); +typedef OnOpenPopupMenuActionClick = void Function(List listEmail, RelativeRect position); class AppBarThreadSelectModeActiveBuilder { OnCloseActionClick? _onCloseActionClick; OnMarkAsEmailReadActionClick? _onMarkAsEmailReadActionClick; OnRemoveEmailActionClick? _onRemoveEmailActionClick; OnOpenContextMenuActionClick? _onOpenContextMenuActionClick; + OnOpenPopupMenuActionClick? _onOpenPopupMenuActionClick; final BuildContext _context; final ImagePaths _imagePaths; final List _listEmail; + final ResponsiveUtils _responsiveUtils; - AppBarThreadSelectModeActiveBuilder(this._context, this._imagePaths, this._listEmail); + AppBarThreadSelectModeActiveBuilder(this._context, this._imagePaths, this._listEmail, this._responsiveUtils); void addCloseActionClick(OnCloseActionClick onCloseActionClick) { _onCloseActionClick = onCloseActionClick; @@ -38,6 +41,10 @@ class AppBarThreadSelectModeActiveBuilder { _onOpenContextMenuActionClick = onOpenContextMenuActionClick; } + void addOnOpenPopupMenuActionClick(OnOpenPopupMenuActionClick onOpenPopupMenuActionClick) { + _onOpenPopupMenuActionClick = onOpenPopupMenuActionClick; + } + Widget build() { return Container( key: Key('app_bar_thread_select_mode_active'), @@ -104,6 +111,18 @@ class AppBarThreadSelectModeActiveBuilder { if (_onOpenContextMenuActionClick != null) { _onOpenContextMenuActionClick!(_listEmail); }}) + .onTapActionClick((details) { + if (_onOpenPopupMenuActionClick != null && !_responsiveUtils.isMobile(_context)) { + final screenSize = MediaQuery.of(_context).size; + final offset = details.globalPosition; + final position = RelativeRect.fromLTRB( + offset.dx, + offset.dy, + screenSize.width - offset.dx, + screenSize.height - offset.dy, + ); + _onOpenPopupMenuActionClick!(_listEmail, position); + }}) .build(), ] ); diff --git a/model/lib/extensions/list_email_id_extension.dart b/model/lib/extensions/list_email_id_extension.dart index 7bcf76acc..cbfd18d06 100644 --- a/model/lib/extensions/list_email_id_extension.dart +++ b/model/lib/extensions/list_email_id_extension.dart @@ -21,6 +21,10 @@ extension ListEmailIdExtension on List { final Map maps = {}; forEach((emailId) { maps[emailId.id] = currentMailboxId.generateMoveToMailboxActionPath(destinationMailboxId); + }); + return maps; + } + Map generateMapUpdateObjectMarkAsStar(MarkStarAction markStarAction) { final Map maps = {}; forEach((emailId) { diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart index 3c7e8bd6f..1c8410122 100644 --- a/model/lib/extensions/presentation_email_extension.dart +++ b/model/lib/extensions/presentation_email_extension.dart @@ -1,7 +1,5 @@ import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; -import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; -import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; extension PresentationEmailExtension on PresentationEmail { @@ -17,11 +15,9 @@ extension PresentationEmailExtension on PresentationEmail { } PresentationEmail toggleSelect() { - PresentationEmail toUpdatedPresentationEmail({Map? newKeywords}) { return PresentationEmail( id, keywords: keywords, - keywords: newKeywords ?? keywords, size: size, receivedAt: receivedAt, hasAttachment: hasAttachment, @@ -73,22 +69,4 @@ extension PresentationEmailExtension on PresentationEmail { replyTo: replyTo ); } - - Email toEmail() { - return Email( - id, - keywords: keywords, - size: size, - receivedAt: receivedAt, - hasAttachment: hasAttachment, - preview: preview, - subject: subject, - sentAt: sentAt, - from: from, - to: to, - cc: cc, - bcc: bcc, - replyTo: replyTo - ); - } } \ No newline at end of file diff --git a/model/lib/model.dart b/model/lib/model.dart index b23876e85..dd99340ca 100644 --- a/model/lib/model.dart +++ b/model/lib/model.dart @@ -25,7 +25,6 @@ export 'email/email_address_cache.dart'; export 'email/read_actions.dart'; export 'email/attachment.dart'; export 'email/move_action.dart'; -export 'email/important_action.dart'; export 'email/mark_star_action.dart'; // Extensions