TF-239 Empty trash folder
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
import 'package:core/utils/app_logger.dart';
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -28,7 +27,6 @@ class ResponsiveUtils {
|
|||||||
|
|
||||||
double getDeviceWidth(BuildContext context) {
|
double getDeviceWidth(BuildContext context) {
|
||||||
final widthScreen = kIsWeb ? context.width : context.mediaQueryShortestSide;
|
final widthScreen = kIsWeb ? context.width : context.mediaQueryShortestSide;
|
||||||
log('ResponsiveUtils::getDeviceWidth(): widthScreen: $widthScreen');
|
|
||||||
return widthScreen;
|
return widthScreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
|
import 'package:core/core.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/caching/config/hive_cache_client.dart';
|
import 'package:tmail_ui_user/features/caching/config/hive_cache_client.dart';
|
||||||
@@ -103,9 +104,11 @@ class EmailCacheClient extends HiveCacheClient<EmailCache> {
|
|||||||
@override
|
@override
|
||||||
Future<void> deleteMultipleItem(List<String> listKey) {
|
Future<void> deleteMultipleItem(List<String> listKey) {
|
||||||
return Future.sync(() async {
|
return Future.sync(() async {
|
||||||
|
log('EmailCacheClient::deleteMultipleItem(): listKey: ${listKey.length}');
|
||||||
final boxEmail = await openBox();
|
final boxEmail = await openBox();
|
||||||
return boxEmail.deleteAll(listKey);
|
return boxEmail.deleteAll(listKey);
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
|
log('EmailCacheClient::deleteMultipleItem(): error: $error');
|
||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.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:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
@@ -52,7 +51,7 @@ abstract class EmailDataSource {
|
|||||||
|
|
||||||
Future<Email?> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
|
Future<Email?> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
|
||||||
|
|
||||||
Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds);
|
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds);
|
||||||
|
|
||||||
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId);
|
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId);
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.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:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
@@ -135,9 +134,9 @@ class EmailDataSourceImpl extends EmailDataSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
|
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) {
|
||||||
return Future.sync(() async {
|
return Future.sync(() async {
|
||||||
return await emailAPI.deleteMultipleEmailsPermanently(session, accountId, emailIds);
|
return await emailAPI.deleteMultipleEmailsPermanently(accountId, emailIds);
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,13 +7,10 @@ import 'package:external_path/external_path.dart';
|
|||||||
import 'package:flutter_downloader/flutter_downloader.dart';
|
import 'package:flutter_downloader/flutter_downloader.dart';
|
||||||
import 'package:jmap_dart_client/http/http_client.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/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/patch_object.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.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_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/reference_prefix.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/jmap_request.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/get/get_email_method.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/get/get_email_method.dart';
|
||||||
@@ -31,7 +28,6 @@ import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'
|
|||||||
import 'package:model/model.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_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_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 {
|
class EmailAPI {
|
||||||
|
|
||||||
@@ -386,54 +382,34 @@ class EmailAPI {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds) async {
|
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) async {
|
||||||
requireCapability(session, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]);
|
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
|
||||||
|
final setEmailMethod = SetEmailMethod(accountId)
|
||||||
|
..addDestroy(emailIds.map((emailId) => emailId.id).toSet());
|
||||||
|
|
||||||
final coreCapability = (session.capabilities[CapabilityIdentifier.jmapCore] as CoreCapability);
|
final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
|
||||||
final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt();
|
|
||||||
|
|
||||||
List<EmailId> listEmailResult = [];
|
final response = await (requestBuilder
|
||||||
var start = 0;
|
..usings(setEmailMethod.requiredCapabilities))
|
||||||
var end = 0;
|
.build()
|
||||||
while (end < emailIds.length) {
|
.execute();
|
||||||
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 setEmailResponse = response.parse<SetEmailResponse>(
|
||||||
final currentSetEmailInvocations = currentExecuteList
|
setEmailInvocation.methodCallId,
|
||||||
.map((emailId) {
|
SetEmailResponse.deserialize);
|
||||||
return SetEmailMethod(accountId)
|
|
||||||
..addDestroy(Set.of([emailId.id]));
|
|
||||||
})
|
|
||||||
.map(requestBuilder.invocation)
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
final response = await (requestBuilder
|
final listIdResult = setEmailResponse?.destroyed;
|
||||||
..usings(Set.of([CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail])))
|
|
||||||
.build()
|
|
||||||
.execute();
|
|
||||||
|
|
||||||
currentSetEmailInvocations
|
if (listIdResult != null) {
|
||||||
.map((currentInvocation) => response.parse(currentInvocation.methodCallId, SetEmailResponse.deserialize))
|
return listIdResult.map((id) => EmailId(id)).toList();
|
||||||
.map((response) => response?.destroyed?.map((id) => EmailId(id)))
|
|
||||||
.where((listId) => listId != null && listId.isNotEmpty)
|
|
||||||
.forEach((listId) {
|
|
||||||
listEmailResult.addAll(listId!);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return listEmailResult;
|
return List.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId) async {
|
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId) async {
|
||||||
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
|
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
|
||||||
final setEmailMethod = SetEmailMethod(accountId)
|
final setEmailMethod = SetEmailMethod(accountId)
|
||||||
..addDestroy(Set.of([emailId.id]));
|
..addDestroy(Set.of([emailId.id]));
|
||||||
|
|
||||||
final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
|
final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.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:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
@@ -117,8 +116,8 @@ class EmailRepositoryImpl extends EmailRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
|
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds) {
|
||||||
return emailDataSource.deleteMultipleEmailsPermanently(session, accountId, emailIds);
|
return emailDataSource.deleteMultipleEmailsPermanently(accountId, emailIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.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:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
@@ -59,7 +58,7 @@ abstract class EmailRepository {
|
|||||||
|
|
||||||
Future<Email?> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
|
Future<Email?> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
|
||||||
|
|
||||||
Future<List<EmailId>> deleteMultipleEmailsPermanently(Session session, AccountId accountId, List<EmailId> emailIds);
|
Future<List<EmailId>> deleteMultipleEmailsPermanently(AccountId accountId, List<EmailId> emailIds);
|
||||||
|
|
||||||
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId);
|
Future<bool> deleteEmailPermanently(AccountId accountId, EmailId emailId);
|
||||||
}
|
}
|
||||||
+2
-3
@@ -1,7 +1,6 @@
|
|||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.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: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/repository/email_repository.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/delete_multiple_emails_permanently_state.dart';
|
||||||
@@ -11,9 +10,9 @@ class DeleteMultipleEmailsPermanentlyInteractor {
|
|||||||
|
|
||||||
DeleteMultipleEmailsPermanentlyInteractor(this.emailRepository);
|
DeleteMultipleEmailsPermanentlyInteractor(this.emailRepository);
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, List<EmailId> emailIds) async* {
|
Stream<Either<Failure, Success>> execute(AccountId accountId, List<EmailId> emailIds) async* {
|
||||||
try {
|
try {
|
||||||
final listResult = await emailRepository.deleteMultipleEmailsPermanently(session, accountId, emailIds);
|
final listResult = await emailRepository.deleteMultipleEmailsPermanently(accountId, emailIds);
|
||||||
if (listResult.length == emailIds.length) {
|
if (listResult.length == emailIds.length) {
|
||||||
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyAllSuccess(listResult));
|
yield Right<Failure, Success>(DeleteMultipleEmailsPermanentlyAllSuccess(listResult));
|
||||||
} else if (listResult.isNotEmpty) {
|
} else if (listResult.isNotEmpty) {
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_ma
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_trash_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_trash_state.dart';
|
||||||
@@ -113,36 +114,49 @@ class MailboxController extends BaseMailboxController {
|
|||||||
});
|
});
|
||||||
|
|
||||||
mailboxDashBoardController.viewState.listen((state) {
|
mailboxDashBoardController.viewState.listen((state) {
|
||||||
state.map((success) {
|
state.fold(
|
||||||
log('MailboxController::onReady(): ${success.runtimeType}');
|
(failure) {
|
||||||
|
log('MailboxController::onReady(): ${failure.runtimeType}');
|
||||||
|
|
||||||
if (success is MarkAsMultipleEmailReadAllSuccess
|
if (failure is EmptyTrashFolderFailure) {
|
||||||
|| success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
mailboxDashBoardController.clearState();
|
||||||
mailboxDashBoardController.clearState();
|
refreshMailboxChanges();
|
||||||
refreshMailboxChanges();
|
}
|
||||||
} else if (success is MoveMultipleEmailToMailboxAllSuccess
|
},
|
||||||
|| success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
(success) {
|
||||||
mailboxDashBoardController.clearState();
|
log('MailboxController::onReady(): ${success.runtimeType}');
|
||||||
refreshMailboxChanges();
|
|
||||||
} else if (success is MoveMultipleEmailToTrashAllSuccess
|
if (success is MarkAsMultipleEmailReadAllSuccess
|
||||||
|| success is MoveMultipleEmailToTrashHasSomeEmailFailure) {
|
|| success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||||
mailboxDashBoardController.clearState();
|
mailboxDashBoardController.clearState();
|
||||||
refreshMailboxChanges();
|
refreshMailboxChanges();
|
||||||
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|
} else if (success is MoveMultipleEmailToMailboxAllSuccess
|
||||||
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
|
|| success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
||||||
mailboxDashBoardController.clearState();
|
mailboxDashBoardController.clearState();
|
||||||
refreshMailboxChanges();
|
refreshMailboxChanges();
|
||||||
} else if (success is MarkAsEmailReadSuccess
|
} else if (success is MoveMultipleEmailToTrashAllSuccess
|
||||||
|| success is MoveToMailboxSuccess
|
|| success is MoveMultipleEmailToTrashHasSomeEmailFailure) {
|
||||||
|| success is MoveToTrashSuccess
|
mailboxDashBoardController.clearState();
|
||||||
|| success is DeleteEmailPermanentlySuccess
|
refreshMailboxChanges();
|
||||||
|| success is SaveEmailAsDraftsSuccess
|
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|
||||||
|| success is RemoveEmailDraftsSuccess
|
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
|
||||||
|| success is SendEmailSuccess
|
mailboxDashBoardController.clearState();
|
||||||
|| success is UpdateEmailDraftsSuccess) {
|
refreshMailboxChanges();
|
||||||
refreshMailboxChanges();
|
} else if (success is EmptyTrashFolderSuccess) {
|
||||||
|
mailboxDashBoardController.clearState();
|
||||||
|
refreshMailboxChanges();
|
||||||
|
} else if (success is MarkAsEmailReadSuccess
|
||||||
|
|| success is MoveToMailboxSuccess
|
||||||
|
|| success is MoveToTrashSuccess
|
||||||
|
|| success is DeleteEmailPermanentlySuccess
|
||||||
|
|| success is SaveEmailAsDraftsSuccess
|
||||||
|
|| success is RemoveEmailDraftsSuccess
|
||||||
|
|| success is SendEmailSuccess
|
||||||
|
|| success is UpdateEmailDraftsSuccess) {
|
||||||
|
refreshMailboxChanges();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
_openMailboxEventController.stream.throttleTime(Duration(milliseconds: 800)).listen((event) {
|
_openMailboxEventController.stream.throttleTime(Duration(milliseconds: 800)).listen((event) {
|
||||||
@@ -227,6 +241,7 @@ class MailboxController extends BaseMailboxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void refreshMailboxChanges() {
|
void refreshMailboxChanges() {
|
||||||
|
log('MailboxController::refreshMailboxChanges():');
|
||||||
final accountId = mailboxDashBoardController.accountId.value;
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
if (accountId != null && currentMailboxState != null) {
|
if (accountId != null && currentMailboxState != null) {
|
||||||
consumeState(_refreshAllMailboxInteractor.execute(accountId, currentMailboxState!));
|
consumeState(_refreshAllMailboxInteractor.execute(accountId, currentMailboxState!));
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
|
import 'package:core/core.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
@@ -38,6 +39,7 @@ class EmailCacheManager {
|
|||||||
|
|
||||||
Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed}) async {
|
Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed}) async {
|
||||||
final emailCacheExist = await _emailCacheClient.isExistTable();
|
final emailCacheExist = await _emailCacheClient.isExistTable();
|
||||||
|
log('EmailCacheManager::update(): emailCacheExist: $emailCacheExist');
|
||||||
if (emailCacheExist) {
|
if (emailCacheExist) {
|
||||||
final updatedCacheEmails = updated
|
final updatedCacheEmails = updated
|
||||||
?.map((email) => email.toEmailCache()).toList() ?? <EmailCache>[];
|
?.map((email) => email.toEmailCache()).toList() ?? <EmailCache>[];
|
||||||
@@ -45,6 +47,9 @@ class EmailCacheManager {
|
|||||||
?.map((email) => email.toEmailCache()).toList() ?? <EmailCache>[];
|
?.map((email) => email.toEmailCache()).toList() ?? <EmailCache>[];
|
||||||
final destroyedCacheEmails = destroyed
|
final destroyedCacheEmails = destroyed
|
||||||
?.map((emailId) => emailId.id.value).toList() ?? <String>[];
|
?.map((emailId) => emailId.id.value).toList() ?? <String>[];
|
||||||
|
|
||||||
|
log('EmailCacheManager::update(): destroyedCacheEmails: ${destroyedCacheEmails.length}');
|
||||||
|
|
||||||
await Future.wait([
|
await Future.wait([
|
||||||
_emailCacheClient.updateMultipleItem(updatedCacheEmails.toMap()),
|
_emailCacheClient.updateMultipleItem(updatedCacheEmails.toMap()),
|
||||||
_emailCacheClient.insertMultipleItem(createdCacheEmails.toMap()),
|
_emailCacheClient.insertMultipleItem(createdCacheEmails.toMap()),
|
||||||
|
|||||||
@@ -7,8 +7,12 @@ import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart';
|
||||||
@@ -22,8 +26,9 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
|
|
||||||
final Map<DataSourceType, ThreadDataSource> mapDataSource;
|
final Map<DataSourceType, ThreadDataSource> mapDataSource;
|
||||||
final StateDataSource stateDataSource;
|
final StateDataSource stateDataSource;
|
||||||
|
final EmailDataSource emailDataSource;
|
||||||
|
|
||||||
ThreadRepositoryImpl(this.mapDataSource, this.stateDataSource);
|
ThreadRepositoryImpl(this.mapDataSource, this.stateDataSource, this.emailDataSource);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<EmailsResponse> getAllEmail(
|
Stream<EmailsResponse> getAllEmail(
|
||||||
@@ -44,6 +49,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
filterOption: emailFilter?.filterOption),
|
filterOption: emailFilter?.filterOption),
|
||||||
stateDataSource.getState(StateType.email)
|
stateDataSource.getState(StateType.email)
|
||||||
]).then((List response) {
|
]).then((List response) {
|
||||||
|
log('ThreadRepositoryImpl::getAllEmail(): localEmail: ${response.first}');
|
||||||
return EmailsResponse(emailList: response.first, state: response.last);
|
return EmailsResponse(emailList: response.first, state: response.last);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -319,4 +325,52 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
|
|
||||||
yield newEmailResponse;
|
yield newEmailResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> emptyTrashFolder(AccountId accountId, MailboxId trashMailboxId) async {
|
||||||
|
var finalResult = true;
|
||||||
|
var hasEmails = true;
|
||||||
|
|
||||||
|
while (hasEmails) {
|
||||||
|
Email? lastEmail;
|
||||||
|
|
||||||
|
final emailsResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
|
||||||
|
accountId,
|
||||||
|
sort: Set()
|
||||||
|
..add(EmailComparator(EmailComparatorProperty.receivedAt)
|
||||||
|
..setIsAscending(false)),
|
||||||
|
filter: EmailFilterCondition(inMailbox: trashMailboxId, before: lastEmail?.receivedAt),
|
||||||
|
properties: Properties({EmailProperty.id}));
|
||||||
|
|
||||||
|
if (emailsResponse.state != null) {
|
||||||
|
await _updateState(emailsResponse.state!);
|
||||||
|
}
|
||||||
|
|
||||||
|
var newEmailList = emailsResponse.emailList ?? <Email>[];
|
||||||
|
if (lastEmail != null) {
|
||||||
|
newEmailList = newEmailList.where((email) => email.id != lastEmail!.id).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
log('ThreadRepositoryImpl::emptyTrashFolder(): ${newEmailList.length}');
|
||||||
|
|
||||||
|
if (newEmailList.isNotEmpty == true) {
|
||||||
|
lastEmail = newEmailList.last;
|
||||||
|
hasEmails = true;
|
||||||
|
final emailIds = newEmailList.map((email) => email.id).toList();
|
||||||
|
|
||||||
|
final listEmailIdDeleted = await emailDataSource.deleteMultipleEmailsPermanently(accountId, emailIds);
|
||||||
|
|
||||||
|
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == emailIds.length) {
|
||||||
|
await _updateEmailCache(newDestroyed: listEmailIdDeleted);
|
||||||
|
finalResult = true;
|
||||||
|
} else {
|
||||||
|
finalResult = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hasEmails = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return finalResult;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -64,4 +64,6 @@ abstract class ThreadRepository {
|
|||||||
Properties? properties,
|
Properties? properties,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Future<bool> emptyTrashFolder(AccountId accountId, MailboxId trashMailboxId);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import 'package:core/core.dart';
|
||||||
|
|
||||||
|
class EmptyTrashFolderSuccess extends UIState {
|
||||||
|
|
||||||
|
EmptyTrashFolderSuccess();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EmptyTrashFolderFailure extends FeatureFailure {
|
||||||
|
final exception;
|
||||||
|
|
||||||
|
EmptyTrashFolderFailure(this.exception);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [exception];
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
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/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
|
||||||
|
|
||||||
|
class EmptyTrashFolderInteractor {
|
||||||
|
final ThreadRepository threadRepository;
|
||||||
|
|
||||||
|
EmptyTrashFolderInteractor(this.threadRepository);
|
||||||
|
|
||||||
|
Stream<Either<Failure, Success>> execute(AccountId accountId, MailboxId trashMailboxId) async* {
|
||||||
|
try {
|
||||||
|
yield Right<Failure, Success>(LoadingState());
|
||||||
|
|
||||||
|
final result = await threadRepository.emptyTrashFolder(accountId, trashMailboxId);
|
||||||
|
if (result) {
|
||||||
|
yield Right<Failure, Success>(EmptyTrashFolderSuccess());
|
||||||
|
} else {
|
||||||
|
yield Left<Failure, Success>(EmptyTrashFolderFailure(null));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
yield Left<Failure, Success>(EmptyTrashFolderFailure(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dar
|
|||||||
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
|
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/data/repository/thread_repository_impl.dart';
|
import 'package:tmail_ui_user/features/thread/data/repository/thread_repository_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/usecases/empty_trash_folder_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
||||||
@@ -57,6 +58,7 @@ class ThreadBindings extends BaseBindings {
|
|||||||
Get.find<SearchMoreEmailInteractor>(),
|
Get.find<SearchMoreEmailInteractor>(),
|
||||||
Get.find<MoveMultipleEmailToTrashInteractor>(),
|
Get.find<MoveMultipleEmailToTrashInteractor>(),
|
||||||
Get.find<DeleteMultipleEmailsPermanentlyInteractor>(),
|
Get.find<DeleteMultipleEmailsPermanentlyInteractor>(),
|
||||||
|
Get.find<EmptyTrashFolderInteractor>(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +98,7 @@ class ThreadBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => SearchMoreEmailInteractor(Get.find<ThreadRepository>()));
|
Get.lazyPut(() => SearchMoreEmailInteractor(Get.find<ThreadRepository>()));
|
||||||
Get.lazyPut(() => MoveMultipleEmailToTrashInteractor(Get.find<EmailRepository>()));
|
Get.lazyPut(() => MoveMultipleEmailToTrashInteractor(Get.find<EmailRepository>()));
|
||||||
Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find<EmailRepository>()));
|
Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find<EmailRepository>()));
|
||||||
|
Get.lazyPut(() => EmptyTrashFolderInteractor(Get.find<ThreadRepository>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -111,7 +114,8 @@ class ThreadBindings extends BaseBindings {
|
|||||||
DataSourceType.network: Get.find<ThreadDataSource>(),
|
DataSourceType.network: Get.find<ThreadDataSource>(),
|
||||||
DataSourceType.local: Get.find<LocalThreadDataSourceImpl>()
|
DataSourceType.local: Get.find<LocalThreadDataSourceImpl>()
|
||||||
},
|
},
|
||||||
Get.find<StateDataSource>()
|
Get.find<StateDataSource>(),
|
||||||
|
Get.find<EmailDataSource>(),
|
||||||
));
|
));
|
||||||
Get.lazyPut(() => EmailRepositoryImpl(
|
Get.lazyPut(() => EmailRepositoryImpl(
|
||||||
Get.find<EmailDataSource>(),
|
Get.find<EmailDataSource>(),
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_da
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_action.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_action.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
|
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||||
@@ -47,6 +48,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_t
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
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/domain/state/search_more_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/usecases/empty_trash_folder_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
||||||
@@ -83,6 +85,7 @@ class ThreadController extends BaseController {
|
|||||||
final SearchMoreEmailInteractor _searchMoreEmailInteractor;
|
final SearchMoreEmailInteractor _searchMoreEmailInteractor;
|
||||||
final MoveMultipleEmailToTrashInteractor _moveMultipleEmailToTrashInteractor;
|
final MoveMultipleEmailToTrashInteractor _moveMultipleEmailToTrashInteractor;
|
||||||
final DeleteMultipleEmailsPermanentlyInteractor _deleteMultipleEmailsPermanentlyInteractor;
|
final DeleteMultipleEmailsPermanentlyInteractor _deleteMultipleEmailsPermanentlyInteractor;
|
||||||
|
final EmptyTrashFolderInteractor _emptyTrashFolderInteractor;
|
||||||
|
|
||||||
final emailList = <PresentationEmail>[].obs;
|
final emailList = <PresentationEmail>[].obs;
|
||||||
final emailListSearch = <PresentationEmail>[].obs;
|
final emailListSearch = <PresentationEmail>[].obs;
|
||||||
@@ -118,6 +121,7 @@ class ThreadController extends BaseController {
|
|||||||
this._searchMoreEmailInteractor,
|
this._searchMoreEmailInteractor,
|
||||||
this._moveMultipleEmailToTrashInteractor,
|
this._moveMultipleEmailToTrashInteractor,
|
||||||
this._deleteMultipleEmailsPermanentlyInteractor,
|
this._deleteMultipleEmailsPermanentlyInteractor,
|
||||||
|
this._emptyTrashFolderInteractor,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -214,6 +218,8 @@ class ThreadController extends BaseController {
|
|||||||
} else if (failure is MarkAsStarMultipleEmailAllFailure
|
} else if (failure is MarkAsStarMultipleEmailAllFailure
|
||||||
|| failure is MarkAsStarMultipleEmailFailure) {
|
|| failure is MarkAsStarMultipleEmailFailure) {
|
||||||
_markAsStarMultipleEmailFailure(failure);
|
_markAsStarMultipleEmailFailure(failure);
|
||||||
|
} else if (failure is EmptyTrashFolderFailure) {
|
||||||
|
_emptyTrashFolderFailure(failure);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
(success) {
|
(success) {
|
||||||
@@ -234,6 +240,8 @@ class ThreadController extends BaseController {
|
|||||||
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess
|
||||||
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
|
|| success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
|
||||||
_deleteMultipleEmailsPermanentlySuccess(success);
|
_deleteMultipleEmailsPermanentlySuccess(success);
|
||||||
|
} else if (success is EmptyTrashFolderSuccess) {
|
||||||
|
_emptyTrashFolderSuccess(success);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -272,6 +280,10 @@ class ThreadController extends BaseController {
|
|||||||
final emailsAfterChanges = success.emailList;
|
final emailsAfterChanges = success.emailList;
|
||||||
final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges);
|
final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges);
|
||||||
emailList.value = newListEmail;
|
emailList.value = newListEmail;
|
||||||
|
|
||||||
|
if (emailList.isEmpty) {
|
||||||
|
refreshAllEmail();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _getAllEmailAction(AccountId accountId, {MailboxId? mailboxId}) {
|
void _getAllEmailAction(AccountId accountId, {MailboxId? mailboxId}) {
|
||||||
@@ -856,6 +868,7 @@ class ThreadController extends BaseController {
|
|||||||
|
|
||||||
switch(actionType) {
|
switch(actionType) {
|
||||||
case DeleteActionType.all:
|
case DeleteActionType.all:
|
||||||
|
_emptyTrashFolderAction();
|
||||||
break;
|
break;
|
||||||
case DeleteActionType.multiple:
|
case DeleteActionType.multiple:
|
||||||
_deleteMultipleEmailsPermanently(listEmailSelected);
|
_deleteMultipleEmailsPermanently(listEmailSelected);
|
||||||
@@ -868,10 +881,9 @@ class ThreadController extends BaseController {
|
|||||||
void _deleteMultipleEmailsPermanently(List<PresentationEmail> emailList) {
|
void _deleteMultipleEmailsPermanently(List<PresentationEmail> emailList) {
|
||||||
cancelSelectEmail();
|
cancelSelectEmail();
|
||||||
|
|
||||||
final session = mailboxDashBoardController.sessionCurrent;
|
|
||||||
final listEmailIds = emailList.map((email) => email.id).toList();
|
final listEmailIds = emailList.map((email) => email.id).toList();
|
||||||
if (session != null && _accountId != null && listEmailIds.isNotEmpty) {
|
if ( _accountId != null && listEmailIds.isNotEmpty) {
|
||||||
consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute(session, _accountId!, listEmailIds));
|
consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute(_accountId!, listEmailIds));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -896,6 +908,35 @@ class ThreadController extends BaseController {
|
|||||||
_refreshEmailChanges();
|
_refreshEmailChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _emptyTrashFolderAction() {
|
||||||
|
cancelSelectEmail();
|
||||||
|
|
||||||
|
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash];
|
||||||
|
log('ThreadController::_emptyTrashFolderAction(): trashMailboxId: $trashMailboxId');
|
||||||
|
if (_accountId != null && trashMailboxId != null) {
|
||||||
|
consumeState(_emptyTrashFolderInteractor.execute(_accountId!, trashMailboxId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _emptyTrashFolderSuccess(EmptyTrashFolderSuccess success) {
|
||||||
|
mailboxDashBoardController.dispatchState(Right(success));
|
||||||
|
|
||||||
|
if (currentContext != null && currentOverlayContext != null) {
|
||||||
|
_appToast.showToastWithIcon(
|
||||||
|
currentOverlayContext!,
|
||||||
|
widthToast: _responsiveUtils.isDesktop(currentContext!) ? 360 : null,
|
||||||
|
message: AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success,
|
||||||
|
icon: _imagePaths.icDeleteToast);
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshAllEmail();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _emptyTrashFolderFailure(EmptyTrashFolderFailure failure) {
|
||||||
|
mailboxDashBoardController.dispatchState(Left(failure));
|
||||||
|
refreshAllEmail();
|
||||||
|
}
|
||||||
|
|
||||||
void openMailboxLeftMenu() {
|
void openMailboxLeftMenu() {
|
||||||
mailboxDashBoardController.openDrawer();
|
mailboxDashBoardController.openDrawer();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
|
|||||||
child: _buildHeader(context)),
|
child: _buildHeader(context)),
|
||||||
_buildSearchInputFormForMobile(context),
|
_buildSearchInputFormForMobile(context),
|
||||||
_buildSearchButtonViewForMobile(context),
|
_buildSearchButtonViewForMobile(context),
|
||||||
|
Obx(() => controller.isMailboxTrash && controller.emailList.isNotEmpty && !controller.isSearchActive()
|
||||||
|
? _buildEmptyTrashButton(context)
|
||||||
|
: SizedBox.shrink()),
|
||||||
Expanded(child: Container(
|
Expanded(child: Container(
|
||||||
color: AppColor.colorBgDesktop,
|
color: AppColor.colorBgDesktop,
|
||||||
margin: _responsiveUtils.isDesktop(context) ? EdgeInsets.all(16) : EdgeInsets.zero,
|
margin: _responsiveUtils.isDesktop(context) ? EdgeInsets.all(16) : EdgeInsets.zero,
|
||||||
@@ -472,11 +475,11 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
|
|||||||
(success) {
|
(success) {
|
||||||
if (controller.isSearchActive()) {
|
if (controller.isSearchActive()) {
|
||||||
return success is SearchingState
|
return success is SearchingState
|
||||||
? Padding(padding: EdgeInsets.only(top: 16), child: _loadingWidget)
|
? Padding(padding: EdgeInsets.symmetric(vertical: 16), child: _loadingWidget)
|
||||||
: SizedBox.shrink();
|
: SizedBox.shrink();
|
||||||
} else {
|
} else {
|
||||||
return success is LoadingState
|
return success is LoadingState
|
||||||
? Padding(padding: EdgeInsets.only(top: 16), child: _loadingWidget)
|
? Padding(padding: EdgeInsets.symmetric(vertical: 16), child: _loadingWidget)
|
||||||
: SizedBox.shrink();
|
: SizedBox.shrink();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
@@ -630,7 +633,7 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
|
|||||||
return controller.emailListSearch.length > 0
|
return controller.emailListSearch.length > 0
|
||||||
? Container(
|
? Container(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
margin: EdgeInsets.zero,
|
margin: EdgeInsets.only(bottom: 16),
|
||||||
padding: EdgeInsets.symmetric(vertical: 12, horizontal: 24),
|
padding: EdgeInsets.symmetric(vertical: 12, horizontal: 24),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: _responsiveUtils.isDesktop(context)
|
borderRadius: _responsiveUtils.isDesktop(context)
|
||||||
@@ -647,4 +650,41 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildEmptyTrashButton(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(14)),
|
||||||
|
border: Border.all(color: AppColor.colorLineLeftEmailView),
|
||||||
|
color: Colors.white),
|
||||||
|
margin: EdgeInsets.only(left: 16, right: 16,
|
||||||
|
bottom: _responsiveUtils.isDesktop(context) ? 0 : 16,
|
||||||
|
top: _responsiveUtils.isDesktop(context) ? 16 : 0),
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||||
|
child: Row(children: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(right: 16),
|
||||||
|
child: SvgPicture.asset(_imagePaths.icDeleteTrash, fit: BoxFit.fill)),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(left: 8),
|
||||||
|
child: Text(
|
||||||
|
AppLocalizations.of(context).message_delete_all_email_in_trash_button,
|
||||||
|
style: TextStyle(color: AppColor.colorContentEmail, fontSize: 13, fontWeight: FontWeight.w500))),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => controller.deleteEmailsPermanently(context, DeleteActionType.all),
|
||||||
|
child: Text(
|
||||||
|
AppLocalizations.of(context).empty_trash_now,
|
||||||
|
style: TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorTextButton)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"@@last_modified": "2022-03-31T18:18:59.491193",
|
"@@last_modified": "2022-04-05T16:53:32.520037",
|
||||||
"initializing_data": "Initializing data...",
|
"initializing_data": "Initializing data...",
|
||||||
"@initializing_data": {
|
"@initializing_data": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
@@ -923,5 +923,91 @@
|
|||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders_order": [],
|
"placeholders_order": [],
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"message_delete_all_email_in_trash_button": "All messages in Trash will be deleted if you reach limited storage.",
|
||||||
|
"@message_delete_all_email_in_trash_button": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"empty_trash_now": "Empty trash now",
|
||||||
|
"@empty_trash_now": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"empty_trash_folder": "Empty trash folder",
|
||||||
|
"@empty_trash_folder": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"empty_trash_dialog_message": "You are about to permanently delete all items in Trash . Do you want to continue?",
|
||||||
|
"@empty_trash_dialog_message": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"delete_all": "Delete all",
|
||||||
|
"@delete_all": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"toast_message_delete_multiple_email_permanently_success": "{count} Messages has been deleted forever",
|
||||||
|
"@toast_message_delete_multiple_email_permanently_success": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [
|
||||||
|
"count"
|
||||||
|
],
|
||||||
|
"placeholders": {
|
||||||
|
"count": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toast_message_delete_a_email_permanently_success": "Message has been deleted forever",
|
||||||
|
"@toast_message_delete_a_email_permanently_success": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"delete_permanently": "Delete permanently",
|
||||||
|
"@delete_permanently": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"delete_messages_forever": "Delete messages forever",
|
||||||
|
"@delete_messages_forever": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"delete_message_forever": "Delete message forever",
|
||||||
|
"@delete_message_forever": {
|
||||||
|
"type": "text",
|
||||||
|
"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": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [
|
||||||
|
"count"
|
||||||
|
],
|
||||||
|
"placeholders": {
|
||||||
|
"count": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"delete_single_message_dialog": "You are about to permanently delete this message. Do you want to continue?",
|
||||||
|
"@delete_single_message_dialog": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"toast_message_empty_trash_folder_success": "All messages has been deleted forever",
|
||||||
|
"@toast_message_empty_trash_folder_success": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1017,7 +1017,8 @@ class AppLocalizations {
|
|||||||
String toast_message_delete_multiple_email_permanently_success(int count) {
|
String toast_message_delete_multiple_email_permanently_success(int count) {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
'$count Messages has been deleted forever',
|
'$count Messages has been deleted forever',
|
||||||
name: 'toast_message_delete_multiple_email_permanently_success');
|
name: 'toast_message_delete_multiple_email_permanently_success',
|
||||||
|
args: [count]);
|
||||||
}
|
}
|
||||||
|
|
||||||
String get toast_message_delete_a_email_permanently_success {
|
String get toast_message_delete_a_email_permanently_success {
|
||||||
@@ -1047,7 +1048,8 @@ class AppLocalizations {
|
|||||||
String delete_multiple_messages_dialog(int count) {
|
String delete_multiple_messages_dialog(int count) {
|
||||||
return Intl.message(
|
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 Trash . Do you want to continue?',
|
||||||
name: 'delete_multiple_messages_dialog');
|
name: 'delete_multiple_messages_dialog',
|
||||||
|
args: [count]);
|
||||||
}
|
}
|
||||||
|
|
||||||
String get delete_single_message_dialog {
|
String get delete_single_message_dialog {
|
||||||
@@ -1055,4 +1057,10 @@ class AppLocalizations {
|
|||||||
'You are about to permanently delete this message. Do you want to continue?',
|
'You are about to permanently delete this message. Do you want to continue?',
|
||||||
name: 'delete_single_message_dialog');
|
name: 'delete_single_message_dialog');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String get toast_message_empty_trash_folder_success {
|
||||||
|
return Intl.message(
|
||||||
|
'All messages has been deleted forever',
|
||||||
|
name: 'toast_message_empty_trash_folder_success');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user