TF-599 Handle mark as read action for mailbox
This commit is contained in:
@@ -3,6 +3,9 @@ import 'package:get/get.dart';
|
|||||||
import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/caching/state_cache_client.dart';
|
import 'package:tmail_ui_user/features/caching/state_cache_client.dart';
|
||||||
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart';
|
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_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/datasource_impl/mailbox_cache_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart';
|
||||||
@@ -15,6 +18,9 @@ import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_reposit
|
|||||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.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/network/thread_api.dart';
|
||||||
|
|
||||||
class DestinationPickerBindings extends BaseBindings {
|
class DestinationPickerBindings extends BaseBindings {
|
||||||
|
|
||||||
@@ -41,6 +47,8 @@ class DestinationPickerBindings extends BaseBindings {
|
|||||||
void bindingsDataSource() {
|
void bindingsDataSource() {
|
||||||
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
||||||
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
|
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
|
||||||
|
Get.lazyPut<EmailDataSource>(() => Get.find<EmailDataSourceImpl>());
|
||||||
|
Get.lazyPut<ThreadDataSource>(() => Get.find<ThreadDataSourceImpl>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -48,6 +56,8 @@ class DestinationPickerBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => MailboxDataSourceImpl(Get.find<MailboxAPI>()));
|
Get.lazyPut(() => MailboxDataSourceImpl(Get.find<MailboxAPI>()));
|
||||||
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(() => ThreadDataSourceImpl(Get.find<ThreadAPI>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -68,7 +78,9 @@ class DestinationPickerBindings extends BaseBindings {
|
|||||||
DataSourceType.network: Get.find<MailboxDataSource>(),
|
DataSourceType.network: Get.find<MailboxDataSource>(),
|
||||||
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
|
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
|
||||||
},
|
},
|
||||||
Get.find<StateDataSource>()
|
Get.find<StateDataSource>(),
|
||||||
|
Get.find<ThreadDataSource>(),
|
||||||
|
Get.find<EmailDataSource>()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,8 +3,17 @@ 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/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.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/utc_date.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/email/keyword_identifier.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/sort/comparator.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/mailbox_datasource.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_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';
|
||||||
@@ -13,13 +22,22 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_r
|
|||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
|
||||||
|
|
||||||
class MailboxRepositoryImpl extends MailboxRepository {
|
class MailboxRepositoryImpl extends MailboxRepository {
|
||||||
|
|
||||||
final Map<DataSourceType, MailboxDataSource> mapDataSource;
|
final Map<DataSourceType, MailboxDataSource> mapDataSource;
|
||||||
final StateDataSource stateDataSource;
|
final StateDataSource stateDataSource;
|
||||||
|
final ThreadDataSource threadDataSource;
|
||||||
|
final EmailDataSource emailDataSource;
|
||||||
|
|
||||||
MailboxRepositoryImpl(this.mapDataSource, this.stateDataSource);
|
MailboxRepositoryImpl(
|
||||||
|
this.mapDataSource,
|
||||||
|
this.stateDataSource,
|
||||||
|
this.threadDataSource,
|
||||||
|
this.emailDataSource
|
||||||
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<MailboxResponse> getAllMailbox(AccountId accountId, {Properties? properties}) async* {
|
Stream<MailboxResponse> getAllMailbox(AccountId accountId, {Properties? properties}) async* {
|
||||||
@@ -152,4 +170,54 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
|||||||
Future<bool> renameMailbox(AccountId accountId, RenameMailboxRequest request) {
|
Future<bool> renameMailbox(AccountId accountId, RenameMailboxRequest request) {
|
||||||
return mapDataSource[DataSourceType.network]!.renameMailbox(accountId, request);
|
return mapDataSource[DataSourceType.network]!.renameMailbox(accountId, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> markAsMailboxRead(AccountId accountId, MailboxId mailboxId, MailboxName mailboxName) async {
|
||||||
|
bool mailboxHasEmails = true;
|
||||||
|
UTCDate? lastReceivedDate;
|
||||||
|
EmailId? lastEmailId;
|
||||||
|
|
||||||
|
while(mailboxHasEmails) {
|
||||||
|
final emailResponse = await threadDataSource.getAllEmail(accountId,
|
||||||
|
limit: UnsignedInt(20),
|
||||||
|
filter: EmailFilterCondition(
|
||||||
|
inMailbox: mailboxId,
|
||||||
|
notKeyword: KeyWordIdentifier.emailSeen.value,
|
||||||
|
before: lastReceivedDate),
|
||||||
|
sort: <Comparator>{}
|
||||||
|
..add(EmailComparator(EmailComparatorProperty.receivedAt)
|
||||||
|
..setIsAscending(false)),
|
||||||
|
properties: Properties({
|
||||||
|
EmailProperty.id,
|
||||||
|
EmailProperty.keywords,
|
||||||
|
EmailProperty.receivedAt,
|
||||||
|
})
|
||||||
|
).then((response) {
|
||||||
|
var listEmails = response.emailList;
|
||||||
|
if (listEmails != null && listEmails.isNotEmpty && lastEmailId != null) {
|
||||||
|
listEmails = listEmails
|
||||||
|
.where((email) => email.id != lastEmailId)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
return EmailsResponse(emailList: listEmails, state: response.state);
|
||||||
|
});
|
||||||
|
log('MailboxRepositoryImpl::markAsMailboxRead(): listEmails: ${emailResponse.emailList?.length}');
|
||||||
|
final listEmailUnread = emailResponse.emailList;
|
||||||
|
|
||||||
|
if (listEmailUnread == null || listEmailUnread.isEmpty) {
|
||||||
|
mailboxHasEmails = false;
|
||||||
|
} else {
|
||||||
|
log('MailboxRepositoryImpl::markAsMailboxRead(): listEmailUnread: ${listEmailUnread.length}');
|
||||||
|
final result = await emailDataSource.markAsRead(accountId,
|
||||||
|
listEmailUnread, ReadActions.markAsRead);
|
||||||
|
|
||||||
|
if (result.length != listEmailUnread.length) {
|
||||||
|
mailboxHasEmails = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -17,4 +17,6 @@ abstract class MailboxRepository {
|
|||||||
Future<bool> deleteMultipleMailbox(Session session, AccountId accountId, List<MailboxId> mailboxIds);
|
Future<bool> deleteMultipleMailbox(Session session, AccountId accountId, List<MailboxId> mailboxIds);
|
||||||
|
|
||||||
Future<bool> renameMailbox(AccountId accountId, RenameMailboxRequest request);
|
Future<bool> renameMailbox(AccountId accountId, RenameMailboxRequest request);
|
||||||
|
|
||||||
|
Future<bool> markAsMailboxRead(AccountId accountId, MailboxId mailboxId, MailboxName mailboxName);
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,9 @@ import 'package:get/get.dart';
|
|||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/caching/state_cache_client.dart';
|
import 'package:tmail_ui_user/features/caching/state_cache_client.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart';
|
import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
|
||||||
@@ -23,6 +26,9 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_in
|
|||||||
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.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/network/thread_api.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
class MailboxBindings extends BaseBindings {
|
class MailboxBindings extends BaseBindings {
|
||||||
@@ -57,6 +63,8 @@ class MailboxBindings extends BaseBindings {
|
|||||||
void bindingsDataSource() {
|
void bindingsDataSource() {
|
||||||
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
||||||
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
|
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
|
||||||
|
Get.lazyPut<EmailDataSource>(() => Get.find<EmailDataSourceImpl>());
|
||||||
|
Get.lazyPut<ThreadDataSource>(() => Get.find<ThreadDataSourceImpl>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -64,6 +72,8 @@ class MailboxBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => MailboxDataSourceImpl(Get.find<MailboxAPI>()));
|
Get.lazyPut(() => MailboxDataSourceImpl(Get.find<MailboxAPI>()));
|
||||||
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(() => ThreadDataSourceImpl(Get.find<ThreadAPI>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -92,6 +102,8 @@ class MailboxBindings extends BaseBindings {
|
|||||||
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
|
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
|
||||||
},
|
},
|
||||||
Get.find<StateDataSource>(),
|
Get.find<StateDataSource>(),
|
||||||
|
Get.find<ThreadDataSource>(),
|
||||||
|
Get.find<EmailDataSource>(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,6 +49,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_na
|
|||||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
|
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
|
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/mark_as_mailbox_read_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/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';
|
||||||
@@ -215,6 +216,7 @@ class MailboxController extends BaseMailboxController {
|
|||||||
success is SaveEmailAsDraftsSuccess ||
|
success is SaveEmailAsDraftsSuccess ||
|
||||||
success is RemoveEmailDraftsSuccess ||
|
success is RemoveEmailDraftsSuccess ||
|
||||||
success is SendEmailSuccess ||
|
success is SendEmailSuccess ||
|
||||||
|
success is MarkAsMailboxReadAllSuccess ||
|
||||||
success is UpdateEmailDraftsSuccess) {
|
success is UpdateEmailDraftsSuccess) {
|
||||||
refreshMailboxChanges();
|
refreshMailboxChanges();
|
||||||
}
|
}
|
||||||
@@ -478,6 +480,9 @@ class MailboxController extends BaseMailboxController {
|
|||||||
case MailboxActions.rename:
|
case MailboxActions.rename:
|
||||||
_openDialogRenameMailboxAction(context, selectionMailbox.first);
|
_openDialogRenameMailboxAction(context, selectionMailbox.first);
|
||||||
break;
|
break;
|
||||||
|
case MailboxActions.markAsRead:
|
||||||
|
_markAsReadMailboxAction(selectionMailbox.first);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -650,6 +655,15 @@ class MailboxController extends BaseMailboxController {
|
|||||||
_cancelSelectMailbox();
|
_cancelSelectMailbox();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _markAsReadMailboxAction(PresentationMailbox presentationMailbox) {
|
||||||
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
|
final mailboxId = presentationMailbox.id;
|
||||||
|
final mailboxName = presentationMailbox.name;
|
||||||
|
if (accountId != null && mailboxName != null) {
|
||||||
|
mailboxDashBoardController.markAsReadMailbox(accountId, mailboxId, mailboxName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _createListMailboxNameAsStringInMailboxParent(PresentationMailbox mailboxRenamed) {
|
void _createListMailboxNameAsStringInMailboxParent(PresentationMailbox mailboxRenamed) {
|
||||||
if (mailboxRenamed.parentId == null) {
|
if (mailboxRenamed.parentId == null) {
|
||||||
final allChildrenAtMailboxLocation = (defaultMailboxTree.value.root.childrenItems ?? <MailboxNode>[]) + (folderMailboxTree.value.root.childrenItems ?? <MailboxNode>[]);
|
final allChildrenAtMailboxLocation = (defaultMailboxTree.value.root.childrenItems ?? <MailboxNode>[]) + (folderMailboxTree.value.root.childrenItems ?? <MailboxNode>[]);
|
||||||
@@ -704,7 +718,7 @@ class MailboxController extends BaseMailboxController {
|
|||||||
_appToast.showToast(AppLocalizations.of(context).the_feature_is_under_development);
|
_appToast.showToast(AppLocalizations.of(context).the_feature_is_under_development);
|
||||||
break;
|
break;
|
||||||
case MailboxActions.markAsRead:
|
case MailboxActions.markAsRead:
|
||||||
_appToast.showToast(AppLocalizations.of(context).the_feature_is_under_development);
|
_markAsReadMailboxAction(mailbox);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -373,18 +373,20 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
|
|||||||
void _openMailboxMenuAction(BuildContext context, RelativeRect position,
|
void _openMailboxMenuAction(BuildContext context, RelativeRect position,
|
||||||
PresentationMailbox mailbox) {
|
PresentationMailbox mailbox) {
|
||||||
final listMailboxActions = [
|
final listMailboxActions = [
|
||||||
MailboxActions.markAsRead,
|
if (mailbox.getCountUnReadEmails().isNotEmpty) MailboxActions.markAsRead,
|
||||||
if (!mailbox.hasRole()) MailboxActions.move,
|
if (!mailbox.hasRole()) MailboxActions.move,
|
||||||
if (!mailbox.hasRole()) MailboxActions.rename,
|
if (!mailbox.hasRole()) MailboxActions.rename,
|
||||||
if (!mailbox.hasRole()) MailboxActions.delete,
|
if (!mailbox.hasRole()) MailboxActions.delete,
|
||||||
];
|
];
|
||||||
|
|
||||||
if (_responsiveUtils.isScreenWithShortestSide(context)) {
|
if (listMailboxActions.isNotEmpty) {
|
||||||
controller.openContextMenuAction(context,
|
if (_responsiveUtils.isScreenWithShortestSide(context)) {
|
||||||
_bottomSheetIdentityActionTiles(context, mailbox, listMailboxActions));
|
controller.openContextMenuAction(context,
|
||||||
} else {
|
_bottomSheetIdentityActionTiles(context, mailbox, listMailboxActions));
|
||||||
controller.openPopupMenuAction(context, position,
|
} else {
|
||||||
_popupMenuMailboxActionTiles(context, mailbox, listMailboxActions));
|
controller.openPopupMenuAction(context, position,
|
||||||
|
_popupMenuMailboxActionTiles(context, mailbox, listMailboxActions));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+34
-10
@@ -54,8 +54,12 @@ class BottomBarSelectionMailboxWidget {
|
|||||||
..paddingIcon(const EdgeInsets.all(8))
|
..paddingIcon(const EdgeInsets.all(8))
|
||||||
..textStyle(TextStyle(
|
..textStyle(TextStyle(
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
color: _isRenameMailboxValid ? AppColor.colorTextButton : AppColor.colorTextButton.withOpacity(0.3)))
|
color: _isRenameMailboxValid
|
||||||
..iconColor(_isRenameMailboxValid ? AppColor.colorTextButton : AppColor.colorTextButton.withOpacity(0.3))
|
? AppColor.colorTextButton
|
||||||
|
: AppColor.colorTextButton.withOpacity(0.3)))
|
||||||
|
..iconColor(_isRenameMailboxValid
|
||||||
|
? AppColor.colorTextButton
|
||||||
|
: AppColor.colorTextButton.withOpacity(0.3))
|
||||||
..onPressActionClick(() {
|
..onPressActionClick(() {
|
||||||
if (_isRenameMailboxValid) {
|
if (_isRenameMailboxValid) {
|
||||||
_onMailboxActionsClick?.call(MailboxActions.rename, _listSelectionMailbox);
|
_onMailboxActionsClick?.call(MailboxActions.rename, _listSelectionMailbox);
|
||||||
@@ -66,9 +70,19 @@ class BottomBarSelectionMailboxWidget {
|
|||||||
Expanded(child: (ButtonBuilder(_imagePaths.icRead)
|
Expanded(child: (ButtonBuilder(_imagePaths.icRead)
|
||||||
..key(const Key('button_mark_read_all_mailbox'))
|
..key(const Key('button_mark_read_all_mailbox'))
|
||||||
..paddingIcon(const EdgeInsets.all(8))
|
..paddingIcon(const EdgeInsets.all(8))
|
||||||
..textStyle(TextStyle(fontSize: 12, color: AppColor.colorTextButton.withOpacity(0.3)))
|
..textStyle(TextStyle(
|
||||||
..iconColor(AppColor.colorTextButton.withOpacity(0.3))
|
fontSize: 12,
|
||||||
..onPressActionClick(() => {})
|
color: _isDeleteMailboxValid
|
||||||
|
? AppColor.colorTextButton
|
||||||
|
: AppColor.colorTextButton.withOpacity(0.3)))
|
||||||
|
..iconColor(_isDeleteMailboxValid
|
||||||
|
? AppColor.colorTextButton
|
||||||
|
: AppColor.colorTextButton.withOpacity(0.3))
|
||||||
|
..onPressActionClick(() {
|
||||||
|
if (_isMarkAsReadMailboxValid) {
|
||||||
|
_onMailboxActionsClick?.call(MailboxActions.markAsRead, _listSelectionMailbox);
|
||||||
|
}
|
||||||
|
})
|
||||||
..text(AppLocalizations.of(_context).mark_as_read, isVertical: true))
|
..text(AppLocalizations.of(_context).mark_as_read, isVertical: true))
|
||||||
.build()),
|
.build()),
|
||||||
Expanded(child: (ButtonBuilder(_imagePaths.icDelete)
|
Expanded(child: (ButtonBuilder(_imagePaths.icDelete)
|
||||||
@@ -76,8 +90,12 @@ class BottomBarSelectionMailboxWidget {
|
|||||||
..paddingIcon(const EdgeInsets.all(8))
|
..paddingIcon(const EdgeInsets.all(8))
|
||||||
..textStyle(TextStyle(
|
..textStyle(TextStyle(
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
color: _isDeleteMailboxValid ? AppColor.colorTextButton : AppColor.colorTextButton.withOpacity(0.3)))
|
color: _isDeleteMailboxValid
|
||||||
..iconColor(_isDeleteMailboxValid ? AppColor.colorTextButton : AppColor.colorTextButton.withOpacity(0.3))
|
? AppColor.colorTextButton
|
||||||
|
: AppColor.colorTextButton.withOpacity(0.3)))
|
||||||
|
..iconColor(_isDeleteMailboxValid
|
||||||
|
? AppColor.colorTextButton
|
||||||
|
: AppColor.colorTextButton.withOpacity(0.3))
|
||||||
..onPressActionClick(() {
|
..onPressActionClick(() {
|
||||||
if (_isDeleteMailboxValid) {
|
if (_isDeleteMailboxValid) {
|
||||||
_onMailboxActionsClick?.call(MailboxActions.delete, _listSelectionMailbox);
|
_onMailboxActionsClick?.call(MailboxActions.delete, _listSelectionMailbox);
|
||||||
@@ -89,9 +107,15 @@ class BottomBarSelectionMailboxWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get _isDeleteMailboxValid => _listSelectionMailbox.length == 1 && _isAllFolderMailbox;
|
bool get _isDeleteMailboxValid => _listSelectionMailbox.length == 1
|
||||||
|
&& _isAllFolderMailbox;
|
||||||
|
|
||||||
bool get _isRenameMailboxValid => _listSelectionMailbox.length == 1 && _isAllFolderMailbox;
|
bool get _isRenameMailboxValid => _listSelectionMailbox.length == 1
|
||||||
|
&& _isAllFolderMailbox;
|
||||||
|
|
||||||
bool get _isAllFolderMailbox => _listSelectionMailbox.every((mailbox) => !mailbox.hasRole());
|
bool get _isMarkAsReadMailboxValid => _listSelectionMailbox.length == 1
|
||||||
|
&& _listSelectionMailbox.first.getCountUnReadEmails().isNotEmpty;
|
||||||
|
|
||||||
|
bool get _isAllFolderMailbox =>
|
||||||
|
_listSelectionMailbox.every((mailbox) => !mailbox.hasRole());
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import 'package:core/core.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
|
||||||
|
class MarkAsMailboxReadLoading extends UIState {
|
||||||
|
|
||||||
|
MarkAsMailboxReadLoading();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class MarkAsMailboxReadAllSuccess extends UIState {
|
||||||
|
|
||||||
|
final MailboxName mailboxName;
|
||||||
|
|
||||||
|
MarkAsMailboxReadAllSuccess(this.mailboxName);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [mailboxName];
|
||||||
|
}
|
||||||
|
|
||||||
|
class MarkAsMailboxReadHasSomeEmailFailure extends FeatureFailure {
|
||||||
|
|
||||||
|
MarkAsMailboxReadHasSomeEmailFailure();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class MarkAsMailboxReadFailure extends FeatureFailure {
|
||||||
|
final dynamic exception;
|
||||||
|
|
||||||
|
MarkAsMailboxReadFailure(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/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/mark_as_mailbox_read_state.dart';
|
||||||
|
|
||||||
|
class MarkAsMailboxReadInteractor {
|
||||||
|
final MailboxRepository _mailboxRepository;
|
||||||
|
|
||||||
|
MarkAsMailboxReadInteractor(this._mailboxRepository);
|
||||||
|
|
||||||
|
Stream<Either<Failure, Success>> execute(AccountId accountId,
|
||||||
|
MailboxId mailboxId, MailboxName mailboxName) async* {
|
||||||
|
try {
|
||||||
|
yield Right<Failure, Success>(MarkAsMailboxReadLoading());
|
||||||
|
final result = await _mailboxRepository.markAsMailboxRead(accountId, mailboxId, mailboxName);
|
||||||
|
if (result) {
|
||||||
|
yield Right(MarkAsMailboxReadAllSuccess(mailboxName));
|
||||||
|
} else {
|
||||||
|
yield Left(MarkAsMailboxReadHasSomeEmailFailure());
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
yield Left(MarkAsMailboxReadFailure(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -57,14 +57,6 @@ class CancelSelectionAllEmailAction extends DashBoardAction {
|
|||||||
List<Object?> get props => [];
|
List<Object?> get props => [];
|
||||||
}
|
}
|
||||||
|
|
||||||
class MarkAsReadAllEmailAction extends DashBoardAction {
|
|
||||||
|
|
||||||
MarkAsReadAllEmailAction();
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
}
|
|
||||||
|
|
||||||
class FilterMessageAction extends DashBoardAction {
|
class FilterMessageAction extends DashBoardAction {
|
||||||
|
|
||||||
final BuildContext context;
|
final BuildContext context;
|
||||||
|
|||||||
@@ -15,8 +15,15 @@ import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_perman
|
|||||||
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart';
|
import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_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/datasource_impl/mailbox_cache_datasource_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_datasource_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/search_datasource.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/search_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart';
|
||||||
@@ -24,6 +31,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/search_
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/mark_as_mailbox_read_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
|
||||||
@@ -55,6 +63,7 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.find<SaveRecentSearchInteractor>(),
|
Get.find<SaveRecentSearchInteractor>(),
|
||||||
Get.find<GetAllRecentSearchLatestInteractor>(),
|
Get.find<GetAllRecentSearchLatestInteractor>(),
|
||||||
Get.find<QuickSearchEmailInteractor>(),
|
Get.find<QuickSearchEmailInteractor>(),
|
||||||
|
Get.find<MarkAsMailboxReadInteractor>(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,6 +74,7 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.lazyPut<SearchDataSource>(() => Get.find<SearchDataSourceImpl>());
|
Get.lazyPut<SearchDataSource>(() => Get.find<SearchDataSourceImpl>());
|
||||||
Get.lazyPut<ThreadDataSource>(() => Get.find<ThreadDataSourceImpl>());
|
Get.lazyPut<ThreadDataSource>(() => Get.find<ThreadDataSourceImpl>());
|
||||||
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
|
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
|
||||||
|
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -78,6 +88,8 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => ThreadDataSourceImpl(Get.find<ThreadAPI>()));
|
Get.lazyPut(() => ThreadDataSourceImpl(Get.find<ThreadAPI>()));
|
||||||
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.lazyPut(() => MailboxCacheDataSourceImpl(Get.find<MailboxCacheManager>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -89,6 +101,7 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => SaveRecentSearchInteractor(Get.find<SearchRepository>()));
|
Get.lazyPut(() => SaveRecentSearchInteractor(Get.find<SearchRepository>()));
|
||||||
Get.lazyPut(() => GetAllRecentSearchLatestInteractor(Get.find<SearchRepository>()));
|
Get.lazyPut(() => GetAllRecentSearchLatestInteractor(Get.find<SearchRepository>()));
|
||||||
Get.lazyPut(() => QuickSearchEmailInteractor(Get.find<ThreadRepository>()));
|
Get.lazyPut(() => QuickSearchEmailInteractor(Get.find<ThreadRepository>()));
|
||||||
|
Get.lazyPut(() => MarkAsMailboxReadInteractor(Get.find<MailboxRepository>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -96,6 +109,7 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.lazyPut<EmailRepository>(() => Get.find<EmailRepositoryImpl>());
|
Get.lazyPut<EmailRepository>(() => Get.find<EmailRepositoryImpl>());
|
||||||
Get.lazyPut<SearchRepository>(() => Get.find<SearchRepositoryImpl>());
|
Get.lazyPut<SearchRepository>(() => Get.find<SearchRepositoryImpl>());
|
||||||
Get.lazyPut<ThreadRepository>(() => Get.find<ThreadRepositoryImpl>());
|
Get.lazyPut<ThreadRepository>(() => Get.find<ThreadRepositoryImpl>());
|
||||||
|
Get.lazyPut<MailboxRepository>(() => Get.find<MailboxRepositoryImpl>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -113,5 +127,14 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.find<StateDataSource>(),
|
Get.find<StateDataSource>(),
|
||||||
Get.find<EmailDataSource>(),
|
Get.find<EmailDataSource>(),
|
||||||
));
|
));
|
||||||
|
Get.lazyPut(() => MailboxRepositoryImpl(
|
||||||
|
{
|
||||||
|
DataSourceType.network: Get.find<MailboxDataSource>(),
|
||||||
|
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
|
||||||
|
},
|
||||||
|
Get.find<StateDataSource>(),
|
||||||
|
Get.find<ThreadDataSource>(),
|
||||||
|
Get.find<EmailDataSource>(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,10 +37,13 @@ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_int
|
|||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_recent_search_latest_state.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_recent_search_latest_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/mark_as_mailbox_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_search_email_state.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_search_email_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/domain/state/remove_email_drafts_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/mark_as_mailbox_read_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
|
||||||
@@ -75,6 +78,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
final SaveRecentSearchInteractor _saveRecentSearchInteractor;
|
final SaveRecentSearchInteractor _saveRecentSearchInteractor;
|
||||||
final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor;
|
final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor;
|
||||||
final QuickSearchEmailInteractor _quickSearchEmailInteractor;
|
final QuickSearchEmailInteractor _quickSearchEmailInteractor;
|
||||||
|
final MarkAsMailboxReadInteractor _markAsMailboxReadInteractor;
|
||||||
|
|
||||||
final scaffoldKey = GlobalKey<ScaffoldState>();
|
final scaffoldKey = GlobalKey<ScaffoldState>();
|
||||||
final selectedMailbox = Rxn<PresentationMailbox>();
|
final selectedMailbox = Rxn<PresentationMailbox>();
|
||||||
@@ -107,6 +111,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
this._saveRecentSearchInteractor,
|
this._saveRecentSearchInteractor,
|
||||||
this._getAllRecentSearchLatestInteractor,
|
this._getAllRecentSearchLatestInteractor,
|
||||||
this._quickSearchEmailInteractor,
|
this._quickSearchEmailInteractor,
|
||||||
|
this._markAsMailboxReadInteractor,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -176,6 +181,8 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
_moveToMailboxSuccess(success);
|
_moveToMailboxSuccess(success);
|
||||||
} else if (success is DeleteEmailPermanentlySuccess) {
|
} else if (success is DeleteEmailPermanentlySuccess) {
|
||||||
_deleteEmailPermanentlySuccess(success);
|
_deleteEmailPermanentlySuccess(success);
|
||||||
|
} else if (success is MarkAsMailboxReadAllSuccess) {
|
||||||
|
_markAsReadMailboxSuccess(success);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -506,6 +513,30 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
return filterMessageOption.value == FilterMessageOption.starred;
|
return filterMessageOption.value == FilterMessageOption.starred;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void markAsReadMailboxAction() {
|
||||||
|
final currentAccountId = accountId.value;
|
||||||
|
final mailboxId = selectedMailbox.value?.id;
|
||||||
|
final mailboxName = selectedMailbox.value?.name;
|
||||||
|
if (currentAccountId != null && mailboxId != null && mailboxName != null) {
|
||||||
|
markAsReadMailbox(currentAccountId, mailboxId, mailboxName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void markAsReadMailbox(AccountId accountId, MailboxId mailboxId, MailboxName mailboxName) {
|
||||||
|
consumeState(_markAsMailboxReadInteractor.execute(accountId, mailboxId, mailboxName));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _markAsReadMailboxSuccess(MarkAsMailboxReadAllSuccess success) {
|
||||||
|
if (currentContext != null && currentOverlayContext != null) {
|
||||||
|
_appToast.showToastWithIcon(
|
||||||
|
currentOverlayContext!,
|
||||||
|
widthToast: _responsiveUtils.isDesktop(currentContext!) ? 360 : null,
|
||||||
|
message: AppLocalizations.of(currentContext!)
|
||||||
|
.toastMessageMarkAsMailboxReadSuccess(success.mailboxName.name),
|
||||||
|
icon: _imagePaths.icReadToast);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void composeEmailAction() {
|
void composeEmailAction() {
|
||||||
if (kIsWeb) {
|
if (kIsWeb) {
|
||||||
if (dashBoardAction.value is! ComposeEmailAction) {
|
if (dashBoardAction.value is! ComposeEmailAction) {
|
||||||
|
|||||||
@@ -227,7 +227,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8))
|
..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8))
|
||||||
..radiusSplash(10)
|
..radiusSplash(10)
|
||||||
..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButtonHeaderThread))
|
..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButtonHeaderThread))
|
||||||
..onPressActionClick(() => controller.dispatchAction(MarkAsReadAllEmailAction()))
|
..onPressActionClick(() => controller.markAsReadMailboxAction())
|
||||||
..text(AppLocalizations.of(context).mark_all_as_read, isVertical: false))
|
..text(AppLocalizations.of(context).mark_all_as_read, isVertical: false))
|
||||||
.build(),
|
.build(),
|
||||||
const SizedBox(width: 16),
|
const SizedBox(width: 16),
|
||||||
@@ -287,7 +287,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8))
|
..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8))
|
||||||
..radiusSplash(10)
|
..radiusSplash(10)
|
||||||
..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButtonHeaderThread))
|
..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButtonHeaderThread))
|
||||||
..onPressActionClick(() => controller.dispatchAction(MarkAsReadAllEmailAction()))
|
..onPressActionClick(() => controller.markAsReadMailboxAction())
|
||||||
..text(AppLocalizations.of(context).mark_all_as_read, isVertical: false))
|
..text(AppLocalizations.of(context).mark_all_as_read, isVertical: false))
|
||||||
.build(),
|
.build(),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_
|
|||||||
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/mark_as_mailbox_read_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/domain/state/remove_email_drafts_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.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';
|
||||||
@@ -194,7 +195,7 @@ class ThreadController extends BaseController {
|
|||||||
_markAsStarMultipleEmailFailure(failure);
|
_markAsStarMultipleEmailFailure(failure);
|
||||||
} else if (failure is EmptyTrashFolderFailure) {
|
} else if (failure is EmptyTrashFolderFailure) {
|
||||||
_emptyTrashFolderFailure(failure);
|
_emptyTrashFolderFailure(failure);
|
||||||
} else if (failure is LoadMoreEmailsFailure) {
|
} else if (failure is LoadMoreEmailsFailure) {
|
||||||
stopFpsMeter();
|
stopFpsMeter();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -253,25 +254,22 @@ class ThreadController extends BaseController {
|
|||||||
if (action is RefreshAllEmailAction) {
|
if (action is RefreshAllEmailAction) {
|
||||||
refreshAllEmail();
|
refreshAllEmail();
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
mailboxDashBoardController.clearDashBoardAction();
|
||||||
} else if (action is MarkAsReadAllEmailAction) {
|
} else if (action is SelectionAllEmailAction) {
|
||||||
markAsReadAllEmails();
|
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
|
||||||
} if (action is SelectionAllEmailAction) {
|
|
||||||
setSelectAllEmailAction();
|
setSelectAllEmailAction();
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
mailboxDashBoardController.clearDashBoardAction();
|
||||||
} if (action is CancelSelectionAllEmailAction) {
|
} else if (action is CancelSelectionAllEmailAction) {
|
||||||
cancelSelectEmail();
|
cancelSelectEmail();
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
mailboxDashBoardController.clearDashBoardAction();
|
||||||
} if (action is FilterMessageAction) {
|
} else if (action is FilterMessageAction) {
|
||||||
filterMessagesAction(action.context, action.option);
|
filterMessagesAction(action.context, action.option);
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
mailboxDashBoardController.clearDashBoardAction();
|
||||||
} if (action is HandleEmailActionTypeAction) {
|
} else if (action is HandleEmailActionTypeAction) {
|
||||||
pressEmailSelectionAction(action.context, action.emailAction, action.listEmailSelected);
|
pressEmailSelectionAction(action.context, action.emailAction, action.listEmailSelected);
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
mailboxDashBoardController.clearDashBoardAction();
|
||||||
} if (action is OpenEmailDetailedAction) {
|
} else if (action is OpenEmailDetailedAction) {
|
||||||
pressEmailAction(action.context, EmailActionType.preview, action.presentationEmail);
|
pressEmailAction(action.context, EmailActionType.preview, action.presentationEmail);
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
mailboxDashBoardController.clearDashBoardAction();
|
||||||
} if (action is DisableSearchEmailAction) {
|
} else if (action is DisableSearchEmailAction) {
|
||||||
closeSearchEmailAction();
|
closeSearchEmailAction();
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
mailboxDashBoardController.clearDashBoardAction();
|
||||||
}
|
}
|
||||||
@@ -291,6 +289,7 @@ class ThreadController extends BaseController {
|
|||||||
|| success is SaveEmailAsDraftsSuccess
|
|| success is SaveEmailAsDraftsSuccess
|
||||||
|| success is RemoveEmailDraftsSuccess
|
|| success is RemoveEmailDraftsSuccess
|
||||||
|| success is SendEmailSuccess
|
|| success is SendEmailSuccess
|
||||||
|
|| success is MarkAsMailboxReadAllSuccess
|
||||||
|| success is UpdateEmailDraftsSuccess) {
|
|| success is UpdateEmailDraftsSuccess) {
|
||||||
_refreshEmailChanges();
|
_refreshEmailChanges();
|
||||||
}
|
}
|
||||||
@@ -496,13 +495,6 @@ class ThreadController extends BaseController {
|
|||||||
mailboxDashBoardController.listEmailSelected.clear();
|
mailboxDashBoardController.listEmailSelected.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void markAsReadAllEmails() {
|
|
||||||
final listEmail = emailList.allEmailUnread;
|
|
||||||
if (listEmail.isNotEmpty) {
|
|
||||||
markAsReadSelectedMultipleEmail(listEmail);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void markAsReadSelectedMultipleEmail(List<PresentationEmail> listPresentationEmail) {
|
void markAsReadSelectedMultipleEmail(List<PresentationEmail> listPresentationEmail) {
|
||||||
final listEmail = listPresentationEmail.map((presentationEmail) => presentationEmail.toEmail()).toList();
|
final listEmail = listPresentationEmail.map((presentationEmail) => presentationEmail.toEmail()).toList();
|
||||||
final readAction = listPresentationEmail.isAllEmailRead ? ReadActions.markAsUnread : ReadActions.markAsRead;
|
final readAction = listPresentationEmail.isAllEmailRead ? ReadActions.markAsUnread : ReadActions.markAsRead;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"@@last_modified": "2022-05-31T15:17:59.229845",
|
"@@last_modified": "2022-06-01T15:37:34.038431",
|
||||||
"initializing_data": "Initializing data...",
|
"initializing_data": "Initializing data...",
|
||||||
"@initializing_data": {
|
"@initializing_data": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
@@ -1383,5 +1383,15 @@
|
|||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders_order": [],
|
"placeholders_order": [],
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"toastMessageMarkAsMailboxReadSuccess": "You’ve marked all messages in \"{mailboxName}\" as read",
|
||||||
|
"@toastMessageMarkAsMailboxReadSuccess": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [
|
||||||
|
"mailboxName"
|
||||||
|
],
|
||||||
|
"placeholders": {
|
||||||
|
"mailboxName": {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1418,4 +1418,11 @@ class AppLocalizations {
|
|||||||
'Delete mailbox',
|
'Delete mailbox',
|
||||||
name: 'deleteMailbox');
|
name: 'deleteMailbox');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String toastMessageMarkAsMailboxReadSuccess(String mailboxName) {
|
||||||
|
return Intl.message(
|
||||||
|
'You’ve marked all messages in "$mailboxName" as read',
|
||||||
|
name: 'toastMessageMarkAsMailboxReadSuccess',
|
||||||
|
args: [mailboxName]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user