diff --git a/lib/features/thread/data/datasource/thread_datasource.dart b/lib/features/thread/data/datasource/thread_datasource.dart index 0a466f6b2..51b6b82fa 100644 --- a/lib/features/thread/data/datasource/thread_datasource.dart +++ b/lib/features/thread/data/datasource/thread_datasource.dart @@ -1,7 +1,5 @@ import 'dart:async'; -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; @@ -13,7 +11,6 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; -import 'package:dartz/dartz.dart' as dartz; abstract class ThreadDataSource { Future getAllEmail( @@ -42,7 +39,6 @@ abstract class ThreadDataSource { Future> emptyTrashFolder( AccountId accountId, MailboxId mailboxId, - Future Function(State state) updateState, Future Function(List? newDestroyed) updateDestroyedEmailCache, ); } \ No newline at end of file diff --git a/lib/features/thread/data/datasource_impl/local_thread_datasource_impl.dart b/lib/features/thread/data/datasource_impl/local_thread_datasource_impl.dart index 46d0c075f..d089b1666 100644 --- a/lib/features/thread/data/datasource_impl/local_thread_datasource_impl.dart +++ b/lib/features/thread/data/datasource_impl/local_thread_datasource_impl.dart @@ -1,8 +1,5 @@ import 'dart:async'; -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:dartz/dartz.dart' as dartz; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; @@ -67,7 +64,11 @@ class LocalThreadDataSourceImpl extends ThreadDataSource { } @override - Future> emptyTrashFolder(AccountId accountId, MailboxId mailboxId, Future Function(State state) updateState, Future Function(List? newDestroyed) updateDestroyedEmailCache) { + Future> emptyTrashFolder( + AccountId accountId, + MailboxId mailboxId, + Future Function(List? newDestroyed) updateDestroyedEmailCache + ) { throw UnimplementedError(); } } \ No newline at end of file diff --git a/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart b/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart index edcbc9976..721aeb133 100644 --- a/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart +++ b/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart @@ -1,8 +1,5 @@ import 'dart:async'; -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:dartz/dartz.dart' as dartz; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; @@ -78,12 +75,11 @@ class ThreadDataSourceImpl extends ThreadDataSource { } @override - Future> emptyTrashFolder(AccountId accountId, MailboxId mailboxId, Future Function(State state) updateState, Future Function(List? newDestroyed) updateDestroyedEmailCache) { + Future> emptyTrashFolder(AccountId accountId, MailboxId mailboxId, Future Function(List? newDestroyed) updateDestroyedEmailCache) { return Future.sync(() async { return await _threadIsolateWorker.emptyTrashFolder( accountId, mailboxId, - updateState, updateDestroyedEmailCache, ); }).catchError((error) { diff --git a/lib/features/thread/data/network/thread_isolate_worker.dart b/lib/features/thread/data/network/thread_isolate_worker.dart index f059307f0..445641df5 100644 --- a/lib/features/thread/data/network/thread_isolate_worker.dart +++ b/lib/features/thread/data/network/thread_isolate_worker.dart @@ -4,7 +4,6 @@ import 'package:core/utils/app_logger.dart'; import 'package:core/utils/build_utils.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; -import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; @@ -27,19 +26,15 @@ class ThreadIsolateWorker { Future> emptyTrashFolder( AccountId accountId, MailboxId mailboxId, - Future Function(State state) updateState, Future Function(List? newDestroyed) updateDestroyedEmailCache, ) async { if (BuildUtils.isWeb) { - return _emptyTrashFolderOnWeb(accountId, mailboxId, updateState, updateDestroyedEmailCache); + return _emptyTrashFolderOnWeb(accountId, mailboxId, updateDestroyedEmailCache); } else { final result = await _isolateExecutor.execute( arg1: EmptyTrashFolderArguments(_threadAPI, _emailAPI, accountId, mailboxId), fun1: _emptyTrashFolderAction, notification: (value) { - if(value is State) { - updateState.call(value); - } if (value is List) { updateDestroyedEmailCache.call(value); log('ThreadIsolateWorker::emptyTrashFolder(): onUpdateProgress: PERCENT ${value.length}'); @@ -64,10 +59,6 @@ class ThreadIsolateWorker { filter: EmailFilterCondition(inMailbox: args.trashMailboxId, before: lastEmail?.receivedAt), properties: Properties({EmailProperty.id})); - if (emailsResponse.state != null) { - sendPort.send(emailsResponse.state!); - } - var newEmailList = emailsResponse.emailList ?? []; if (lastEmail != null) { newEmailList = newEmailList.where((email) => email.id != lastEmail!.id).toList(); @@ -102,7 +93,6 @@ class ThreadIsolateWorker { Future> _emptyTrashFolderOnWeb( AccountId accountId, MailboxId trashMailboxId, - Future Function(State state) updateState, Future Function(List newDestroyed) updateDestroyedEmailCache, ) async { List emailListCompleted = List.empty(growable: true); @@ -119,10 +109,6 @@ class ThreadIsolateWorker { filter: EmailFilterCondition(inMailbox: trashMailboxId, before: lastEmail?.receivedAt), properties: Properties({EmailProperty.id})); - if (emailsResponse.state != null) { - await updateState.call(emailsResponse.state!); - } - var newEmailList = emailsResponse.emailList ?? []; if (lastEmail != null) { newEmailList = newEmailList.where((email) => email.id != lastEmail!.id).toList(); diff --git a/lib/features/thread/data/repository/thread_repository_impl.dart b/lib/features/thread/data/repository/thread_repository_impl.dart index eda48eaa9..22f4b19f6 100644 --- a/lib/features/thread/data/repository/thread_repository_impl.dart +++ b/lib/features/thread/data/repository/thread_repository_impl.dart @@ -9,9 +9,6 @@ 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/unsigned_int.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:model/model.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; @@ -299,46 +296,13 @@ class ThreadRepositoryImpl extends ThreadRepository { } @override - Future 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: {} - ..add(EmailComparator(EmailComparatorProperty.receivedAt) - ..setIsAscending(false)), - filter: EmailFilterCondition(inMailbox: trashMailboxId, before: lastEmail?.receivedAt), - properties: Properties({EmailProperty.id})); - - var newEmailList = emailsResponse.emailList ?? []; - 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; + Future> emptyTrashFolder(AccountId accountId, MailboxId trashMailboxId) async { + return mapDataSource[DataSourceType.network]!.emptyTrashFolder( + accountId, + trashMailboxId, + (listEmailIdDeleted) async { + await _updateEmailCache(newDestroyed: listEmailIdDeleted); + }, + ); } } \ No newline at end of file diff --git a/lib/features/thread/domain/usecases/empty_trash_folder_interactor.dart b/lib/features/thread/domain/usecases/empty_trash_folder_interactor.dart index 79c336a83..d74ea460f 100644 --- a/lib/features/thread/domain/usecases/empty_trash_folder_interactor.dart +++ b/lib/features/thread/domain/usecases/empty_trash_folder_interactor.dart @@ -31,7 +31,7 @@ class EmptyTrashFolderInteractor { final currentEmailState = listState.last; final result = await threadRepository.emptyTrashFolder(accountId, trashMailboxId); - if (result) { + if (result.isNotEmpty) { yield Right(EmptyTrashFolderSuccess( currentMailboxState: currentMailboxState, currentEmailState: currentEmailState, diff --git a/lib/features/thread/presentation/thread_bindings.dart b/lib/features/thread/presentation/thread_bindings.dart index 84260e4f6..476d71278 100644 --- a/lib/features/thread/presentation/thread_bindings.dart +++ b/lib/features/thread/presentation/thread_bindings.dart @@ -29,6 +29,7 @@ import 'package:tmail_ui_user/features/thread/data/datasource_impl/local_thread_ import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; +import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.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/usecases/empty_trash_folder_interactor.dart'; @@ -76,7 +77,7 @@ class ThreadBindings extends BaseBindings { void bindingsDataSourceImpl() { Get.lazyPut(() => MailboxDataSourceImpl(Get.find(), Get.find())); Get.lazyPut(() => MailboxCacheDataSourceImpl(Get.find())); - Get.lazyPut(() => ThreadDataSourceImpl(Get.find())); + Get.lazyPut(() => ThreadDataSourceImpl(Get.find(), Get.find())); Get.lazyPut(() => LocalThreadDataSourceImpl(Get.find())); Get.lazyPut(() => StateDataSourceImpl(Get.find())); Get.lazyPut(() => EmailDataSourceImpl(Get.find())); diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 66bd0d33d..9e15adce4 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -71,8 +71,6 @@ import 'package:tmail_ui_user/features/thread/presentation/model/search_status.d import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; -import 'package:tmail_ui_user/main/utils/binding_tag.dart'; -import 'package:worker_manager/worker_manager.dart'; class ThreadController extends BaseController { @@ -80,7 +78,6 @@ class ThreadController extends BaseController { final _imagePaths = Get.find(); final _responsiveUtils = Get.find(); final _appToast = Get.find(); - final Executor _isolateExecutor = Get.find(tag: BindingTag.threadExecutor); final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor; final MarkAsMultipleEmailReadInteractor _markAsMultipleEmailReadInteractor; @@ -144,7 +141,6 @@ class ThreadController extends BaseController { @override void onInit() { _initWorker(); - _initializeIsolateExecutor(); super.onInit(); } @@ -157,7 +153,6 @@ class ThreadController extends BaseController { @override void onClose() { listEmailController.dispose(); - _isolateExecutor.dispose(); _clearWorker(); super.onClose(); } @@ -320,14 +315,6 @@ class ThreadController extends BaseController { }); } - void _initializeIsolateExecutor() async { - try { - await _isolateExecutor.warmUp(); - } catch(e) { - log('ThreadController::_initializeIsolateExecutor(): exception: $e'); - } - } - void _clearWorker() { mailboxWorker.call(); dashboardActionWorker.call(); diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index e6fc61eb4..00eaec1aa 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -21,7 +21,6 @@ import 'package:tmail_ui_user/features/manage_account/data/network/manage_accoun import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart'; -import 'package:tmail_ui_user/main/utils/binding_tag.dart'; import 'package:worker_manager/worker_manager.dart'; class NetworkBindings extends Bindings { @@ -93,12 +92,11 @@ class NetworkBindings extends Bindings { } void _bindingIsolateWorker() { - Get.put(Executor(), tag: BindingTag.threadExecutor); + Get.put(Executor()); Get.put(ThreadIsolateWorker( Get.find(), Get.find(), - Get.find(tag: BindingTag.threadExecutor))); - Get.put(Executor()); + Get.find())); Get.put(MailboxIsolateWorker( Get.find(), Get.find(), diff --git a/lib/main/utils/binding_tag.dart b/lib/main/utils/binding_tag.dart deleted file mode 100644 index 1c35ce841..000000000 --- a/lib/main/utils/binding_tag.dart +++ /dev/null @@ -1,4 +0,0 @@ - -class BindingTag { - static const String threadExecutor = '#ThreadExecutor' ; -} \ No newline at end of file diff --git a/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart b/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart index dc82f464a..3eac6cc39 100644 --- a/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart +++ b/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart @@ -1,7 +1,8 @@ -// Mocks generated by Mockito 5.0.17 from annotations +// Mocks generated by Mockito 5.2.0 from annotations // in tmail_ui_user/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart. // Do not manually edit this file. +// ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i3; import 'package:jmap_dart_client/jmap/account_id.dart' as _i5; @@ -24,6 +25,7 @@ import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dar import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart' as _i2; +// ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references @@ -105,9 +107,10 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository { returnValue: Future>.value(<_i14.Email>[])) as _i3.Future>); @override - _i3.Future emptyTrashFolder( + _i3.Future> emptyTrashFolder( _i5.AccountId? accountId, _i11.MailboxId? trashMailboxId) => (super.noSuchMethod( - Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]), - returnValue: Future.value(false)) as _i3.Future); + Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]), + returnValue: Future>.value(<_i14.EmailId>[])) + as _i3.Future>); } diff --git a/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart b/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart index b2a94e9d3..c1b487099 100644 --- a/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart +++ b/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart @@ -1,7 +1,8 @@ -// Mocks generated by Mockito 5.0.17 from annotations +// Mocks generated by Mockito 5.2.0 from annotations // in tmail_ui_user/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart. // Do not manually edit this file. +// ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i3; import 'package:jmap_dart_client/jmap/account_id.dart' as _i5; @@ -24,6 +25,7 @@ import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dar import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart' as _i2; +// ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references @@ -105,9 +107,10 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository { returnValue: Future>.value(<_i14.Email>[])) as _i3.Future>); @override - _i3.Future emptyTrashFolder( + _i3.Future> emptyTrashFolder( _i5.AccountId? accountId, _i11.MailboxId? trashMailboxId) => (super.noSuchMethod( - Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]), - returnValue: Future.value(false)) as _i3.Future); + Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]), + returnValue: Future>.value(<_i14.EmailId>[])) + as _i3.Future>); }