diff --git a/assets/images/ic_delete_trash.svg b/assets/images/ic_delete_trash.svg
new file mode 100644
index 000000000..341e41e7a
--- /dev/null
+++ b/assets/images/ic_delete_trash.svg
@@ -0,0 +1,3 @@
+
diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart
index cd78ffc17..1dcd28a5e 100644
--- a/core/lib/presentation/resources/image_paths.dart
+++ b/core/lib/presentation/resources/image_paths.dart
@@ -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;
diff --git a/core/lib/presentation/utils/app_toast.dart b/core/lib/presentation/utils/app_toast.dart
index f3301446a..e3870b495 100644
--- a/core/lib/presentation/utils/app_toast.dart
+++ b/core/lib/presentation/utils/app_toast.dart
@@ -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: [
diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart
index cd6b0484e..08e4aafbc 100644
--- a/lib/features/email/data/datasource/email_datasource.dart
+++ b/lib/features/email/data/datasource/email_datasource.dart
@@ -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 removeEmailDrafts(AccountId accountId, EmailId emailId);
Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
+
+ Future> deleteMultipleEmailPermanently(Session session, AccountId accountId, List emailIds);
}
\ No newline at end of file
diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart
index 6a3b72004..4d7f7ca8e 100644
--- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart
+++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart
@@ -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> deleteMultipleEmailPermanently(Session session, AccountId accountId, List emailIds) {
+ return Future.sync(() async {
+ return await emailAPI.deleteMultipleEmailPermanently(session, accountId, emailIds);
+ }).catchError((error) {
+ throw error;
+ });
+ }
}
\ No newline at end of file
diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart
index d27c988f2..fe6dc8096 100644
--- a/lib/features/email/data/network/email_api.dart
+++ b/lib/features/email/data/network/email_api.dart
@@ -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> deleteMultipleEmailPermanently(Session session, AccountId accountId, List emailIds) async {
+ requireCapability(session, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]);
+
+ final coreCapability = (session.capabilities[CapabilityIdentifier.jmapCore] as CoreCapability);
+ final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt();
+
+ List 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;
+ }
}
\ No newline at end of file
diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart
index 4b4529205..c79f6013a 100644
--- a/lib/features/email/data/repository/email_repository_impl.dart
+++ b/lib/features/email/data/repository/email_repository_impl.dart
@@ -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> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) {
return emailDataSource.moveToTrash(accountId, moveRequest);
}
+
+ @override
+ Future> deleteMultipleEmailPermanently(Session session, AccountId accountId, List emailIds) {
+ return emailDataSource.deleteMultipleEmailPermanently(session, accountId, emailIds);
+ }
}
\ No newline at end of file
diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart
index fe4c6ac9d..343c613a4 100644
--- a/lib/features/email/domain/repository/email_repository.dart
+++ b/lib/features/email/domain/repository/email_repository.dart
@@ -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 removeEmailDrafts(AccountId accountId, EmailId emailId);
Future updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
+
+ Future> deleteMultipleEmailPermanently(Session session, AccountId accountId, List emailIds);
}
\ No newline at end of file
diff --git a/lib/features/email/domain/state/delete_multiple_email_state.dart b/lib/features/email/domain/state/delete_multiple_email_state.dart
new file mode 100644
index 000000000..3fdbdb9bf
--- /dev/null
+++ b/lib/features/email/domain/state/delete_multiple_email_state.dart
@@ -0,0 +1,40 @@
+import 'package:core/core.dart';
+import 'package:jmap_dart_client/jmap/mail/email/email.dart';
+
+class DeleteMultipleEmailsPermanentlyAllSuccess extends UIState {
+
+ List emailIds;
+
+ DeleteMultipleEmailsPermanentlyAllSuccess(this.emailIds);
+
+ @override
+ List