diff --git a/lib/features/mailbox/domain/constants/mailbox_constants.dart b/lib/features/mailbox/domain/constants/mailbox_constants.dart new file mode 100644 index 000000000..052a32b4a --- /dev/null +++ b/lib/features/mailbox/domain/constants/mailbox_constants.dart @@ -0,0 +1,3 @@ +class MailboxConstants { + static const MAILBOX_LEVEL_SEPARATOR = "/"; +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/extensions/list_mailbox_extension.dart b/lib/features/mailbox/domain/extensions/list_mailbox_extension.dart new file mode 100644 index 000000000..8e96b32cf --- /dev/null +++ b/lib/features/mailbox/domain/extensions/list_mailbox_extension.dart @@ -0,0 +1,22 @@ +import 'package:built_collection/built_collection.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/extensions/mailbox_extension.dart'; + +extension ListMailboxExtensions on List { + Tuple2, List> splitMailboxList(bool test(Mailbox element)) { + final validBuilder = ListBuilder(); + final invalidBuilder = ListBuilder(); + forEach((element) { + if (test(element)) { + validBuilder.add(element.toPresentationMailbox()); + } else { + invalidBuilder.add(element.toPresentationMailbox()); + } + }); + return Tuple2( + validBuilder.build().toList(), + invalidBuilder.build().toList()); + } +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/extensions/mailbox_extension.dart b/lib/features/mailbox/domain/extensions/mailbox_extension.dart new file mode 100644 index 000000000..e6bf5a4e2 --- /dev/null +++ b/lib/features/mailbox/domain/extensions/mailbox_extension.dart @@ -0,0 +1,24 @@ +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/model.dart'; + +extension MailboxExtension on Mailbox { + + PresentationMailbox toPresentationMailbox({SelectMode selectMode = SelectMode.INACTIVE}) { + return PresentationMailbox( + id, + name: name, + parentId: parentId, + role: role, + sortOrder: sortOrder, + totalEmails: totalEmails, + unreadEmails: unreadEmails, + totalThreads: totalThreads, + unreadThreads: unreadThreads, + myRights: myRights, + isSubscribed: isSubscribed, + selectMode: selectMode + ); + } + + bool hasRole() => role != null && role!.value.isNotEmpty; +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/extensions/mailbox_name_extension.dart b/lib/features/mailbox/domain/extensions/mailbox_name_extension.dart new file mode 100644 index 000000000..55d27ec0b --- /dev/null +++ b/lib/features/mailbox/domain/extensions/mailbox_name_extension.dart @@ -0,0 +1,5 @@ +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; + +extension MailboxNameExtension on MailboxName { + int compareToSort(MailboxName mailboxName) => name.compareTo(mailboxName.name); +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/extensions/presentation_mailbox_extension.dart b/lib/features/mailbox/domain/extensions/presentation_mailbox_extension.dart new file mode 100644 index 000000000..e16d7d2a3 --- /dev/null +++ b/lib/features/mailbox/domain/extensions/presentation_mailbox_extension.dart @@ -0,0 +1,32 @@ +import 'package:core/core.dart'; +import 'package:model/model.dart'; + +extension PresentationMailboxExtension on PresentationMailbox { + + String getMailboxIcon(ImagePaths imagePaths) { + if (hasRole()) { + switch(role!.value) { + case 'inbox': + return imagePaths.icMailboxInbox; + case 'drafts': + return imagePaths.icMailboxDrafts; + case 'outbox': + return imagePaths.icMailboxInbox; + case 'sent': + return imagePaths.icMailboxSent; + case 'trash': + return imagePaths.icMailboxTrash; + case 'spam': + return imagePaths.icMailboxSpam; + case 'templates': + return imagePaths.icMailboxTemplate; + case 'all_mail': + return imagePaths.icMailboxAllMail; + default: + return imagePaths.icMailboxFolder; + } + } else { + return imagePaths.icMailboxFolder; + } + } +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/repository/mailbox_repository.dart b/lib/features/mailbox/domain/repository/mailbox_repository.dart new file mode 100644 index 000000000..b8286e0bb --- /dev/null +++ b/lib/features/mailbox/domain/repository/mailbox_repository.dart @@ -0,0 +1,7 @@ +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/mail/mailbox/mailbox.dart'; + +abstract class MailboxRepository { + Future> getAllMailbox(AccountId accountId, {Properties? properties}); +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/state/get_all_mailboxes_state.dart b/lib/features/mailbox/domain/state/get_all_mailboxes_state.dart new file mode 100644 index 000000000..eab518346 --- /dev/null +++ b/lib/features/mailbox/domain/state/get_all_mailboxes_state.dart @@ -0,0 +1,21 @@ +import 'package:core/core.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; + +class GetAllMailboxSuccess extends UIState { + final List defaultMailboxList; + final List folderMailboxList; + + GetAllMailboxSuccess({required this.defaultMailboxList, required this.folderMailboxList}); + + @override + List get props => [folderMailboxList]; +} + +class GetAllMailboxFailure extends FeatureFailure { + final exception; + + GetAllMailboxFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart new file mode 100644 index 000000000..2b428cc2c --- /dev/null +++ b/lib/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart @@ -0,0 +1,25 @@ +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:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/extensions/list_mailbox_extension.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/extensions/mailbox_extension.dart'; + +class GetAllMailboxInteractor { + final MailboxRepository mailboxRepository; + + GetAllMailboxInteractor(this.mailboxRepository); + + Stream> execute(AccountId accountId, {Properties? properties}) async* { + try { + yield Right(UIState.loading); + final mailboxList = await mailboxRepository.getAllMailbox(accountId, properties: properties); + final tupleList = mailboxList.splitMailboxList((mailbox) => mailbox.hasRole()); + yield Right(GetAllMailboxSuccess(defaultMailboxList: tupleList.value1, folderMailboxList: tupleList.value2)); + } catch (e) { + yield Left(GetAllMailboxFailure(e)); + } + } +} \ No newline at end of file