diff --git a/lib/features/thread/domain/constants/thread_constants.dart b/lib/features/thread/domain/constants/thread_constants.dart new file mode 100644 index 000000000..6568ef856 --- /dev/null +++ b/lib/features/thread/domain/constants/thread_constants.dart @@ -0,0 +1,5 @@ +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; + +class ThreadConstants { + static final defaultLimit = UnsignedInt(20); +} \ No newline at end of file diff --git a/lib/features/thread/domain/extensions/email_extension.dart b/lib/features/thread/domain/extensions/email_extension.dart new file mode 100644 index 000000000..d4e16962c --- /dev/null +++ b/lib/features/thread/domain/extensions/email_extension.dart @@ -0,0 +1,24 @@ +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/model.dart'; + +extension EmailExtension on Email { + + PresentationEmail toPresentationEmail({SelectMode selectMode = SelectMode.INACTIVE}) { + return PresentationEmail( + id, + keywords: keywords, + size: size, + receivedAt: receivedAt, + hasAttachment: hasAttachment, + preview: preview, + subject: subject, + sentAt: sentAt, + from: from, + to: to, + cc: cc, + bcc: bcc, + replyTo: replyTo, + selectMode: selectMode + ); + } +} \ No newline at end of file diff --git a/lib/features/thread/domain/repository/thread_repository.dart b/lib/features/thread/domain/repository/thread_repository.dart new file mode 100644 index 000000000..1e7b8a5b2 --- /dev/null +++ b/lib/features/thread/domain/repository/thread_repository.dart @@ -0,0 +1,19 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; + +abstract class ThreadRepository { + Future> getAllEmail( + AccountId accountId, + { + int? position, + UnsignedInt? limit, + Set? sort, + Filter? filter, + Properties? properties + } + ); +} \ No newline at end of file diff --git a/lib/features/thread/domain/state/get_all_email_state.dart b/lib/features/thread/domain/state/get_all_email_state.dart new file mode 100644 index 000000000..fb1e7be9a --- /dev/null +++ b/lib/features/thread/domain/state/get_all_email_state.dart @@ -0,0 +1,20 @@ +import 'package:core/core.dart'; +import 'package:model/model.dart'; + +class GetAllEmailSuccess extends UIState { + final List emailList; + + GetAllEmailSuccess(this.emailList); + + @override + List get props => [emailList]; +} + +class GetAllEmailFailure extends FeatureFailure { + final exception; + + GetAllEmailFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart b/lib/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart new file mode 100644 index 000000000..f3218af4e --- /dev/null +++ b/lib/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart @@ -0,0 +1,43 @@ +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/filter/filter.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/repository/thread_repository.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart'; +import 'package:tmail_ui_user/features/thread/domain/extensions/email_extension.dart'; + +class GetEmailsInMailboxInteractor { + final ThreadRepository threadRepository; + + GetEmailsInMailboxInteractor(this.threadRepository); + + Stream> execute( + AccountId accountId, + { + int? position, + UnsignedInt? limit, + Set? sort, + Filter? filter, + Properties? properties + } + ) async* { + try { + yield Right(UIState.loading); + final emailList = await threadRepository.getAllEmail( + accountId, + position: position, + limit: limit, + sort: sort, + filter: filter, + properties: properties + ); + final presentationEmailList = emailList.map((email) => email.toPresentationEmail()).toList(); + yield Right(GetAllEmailSuccess(presentationEmailList)); + } catch (e) { + yield Left(GetAllEmailFailure(e)); + } + } +} \ No newline at end of file