tf-1946 add swipe to thread

tf-1946 add swipe to thread

tf-1946 fix duplicate import and change MarkReadAction

(cherry picked from commit 3fa17e200b972c3dd81ae297f19fd7b736f3845a)
This commit is contained in:
hieubt
2023-08-28 10:21:56 +07:00
committed by Dat Vu
parent 20c95caf0e
commit 852599856d
11 changed files with 160 additions and 27 deletions
@@ -19,6 +19,7 @@ import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.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/presentation/model/composer_arguments.dart';
@@ -233,8 +234,8 @@ mixin EmailActionController {
mailboxDashBoardController.deleteEmailPermanently(email);
}
void markAsEmailRead(PresentationEmail presentationEmail, ReadActions readActions) async {
mailboxDashBoardController.markAsEmailRead(presentationEmail, readActions);
void markAsEmailRead(PresentationEmail presentationEmail, ReadActions readActions, MarkReadAction markReadAction) async {
mailboxDashBoardController.markAsEmailRead(presentationEmail, readActions, markReadAction);
}
void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction action) {
@@ -24,6 +24,7 @@ import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
@@ -882,10 +883,10 @@ class ThreadController extends BaseController with EmailActionController {
selectEmail(context, selectedEmail);
break;
case EmailActionType.markAsRead:
markAsEmailRead(selectedEmail, ReadActions.markAsRead);
markAsEmailRead(selectedEmail, ReadActions.markAsRead, MarkReadAction.tap);
break;
case EmailActionType.markAsUnread:
markAsEmailRead(selectedEmail, ReadActions.markAsUnread);
markAsEmailRead(selectedEmail, ReadActions.markAsUnread, MarkReadAction.tap);
break;
case EmailActionType.markAsStarred:
markAsStarEmail(selectedEmail, MarkStarAction.markStar);
@@ -1064,4 +1065,24 @@ class ThreadController extends BaseController with EmailActionController {
);
}
}
Future<bool> swipeEmailAction(BuildContext context, PresentationEmail email, DismissDirection direction) async {
if (direction == DismissDirection.startToEnd) {
ReadActions readActions = !email.hasRead ? ReadActions.markAsRead : ReadActions.markAsUnread;
markAsEmailRead(email, readActions, MarkReadAction.swipeOnThread);
}
return false;
}
DismissDirection getSwipeDirection (bool isWebDesktop, SelectMode selectMode) {
if (isWebDesktop) {
return DismissDirection.none;
}
if (selectMode == SelectMode.ACTIVE) {
return DismissDirection.none;
}
return DismissDirection.horizontal;
}
}
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart';
import 'package:flutter_svg/flutter_svg.dart';
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';
@@ -388,18 +389,60 @@ class ThreadView extends GetWidget<ThreadController>
final isShowingEmailContent = controller.mailboxDashBoardController.selectedEmail.value?.id == presentationEmail.id;
final selectModeAll = controller.mailboxDashBoardController.currentSelectMode.value;
return (EmailTileBuilder(
context,
presentationEmail,
selectModeAll,
controller.searchQuery,
isShowingEmailContent,
mailboxContain: presentationEmail.mailboxContain,
isSearchEmailRunning: controller.searchController.isSearchEmailRunning
)
..addOnPressEmailActionClick((action, email) => _handleEmailActionClicked(context, email, action))
..addOnMoreActionClick((email, position) => _handleEmailContextMenuAction(context, email, position))
).build();
return Dismissible(
key: ValueKey<EmailId?>(presentationEmail.id),
direction: controller.getSwipeDirection(_responsiveUtils.isWebDesktop(context), selectModeAll),
background: Container(
color: AppColor.colorItemRecipientSelected,
child: Padding(
padding: const EdgeInsetsDirectional.only(start: 16),
child: Align(
alignment: AlignmentDirectional.centerStart,
child: Row(
children: [
CircleAvatar(
backgroundColor: AppColor.colorSpamReportBannerBackground,
radius: 24,
child: !presentationEmail.hasRead
? SvgPicture.asset(
_imagePaths.icMarkAsRead,
fit: BoxFit.fill,
)
: SvgPicture.asset(
_imagePaths.icUnreadEmail,
fit: BoxFit.fill,
colorFilter: AppColor.primaryColor.asFilter(),
),
),
const SizedBox(width: 11),
Text(
!presentationEmail.hasRead
? AppLocalizations.of(context).mark_as_read
: AppLocalizations.of(context).mark_as_unread,
style: const TextStyle(
fontSize: 15,
color: AppColor.primaryColor,
),
),
],
),
),
),
),
confirmDismiss: (direction) => controller.swipeEmailAction(context, presentationEmail, direction),
child: (EmailTileBuilder(
context,
presentationEmail,
selectModeAll,
controller.searchQuery,
isShowingEmailContent,
mailboxContain: presentationEmail.mailboxContain,
isSearchEmailRunning: controller.searchController.isSearchEmailRunning
)
..addOnPressEmailActionClick((action, email) => _handleEmailActionClicked(context, email, action))
..addOnMoreActionClick((email, position) => _handleEmailContextMenuAction(context, email, position))
).build(),
);
}
void _handleEmailActionClicked(