TF-78 Create action bar and context menu when multiple selected email
This commit is contained in:
@@ -2,6 +2,7 @@ import 'package:core/core.dart';
|
||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
||||
@@ -21,7 +22,9 @@ import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/load_more_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_context_menu_action_builder.dart';
|
||||
import 'package:tmail_ui_user/main/actions/email_action.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
|
||||
@@ -30,6 +33,7 @@ class ThreadController extends BaseController {
|
||||
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
||||
final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor;
|
||||
final ResponsiveUtils responsiveUtils;
|
||||
final ScrollController listEmailController;
|
||||
|
||||
final _properties = Properties({
|
||||
'id', 'subject', 'from', 'to', 'cc', 'bcc', 'keywords', 'receivedAt',
|
||||
@@ -38,6 +42,7 @@ class ThreadController extends BaseController {
|
||||
|
||||
final emailList = <PresentationEmail>[].obs;
|
||||
final loadMoreState = LoadMoreState.IDLE.obs;
|
||||
final currentSelectMode = SelectMode.INACTIVE.obs;
|
||||
|
||||
int positionCurrent = 0;
|
||||
int lastGetTotal = 0;
|
||||
@@ -45,7 +50,8 @@ class ThreadController extends BaseController {
|
||||
|
||||
ThreadController(
|
||||
this.responsiveUtils,
|
||||
this._getEmailsInMailboxInteractor
|
||||
this._getEmailsInMailboxInteractor,
|
||||
this.listEmailController,
|
||||
);
|
||||
|
||||
@override
|
||||
@@ -66,8 +72,9 @@ class ThreadController extends BaseController {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
mailboxDashBoardController.selectedMailbox.close();
|
||||
listEmailController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -175,13 +182,35 @@ class ThreadController extends BaseController {
|
||||
: SelectMode.INACTIVE;
|
||||
}
|
||||
|
||||
void selectEmail(BuildContext context, PresentationEmail presentationEmailSelected) {
|
||||
void previewEmail(BuildContext context, PresentationEmail presentationEmailSelected) {
|
||||
mailboxDashBoardController.setSelectedEmail(presentationEmailSelected);
|
||||
if (!responsiveUtils.isDesktop(context)) {
|
||||
goToEmail(context);
|
||||
}
|
||||
}
|
||||
|
||||
void selectEmail(BuildContext context, PresentationEmail presentationEmailSelected) {
|
||||
emailList.value = emailList.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email).toList();
|
||||
if (_isUnSelectedAll()) {
|
||||
currentSelectMode.value = SelectMode.INACTIVE;
|
||||
} else {
|
||||
if (currentSelectMode.value == SelectMode.INACTIVE) {
|
||||
currentSelectMode.value = SelectMode.ACTIVE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<PresentationEmail> getListEmailSelected() => emailList.where((email) => email.selectMode == SelectMode.ACTIVE).toList();
|
||||
|
||||
bool _isUnSelectedAll() => emailList.every((email) => email.selectMode == SelectMode.INACTIVE);
|
||||
|
||||
bool _isEmailAllRead(List<PresentationEmail> listEmail) => listEmail.every((email) => !email.isUnReadEmail());
|
||||
|
||||
void cancelSelectEmail() {
|
||||
emailList.value = emailList.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE)).toList();
|
||||
currentSelectMode.value = SelectMode.INACTIVE;
|
||||
}
|
||||
|
||||
void _updateStateUnReadEmail(EmailId emailId, {required bool unRead}) {
|
||||
final newEmailList = emailList
|
||||
.map((email) => email.id == emailId ? email.markAsReadPresentationEmail(unRead: unRead) : email)
|
||||
@@ -189,6 +218,73 @@ class ThreadController extends BaseController {
|
||||
emailList.value = newEmailList;
|
||||
}
|
||||
|
||||
void unreadSelectedEmail(List<PresentationEmail> listEmail) {
|
||||
popBack();
|
||||
}
|
||||
|
||||
void openContextMenuSelectedEmail(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
||||
(ContextMenuBuilder(context)
|
||||
..addTiles(_contextMenuActionList(context, imagePaths, listEmail)))
|
||||
.build();
|
||||
}
|
||||
|
||||
List<Widget> _contextMenuActionList(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
||||
return [
|
||||
_moveToTrashAction(context, imagePaths, listEmail),
|
||||
_moveToMailboxAction(context, imagePaths, listEmail),
|
||||
_markAsSeenAction(context, imagePaths, listEmail),
|
||||
_markAsFlagAction(context, imagePaths, listEmail),
|
||||
_moveToSpamAction(context, imagePaths, listEmail),
|
||||
SizedBox(height: 40),
|
||||
];
|
||||
}
|
||||
|
||||
Widget _markAsSeenAction(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('mark_as_seen_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icEyeDisable, width: 24, height: 24, fit: BoxFit.fill),
|
||||
_isEmailAllRead(listEmail) ? AppLocalizations.of(context).mark_as_unread : AppLocalizations.of(context).mark_as_read,
|
||||
listEmail)
|
||||
..onActionClick((data) => unreadSelectedEmail(data)))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _moveToTrashAction(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('move_to_trash_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icTrash, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_trash, listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _moveToMailboxAction(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('move_to_mailbox_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icFolder, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_mailbox, listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _markAsFlagAction(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
||||
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();
|
||||
}
|
||||
|
||||
Widget _moveToSpamAction(BuildContext context, ImagePaths imagePaths, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('move_to_spam_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icMailboxSpam, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_spam, listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
bool canComposeEmail() => mailboxDashBoardController.sessionCurrent != null
|
||||
&& mailboxDashBoardController.userProfile.value != null
|
||||
&& mailboxDashBoardController.mapMailboxId.containsKey(PresentationMailbox.roleOutbox);
|
||||
|
||||
Reference in New Issue
Block a user