TF-239 Delete multiple emails permanently

This commit is contained in:
dab246
2022-04-05 11:00:18 +07:00
committed by Dat H. Pham
parent b2e98087dd
commit 6445e3076f
18 changed files with 382 additions and 20 deletions
+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.8 2.39844C10.5772 2.39856 10.3588 2.4607 10.1693 2.5779C9.97987 2.6951 9.82676 2.86274 9.72718 3.06204L8.85838 4.79844H4.79998C4.48172 4.79844 4.17649 4.92487 3.95145 5.14991C3.7264 5.37495 3.59998 5.68018 3.59998 5.99844C3.59998 6.3167 3.7264 6.62192 3.95145 6.84697C4.17649 7.07201 4.48172 7.19844 4.79998 7.19844V19.1984C4.79998 19.835 5.05283 20.4454 5.50292 20.8955C5.95301 21.3456 6.56346 21.5984 7.19998 21.5984H16.8C17.4365 21.5984 18.0469 21.3456 18.497 20.8955C18.9471 20.4454 19.2 19.835 19.2 19.1984V7.19844C19.5182 7.19844 19.8235 7.07201 20.0485 6.84697C20.2735 6.62192 20.4 6.3167 20.4 5.99844C20.4 5.68018 20.2735 5.37495 20.0485 5.14991C19.8235 4.92487 19.5182 4.79844 19.2 4.79844H15.1416L14.2728 3.06204C14.1732 2.86274 14.0201 2.6951 13.8306 2.5779C13.6411 2.4607 13.4228 2.39856 13.2 2.39844H10.8ZM8.39998 9.59844C8.39998 9.28018 8.5264 8.97495 8.75145 8.74991C8.97649 8.52487 9.28172 8.39844 9.59998 8.39844C9.91824 8.39844 10.2235 8.52487 10.4485 8.74991C10.6735 8.97495 10.8 9.28018 10.8 9.59844V16.7984C10.8 17.1167 10.6735 17.4219 10.4485 17.647C10.2235 17.872 9.91824 17.9984 9.59998 17.9984C9.28172 17.9984 8.97649 17.872 8.75145 17.647C8.5264 17.4219 8.39998 17.1167 8.39998 16.7984V9.59844ZM14.4 8.39844C14.0817 8.39844 13.7765 8.52487 13.5514 8.74991C13.3264 8.97495 13.2 9.28018 13.2 9.59844V16.7984C13.2 17.1167 13.3264 17.4219 13.5514 17.647C13.7765 17.872 14.0817 17.9984 14.4 17.9984C14.7182 17.9984 15.0235 17.872 15.2485 17.647C15.4735 17.4219 15.6 17.1167 15.6 16.7984V9.59844C15.6 9.28018 15.4735 8.97495 15.2485 8.74991C15.0235 8.52487 14.7182 8.39844 14.4 8.39844Z" fill="#99A2AD"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -87,6 +87,7 @@ class ImagePaths {
String get icSendToastError => _getImagePath('ic_send_toast_error.svg');
String get icEmpty => _getImagePath('ic_empty.svg');
String get icNotConnection => _getImagePath('ic_not_connection.svg');
String get icDeleteTrash => _getImagePath('ic_delete_trash.svg');
String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
+6 -4
View File
@@ -61,9 +61,11 @@ class AppToast {
);
}
void showToastWithIcon(BuildContext context,
{String? message, String? icon, Color? bgColor,
Color? textColor, double? radius, EdgeInsets? padding, TextStyle? textStyle}) {
void showToastWithIcon(BuildContext context, {
String? message, String? icon, Color? bgColor,
Color? textColor, double? radius, EdgeInsets? padding,
TextStyle? textStyle, double? widthToast}) {
double sizeWidth = context.width > 360 ? 360 : context.width - 40;
final toast = Material(
color: bgColor ?? Colors.white,
elevation: 10,
@@ -75,7 +77,7 @@ class AppToast {
borderRadius: BorderRadius.circular(radius ?? 10.0),
color: bgColor ?? Colors.white,
),
width: 320,
width: widthToast ?? sizeWidth,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
@@ -1,5 +1,6 @@
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
@@ -50,4 +51,6 @@ abstract class EmailDataSource {
Future<bool> removeEmailDrafts(AccountId accountId, EmailId emailId);
Future<Email?> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds);
}
@@ -1,5 +1,6 @@
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
@@ -132,4 +133,13 @@ class EmailDataSourceImpl extends EmailDataSource {
throw error;
});
}
@override
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
return Future.sync(() async {
return await emailAPI.deleteMultipleEmailPermanently(session, accountId, emailIds);
}).catchError((error) {
throw error;
});
}
}
@@ -7,10 +7,13 @@ import 'package:external_path/external_path.dart';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:jmap_dart_client/http/http_client.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart';
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/reference_id.dart';
import 'package:jmap_dart_client/jmap/core/reference_prefix.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/jmap_request.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/get/get_email_method.dart';
@@ -28,6 +31,7 @@ import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart';
class EmailAPI {
@@ -381,4 +385,49 @@ class EmailAPI {
throw error;
});
}
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds) async {
requireCapability(session, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]);
final coreCapability = (session.capabilities[CapabilityIdentifier.jmapCore] as CoreCapability);
final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt();
List<EmailId> listEmailResult = [];
var start = 0;
var end = 0;
while (end < emailIds.length) {
start = end;
if (emailIds.length - start >= maxMethodCount) {
end = maxMethodCount;
} else {
end = emailIds.length;
}
log('EmailAPI::deleteMultipleEmailPermanently(): delete from $start to $end / ${emailIds.length}');
final currentExecuteList = emailIds.sublist(start, end);
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
final currentSetEmailInvocations = currentExecuteList
.map((emailId) {
return SetEmailMethod(accountId)
..addDestroy(Set.of([emailId.id]));
})
.map(requestBuilder.invocation)
.toList();
final response = await (requestBuilder
..usings(Set.of([CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail])))
.build()
.execute();
currentSetEmailInvocations
.map((currentInvocation) => response.parse(currentInvocation.methodCallId, SetEmailResponse.deserialize))
.map((response) => response?.destroyed?.map((id) => EmailId(id)))
.where((listId) => listId != null && listId.isNotEmpty)
.forEach((listId) {
listEmailResult.addAll(listId!);
});
}
return listEmailResult;
}
}
@@ -1,6 +1,7 @@
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
@@ -114,4 +115,9 @@ class EmailRepositoryImpl extends EmailRepository {
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) {
return emailDataSource.moveToTrash(accountId, moveRequest);
}
@override
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
return emailDataSource.deleteMultipleEmailPermanently(session, accountId, emailIds);
}
}
@@ -1,5 +1,6 @@
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
@@ -57,4 +58,6 @@ abstract class EmailRepository {
Future<bool> removeEmailDrafts(AccountId accountId, EmailId emailId);
Future<Email?> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds);
}
@@ -0,0 +1,40 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
class DeleteMultipleEmailsPermanentlyAllSuccess extends UIState {
List<EmailId> emailIds;
DeleteMultipleEmailsPermanentlyAllSuccess(this.emailIds);
@override
List<Object?> get props => [emailIds];
}
class DeleteMultipleEmailsPermanentlyHasSomeEmailFailure extends UIState {
List<EmailId> emailIds;
DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(this.emailIds);
@override
List<Object> get props => [emailIds];
}
class DeleteMultipleEmailsPermanentlyAllFailure extends FeatureFailure {
DeleteMultipleEmailsPermanentlyAllFailure();
@override
List<Object?> get props => [];
}
class DeleteMultipleEmailsPermanentlyFailure extends FeatureFailure {
final exception;
DeleteMultipleEmailsPermanentlyFailure(this.exception);
@override
List<Object?> get props => [exception];
}
@@ -0,0 +1,28 @@
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_email_state.dart';
class DeleteMultipleEmailsPermanentlyInteractor {
final EmailRepository emailRepository;
DeleteMultipleEmailsPermanentlyInteractor(this.emailRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, List<EmailId> emailIds) async* {
try {
final listResult = await emailRepository.deleteMultipleEmailPermanently(session, accountId, emailIds);
if (listResult.length == emailIds.length) {
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyAllSuccess(listResult));
} else if (listResult.isNotEmpty) {
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(listResult));
} else {
yield Left<Failure, Success>(DeleteMultipleEmailsPermanentlyAllFailure());
}
} catch (e) {
yield Left<Failure, Success>(DeleteMultipleEmailsPermanentlyFailure(e));
}
}
}
@@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/base/base_mailbox_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/state/delete_multiple_email_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/state/move_to_trash_state.dart';
@@ -126,6 +127,10 @@ class MailboxController extends BaseMailboxController {
|| success is MoveMultipleEmailToTrashHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is MarkAsEmailReadSuccess
|| success is MoveToMailboxSuccess
|| success is MoveToTrashSuccess
@@ -0,0 +1,45 @@
import 'package:flutter/cupertino.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
enum DeleteActionType {
all,
multiple,
single,
}
extension DeleteActionTypeExtension on DeleteActionType {
String getTitleDialog(BuildContext context) {
switch(this) {
case DeleteActionType.all:
return AppLocalizations.of(context).empty_trash_folder;
case DeleteActionType.multiple:
return AppLocalizations.of(context).delete_messages_forever;
case DeleteActionType.single:
return AppLocalizations.of(context).delete_message_forever;
}
}
String getContentDialog(BuildContext context, {int? count}) {
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);
case DeleteActionType.single:
return AppLocalizations.of(context).delete_single_message_dialog;
}
}
String getConfirmActionName(BuildContext context) {
switch(this) {
case DeleteActionType.all:
return AppLocalizations.of(context).delete_all;
case DeleteActionType.multiple:
return AppLocalizations.of(context).delete;
case DeleteActionType.single:
return AppLocalizations.of(context).delete;
}
}
}
@@ -10,6 +10,7 @@ import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
import 'package:tmail_ui_user/features/email/data/repository/email_repository_impl.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_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/mark_as_email_read_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
@@ -55,6 +56,7 @@ class ThreadBindings extends BaseBindings {
Get.find<SearchEmailInteractor>(),
Get.find<SearchMoreEmailInteractor>(),
Get.find<MoveMultipleEmailToTrashInteractor>(),
Get.find<DeleteMultipleEmailsPermanentlyInteractor>(),
));
}
@@ -93,6 +95,7 @@ class ThreadBindings extends BaseBindings {
Get.lazyPut(() => SearchEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => SearchMoreEmailInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => MoveMultipleEmailToTrashInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find<EmailRepository>()));
}
@override
@@ -2,6 +2,7 @@ import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:flutter/foundation.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/sort/comparator.dart';
@@ -14,6 +15,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
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';
@@ -21,10 +23,12 @@ import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts
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/model/move_to_trash_request.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_email_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/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/move_to_trash_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_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/presentation/model/mailbox_actions.dart';
@@ -53,6 +57,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_em
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/presentation/extensions/filter_message_option_extension.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
@@ -76,6 +81,7 @@ class ThreadController extends BaseController {
final SearchEmailInteractor _searchEmailInteractor;
final SearchMoreEmailInteractor _searchMoreEmailInteractor;
final MoveMultipleEmailToTrashInteractor _moveMultipleEmailToTrashInteractor;
final DeleteMultipleEmailsPermanentlyInteractor _deleteMultipleEmailsPermanentlyInteractor;
final emailList = <PresentationEmail>[].obs;
final emailListSearch = <PresentationEmail>[].obs;
@@ -110,6 +116,7 @@ class ThreadController extends BaseController {
this._searchEmailInteractor,
this._searchMoreEmailInteractor,
this._moveMultipleEmailToTrashInteractor,
this._deleteMultipleEmailsPermanentlyInteractor,
);
@override
@@ -222,6 +229,9 @@ class ThreadController extends BaseController {
} else if (success is MoveMultipleEmailToTrashAllSuccess
|| success is MoveMultipleEmailToTrashHasSomeEmailFailure) {
_moveSelectedMultipleEmailToTrashSuccess(success);
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
_deleteMultipleEmailsPermanentlySuccess(success);
}
}
);
@@ -804,11 +814,86 @@ class ThreadController extends BaseController {
case EmailActionType.moveToTrash:
moveSelectedMultipleEmailToTrashAction(selectionEmail);
break;
case EmailActionType.deletePermanently:
deleteEmailsPermanently(context, DeleteActionType.multiple, selectedEmails: selectionEmail);
break;
default:
break;
}
}
bool get isMailboxTrash => mailboxDashBoardController.selectedMailbox.value?.role == PresentationMailbox.roleTrash;
void deleteEmailsPermanently(BuildContext context, DeleteActionType actionType, {List<PresentationEmail>? selectedEmails}) {
if (_responsiveUtils.isMobile(context)) {
(ConfirmationDialogActionSheetBuilder(context)
..messageText(actionType.getContentDialog(context, count: selectedEmails?.length))
..onCancelAction(AppLocalizations.of(context).cancel, () => popBack())
..onConfirmAction(actionType.getConfirmActionName(context), () => _deleteEmailsPermanentlyAction(actionType)))
.show();
} else {
showDialog(
context: context,
barrierColor: AppColor.colorDefaultCupertinoActionSheet,
builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths)
..key(Key('confirm_dialog_delete_emails_permanently'))
..title(actionType.getTitleDialog(context))
..content(actionType.getContentDialog(context, count: selectedEmails?.length))
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, fit: BoxFit.fill))
..colorConfirmButton(AppColor.colorConfirmActionDialog)
..styleTextConfirmButton(TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorActionDeleteConfirmDialog))
..onCloseButtonAction(() => popBack())
..onConfirmButtonAction(actionType.getConfirmActionName(context), () => _deleteEmailsPermanentlyAction(actionType))
..onCancelButtonAction(AppLocalizations.of(context).cancel, () => popBack()))
.build()));
}
}
void _deleteEmailsPermanentlyAction(DeleteActionType actionType) {
popBack();
switch(actionType) {
case DeleteActionType.all:
break;
case DeleteActionType.multiple:
_deleteMultipleEmailsPermanently(listEmailSelected);
break;
case DeleteActionType.single:
break;
}
}
void _deleteMultipleEmailsPermanently(List<PresentationEmail> emailList) {
cancelSelectEmail();
final session = mailboxDashBoardController.sessionCurrent;
final listEmailIds = emailList.map((email) => email.id).toList();
if (session != null && _accountId != null && listEmailIds.isNotEmpty) {
consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute(session, _accountId!, listEmailIds));
}
}
void _deleteMultipleEmailsPermanentlySuccess(Success success) {
mailboxDashBoardController.dispatchState(Right(success));
List<EmailId> listEmailIdResult = <EmailId>[];
if (success is DeleteMultipleEmailsPermanentlyAllSuccess) {
listEmailIdResult = success.emailIds;
} else if (success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
listEmailIdResult = success.emailIds;
}
if (currentContext != null && currentOverlayContext != null && listEmailIdResult.isNotEmpty) {
_appToast.showToastWithIcon(
currentOverlayContext!,
widthToast: _responsiveUtils.isDesktop(currentContext!) ? 360 : null,
message: AppLocalizations.of(currentContext!).toast_message_delete_multiple_email_permanently_success(listEmailIdResult.length),
icon: _imagePaths.icDeleteToast);
}
_refreshEmailChanges();
}
void openMailboxLeftMenu() {
mailboxDashBoardController.openDrawer();
}
@@ -8,6 +8,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/user_setti
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
import 'package:tmail_ui_user/features/thread/presentation/extensions/filter_message_option_extension.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart';
@@ -207,11 +208,14 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
icon: SvgPicture.asset(_imagePaths.icMove, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).move,
onTap: () => controller.pressEmailSelectionAction(context, EmailActionType.move, controller.listEmailSelected)),
if (controller.mailboxDashBoardController.selectedMailbox.value?.role != PresentationMailbox.roleTrash)
buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDelete, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).move_to_trash,
onTap: () => controller.pressEmailSelectionAction(context, EmailActionType.moveToTrash, controller.listEmailSelected)),
tooltip: controller.mailboxDashBoardController.selectedMailbox.value?.role != PresentationMailbox.roleTrash
? AppLocalizations.of(context).move_to_trash
: AppLocalizations.of(context).delete_permanently,
onTap: () => controller.mailboxDashBoardController.selectedMailbox.value?.role != PresentationMailbox.roleTrash
? controller.pressEmailSelectionAction(context, EmailActionType.moveToTrash, controller.listEmailSelected)
: controller.deleteEmailsPermanently(context, DeleteActionType.multiple, selectedEmails: controller.listEmailSelected)),
]);
}
@@ -81,15 +81,17 @@ class BottomBarThreadSelectionWidget {
}})
..text(AppLocalizations.of(_context).move, isVertical: _responsiveUtils.isMobile(_context)))
.build(),
if (!_responsiveUtils.isDesktop(_context) && _currentMailbox?.role != PresentationMailbox.roleTrash)
(ButtonBuilder(_imagePaths.icDelete)
..key(Key('button_delete_email'))
..paddingIcon(EdgeInsets.all(8))
..textStyle(TextStyle(fontSize: 12, color: AppColor.colorTextButton))
..onPressActionClick(() {
if (_onPressEmailSelectionActionClick != null) {
_onPressEmailSelectionActionClick!(EmailActionType.moveToTrash, _listSelectionEmail);
}})
if (_currentMailbox?.role != PresentationMailbox.roleTrash) {
_onPressEmailSelectionActionClick?.call(EmailActionType.moveToTrash, _listSelectionEmail);
} else {
_onPressEmailSelectionActionClick?.call(EmailActionType.deletePermanently, _listSelectionEmail);
}
})
..text(AppLocalizations.of(_context).delete, isVertical: _responsiveUtils.isMobile(_context)))
.build()
]
@@ -983,4 +983,76 @@ class AppLocalizations {
'Team - Mail',
name: 'page_name');
}
String get message_delete_all_email_in_trash_button {
return Intl.message(
'All messages in Trash will be deleted if you reach limited storage.',
name: 'message_delete_all_email_in_trash_button');
}
String get empty_trash_now {
return Intl.message(
'Empty trash now',
name: 'empty_trash_now');
}
String get empty_trash_folder {
return Intl.message(
'Empty trash folder',
name: 'empty_trash_folder');
}
String get empty_trash_dialog_message {
return Intl.message(
'You are about to permanently delete all items in Trash . Do you want to continue?',
name: 'empty_trash_dialog_message');
}
String get delete_all {
return Intl.message(
'Delete all',
name: 'delete_all');
}
String toast_message_delete_multiple_email_permanently_success(int count) {
return Intl.message(
'$count Messages has been deleted forever',
name: 'toast_message_delete_multiple_email_permanently_success');
}
String get toast_message_delete_a_email_permanently_success {
return Intl.message(
'Message has been deleted forever',
name: 'toast_message_delete_a_email_permanently_success');
}
String get delete_permanently {
return Intl.message(
'Delete permanently',
name: 'delete_permanently');
}
String get delete_messages_forever {
return Intl.message(
'Delete messages forever',
name: 'delete_messages_forever');
}
String get delete_message_forever {
return Intl.message(
'Delete message forever',
name: 'delete_message_forever');
}
String delete_multiple_messages_dialog(int count) {
return Intl.message(
'You are about to permanently delete $count items in Trash . Do you want to continue?',
name: 'delete_multiple_messages_dialog');
}
String get delete_single_message_dialog {
return Intl.message(
'You are about to permanently delete this message. Do you want to continue?',
name: 'delete_single_message_dialog');
}
}
+1
View File
@@ -12,4 +12,5 @@ enum EmailActionType {
edit,
composeFromEmailAddress,
moveToTrash,
deletePermanently,
}