TF-421 Support delete permanently selection email in mailbox Draft

This commit is contained in:
dab246
2022-09-08 15:51:53 +07:00
committed by Dat H. Pham
parent 811b29e353
commit e1c8439fe4
9 changed files with 70 additions and 24 deletions
@@ -139,6 +139,7 @@ extension AppColor on Color {
static const colorDividerRuleFilter = Color(0xFFE7E8EC);
static const colorIconTextField = Color(0xFFB8C1CC);
static const colorVacationNotificationMessageBackground = Color(0x2999A2AD);
static const colorDeletePermanentlyButton = Color(0xffE64646);
static const mapGradientColor = [
[Color(0xFF21D4FD), Color(0xFFB721FF)],
@@ -2,6 +2,14 @@ import 'package:core/core.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class StartDeleteEmailPermanently extends UIState {
StartDeleteEmailPermanently();
@override
List<Object?> get props => [];
}
class DeleteEmailPermanentlySuccess extends UIActionState {
DeleteEmailPermanentlySuccess({
@@ -14,6 +14,8 @@ class DeleteEmailPermanentlyInteractor {
Stream<Either<Failure, Success>> execute(AccountId accountId, EmailId emailId) async* {
try {
yield Right<Failure, Success>(StartDeleteEmailPermanently());
final listState = await Future.wait([
_mailboxRepository.getMailboxState(),
_emailRepository.getEmailState(),
@@ -421,12 +421,17 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
}
}),
Obx(() => buildIconWeb(
icon: SvgPicture.asset(imagePaths.icDelete, fit: BoxFit.fill),
tooltip: controller.selectedMailbox.value?.isTrash == true
icon: SvgPicture.asset(
canDeletePermanently ? imagePaths.icDeleteComposer : imagePaths.icDelete,
color: canDeletePermanently ? AppColor.colorDeletePermanentlyButton : AppColor.primaryColor,
width: 20,
height: 20,
fit: BoxFit.fill),
tooltip: canDeletePermanently
? AppLocalizations.of(context).delete_permanently
: AppLocalizations.of(context).move_to_trash,
onTap: () {
if (controller.selectedMailbox.value?.isTrash == true) {
if (canDeletePermanently) {
return controller.dispatchAction(HandleEmailActionTypeAction(context,
controller.listEmailSelected,
EmailActionType.deletePermanently));
@@ -439,6 +444,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
]);
}
bool get canDeletePermanently {
return controller.selectedMailbox.value?.isTrash == true ||
controller.selectedMailbox.value?.isDrafts == true;
}
Widget _buildSearchForm(BuildContext context) {
return Row(
children: [
@@ -21,12 +21,14 @@ extension DeleteActionTypeExtension on DeleteActionType {
}
}
String getContentDialog(BuildContext context, {int? count}) {
String getContentDialog(BuildContext context, {int? count, String? mailboxName}) {
switch(this) {
case DeleteActionType.all:
return AppLocalizations.of(context).empty_trash_dialog_message;
case DeleteActionType.multiple:
return AppLocalizations.of(context).delete_multiple_messages_dialog(count ?? 0);
return AppLocalizations.of(context).delete_multiple_messages_dialog(
count ?? 0,
mailboxName ?? '');
case DeleteActionType.single:
return AppLocalizations.of(context).delete_single_message_dialog;
}
@@ -928,7 +928,11 @@ class ThreadController extends BaseController {
moveSelectedMultipleEmailToTrash(selectionEmail);
break;
case EmailActionType.deletePermanently:
deleteSelectionEmailsPermanently(context, DeleteActionType.multiple, selectedEmails: selectionEmail);
deleteSelectionEmailsPermanently(
context,
DeleteActionType.multiple,
selectedEmails: selectionEmail,
presentationMailbox: currentMailbox);
break;
case EmailActionType.moveToSpam:
moveSelectedMultipleEmailToSpam(selectionEmail);
@@ -1144,10 +1148,20 @@ class ThreadController extends BaseController {
bool get isMailboxTrash => mailboxDashBoardController.selectedMailbox.value?.role == PresentationMailbox.roleTrash;
void deleteSelectionEmailsPermanently(BuildContext context, DeleteActionType actionType, {List<PresentationEmail>? selectedEmails}) {
void deleteSelectionEmailsPermanently(
BuildContext context,
DeleteActionType actionType,
{
List<PresentationEmail>? selectedEmails,
PresentationMailbox? presentationMailbox
}
) {
if (_responsiveUtils.isMobile(context)) {
(ConfirmationDialogActionSheetBuilder(context)
..messageText(actionType.getContentDialog(context, count: selectedEmails?.length))
..messageText(actionType.getContentDialog(
context,
count: selectedEmails?.length,
mailboxName: presentationMailbox?.name?.name))
..onCancelAction(AppLocalizations.of(context).cancel, () => popBack())
..onConfirmAction(actionType.getConfirmActionName(context), () => _deleteSelectionEmailsPermanentlyAction(actionType)))
.show();
@@ -1158,7 +1172,10 @@ class ThreadController extends BaseController {
builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths)
..key(const Key('confirm_dialog_delete_emails_permanently'))
..title(actionType.getTitleDialog(context))
..content(actionType.getContentDialog(context, count: selectedEmails?.length))
..content(actionType.getContentDialog(
context,
count: selectedEmails?.length,
mailboxName: presentationMailbox?.name?.name))
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, fit: BoxFit.fill))
..colorConfirmButton(AppColor.colorConfirmActionDialog)
..styleTextConfirmButton(const TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorActionDeleteConfirmDialog))
@@ -190,21 +190,25 @@ class AppBarThreadWidgetBuilder {
iconPadding: const EdgeInsets.all(5),
splashRadius: 15,
icon: SvgPicture.asset(
_imagePaths.icDeleteComposer,
width: 18,
height: 18,
color: AppColor.textFieldErrorBorderColor,
canDeletePermanently ? _imagePaths.icDeleteComposer : _imagePaths.icDelete,
color: canDeletePermanently ? AppColor.colorDeletePermanentlyButton : AppColor.primaryColor,
width: 20,
height: 20,
fit: BoxFit.fill),
tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash
? AppLocalizations.of(_context).move_to_trash
: AppLocalizations.of(_context).delete_permanently,
onTap: () => _currentMailbox?.isTrash == true
tooltip: canDeletePermanently
? AppLocalizations.of(_context).delete_permanently
: AppLocalizations.of(_context).move_to_trash,
onTap: () => canDeletePermanently
? _onEmailSelectionAction?.call(EmailActionType.deletePermanently, _listSelectionEmail)
: _onEmailSelectionAction?.call(EmailActionType.moveToTrash, _listSelectionEmail)),
const SizedBox(width: 10),
]);
}
bool get canDeletePermanently {
return _currentMailbox?.isTrash == true || _currentMailbox?.isDrafts == true;
}
Widget _buildBodyAppBarForMobile() {
return Row(children: [
Expanded(child: Stack(
+6 -4
View File
@@ -1,5 +1,5 @@
{
"@@last_modified": "2022-09-08T14:02:20.481140",
"@@last_modified": "2022-09-08T15:46:55.686024",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
@@ -1036,14 +1036,16 @@
"placeholders_order": [],
"placeholders": {}
},
"delete_multiple_messages_dialog": "You are about to permanently delete {count} items in Trash . Do you want to continue?",
"delete_multiple_messages_dialog": "You are about to permanently delete {count} items in {mailboxName} . Do you want to continue?",
"@delete_multiple_messages_dialog": {
"type": "text",
"placeholders_order": [
"count"
"count",
"mailboxName"
],
"placeholders": {
"count": {}
"count": {},
"mailboxName": {}
}
},
"delete_single_message_dialog": "You are about to permanently delete this message. Do you want to continue?",
@@ -1075,11 +1075,11 @@ class AppLocalizations {
name: 'delete_message_forever');
}
String delete_multiple_messages_dialog(int count) {
String delete_multiple_messages_dialog(int count, String mailboxName) {
return Intl.message(
'You are about to permanently delete $count items in Trash . Do you want to continue?',
'You are about to permanently delete $count items in $mailboxName . Do you want to continue?',
name: 'delete_multiple_messages_dialog',
args: [count]);
args: [count, mailboxName]);
}
String get delete_single_message_dialog {