TF-267 Fix bug display a full page for sorting results
This commit is contained in:
@@ -6,6 +6,7 @@ import 'package:jmap_dart_client/jmap/core/state.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/model.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';
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@ abstract class ThreadDataSource {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort});
|
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});
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,7 @@ import 'package:jmap_dart_client/jmap/core/state.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/model.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/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/model/email_change_response.dart';
|
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
|
||||||
@@ -43,9 +44,9 @@ class LocalThreadDataSourceImpl extends ThreadDataSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort}) {
|
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption}) {
|
||||||
return Future.sync(() async {
|
return Future.sync(() async {
|
||||||
return await _emailCacheManager.getAllEmail(inMailboxId: inMailboxId, sort: sort);
|
return await _emailCacheManager.getAllEmail(inMailboxId: inMailboxId, sort: sort, filterOption: filterOption ?? FilterMessageOption.all);
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import 'package:jmap_dart_client/jmap/core/state.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/model.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/domain/model/email_response.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
|
||||||
@@ -60,7 +61,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, UnsignedInt? limit}) {
|
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption}) {
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,11 +16,18 @@ class EmailCacheManager {
|
|||||||
|
|
||||||
EmailCacheManager(this._emailCacheClient);
|
EmailCacheManager(this._emailCacheClient);
|
||||||
|
|
||||||
Future<List<Email>> getAllEmail({MailboxId? inMailboxId, Set<Comparator>? sort}) async {
|
Future<List<Email>> getAllEmail({
|
||||||
|
MailboxId? inMailboxId,
|
||||||
|
Set<Comparator>? sort,
|
||||||
|
FilterMessageOption filterOption = FilterMessageOption.all
|
||||||
|
}) async {
|
||||||
final emailCacheList = inMailboxId != null
|
final emailCacheList = inMailboxId != null
|
||||||
? await _emailCacheClient.getListEmailCacheByMailboxId(inMailboxId)
|
? await _emailCacheClient.getListEmailCacheByMailboxId(inMailboxId)
|
||||||
: await _emailCacheClient.getAll();
|
: await _emailCacheClient.getAll();
|
||||||
final emailList = emailCacheList.map((emailCache) => emailCache.toEmail()).toList();
|
final emailList = emailCacheList
|
||||||
|
.map((emailCache) => emailCache.toEmail())
|
||||||
|
.where((email) => filterOption.filterEmail(email))
|
||||||
|
.toList();
|
||||||
if (sort != null) {
|
if (sort != null) {
|
||||||
sort.forEach((comparator) {
|
sort.forEach((comparator) {
|
||||||
emailList.sortBy(comparator);
|
emailList.sortBy(comparator);
|
||||||
|
|||||||
@@ -36,7 +36,10 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
}
|
}
|
||||||
) async* {
|
) async* {
|
||||||
final localEmailResponse = await Future.wait([
|
final localEmailResponse = await Future.wait([
|
||||||
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: emailFilter?.mailboxId, sort: sort),
|
mapDataSource[DataSourceType.local]!.getAllEmailCache(
|
||||||
|
inMailboxId: emailFilter?.mailboxId,
|
||||||
|
sort: sort,
|
||||||
|
filterOption: emailFilter?.filterOption),
|
||||||
stateDataSource.getState(StateType.email)
|
stateDataSource.getState(StateType.email)
|
||||||
]).then((List response) {
|
]).then((List response) {
|
||||||
return EmailsResponse(emailList: response.first, state: response.last);
|
return EmailsResponse(emailList: response.first, state: response.last);
|
||||||
@@ -110,7 +113,10 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final newEmailResponse = await Future.wait([
|
final newEmailResponse = await Future.wait([
|
||||||
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: emailFilter?.mailboxId, sort: sort),
|
mapDataSource[DataSourceType.local]!.getAllEmailCache(
|
||||||
|
inMailboxId: emailFilter?.mailboxId,
|
||||||
|
sort: sort,
|
||||||
|
filterOption: emailFilter?.filterOption),
|
||||||
stateDataSource.getState(StateType.email)
|
stateDataSource.getState(StateType.email)
|
||||||
]).then((List response) {
|
]).then((List response) {
|
||||||
return EmailsResponse(emailList: response.first, state: response.last);
|
return EmailsResponse(emailList: response.first, state: response.last);
|
||||||
@@ -167,12 +173,14 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Properties? propertiesCreated,
|
Properties? propertiesCreated,
|
||||||
Properties? propertiesUpdated,
|
Properties? propertiesUpdated,
|
||||||
MailboxId? inMailboxId
|
MailboxId? inMailboxId,
|
||||||
|
FilterMessageOption? filterOption,
|
||||||
}
|
}
|
||||||
) async* {
|
) async* {
|
||||||
final localEmailList = await mapDataSource[DataSourceType.local]!.getAllEmailCache(
|
final localEmailList = await mapDataSource[DataSourceType.local]!.getAllEmailCache(
|
||||||
inMailboxId: inMailboxId,
|
inMailboxId: inMailboxId,
|
||||||
sort: sort);
|
sort: sort,
|
||||||
|
filterOption: filterOption);
|
||||||
|
|
||||||
EmailChangeResponse? emailChangeResponse;
|
EmailChangeResponse? emailChangeResponse;
|
||||||
bool hasMoreChanges = true;
|
bool hasMoreChanges = true;
|
||||||
@@ -212,7 +220,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final newEmailResponse = await Future.wait([
|
final newEmailResponse = await Future.wait([
|
||||||
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: inMailboxId, sort: sort),
|
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: inMailboxId, sort: sort, filterOption: filterOption),
|
||||||
stateDataSource.getState(StateType.email)
|
stateDataSource.getState(StateType.email)
|
||||||
]).then((List response) {
|
]).then((List response) {
|
||||||
return EmailsResponse(emailList: response.first, state: response.last);
|
return EmailsResponse(emailList: response.first, state: response.last);
|
||||||
@@ -270,4 +278,40 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
|
|
||||||
return emailResponse.emailList ?? List.empty();
|
return emailResponse.emailList ?? List.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Stream<EmailsResponse> refreshAll(
|
||||||
|
AccountId accountId,
|
||||||
|
{
|
||||||
|
UnsignedInt? limit,
|
||||||
|
Set<Comparator>? sort,
|
||||||
|
EmailFilter? emailFilter,
|
||||||
|
Properties? propertiesCreated,
|
||||||
|
Properties? propertiesUpdated,
|
||||||
|
}
|
||||||
|
) async* {
|
||||||
|
EmailsResponse? networkEmailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
|
||||||
|
accountId,
|
||||||
|
limit: limit,
|
||||||
|
sort: sort,
|
||||||
|
filter: emailFilter?.filter,
|
||||||
|
properties: propertiesCreated);
|
||||||
|
|
||||||
|
await _updateEmailCache(newCreated: networkEmailResponse.emailList);
|
||||||
|
if (networkEmailResponse.state != null) {
|
||||||
|
await _updateState(networkEmailResponse.state!);
|
||||||
|
}
|
||||||
|
|
||||||
|
final newEmailResponse = await Future.wait([
|
||||||
|
mapDataSource[DataSourceType.local]!.getAllEmailCache(
|
||||||
|
inMailboxId: emailFilter?.mailboxId,
|
||||||
|
sort: sort,
|
||||||
|
filterOption: emailFilter?.filterOption),
|
||||||
|
stateDataSource.getState(StateType.email)
|
||||||
|
]).then((List response) {
|
||||||
|
return EmailsResponse(emailList: response.first, state: response.last);
|
||||||
|
});
|
||||||
|
|
||||||
|
yield newEmailResponse;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,17 @@ abstract class ThreadRepository {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Stream<EmailsResponse> refreshAll(
|
||||||
|
AccountId accountId,
|
||||||
|
{
|
||||||
|
UnsignedInt? limit,
|
||||||
|
Set<Comparator>? sort,
|
||||||
|
EmailFilter? emailFilter,
|
||||||
|
Properties? propertiesCreated,
|
||||||
|
Properties? propertiesUpdated,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
Stream<EmailsResponse> refreshChanges(
|
Stream<EmailsResponse> refreshChanges(
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
jmap.State currentState,
|
jmap.State currentState,
|
||||||
@@ -28,7 +39,8 @@ abstract class ThreadRepository {
|
|||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Properties? propertiesCreated,
|
Properties? propertiesCreated,
|
||||||
Properties? propertiesUpdated,
|
Properties? propertiesUpdated,
|
||||||
MailboxId? inMailboxId
|
MailboxId? inMailboxId,
|
||||||
|
FilterMessageOption? filterOption,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
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/core/properties/properties.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
||||||
|
import 'package:model/model.dart';
|
||||||
|
|
||||||
|
class RefreshAllEmailsInMailboxInteractor {
|
||||||
|
final ThreadRepository threadRepository;
|
||||||
|
|
||||||
|
RefreshAllEmailsInMailboxInteractor(this.threadRepository);
|
||||||
|
|
||||||
|
Stream<Either<Failure, Success>> execute(
|
||||||
|
AccountId accountId,
|
||||||
|
{
|
||||||
|
UnsignedInt? limit,
|
||||||
|
Set<Comparator>? sort,
|
||||||
|
EmailFilter? emailFilter,
|
||||||
|
Properties? propertiesCreated,
|
||||||
|
Properties? propertiesUpdated,
|
||||||
|
}
|
||||||
|
) async* {
|
||||||
|
try {
|
||||||
|
yield Right<Failure, Success>(LoadingState());
|
||||||
|
|
||||||
|
yield* threadRepository
|
||||||
|
.refreshAll(
|
||||||
|
accountId,
|
||||||
|
limit: limit,
|
||||||
|
sort: sort,
|
||||||
|
emailFilter: emailFilter,
|
||||||
|
propertiesCreated: propertiesCreated,
|
||||||
|
propertiesUpdated: propertiesUpdated)
|
||||||
|
.map(_toGetEmailState);
|
||||||
|
} catch (e) {
|
||||||
|
yield Left(GetAllEmailFailure(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Either<Failure, Success> _toGetEmailState(EmailsResponse emailResponse) {
|
||||||
|
final presentationEmailList = emailResponse.emailList
|
||||||
|
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
|
||||||
|
|
||||||
|
return Right<Failure, Success>(GetAllEmailSuccess(
|
||||||
|
emailList: presentationEmailList,
|
||||||
|
currentEmailState: emailResponse.state));
|
||||||
|
}
|
||||||
|
}
|
||||||
+4
-2
@@ -22,7 +22,8 @@ class RefreshChangesEmailsInMailboxInteractor {
|
|||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Properties? propertiesCreated,
|
Properties? propertiesCreated,
|
||||||
Properties? propertiesUpdated,
|
Properties? propertiesUpdated,
|
||||||
MailboxId? inMailboxId
|
MailboxId? inMailboxId,
|
||||||
|
FilterMessageOption? filterOption,
|
||||||
}
|
}
|
||||||
) async* {
|
) async* {
|
||||||
yield Right<Failure, Success>(RefreshingState());
|
yield Right<Failure, Success>(RefreshingState());
|
||||||
@@ -35,7 +36,8 @@ class RefreshChangesEmailsInMailboxInteractor {
|
|||||||
sort: sort,
|
sort: sort,
|
||||||
propertiesCreated: propertiesCreated,
|
propertiesCreated: propertiesCreated,
|
||||||
propertiesUpdated: propertiesUpdated,
|
propertiesUpdated: propertiesUpdated,
|
||||||
inMailboxId: inMailboxId)
|
inMailboxId: inMailboxId,
|
||||||
|
filterOption: filterOption)
|
||||||
.map(_toGetEmailState);
|
.map(_toGetEmailState);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left(GetAllEmailFailure(e));
|
yield Left(GetAllEmailFailure(e));
|
||||||
|
|||||||
+1
-21
@@ -1,31 +1,11 @@
|
|||||||
|
|
||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:model/email/presentation_email.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
enum FilterMessageOption {
|
|
||||||
all,
|
|
||||||
unread,
|
|
||||||
attachments,
|
|
||||||
starred,
|
|
||||||
}
|
|
||||||
|
|
||||||
extension FilterMessageOptionExtension on FilterMessageOption {
|
extension FilterMessageOptionExtension on FilterMessageOption {
|
||||||
|
|
||||||
bool filterEmail(PresentationEmail email) {
|
|
||||||
switch(this) {
|
|
||||||
case FilterMessageOption.all:
|
|
||||||
return true;
|
|
||||||
case FilterMessageOption.unread:
|
|
||||||
return email.isUnReadEmail();
|
|
||||||
case FilterMessageOption.attachments:
|
|
||||||
return email.withAttachments;
|
|
||||||
case FilterMessageOption.starred:
|
|
||||||
return email.isFlaggedEmail();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String getIconToast(ImagePaths imagePaths) {
|
String getIconToast(ImagePaths imagePaths) {
|
||||||
switch(this) {
|
switch(this) {
|
||||||
case FilterMessageOption.all:
|
case FilterMessageOption.all:
|
||||||
@@ -28,6 +28,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_i
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
|
||||||
@@ -46,6 +47,7 @@ class ThreadBindings extends BaseBindings {
|
|||||||
Get.put(ThreadController(
|
Get.put(ThreadController(
|
||||||
Get.find<ResponsiveUtils>(),
|
Get.find<ResponsiveUtils>(),
|
||||||
Get.find<GetEmailsInMailboxInteractor>(),
|
Get.find<GetEmailsInMailboxInteractor>(),
|
||||||
|
Get.find<RefreshAllEmailsInMailboxInteractor>(),
|
||||||
Get.find<ScrollController>(),
|
Get.find<ScrollController>(),
|
||||||
Get.find<MarkAsMultipleEmailReadInteractor>(),
|
Get.find<MarkAsMultipleEmailReadInteractor>(),
|
||||||
Get.find<AppToast>(),
|
Get.find<AppToast>(),
|
||||||
@@ -83,6 +85,7 @@ class ThreadBindings extends BaseBindings {
|
|||||||
@override
|
@override
|
||||||
void bindingsInteractor() {
|
void bindingsInteractor() {
|
||||||
Get.lazyPut(() => GetEmailsInMailboxInteractor(Get.find<ThreadRepository>()));
|
Get.lazyPut(() => GetEmailsInMailboxInteractor(Get.find<ThreadRepository>()));
|
||||||
|
Get.lazyPut(() => RefreshAllEmailsInMailboxInteractor(Get.find<ThreadRepository>()));
|
||||||
Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find<EmailRepository>()));
|
Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find<EmailRepository>()));
|
||||||
Get.lazyPut(() => MarkAsMultipleEmailReadInteractor(Get.find<EmailRepository>()));
|
Get.lazyPut(() => MarkAsMultipleEmailReadInteractor(Get.find<EmailRepository>()));
|
||||||
Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>()));
|
Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>()));
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ 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.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.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/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:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||||
@@ -41,10 +42,11 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_i
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/model/filter_message_option.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/extensions/filter_message_option_extension.dart';
|
||||||
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';
|
||||||
@@ -54,6 +56,7 @@ class ThreadController extends BaseController {
|
|||||||
|
|
||||||
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
||||||
final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor;
|
final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor;
|
||||||
|
final RefreshAllEmailsInMailboxInteractor _refreshAllEmailsInMailboxInteractor;
|
||||||
final MarkAsMultipleEmailReadInteractor _markAsMultipleEmailReadInteractor;
|
final MarkAsMultipleEmailReadInteractor _markAsMultipleEmailReadInteractor;
|
||||||
final AppToast _appToast;
|
final AppToast _appToast;
|
||||||
final ResponsiveUtils responsiveUtils;
|
final ResponsiveUtils responsiveUtils;
|
||||||
@@ -69,7 +72,6 @@ class ThreadController extends BaseController {
|
|||||||
|
|
||||||
final emailList = <PresentationEmail>[].obs;
|
final emailList = <PresentationEmail>[].obs;
|
||||||
final emailListSearch = <PresentationEmail>[].obs;
|
final emailListSearch = <PresentationEmail>[].obs;
|
||||||
final emailListFiltered = <PresentationEmail>[].obs;
|
|
||||||
final currentSelectMode = SelectMode.INACTIVE.obs;
|
final currentSelectMode = SelectMode.INACTIVE.obs;
|
||||||
final filterMessageOption = FilterMessageOption.all.obs;
|
final filterMessageOption = FilterMessageOption.all.obs;
|
||||||
|
|
||||||
@@ -82,9 +84,6 @@ class ThreadController extends BaseController {
|
|||||||
|
|
||||||
SearchQuery? get searchQuery => mailboxDashBoardController.searchQuery;
|
SearchQuery? get searchQuery => mailboxDashBoardController.searchQuery;
|
||||||
|
|
||||||
EmailFilterCondition? get _filterCondition => EmailFilterCondition(
|
|
||||||
inMailbox: mailboxDashBoardController.selectedMailbox.value?.id);
|
|
||||||
|
|
||||||
Set<Comparator>? get _sortOrder => Set()
|
Set<Comparator>? get _sortOrder => Set()
|
||||||
..add(EmailComparator(EmailComparatorProperty.receivedAt)
|
..add(EmailComparator(EmailComparatorProperty.receivedAt)
|
||||||
..setIsAscending(false));
|
..setIsAscending(false));
|
||||||
@@ -94,6 +93,7 @@ class ThreadController extends BaseController {
|
|||||||
ThreadController(
|
ThreadController(
|
||||||
this.responsiveUtils,
|
this.responsiveUtils,
|
||||||
this._getEmailsInMailboxInteractor,
|
this._getEmailsInMailboxInteractor,
|
||||||
|
this._refreshAllEmailsInMailboxInteractor,
|
||||||
this.listEmailController,
|
this.listEmailController,
|
||||||
this._markAsMultipleEmailReadInteractor,
|
this._markAsMultipleEmailReadInteractor,
|
||||||
this._appToast,
|
this._appToast,
|
||||||
@@ -220,7 +220,6 @@ class ThreadController extends BaseController {
|
|||||||
void _resetToOriginalValue() {
|
void _resetToOriginalValue() {
|
||||||
dispatchState(Right(LoadingState()));
|
dispatchState(Right(LoadingState()));
|
||||||
emailList.clear();
|
emailList.clear();
|
||||||
emailListFiltered.clear();
|
|
||||||
canLoadMore = true;
|
canLoadMore = true;
|
||||||
disableSearch();
|
disableSearch();
|
||||||
cancelSelectEmail();
|
cancelSelectEmail();
|
||||||
@@ -232,12 +231,6 @@ class ThreadController extends BaseController {
|
|||||||
.map((email) => email.asAvatarGradientColor(random))
|
.map((email) => email.asAvatarGradientColor(random))
|
||||||
.toList();
|
.toList();
|
||||||
emailList.value = listEmailHaveAvatarGradientColor;
|
emailList.value = listEmailHaveAvatarGradientColor;
|
||||||
if (isFilterMessagesEnabled) {
|
|
||||||
final emailsFiltered = listEmailHaveAvatarGradientColor
|
|
||||||
.where((email) => filterMessageOption.value.filterEmail(email))
|
|
||||||
.toList();
|
|
||||||
emailListFiltered.addAll(emailsFiltered);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _getAllEmailAction(AccountId accountId, {MailboxId? mailboxId}) {
|
void _getAllEmailAction(AccountId accountId, {MailboxId? mailboxId}) {
|
||||||
@@ -246,16 +239,60 @@ class ThreadController extends BaseController {
|
|||||||
limit: ThreadConstants.defaultLimit,
|
limit: ThreadConstants.defaultLimit,
|
||||||
sort: _sortOrder,
|
sort: _sortOrder,
|
||||||
emailFilter: EmailFilter(
|
emailFilter: EmailFilter(
|
||||||
filter: _filterCondition,
|
filter: _getFilterCondition(),
|
||||||
|
filterOption: filterMessageOption.value,
|
||||||
mailboxId: mailboxId ?? _currentMailboxId),
|
mailboxId: mailboxId ?? _currentMailboxId),
|
||||||
propertiesCreated: ThreadConstants.propertiesDefault,
|
propertiesCreated: ThreadConstants.propertiesDefault,
|
||||||
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
|
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EmailFilterCondition _getFilterCondition({bool isLoadMore = false}) {
|
||||||
|
switch(filterMessageOption.value) {
|
||||||
|
case FilterMessageOption.all:
|
||||||
|
return EmailFilterCondition(
|
||||||
|
inMailbox: mailboxDashBoardController.selectedMailbox.value?.id,
|
||||||
|
before: isLoadMore ? emailList.last.receivedAt : null
|
||||||
|
);
|
||||||
|
case FilterMessageOption.unread:
|
||||||
|
return EmailFilterCondition(
|
||||||
|
inMailbox: mailboxDashBoardController.selectedMailbox.value?.id,
|
||||||
|
notKeyword: KeyWordIdentifier.emailSeen.value,
|
||||||
|
before: isLoadMore ? emailList.last.receivedAt : null
|
||||||
|
);
|
||||||
|
case FilterMessageOption.attachments:
|
||||||
|
return EmailFilterCondition(
|
||||||
|
inMailbox: mailboxDashBoardController.selectedMailbox.value?.id,
|
||||||
|
hasAttachment: true,
|
||||||
|
before: isLoadMore ? emailList.last.receivedAt : null
|
||||||
|
);
|
||||||
|
case FilterMessageOption.starred:
|
||||||
|
return EmailFilterCondition(
|
||||||
|
inMailbox: mailboxDashBoardController.selectedMailbox.value?.id,
|
||||||
|
hasKeyword: KeyWordIdentifier.emailFlagged.value,
|
||||||
|
before: isLoadMore ? emailList.last.receivedAt : null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void refreshAllEmail() {
|
void refreshAllEmail() {
|
||||||
dispatchState(Right(LoadingState()));
|
dispatchState(Right(LoadingState()));
|
||||||
_getAllEmail();
|
canLoadMore = true;
|
||||||
|
cancelSelectEmail();
|
||||||
|
|
||||||
|
if (_accountId != null) {
|
||||||
|
consumeState(_refreshAllEmailsInMailboxInteractor.execute(
|
||||||
|
_accountId!,
|
||||||
|
limit: ThreadConstants.defaultLimit,
|
||||||
|
sort: _sortOrder,
|
||||||
|
emailFilter: EmailFilter(
|
||||||
|
filter: _getFilterCondition(),
|
||||||
|
filterOption: filterMessageOption.value,
|
||||||
|
mailboxId: _currentMailboxId),
|
||||||
|
propertiesCreated: ThreadConstants.propertiesDefault,
|
||||||
|
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _refreshEmailChanges() {
|
void _refreshEmailChanges() {
|
||||||
@@ -279,6 +316,7 @@ class ThreadController extends BaseController {
|
|||||||
propertiesCreated: ThreadConstants.propertiesDefault,
|
propertiesCreated: ThreadConstants.propertiesDefault,
|
||||||
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
|
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
|
||||||
inMailboxId: _currentMailboxId,
|
inMailboxId: _currentMailboxId,
|
||||||
|
filterOption: filterMessageOption.value
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -290,9 +328,7 @@ class ThreadController extends BaseController {
|
|||||||
_accountId!,
|
_accountId!,
|
||||||
limit: ThreadConstants.defaultLimit,
|
limit: ThreadConstants.defaultLimit,
|
||||||
sort: _sortOrder,
|
sort: _sortOrder,
|
||||||
filter: EmailFilterCondition(
|
filter: _getFilterCondition(isLoadMore: true),
|
||||||
inMailbox: mailboxDashBoardController.selectedMailbox.value?.id,
|
|
||||||
before: emailList.last.receivedAt),
|
|
||||||
properties: ThreadConstants.propertiesDefault,
|
properties: ThreadConstants.propertiesDefault,
|
||||||
lastEmailId: emailList.last.id
|
lastEmailId: emailList.last.id
|
||||||
));
|
));
|
||||||
@@ -305,13 +341,6 @@ class ThreadController extends BaseController {
|
|||||||
.map((email) => email.asAvatarGradientColor(random))
|
.map((email) => email.asAvatarGradientColor(random))
|
||||||
.toList();
|
.toList();
|
||||||
emailList.addAll(listEmailHaveAvatarGradientColor);
|
emailList.addAll(listEmailHaveAvatarGradientColor);
|
||||||
|
|
||||||
if (isFilterMessagesEnabled) {
|
|
||||||
final emailsFilteredMore = listEmailHaveAvatarGradientColor
|
|
||||||
.where((email) => filterMessageOption.value.filterEmail(email))
|
|
||||||
.toList();
|
|
||||||
emailListFiltered.addAll(emailsFilteredMore);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
canLoadMore = false;
|
canLoadMore = false;
|
||||||
}
|
}
|
||||||
@@ -336,15 +365,9 @@ class ThreadController extends BaseController {
|
|||||||
.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email)
|
.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email)
|
||||||
.toList();
|
.toList();
|
||||||
} else {
|
} else {
|
||||||
if (isFilterMessagesEnabled) {
|
emailList.value = emailList
|
||||||
emailListFiltered.value = emailListFiltered
|
.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email)
|
||||||
.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email)
|
.toList();
|
||||||
.toList();
|
|
||||||
} else {
|
|
||||||
emailList.value = emailList
|
|
||||||
.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email)
|
|
||||||
.toList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_isUnSelectedAll()) {
|
if (_isUnSelectedAll()) {
|
||||||
@@ -364,11 +387,7 @@ class ThreadController extends BaseController {
|
|||||||
if (isSearchActive()) {
|
if (isSearchActive()) {
|
||||||
return emailListSearch.where((email) => email.selectMode == SelectMode.ACTIVE).toList();
|
return emailListSearch.where((email) => email.selectMode == SelectMode.ACTIVE).toList();
|
||||||
} else {
|
} else {
|
||||||
if (isFilterMessagesEnabled) {
|
return emailList.where((email) => email.selectMode == SelectMode.ACTIVE).toList();
|
||||||
return emailListFiltered.where((email) => email.selectMode == SelectMode.ACTIVE).toList();
|
|
||||||
} else {
|
|
||||||
return emailList.where((email) => email.selectMode == SelectMode.ACTIVE).toList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,11 +395,7 @@ class ThreadController extends BaseController {
|
|||||||
if (isSearchActive()) {
|
if (isSearchActive()) {
|
||||||
return emailListSearch.every((email) => email.selectMode == SelectMode.INACTIVE);
|
return emailListSearch.every((email) => email.selectMode == SelectMode.INACTIVE);
|
||||||
} else {
|
} else {
|
||||||
if (isFilterMessagesEnabled) {
|
return emailList.every((email) => email.selectMode == SelectMode.INACTIVE);
|
||||||
return emailListFiltered.every((email) => email.selectMode == SelectMode.INACTIVE);
|
|
||||||
} else {
|
|
||||||
return emailList.every((email) => email.selectMode == SelectMode.INACTIVE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -392,11 +407,7 @@ class ThreadController extends BaseController {
|
|||||||
if (isSearchActive()) {
|
if (isSearchActive()) {
|
||||||
emailListSearch.value = emailListSearch.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE)).toList();
|
emailListSearch.value = emailListSearch.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE)).toList();
|
||||||
} else {
|
} else {
|
||||||
if (isFilterMessagesEnabled) {
|
emailList.value = emailList.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE)).toList();
|
||||||
emailListFiltered.value = emailListFiltered.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE)).toList();
|
|
||||||
} else {
|
|
||||||
emailList.value = emailList.map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE)).toList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
currentSelectMode.value = SelectMode.INACTIVE;
|
currentSelectMode.value = SelectMode.INACTIVE;
|
||||||
}
|
}
|
||||||
@@ -465,22 +476,18 @@ class ThreadController extends BaseController {
|
|||||||
popBack();
|
popBack();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get isFilterMessagesEnabled => filterMessageOption != FilterMessageOption.all;
|
|
||||||
|
|
||||||
void filterMessagesAction(BuildContext context, FilterMessageOption filterOption) {
|
void filterMessagesAction(BuildContext context, FilterMessageOption filterOption) {
|
||||||
popBack();
|
popBack();
|
||||||
|
|
||||||
final newFilterOption = filterMessageOption.value == filterOption ? FilterMessageOption.all : filterOption;
|
final newFilterOption = filterMessageOption.value == filterOption ? FilterMessageOption.all : filterOption;
|
||||||
|
|
||||||
final emailsFiltered = emailList.where((email) => newFilterOption.filterEmail(email)).toList();
|
|
||||||
emailListFiltered.value = emailsFiltered;
|
|
||||||
|
|
||||||
filterMessageOption.value = newFilterOption;
|
filterMessageOption.value = newFilterOption;
|
||||||
|
|
||||||
_appToast.showToastWithIcon(
|
_appToast.showToastWithIcon(
|
||||||
Get.overlayContext!,
|
Get.overlayContext!,
|
||||||
message: newFilterOption.getMessageToast(context),
|
message: newFilterOption.getMessageToast(context),
|
||||||
icon: newFilterOption.getIconToast(_imagePaths));
|
icon: newFilterOption.getIconToast(_imagePaths));
|
||||||
|
|
||||||
|
refreshAllEmail();
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveSelectedMultipleEmailToMailboxAction(List<PresentationEmail> listEmail) async {
|
void moveSelectedMultipleEmailToMailboxAction(List<PresentationEmail> listEmail) async {
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import 'package:get/get.dart';
|
|||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/model/filter_message_option.dart';
|
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart';
|
||||||
@@ -317,9 +316,7 @@ class ThreadView extends GetWidget<ThreadController> {
|
|||||||
return _buildResultSearchEmails(context, controller.emailListSearch);
|
return _buildResultSearchEmails(context, controller.emailListSearch);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return _buildResultListEmail(
|
return _buildResultListEmail(context, controller.emailList);
|
||||||
context,
|
|
||||||
controller.isFilterMessagesEnabled ? controller.emailListFiltered : controller.emailList);
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/model/filter_message_option.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/extensions/filter_message_option_extension.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
typedef OnFilterEmailAction = void Function(FilterMessageOption, RelativeRect? position);
|
typedef OnFilterEmailAction = void Function(FilterMessageOption, RelativeRect? position);
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@ import 'package:core/core.dart';
|
|||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/model/filter_message_option.dart';
|
import 'package:model/model.dart';
|
||||||
|
|
||||||
class FilterMessageCupertinoActionSheetActionBuilder extends CupertinoActionSheetActionBuilder<FilterMessageOption> {
|
class FilterMessageCupertinoActionSheetActionBuilder extends CupertinoActionSheetActionBuilder<FilterMessageOption> {
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,16 @@
|
|||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.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/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/email/filter_message_option.dart';
|
||||||
|
|
||||||
class EmailFilter with EquatableMixin {
|
class EmailFilter with EquatableMixin {
|
||||||
|
|
||||||
final Filter? filter;
|
final Filter? filter;
|
||||||
|
final FilterMessageOption? filterOption;
|
||||||
final MailboxId? mailboxId;
|
final MailboxId? mailboxId;
|
||||||
|
|
||||||
EmailFilter({this.filter, this.mailboxId});
|
EmailFilter({this.filter, this.filterOption, this.mailboxId});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [filter, mailboxId];
|
List<Object?> get props => [filter, filterOption, mailboxId];
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
|
import 'package:model/email/presentation_email.dart';
|
||||||
|
import 'package:model/extensions/email_extension.dart';
|
||||||
|
|
||||||
|
enum FilterMessageOption {
|
||||||
|
all,
|
||||||
|
unread,
|
||||||
|
attachments,
|
||||||
|
starred,
|
||||||
|
}
|
||||||
|
|
||||||
|
extension FilterMessageOptionExtension on FilterMessageOption {
|
||||||
|
|
||||||
|
bool filterPresentationEmail(PresentationEmail email) {
|
||||||
|
switch(this) {
|
||||||
|
case FilterMessageOption.all:
|
||||||
|
return true;
|
||||||
|
case FilterMessageOption.unread:
|
||||||
|
return email.isUnReadEmail();
|
||||||
|
case FilterMessageOption.attachments:
|
||||||
|
return email.withAttachments;
|
||||||
|
case FilterMessageOption.starred:
|
||||||
|
return email.isFlaggedEmail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool filterEmail(Email email) {
|
||||||
|
switch(this) {
|
||||||
|
case FilterMessageOption.all:
|
||||||
|
return true;
|
||||||
|
case FilterMessageOption.unread:
|
||||||
|
return email.isUnReadEmail();
|
||||||
|
case FilterMessageOption.attachments:
|
||||||
|
return email.withAttachments;
|
||||||
|
case FilterMessageOption.starred:
|
||||||
|
return email.isFlaggedEmail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,6 +16,8 @@ extension EmailExtension on Email {
|
|||||||
|
|
||||||
bool isFlaggedEmail() => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true;
|
bool isFlaggedEmail() => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true;
|
||||||
|
|
||||||
|
bool get withAttachments => hasAttachment == true;
|
||||||
|
|
||||||
Set<String> getRecipientEmailAddressList() {
|
Set<String> getRecipientEmailAddressList() {
|
||||||
final listEmailAddress = Set<String>();
|
final listEmailAddress = Set<String>();
|
||||||
final listToAddress = to.getListAddress() ?? [];
|
final listToAddress = to.getListAddress() ?? [];
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ export 'email/mark_star_action.dart';
|
|||||||
export 'email/email_property.dart';
|
export 'email/email_property.dart';
|
||||||
export 'email/email_filter.dart';
|
export 'email/email_filter.dart';
|
||||||
export 'email/email_content_type.dart';
|
export 'email/email_content_type.dart';
|
||||||
|
export 'email/filter_message_option.dart';
|
||||||
|
|
||||||
// Extensions
|
// Extensions
|
||||||
export 'extensions/email_address_extension.dart';
|
export 'extensions/email_address_extension.dart';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Mocks generated by Mockito 5.0.10 from annotations
|
// Mocks generated by Mockito 5.0.17 from annotations
|
||||||
// in tmail_ui_user/test/features/mailbox/domain/usecases/get_all_mailbox_interactor_test.dart.
|
// in tmail_ui_user/test/features/mailbox/domain/usecases/get_all_mailbox_interactor_test.dart.
|
||||||
// Do not manually edit this file.
|
// Do not manually edit this file.
|
||||||
|
|
||||||
@@ -7,17 +7,25 @@ import 'dart:async' as _i3;
|
|||||||
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
|
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i6;
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i6;
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart' as _i7;
|
import 'package:jmap_dart_client/jmap/core/state.dart' as _i7;
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i8;
|
||||||
import 'package:mockito/mockito.dart' as _i1;
|
import 'package:mockito/mockito.dart' as _i1;
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'
|
||||||
|
as _i9;
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'
|
||||||
as _i4;
|
as _i4;
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'
|
||||||
|
as _i10;
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'
|
||||||
as _i2;
|
as _i2;
|
||||||
|
|
||||||
// ignore_for_file: avoid_redundant_argument_values
|
// ignore_for_file: avoid_redundant_argument_values
|
||||||
|
// ignore_for_file: avoid_setters_without_getters
|
||||||
// ignore_for_file: comment_references
|
// ignore_for_file: comment_references
|
||||||
|
// ignore_for_file: implementation_imports
|
||||||
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
||||||
// ignore_for_file: prefer_const_constructors
|
// ignore_for_file: prefer_const_constructors
|
||||||
// ignore_for_file: unnecessary_parenthesis
|
// ignore_for_file: unnecessary_parenthesis
|
||||||
|
// ignore_for_file: camel_case_types
|
||||||
|
|
||||||
/// A class which mocks [MailboxRepository].
|
/// A class which mocks [MailboxRepository].
|
||||||
///
|
///
|
||||||
@@ -42,4 +50,23 @@ class MockMailboxRepository extends _i1.Mock implements _i2.MailboxRepository {
|
|||||||
Invocation.method(#refresh, [accountId, currentState]),
|
Invocation.method(#refresh, [accountId, currentState]),
|
||||||
returnValue: Stream<_i4.MailboxResponse>.empty())
|
returnValue: Stream<_i4.MailboxResponse>.empty())
|
||||||
as _i3.Stream<_i4.MailboxResponse>);
|
as _i3.Stream<_i4.MailboxResponse>);
|
||||||
|
@override
|
||||||
|
_i3.Future<_i8.Mailbox?> createNewMailbox(_i5.AccountId? accountId,
|
||||||
|
_i9.CreateNewMailboxRequest? newMailboxRequest) =>
|
||||||
|
(super.noSuchMethod(
|
||||||
|
Invocation.method(#createNewMailbox, [accountId, newMailboxRequest]),
|
||||||
|
returnValue:
|
||||||
|
Future<_i8.Mailbox?>.value()) as _i3.Future<_i8.Mailbox?>);
|
||||||
|
@override
|
||||||
|
_i3.Future<bool> deleteMultipleMailbox(
|
||||||
|
_i5.AccountId? accountId, List<_i8.MailboxId>? mailboxIds) =>
|
||||||
|
(super.noSuchMethod(
|
||||||
|
Invocation.method(#deleteMultipleMailbox, [accountId, mailboxIds]),
|
||||||
|
returnValue: Future<bool>.value(false)) as _i3.Future<bool>);
|
||||||
|
@override
|
||||||
|
_i3.Future<bool> renameMailbox(
|
||||||
|
_i5.AccountId? accountId, _i10.RenameMailboxRequest? request) =>
|
||||||
|
(super.noSuchMethod(
|
||||||
|
Invocation.method(#renameMailbox, [accountId, request]),
|
||||||
|
returnValue: Future<bool>.value(false)) as _i3.Future<bool>);
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-1
@@ -1,4 +1,4 @@
|
|||||||
// Mocks generated by Mockito 5.0.10 from annotations
|
// Mocks generated by Mockito 5.0.17 from annotations
|
||||||
// in tmail_ui_user/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.dart.
|
// in tmail_ui_user/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.dart.
|
||||||
// Do not manually edit this file.
|
// Do not manually edit this file.
|
||||||
|
|
||||||
@@ -7,17 +7,25 @@ import 'dart:async' as _i3;
|
|||||||
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
|
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i6;
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i6;
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart' as _i7;
|
import 'package:jmap_dart_client/jmap/core/state.dart' as _i7;
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i8;
|
||||||
import 'package:mockito/mockito.dart' as _i1;
|
import 'package:mockito/mockito.dart' as _i1;
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'
|
||||||
|
as _i9;
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'
|
||||||
as _i4;
|
as _i4;
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'
|
||||||
|
as _i10;
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'
|
||||||
as _i2;
|
as _i2;
|
||||||
|
|
||||||
// ignore_for_file: avoid_redundant_argument_values
|
// ignore_for_file: avoid_redundant_argument_values
|
||||||
|
// ignore_for_file: avoid_setters_without_getters
|
||||||
// ignore_for_file: comment_references
|
// ignore_for_file: comment_references
|
||||||
|
// ignore_for_file: implementation_imports
|
||||||
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
||||||
// ignore_for_file: prefer_const_constructors
|
// ignore_for_file: prefer_const_constructors
|
||||||
// ignore_for_file: unnecessary_parenthesis
|
// ignore_for_file: unnecessary_parenthesis
|
||||||
|
// ignore_for_file: camel_case_types
|
||||||
|
|
||||||
/// A class which mocks [MailboxRepository].
|
/// A class which mocks [MailboxRepository].
|
||||||
///
|
///
|
||||||
@@ -42,4 +50,23 @@ class MockMailboxRepository extends _i1.Mock implements _i2.MailboxRepository {
|
|||||||
Invocation.method(#refresh, [accountId, currentState]),
|
Invocation.method(#refresh, [accountId, currentState]),
|
||||||
returnValue: Stream<_i4.MailboxResponse>.empty())
|
returnValue: Stream<_i4.MailboxResponse>.empty())
|
||||||
as _i3.Stream<_i4.MailboxResponse>);
|
as _i3.Stream<_i4.MailboxResponse>);
|
||||||
|
@override
|
||||||
|
_i3.Future<_i8.Mailbox?> createNewMailbox(_i5.AccountId? accountId,
|
||||||
|
_i9.CreateNewMailboxRequest? newMailboxRequest) =>
|
||||||
|
(super.noSuchMethod(
|
||||||
|
Invocation.method(#createNewMailbox, [accountId, newMailboxRequest]),
|
||||||
|
returnValue:
|
||||||
|
Future<_i8.Mailbox?>.value()) as _i3.Future<_i8.Mailbox?>);
|
||||||
|
@override
|
||||||
|
_i3.Future<bool> deleteMultipleMailbox(
|
||||||
|
_i5.AccountId? accountId, List<_i8.MailboxId>? mailboxIds) =>
|
||||||
|
(super.noSuchMethod(
|
||||||
|
Invocation.method(#deleteMultipleMailbox, [accountId, mailboxIds]),
|
||||||
|
returnValue: Future<bool>.value(false)) as _i3.Future<bool>);
|
||||||
|
@override
|
||||||
|
_i3.Future<bool> renameMailbox(
|
||||||
|
_i5.AccountId? accountId, _i10.RenameMailboxRequest? request) =>
|
||||||
|
(super.noSuchMethod(
|
||||||
|
Invocation.method(#renameMailbox, [accountId, request]),
|
||||||
|
returnValue: Future<bool>.value(false)) as _i3.Future<bool>);
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-4
@@ -1,4 +1,4 @@
|
|||||||
// Mocks generated by Mockito 5.0.10 from annotations
|
// Mocks generated by Mockito 5.0.17 from annotations
|
||||||
// in tmail_ui_user/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart.
|
// in tmail_ui_user/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart.
|
||||||
// Do not manually edit this file.
|
// Do not manually edit this file.
|
||||||
|
|
||||||
@@ -13,17 +13,20 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i6;
|
|||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i13;
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i13;
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11;
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11;
|
||||||
import 'package:mockito/mockito.dart' as _i1;
|
import 'package:mockito/mockito.dart' as _i1;
|
||||||
import 'package:model/email/email_filter.dart' as _i8;
|
import 'package:model/model.dart' as _i8;
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
|
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
|
||||||
as _i4;
|
as _i4;
|
||||||
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
|
||||||
as _i2;
|
as _i2;
|
||||||
|
|
||||||
// ignore_for_file: avoid_redundant_argument_values
|
// ignore_for_file: avoid_redundant_argument_values
|
||||||
|
// ignore_for_file: avoid_setters_without_getters
|
||||||
// ignore_for_file: comment_references
|
// ignore_for_file: comment_references
|
||||||
|
// ignore_for_file: implementation_imports
|
||||||
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
||||||
// ignore_for_file: prefer_const_constructors
|
// ignore_for_file: prefer_const_constructors
|
||||||
// ignore_for_file: unnecessary_parenthesis
|
// ignore_for_file: unnecessary_parenthesis
|
||||||
|
// ignore_for_file: camel_case_types
|
||||||
|
|
||||||
/// A class which mocks [ThreadRepository].
|
/// A class which mocks [ThreadRepository].
|
||||||
///
|
///
|
||||||
@@ -58,7 +61,8 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
|
|||||||
{Set<_i7.Comparator>? sort,
|
{Set<_i7.Comparator>? sort,
|
||||||
_i9.Properties? propertiesCreated,
|
_i9.Properties? propertiesCreated,
|
||||||
_i9.Properties? propertiesUpdated,
|
_i9.Properties? propertiesUpdated,
|
||||||
_i11.MailboxId? inMailboxId}) =>
|
_i11.MailboxId? inMailboxId,
|
||||||
|
_i8.FilterMessageOption? filterOption}) =>
|
||||||
(super.noSuchMethod(
|
(super.noSuchMethod(
|
||||||
Invocation.method(#refreshChanges, [
|
Invocation.method(#refreshChanges, [
|
||||||
accountId,
|
accountId,
|
||||||
@@ -67,7 +71,8 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
|
|||||||
#sort: sort,
|
#sort: sort,
|
||||||
#propertiesCreated: propertiesCreated,
|
#propertiesCreated: propertiesCreated,
|
||||||
#propertiesUpdated: propertiesUpdated,
|
#propertiesUpdated: propertiesUpdated,
|
||||||
#inMailboxId: inMailboxId
|
#inMailboxId: inMailboxId,
|
||||||
|
#filterOption: filterOption
|
||||||
}),
|
}),
|
||||||
returnValue: Stream<_i4.EmailsResponse>.empty())
|
returnValue: Stream<_i4.EmailsResponse>.empty())
|
||||||
as _i3.Stream<_i4.EmailsResponse>);
|
as _i3.Stream<_i4.EmailsResponse>);
|
||||||
|
|||||||
+9
-4
@@ -1,4 +1,4 @@
|
|||||||
// Mocks generated by Mockito 5.0.10 from annotations
|
// Mocks generated by Mockito 5.0.17 from annotations
|
||||||
// in tmail_ui_user/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart.
|
// in tmail_ui_user/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart.
|
||||||
// Do not manually edit this file.
|
// Do not manually edit this file.
|
||||||
|
|
||||||
@@ -13,17 +13,20 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i6;
|
|||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i13;
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i13;
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11;
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11;
|
||||||
import 'package:mockito/mockito.dart' as _i1;
|
import 'package:mockito/mockito.dart' as _i1;
|
||||||
import 'package:model/email/email_filter.dart' as _i8;
|
import 'package:model/model.dart' as _i8;
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
|
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
|
||||||
as _i4;
|
as _i4;
|
||||||
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
|
||||||
as _i2;
|
as _i2;
|
||||||
|
|
||||||
// ignore_for_file: avoid_redundant_argument_values
|
// ignore_for_file: avoid_redundant_argument_values
|
||||||
|
// ignore_for_file: avoid_setters_without_getters
|
||||||
// ignore_for_file: comment_references
|
// ignore_for_file: comment_references
|
||||||
|
// ignore_for_file: implementation_imports
|
||||||
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
// ignore_for_file: invalid_use_of_visible_for_testing_member
|
||||||
// ignore_for_file: prefer_const_constructors
|
// ignore_for_file: prefer_const_constructors
|
||||||
// ignore_for_file: unnecessary_parenthesis
|
// ignore_for_file: unnecessary_parenthesis
|
||||||
|
// ignore_for_file: camel_case_types
|
||||||
|
|
||||||
/// A class which mocks [ThreadRepository].
|
/// A class which mocks [ThreadRepository].
|
||||||
///
|
///
|
||||||
@@ -58,7 +61,8 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
|
|||||||
{Set<_i7.Comparator>? sort,
|
{Set<_i7.Comparator>? sort,
|
||||||
_i9.Properties? propertiesCreated,
|
_i9.Properties? propertiesCreated,
|
||||||
_i9.Properties? propertiesUpdated,
|
_i9.Properties? propertiesUpdated,
|
||||||
_i11.MailboxId? inMailboxId}) =>
|
_i11.MailboxId? inMailboxId,
|
||||||
|
_i8.FilterMessageOption? filterOption}) =>
|
||||||
(super.noSuchMethod(
|
(super.noSuchMethod(
|
||||||
Invocation.method(#refreshChanges, [
|
Invocation.method(#refreshChanges, [
|
||||||
accountId,
|
accountId,
|
||||||
@@ -67,7 +71,8 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
|
|||||||
#sort: sort,
|
#sort: sort,
|
||||||
#propertiesCreated: propertiesCreated,
|
#propertiesCreated: propertiesCreated,
|
||||||
#propertiesUpdated: propertiesUpdated,
|
#propertiesUpdated: propertiesUpdated,
|
||||||
#inMailboxId: inMailboxId
|
#inMailboxId: inMailboxId,
|
||||||
|
#filterOption: filterOption
|
||||||
}),
|
}),
|
||||||
returnValue: Stream<_i4.EmailsResponse>.empty())
|
returnValue: Stream<_i4.EmailsResponse>.empty())
|
||||||
as _i3.Stream<_i4.EmailsResponse>);
|
as _i3.Stream<_i4.EmailsResponse>);
|
||||||
|
|||||||
Reference in New Issue
Block a user