TF-695: implement isolate for empty trash
This commit is contained in:
@@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_b
|
|||||||
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
|
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart';
|
||||||
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/network/thread_isolate_worker.dart';
|
||||||
|
|
||||||
class DestinationPickerBindings extends BaseBindings {
|
class DestinationPickerBindings extends BaseBindings {
|
||||||
|
|
||||||
@@ -58,7 +59,7 @@ class DestinationPickerBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => MailboxCacheDataSourceImpl(Get.find<MailboxCacheManager>()));
|
Get.lazyPut(() => MailboxCacheDataSourceImpl(Get.find<MailboxCacheManager>()));
|
||||||
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>()));
|
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>()));
|
||||||
Get.lazyPut(() => EmailDataSourceImpl(Get.find<EmailAPI>()));
|
Get.lazyPut(() => EmailDataSourceImpl(Get.find<EmailAPI>()));
|
||||||
Get.lazyPut(() => ThreadDataSourceImpl(Get.find<ThreadAPI>()));
|
Get.lazyPut(() => ThreadDataSourceImpl(Get.find<ThreadAPI>(), Get.find<ThreadIsolateWorker>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_na
|
|||||||
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
|
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart';
|
||||||
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/network/thread_isolate_worker.dart';
|
||||||
|
|
||||||
class MailboxBindings extends BaseBindings {
|
class MailboxBindings extends BaseBindings {
|
||||||
|
|
||||||
@@ -73,7 +74,7 @@ class MailboxBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => MailboxCacheDataSourceImpl(Get.find<MailboxCacheManager>()));
|
Get.lazyPut(() => MailboxCacheDataSourceImpl(Get.find<MailboxCacheManager>()));
|
||||||
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>()));
|
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>()));
|
||||||
Get.lazyPut(() => EmailDataSourceImpl(Get.find<EmailAPI>()));
|
Get.lazyPut(() => EmailDataSourceImpl(Get.find<EmailAPI>()));
|
||||||
Get.lazyPut(() => ThreadDataSourceImpl(Get.find<ThreadAPI>()));
|
Get.lazyPut(() => ThreadDataSourceImpl(Get.find<ThreadAPI>(), Get.find<ThreadIsolateWorker>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
+2
-1
@@ -80,6 +80,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/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/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_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/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/presentation/thread_bindings.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/thread_bindings.dart';
|
||||||
@@ -138,7 +139,7 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.find<DioClient>()
|
Get.find<DioClient>()
|
||||||
));
|
));
|
||||||
Get.lazyPut(() => SearchDataSourceImpl(Get.find<RecentSearchCacheClient>()));
|
Get.lazyPut(() => SearchDataSourceImpl(Get.find<RecentSearchCacheClient>()));
|
||||||
Get.lazyPut(() => ThreadDataSourceImpl(Get.find<ThreadAPI>()));
|
Get.lazyPut(() => ThreadDataSourceImpl(Get.find<ThreadAPI>(), Get.find<ThreadIsolateWorker>()));
|
||||||
Get.lazyPut(() => LocalThreadDataSourceImpl(Get.find<EmailCacheManager>()));
|
Get.lazyPut(() => LocalThreadDataSourceImpl(Get.find<EmailCacheManager>()));
|
||||||
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>()));
|
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>()));
|
||||||
Get.lazyPut(() => MailboxDataSourceImpl(Get.find<MailboxAPI>(), Get.find<MailboxIsolateWorker>()));
|
Get.lazyPut(() => MailboxDataSourceImpl(Get.find<MailboxAPI>(), Get.find<MailboxIsolateWorker>()));
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
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/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
@@ -9,6 +13,7 @@ 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/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/email_response.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
||||||
|
import 'package:dartz/dartz.dart' as dartz;
|
||||||
|
|
||||||
abstract class ThreadDataSource {
|
abstract class ThreadDataSource {
|
||||||
Future<EmailsResponse> getAllEmail(
|
Future<EmailsResponse> getAllEmail(
|
||||||
@@ -33,4 +38,11 @@ abstract class ThreadDataSource {
|
|||||||
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption});
|
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption});
|
||||||
|
|
||||||
Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed});
|
Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed});
|
||||||
|
|
||||||
|
Future<List<EmailId>> emptyTrashFolder(
|
||||||
|
AccountId accountId,
|
||||||
|
MailboxId mailboxId,
|
||||||
|
Future<void> Function(State state) updateState,
|
||||||
|
Future<void> Function(List<EmailId>? newDestroyed) updateDestroyedEmailCache,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,8 @@
|
|||||||
|
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/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
@@ -60,4 +65,9 @@ class LocalThreadDataSourceImpl extends ThreadDataSource {
|
|||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<EmailId>> emptyTrashFolder(AccountId accountId, MailboxId mailboxId, Future<void> Function(State state) updateState, Future<void> Function(List<EmailId>? newDestroyed) updateDestroyedEmailCache) {
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,8 @@
|
|||||||
|
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/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
@@ -8,6 +13,7 @@ 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';
|
||||||
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
|
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
|
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
|
||||||
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/domain/model/filter_message_option.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
||||||
@@ -15,8 +21,9 @@ import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option
|
|||||||
class ThreadDataSourceImpl extends ThreadDataSource {
|
class ThreadDataSourceImpl extends ThreadDataSource {
|
||||||
|
|
||||||
final ThreadAPI threadAPI;
|
final ThreadAPI threadAPI;
|
||||||
|
final ThreadIsolateWorker _threadIsolateWorker;
|
||||||
|
|
||||||
ThreadDataSourceImpl(this.threadAPI);
|
ThreadDataSourceImpl(this.threadAPI, this._threadIsolateWorker);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<EmailsResponse> getAllEmail(
|
Future<EmailsResponse> getAllEmail(
|
||||||
@@ -69,4 +76,18 @@ class ThreadDataSourceImpl extends ThreadDataSource {
|
|||||||
Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed}) {
|
Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed}) {
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<EmailId>> emptyTrashFolder(AccountId accountId, MailboxId mailboxId, Future<void> Function(State state) updateState, Future<void> Function(List<EmailId>? newDestroyed) updateDestroyedEmailCache) {
|
||||||
|
return Future.sync(() async {
|
||||||
|
return await _threadIsolateWorker.emptyTrashFolder(
|
||||||
|
accountId,
|
||||||
|
mailboxId,
|
||||||
|
updateState,
|
||||||
|
updateDestroyedEmailCache,
|
||||||
|
);
|
||||||
|
}).catchError((error) {
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -9,17 +9,10 @@ import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
|
|||||||
class EmptyTrashFolderArguments with EquatableMixin {
|
class EmptyTrashFolderArguments with EquatableMixin {
|
||||||
AccountId accountId;
|
AccountId accountId;
|
||||||
MailboxId trashMailboxId;
|
MailboxId trashMailboxId;
|
||||||
Future<void> Function(State state) updateState;
|
|
||||||
Future<void> Function({
|
|
||||||
List<Email>? newUpdated,
|
|
||||||
List<Email>? newCreated,
|
|
||||||
List<EmailId>? newDestroyed,
|
|
||||||
}) updateEmailCache;
|
|
||||||
final ThreadAPI threadAPI;
|
final ThreadAPI threadAPI;
|
||||||
final EmailAPI emailAPI;
|
final EmailAPI emailAPI;
|
||||||
|
|
||||||
EmptyTrashFolderArguments(this.threadAPI, this.emailAPI, this.accountId,
|
EmptyTrashFolderArguments(this.threadAPI, this.emailAPI, this.accountId, this.trashMailboxId);
|
||||||
this.trashMailboxId, this.updateEmailCache, this.updateState);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [accountId, trashMailboxId];
|
List<Object?> get props => [accountId, trashMailboxId];
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:core/presentation/state/failure.dart';
|
|
||||||
import 'package:core/presentation/state/success.dart';
|
|
||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:core/utils/build_utils.dart';
|
import 'package:core/utils/build_utils.dart';
|
||||||
import 'package:dartz/dartz.dart' as dartz;
|
|
||||||
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/properties/properties.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/state.dart';
|
||||||
@@ -18,7 +15,6 @@ import 'package:model/email/email_property.dart';
|
|||||||
import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
|
import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/data/model/empty_trash_folder_arguments.dart';
|
import 'package:tmail_ui_user/features/thread/data/model/empty_trash_folder_arguments.dart';
|
||||||
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/domain/state/empty_trash_folder_state.dart';
|
|
||||||
import 'package:worker_manager/worker_manager.dart';
|
import 'package:worker_manager/worker_manager.dart';
|
||||||
|
|
||||||
class ThreadIsolateWorker {
|
class ThreadIsolateWorker {
|
||||||
@@ -31,28 +27,22 @@ class ThreadIsolateWorker {
|
|||||||
Future<List<EmailId>> emptyTrashFolder(
|
Future<List<EmailId>> emptyTrashFolder(
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
MailboxId mailboxId,
|
MailboxId mailboxId,
|
||||||
int totalEmailUnread,
|
|
||||||
Future<void> Function(State state) updateState,
|
Future<void> Function(State state) updateState,
|
||||||
Future<void> Function({
|
Future<void> Function(List<EmailId>? newDestroyed) updateDestroyedEmailCache,
|
||||||
List<Email>? newUpdated,
|
|
||||||
List<Email>? newCreated,
|
|
||||||
List<EmailId>? newDestroyed,
|
|
||||||
}) updateEmailCache,
|
|
||||||
StreamController<dartz.Either<Failure, Success>> onProgressController,
|
|
||||||
) async {
|
) async {
|
||||||
if (BuildUtils.isWeb) {
|
if (BuildUtils.isWeb) {
|
||||||
return _emptyTrashFolderOnWeb(accountId, mailboxId, updateState, updateEmailCache, onProgressController);
|
return _emptyTrashFolderOnWeb(accountId, mailboxId, updateState, updateDestroyedEmailCache);
|
||||||
} else {
|
} else {
|
||||||
final result = await _isolateExecutor.execute(
|
final result = await _isolateExecutor.execute(
|
||||||
arg1: EmptyTrashFolderArguments(_threadAPI, _emailAPI, accountId, mailboxId, updateEmailCache, updateState),
|
arg1: EmptyTrashFolderArguments(_threadAPI, _emailAPI, accountId, mailboxId),
|
||||||
fun1: _emptyTrashFolderAction,
|
fun1: _emptyTrashFolderAction,
|
||||||
notification: (value) {
|
notification: (value) {
|
||||||
if (value is List<Email>) {
|
if(value is State) {
|
||||||
log('ThreadIsolateWorker::markAsThreadRead(): onUpdateProgress: PERCENT ${value.length / totalEmailUnread}');
|
updateState.call(value);
|
||||||
onProgressController.add(dartz.Right(UpdatingEmptyTrashFolderState(
|
}
|
||||||
mailboxId: mailboxId,
|
if (value is List<EmailId>) {
|
||||||
countRemove: value.length,
|
updateDestroyedEmailCache.call(value);
|
||||||
)));
|
log('ThreadIsolateWorker::emptyTrashFolder(): onUpdateProgress: PERCENT ${value.length}');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
@@ -75,7 +65,7 @@ class ThreadIsolateWorker {
|
|||||||
properties: Properties({EmailProperty.id}));
|
properties: Properties({EmailProperty.id}));
|
||||||
|
|
||||||
if (emailsResponse.state != null) {
|
if (emailsResponse.state != null) {
|
||||||
await args.updateState.call(emailsResponse.state!);
|
sendPort.send(emailsResponse.state!);
|
||||||
}
|
}
|
||||||
|
|
||||||
var newEmailList = emailsResponse.emailList ?? <Email>[];
|
var newEmailList = emailsResponse.emailList ?? <Email>[];
|
||||||
@@ -83,7 +73,7 @@ class ThreadIsolateWorker {
|
|||||||
newEmailList = newEmailList.where((email) => email.id != lastEmail!.id).toList();
|
newEmailList = newEmailList.where((email) => email.id != lastEmail!.id).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
log('ThreadRepositoryImpl::emptyTrashFolder(): ${newEmailList.length}');
|
log('ThreadIsolateWorker::_emptyTrashFolderAction(): ${newEmailList.length}');
|
||||||
|
|
||||||
if (newEmailList.isNotEmpty == true) {
|
if (newEmailList.isNotEmpty == true) {
|
||||||
lastEmail = newEmailList.last;
|
lastEmail = newEmailList.last;
|
||||||
@@ -93,7 +83,7 @@ class ThreadIsolateWorker {
|
|||||||
final listEmailIdDeleted = await args.emailAPI.deleteMultipleEmailsPermanently(args.accountId, emailIds);
|
final listEmailIdDeleted = await args.emailAPI.deleteMultipleEmailsPermanently(args.accountId, emailIds);
|
||||||
|
|
||||||
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == emailIds.length) {
|
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == emailIds.length) {
|
||||||
await args.updateEmailCache(newDestroyed: listEmailIdDeleted);
|
sendPort.send(listEmailIdDeleted);
|
||||||
}
|
}
|
||||||
emailListCompleted.addAll(listEmailIdDeleted);
|
emailListCompleted.addAll(listEmailIdDeleted);
|
||||||
|
|
||||||
@@ -103,9 +93,9 @@ class ThreadIsolateWorker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('ThreadIsolateWorker::_emptyTrashFolderOnWeb(): ERROR: $e');
|
log('ThreadIsolateWorker::_emptyTrashFolderAction(): ERROR: $e');
|
||||||
}
|
}
|
||||||
log('ThreadIsolateWorker::_emptyTrashFolderOnWeb(): TOTAL_REMOVE: ${emailListCompleted.length}');
|
log('ThreadIsolateWorker::_emptyTrashFolderAction(): TOTAL_REMOVE: ${emailListCompleted.length}');
|
||||||
return emailListCompleted;
|
return emailListCompleted;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,12 +103,7 @@ class ThreadIsolateWorker {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
MailboxId trashMailboxId,
|
MailboxId trashMailboxId,
|
||||||
Future<void> Function(State state) updateState,
|
Future<void> Function(State state) updateState,
|
||||||
Future<void> Function({
|
Future<void> Function(List<EmailId> newDestroyed) updateDestroyedEmailCache,
|
||||||
List<Email>? newUpdated,
|
|
||||||
List<Email>? newCreated,
|
|
||||||
List<EmailId>? newDestroyed,
|
|
||||||
}) updateEmailCache,
|
|
||||||
StreamController<dartz.Either<Failure, Success>> onProgressController,
|
|
||||||
) async {
|
) async {
|
||||||
List<EmailId> emailListCompleted = List.empty(growable: true);
|
List<EmailId> emailListCompleted = List.empty(growable: true);
|
||||||
try {
|
try {
|
||||||
@@ -143,7 +128,7 @@ class ThreadIsolateWorker {
|
|||||||
newEmailList = newEmailList.where((email) => email.id != lastEmail!.id).toList();
|
newEmailList = newEmailList.where((email) => email.id != lastEmail!.id).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
log('ThreadRepositoryImpl::emptyTrashFolder(): ${newEmailList.length}');
|
log('ThreadIsolateWorker::_emptyTrashFolderOnWeb(): ${newEmailList.length}');
|
||||||
|
|
||||||
if (newEmailList.isNotEmpty == true) {
|
if (newEmailList.isNotEmpty == true) {
|
||||||
lastEmail = newEmailList.last;
|
lastEmail = newEmailList.last;
|
||||||
@@ -153,13 +138,10 @@ class ThreadIsolateWorker {
|
|||||||
final listEmailIdDeleted = await _emailAPI.deleteMultipleEmailsPermanently(accountId, emailIds);
|
final listEmailIdDeleted = await _emailAPI.deleteMultipleEmailsPermanently(accountId, emailIds);
|
||||||
|
|
||||||
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == emailIds.length) {
|
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == emailIds.length) {
|
||||||
await updateEmailCache(newDestroyed: listEmailIdDeleted);
|
await updateDestroyedEmailCache(listEmailIdDeleted);
|
||||||
}
|
}
|
||||||
emailListCompleted.addAll(listEmailIdDeleted);
|
emailListCompleted.addAll(listEmailIdDeleted);
|
||||||
|
|
||||||
onProgressController.add(dartz.Right(UpdatingEmptyTrashFolderState(
|
|
||||||
mailboxId: trashMailboxId,
|
|
||||||
countRemove: emailListCompleted.length)));
|
|
||||||
} else {
|
} else {
|
||||||
hasEmails = false;
|
hasEmails = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
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/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
@@ -10,6 +14,7 @@ import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart';
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/model/email_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:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart';
|
||||||
|
import 'package:dartz/dartz.dart' as dartz;
|
||||||
|
|
||||||
abstract class ThreadRepository {
|
abstract class ThreadRepository {
|
||||||
Stream<EmailsResponse> getAllEmail(
|
Stream<EmailsResponse> getAllEmail(
|
||||||
@@ -47,5 +52,8 @@ abstract class ThreadRepository {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Future<bool> emptyTrashFolder(AccountId accountId, MailboxId trashMailboxId);
|
Future<List<EmailId>> emptyTrashFolder(
|
||||||
|
AccountId accountId,
|
||||||
|
MailboxId trashMailboxId,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
@@ -71,6 +71,8 @@ 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/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.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/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 {
|
class ThreadController extends BaseController {
|
||||||
|
|
||||||
@@ -78,6 +80,7 @@ class ThreadController extends BaseController {
|
|||||||
final _imagePaths = Get.find<ImagePaths>();
|
final _imagePaths = Get.find<ImagePaths>();
|
||||||
final _responsiveUtils = Get.find<ResponsiveUtils>();
|
final _responsiveUtils = Get.find<ResponsiveUtils>();
|
||||||
final _appToast = Get.find<AppToast>();
|
final _appToast = Get.find<AppToast>();
|
||||||
|
final Executor _isolateExecutor = Get.find<Executor>(tag: BindingTag.threadExecutor);
|
||||||
|
|
||||||
final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor;
|
final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor;
|
||||||
final MarkAsMultipleEmailReadInteractor _markAsMultipleEmailReadInteractor;
|
final MarkAsMultipleEmailReadInteractor _markAsMultipleEmailReadInteractor;
|
||||||
@@ -105,7 +108,6 @@ class ThreadController extends BaseController {
|
|||||||
final ScrollController listEmailController = ScrollController();
|
final ScrollController listEmailController = ScrollController();
|
||||||
late Worker mailboxWorker, searchWorker, dashboardActionWorker, viewStateWorker, advancedSearchFilterWorker;
|
late Worker mailboxWorker, searchWorker, dashboardActionWorker, viewStateWorker, advancedSearchFilterWorker;
|
||||||
|
|
||||||
|
|
||||||
Set<Comparator>? get _sortOrder => <Comparator>{}
|
Set<Comparator>? get _sortOrder => <Comparator>{}
|
||||||
..add(EmailComparator(EmailComparatorProperty.receivedAt)
|
..add(EmailComparator(EmailComparatorProperty.receivedAt)
|
||||||
..setIsAscending(false));
|
..setIsAscending(false));
|
||||||
@@ -141,6 +143,7 @@ class ThreadController extends BaseController {
|
|||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
_initWorker();
|
_initWorker();
|
||||||
|
_initializeIsolateExecutor();
|
||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,6 +156,7 @@ class ThreadController extends BaseController {
|
|||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
listEmailController.dispose();
|
listEmailController.dispose();
|
||||||
|
_isolateExecutor.dispose();
|
||||||
_clearWorker();
|
_clearWorker();
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
@@ -315,6 +319,10 @@ class ThreadController extends BaseController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _initializeIsolateExecutor() async {
|
||||||
|
await _isolateExecutor.warmUp(log: BuildUtils.isDebugMode);
|
||||||
|
}
|
||||||
|
|
||||||
void _clearWorker() {
|
void _clearWorker() {
|
||||||
mailboxWorker.call();
|
mailboxWorker.call();
|
||||||
dashboardActionWorker.call();
|
dashboardActionWorker.call();
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_work
|
|||||||
import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart';
|
import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart';
|
||||||
import 'package:tmail_ui_user/features/session/data/network/session_api.dart';
|
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_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';
|
import 'package:worker_manager/worker_manager.dart';
|
||||||
|
|
||||||
class NetworkBindings extends Bindings {
|
class NetworkBindings extends Bindings {
|
||||||
@@ -91,6 +93,11 @@ class NetworkBindings extends Bindings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _bindingIsolateWorker() {
|
void _bindingIsolateWorker() {
|
||||||
|
Get.put(Executor(), tag: BindingTag.threadExecutor);
|
||||||
|
Get.put(ThreadIsolateWorker(
|
||||||
|
Get.find<ThreadAPI>(),
|
||||||
|
Get.find<EmailAPI>(),
|
||||||
|
Get.find<Executor>(tag: BindingTag.threadExecutor)));
|
||||||
Get.put(Executor());
|
Get.put(Executor());
|
||||||
Get.put(MailboxIsolateWorker(
|
Get.put(MailboxIsolateWorker(
|
||||||
Get.find<ThreadAPI>(),
|
Get.find<ThreadAPI>(),
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
class BindingTag {
|
||||||
|
static const String threadExecutor = '#ThreadExecutor' ;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user