diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index 22481b335..4e416ddb6 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -8,20 +8,27 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/main/actions/app_action.dart'; +import 'package:tmail_ui_user/main/actions/email_action.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class EmailController extends BaseController { final mailboxDashBoardController = Get.find(); + final responsiveUtils = Get.find(); + final GetEmailContentInteractor _getEmailContentInteractor; final MarkAsEmailReadInteractor _markAsEmailReadInteractor; final emailAddressExpandMode = ExpandMode.COLLAPSE.obs; EmailContent? emailContent; + AppAction? emailActionCurrent; EmailController(this._getEmailContentInteractor, this._markAsEmailReadInteractor); @@ -30,10 +37,13 @@ class EmailController extends BaseController { super.onReady(); mailboxDashBoardController.selectedEmail.listen((presentationEmail) { toggleDisplayEmailAddressAction(expandMode: ExpandMode.COLLAPSE); + emailActionCurrent = null; final accountId = mailboxDashBoardController.accountId.value; if (accountId != null && presentationEmail != null) { _getEmailContentAction(accountId, presentationEmail.id); - markAsEmailRead(unread: false); + if (presentationEmail.isUnReadEmail()) { + markAsEmailRead(unread: false); + } } }); } @@ -73,8 +83,23 @@ class EmailController extends BaseController { void markAsEmailRead({required bool unread}) async { final accountId = mailboxDashBoardController.accountId.value; final presentationEmail = mailboxDashBoardController.selectedEmail.value; - if (accountId != null && presentationEmail != null) { - _markAsEmailReadInteractor.execute(accountId, presentationEmail.id, unread); + final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; + if (accountId != null && presentationEmail != null && mailboxCurrent != null) { + _markAsEmailReadInteractor.execute(accountId, presentationEmail.id, unread) + .then((result) => result + .map((success) { + if (success is MarkAsEmailReadSuccess) { + emailActionCurrent = MarkAsEmailReadAction(presentationEmail.id, mailboxCurrent); + _updateMailboxDashBoardActionForDesktop(emailActionCurrent); + } + }) + ); + } + } + + void _updateMailboxDashBoardActionForDesktop(AppAction? appAction) { + if (Get.context != null && responsiveUtils.isDesktop(Get.context!)) { + mailboxDashBoardController.setMailboxDashBoardAction(appAction); } } @@ -84,7 +109,7 @@ class EmailController extends BaseController { && mailboxDashBoardController.selectedEmail.value != null; void goToThreadView(BuildContext context) { - Get.back(); + popBack(result: emailActionCurrent); } void pressEmailAction(EmailActionType emailActionType) { diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 3f03c0b16..85e465d6e 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -22,25 +22,29 @@ class EmailView extends GetWidget { @override Widget build(BuildContext context) { - return Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: AppColor.primaryLightColor, - body: SafeArea( - right: false, - left: false, - child: Container( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - _buildAppBar(context), - Expanded(child: _buildEmailContent(context)), - _buildBottomBar(context), - ]) - ) - ), - ); + return WillPopScope( + child: Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: AppColor.primaryLightColor, + body: SafeArea( + right: false, + left: false, + child: Container( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildAppBar(context), + Expanded(child: _buildEmailContent(context)), + _buildBottomBar(context), + ]) + ) + )), + onWillPop: () async { + emailController.goToThreadView(context); + return true; + }); } Widget _buildAppBar(BuildContext context) { diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 3bdfbe136..d0f914cae 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -1,22 +1,20 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:model/mailbox/presentation_mailbox.dart'; -import 'package:model/mailbox/select_mode.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/constants/mailbox_constants.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/main/actions/email_action.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; class MailboxController extends BaseController { @@ -28,6 +26,7 @@ class MailboxController extends BaseController { final ResponsiveUtils responsiveUtils; final folderMailboxTree = MailboxTree(MailboxNode.root()).obs; + final defaultMailboxList = [].obs; MailboxController( this._getAllMailboxInteractor, @@ -44,12 +43,20 @@ class MailboxController extends BaseController { getAllMailboxAction(accountId); } }); + + mailboxDashBoardController.mailboxDashBoardAction.listen((action) { + if (action is MarkAsEmailReadAction) { + _updateCountUnReadAllMailbox(action.presentationMailbox); + mailboxDashBoardController.clearMailboxDashBoardAction(); + } + }); } @override void dispose() { super.dispose(); mailboxDashBoardController.accountId.close(); + mailboxDashBoardController.mailboxDashBoardAction.close(); } void refreshGetAllMailboxAction() { @@ -77,6 +84,7 @@ class MailboxController extends BaseController { void onDone() { viewState.value.map((success) { if (success is GetAllMailboxSuccess) { + defaultMailboxList.value = success.defaultMailboxList; _setUpMapMailboxIdDefault(success.defaultMailboxList); } }); @@ -90,12 +98,21 @@ class MailboxController extends BaseController { } void _setUpMapMailboxIdDefault(List defaultMailboxList) { + var mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; + defaultMailboxList.forEach((presentationMailbox) { - if (presentationMailbox.role == PresentationMailbox.roleInbox) { - mailboxDashBoardController.setSelectedMailbox(presentationMailbox); + if (mailboxCurrent == null && presentationMailbox.role == PresentationMailbox.roleInbox) { + mailboxCurrent = presentationMailbox; + } else if (mailboxCurrent?.role == presentationMailbox.role) { + mailboxCurrent = presentationMailbox; } + mailboxDashBoardController.addMailboxIdToMap(presentationMailbox.role!, presentationMailbox.id); }); + + if (mailboxCurrent != null) { + mailboxDashBoardController.setNewFirstSelectedMailbox(mailboxCurrent); + } } SelectMode getSelectMode(PresentationMailbox presentationMailbox, PresentationMailbox? selectedMailbox) { @@ -109,12 +126,29 @@ class MailboxController extends BaseController { PresentationMailbox presentationMailboxSelected ) { mailboxDashBoardController.setSelectedMailbox(presentationMailboxSelected); + mailboxDashBoardController.clearSelectedEmail(); if (responsiveUtils.isMobile(context)) { mailboxDashBoardController.closeDrawer(); } } + void _updateCountUnReadAllMailbox(PresentationMailbox presentationMailbox) { + if (presentationMailbox.hasRole()) { + final newCountUnRead = presentationMailbox.unreadEmails != null + ? presentationMailbox.unreadEmails!.value.value - 1 + : 0; + final newMailbox = presentationMailbox.toPresentationMailbox(countUnRead: UnsignedInt(newCountUnRead)); + final newDefaultMailboxList = defaultMailboxList + .map((mailbox) => mailbox.id == presentationMailbox.id + ? mailbox.toPresentationMailbox(countUnRead: UnsignedInt(newCountUnRead)) + : mailbox) + .toList(); + defaultMailboxList.value = newDefaultMailboxList; + mailboxDashBoardController.setNewFirstSelectedMailbox(newMailbox); + } + } + void _deleteCredential() async { await _deleteCredentialInteractor.execute(); } diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index 892de3167..bc1df93fb 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart'; @@ -127,12 +126,9 @@ class MailboxView extends GetWidget { primary: false, shrinkWrap: true, children: [ - Obx(() => controller.viewState.value.fold( - (failure) => SizedBox.shrink(), - (success) => success is GetAllMailboxSuccess - ? _buildDefaultMailbox(context, success.defaultMailboxList) - : SizedBox.shrink()) - ), + Obx(() => controller.defaultMailboxList.isNotEmpty + ? _buildDefaultMailbox(context, controller.defaultMailboxList) + : SizedBox.shrink()), Padding( padding: EdgeInsets.only( left: responsiveUtils.isMobile(context) ? 40 : 32, @@ -202,7 +198,8 @@ class MailboxView extends GetWidget { imagePaths, responsiveUtils, mailboxNode, - controller.getSelectMode(mailboxNode.item, controller.mailboxDashBoardController.selectedMailbox.value)) + controller.getSelectMode(mailboxNode.item, + controller.mailboxDashBoardController.selectedMailbox.value)) .build(context)), children: _buildListChildTileWidget(context, mailboxNode.childrenItems!))) : Padding( diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index cfb4fef5a..5b2f13678 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/email_controller.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/usecases/get_user_profile_interactor.dart'; +import 'package:tmail_ui_user/main/actions/app_action.dart'; class MailboxDashBoardController extends BaseController { @@ -19,6 +20,7 @@ class MailboxDashBoardController extends BaseController { final selectedEmail = Rxn(); final accountId = Rxn(); final userProfile = Rxn(); + final mailboxDashBoardAction = Rxn(); Session? sessionCurrent; Map mapMailboxId = Map(); @@ -67,10 +69,27 @@ class MailboxDashBoardController extends BaseController { selectedMailbox.value = newPresentationMailbox; } + void setNewFirstSelectedMailbox(PresentationMailbox? newPresentationMailbox) { + selectedMailbox.firstRebuild = true; + selectedMailbox.value = newPresentationMailbox; + } + void setSelectedEmail(PresentationEmail? newPresentationEmail) { selectedEmail.value = newPresentationEmail; } + void setMailboxDashBoardAction(AppAction? newAction) { + mailboxDashBoardAction.value = newAction; + } + + void clearMailboxDashBoardAction() { + mailboxDashBoardAction.value = null; + } + + void clearSelectedEmail() { + selectedEmail.value = null; + } + void openDrawer() { scaffoldKey.currentState?.openDrawer(); } diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 5b8604b77..38554daa8 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -8,9 +8,11 @@ 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'; 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/mailbox/mailbox.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; @@ -19,7 +21,9 @@ import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants. import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/load_more_state.dart'; +import 'package:tmail_ui_user/main/actions/email_action.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class ThreadController extends BaseController { @@ -37,6 +41,7 @@ class ThreadController extends BaseController { int positionCurrent = 0; int lastGetTotal = 0; + MailboxId? _currentMailboxId; ThreadController( this.responsiveUtils, @@ -47,8 +52,15 @@ class ThreadController extends BaseController { void onReady() { super.onReady(); mailboxDashBoardController.selectedMailbox.listen((selectedMailbox) { - mailboxDashBoardController.setSelectedEmail(null); - refreshGetAllEmailAction(); + if (_currentMailboxId != selectedMailbox?.id) { + _currentMailboxId = selectedMailbox?.id; + refreshGetAllEmailAction(); + } else { + final emailCurrent = mailboxDashBoardController.selectedEmail.value; + if (Get.context != null && responsiveUtils.isDesktop(Get.context!) && emailCurrent != null) { + _updateStateUnReadEmail(emailCurrent.id, unRead: false); + } + } }); } @@ -170,6 +182,13 @@ class ThreadController extends BaseController { } } + void _updateStateUnReadEmail(EmailId emailId, {required bool unRead}) { + final newEmailList = emailList + .map((email) => email.id == emailId ? email.markAsReadPresentationEmail(unRead: unRead) : email) + .toList(); + emailList.value = newEmailList; + } + bool canComposeEmail() => mailboxDashBoardController.sessionCurrent != null && mailboxDashBoardController.userProfile.value != null && mailboxDashBoardController.mapMailboxId.containsKey(PresentationMailbox.roleOutbox); @@ -178,8 +197,13 @@ class ThreadController extends BaseController { mailboxDashBoardController.openDrawer(); } - void goToEmail(BuildContext context) { - Get.toNamed(AppRoutes.EMAIL); + void goToEmail(BuildContext context) async { + final action = await push(AppRoutes.EMAIL); + if (action is MarkAsEmailReadAction) { + _updateStateUnReadEmail(action.emailId, unRead: false); + mailboxDashBoardController.setMailboxDashBoardAction(action); + } + mailboxDashBoardController.clearSelectedEmail(); } void composeEmailAction() { diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 76e2b92ec..f1aa148d3 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -30,11 +30,7 @@ class ThreadView extends GetWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Obx(() => _buildAppBarMailboxListMail( - context, - controller.mailboxDashBoardController.selectedMailbox.value, - controller.mailboxDashBoardController.userProfile.value, - )), + _buildAppBarMailboxListMail(context), _buildLoadingView(), Expanded(child: _buildListEmail(context)), _buildLoadingViewLoadMore() @@ -51,17 +47,17 @@ class ThreadView extends GetWidget { ); } - Widget _buildAppBarMailboxListMail(BuildContext context, PresentationMailbox? presentationMailbox, UserProfile? userProfile) { - return Padding( - padding: EdgeInsets.only(left: 15, right: 12), - child: AppBarThreadWidgetBuilder( - context, - imagePaths, - responsiveUtils, - presentationMailbox, - userProfile) - .onOpenListMailboxActionClick(() => controller.openMailboxLeftMenu()) - .build()); + Widget _buildAppBarMailboxListMail(BuildContext context) { + return Obx(() => Padding( + padding: EdgeInsets.only(left: 15, right: 12), + child: AppBarThreadWidgetBuilder( + context, + imagePaths, + responsiveUtils, + controller.mailboxDashBoardController.selectedMailbox.value, + controller.mailboxDashBoardController.userProfile.value) + .onOpenListMailboxActionClick(() => controller.openMailboxLeftMenu()) + .build())); } Widget _buildLoadingView() { @@ -96,13 +92,12 @@ class ThreadView extends GetWidget { alignment: Alignment.center, padding: EdgeInsets.zero, color: responsiveUtils.isMobile(context) ? AppColor.bgMailboxListMail : Colors.white, - child: Obx(() => RefreshIndicator( + child: RefreshIndicator( color: AppColor.primaryColor, onRefresh: () async => controller.refreshGetAllEmailAction(), - child: controller.emailList.isNotEmpty + child: Obx(() => controller.emailList.isNotEmpty ? _buildListEmailBody(context, controller.emailList) - : _buildEmptyEmail(context))) - ); + : _buildEmptyEmail(context)))); } Widget _buildListEmailBody(BuildContext context, List listPresentationEmail) { diff --git a/lib/main/actions/app_action.dart b/lib/main/actions/app_action.dart new file mode 100644 index 000000000..32cef7853 --- /dev/null +++ b/lib/main/actions/app_action.dart @@ -0,0 +1,8 @@ + +import 'package:equatable/equatable.dart'; + +abstract class AppAction with EquatableMixin {} + +abstract class ActionOnline extends AppAction {} + +abstract class ActionOffline extends AppAction {} \ No newline at end of file diff --git a/lib/main/actions/email_action.dart b/lib/main/actions/email_action.dart new file mode 100644 index 000000000..9932c5615 --- /dev/null +++ b/lib/main/actions/email_action.dart @@ -0,0 +1,14 @@ + +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/main/actions/app_action.dart'; + +class MarkAsEmailReadAction extends ActionOnline { + final EmailId emailId; + final PresentationMailbox presentationMailbox; + + MarkAsEmailReadAction(this.emailId, this.presentationMailbox); + + @override + List get props => [emailId, presentationMailbox]; +} \ No newline at end of file diff --git a/lib/main/routes/route_navigation.dart b/lib/main/routes/route_navigation.dart new file mode 100644 index 000000000..d563c2729 --- /dev/null +++ b/lib/main/routes/route_navigation.dart @@ -0,0 +1,18 @@ + +import 'package:get/get.dart'; + +Future push(String routeName, {dynamic arguments}) async { + return Get.toNamed(routeName, arguments: arguments); +} + +Future pushAndPop(String routeName, {dynamic arguments}) async { + return Get.offNamed(routeName, arguments: arguments); +} + +Future pushAndPopAll(String routeName, {dynamic arguments}) async { + return Get.offAllNamed(routeName, arguments: arguments); +} + +void popBack({dynamic result}) { + Get.back(result: result); +} \ No newline at end of file diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart index b5152aa74..0fb97d9a0 100644 --- a/model/lib/extensions/presentation_email_extension.dart +++ b/model/lib/extensions/presentation_email_extension.dart @@ -1,4 +1,5 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; import 'package:model/model.dart'; extension PresentationEmailExtension on PresentationEmail { @@ -12,4 +13,37 @@ extension PresentationEmailExtension on PresentationEmail { } return ''; } + + PresentationEmail markAsReadPresentationEmail({required bool unRead}) { + var newKeyWord = keywords; + + if (unRead) { + newKeyWord?.removeWhere((key, value) => key == KeyWordIdentifier.emailSeen); + } else { + if (newKeyWord == null) { + newKeyWord = { + KeyWordIdentifier.emailSeen: true + }; + } else { + newKeyWord[KeyWordIdentifier.emailSeen] = true; + } + } + + return PresentationEmail( + id, + keywords: newKeyWord, + 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/model/lib/extensions/presentation_mailbox_extension.dart b/model/lib/extensions/presentation_mailbox_extension.dart new file mode 100644 index 000000000..1ffbf6aea --- /dev/null +++ b/model/lib/extensions/presentation_mailbox_extension.dart @@ -0,0 +1,23 @@ +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/model.dart'; + +extension PresentationMailboxExtension on PresentationMailbox { + + PresentationMailbox toPresentationMailbox({required UnsignedInt countUnRead}) { + return PresentationMailbox( + id, + name: name, + parentId: parentId, + role: role, + sortOrder: sortOrder, + totalEmails: totalEmails, + unreadEmails: UnreadEmails(countUnRead), + totalThreads: totalThreads, + unreadThreads: unreadThreads, + myRights: myRights, + isSubscribed: isSubscribed, + selectMode: selectMode + ); + } +} \ No newline at end of file diff --git a/model/lib/model.dart b/model/lib/model.dart index 0917e302f..7d88be7ff 100644 --- a/model/lib/model.dart +++ b/model/lib/model.dart @@ -38,6 +38,7 @@ export 'extensions/presentation_account_extension.dart'; export 'extensions/user_profile_extension.dart'; export 'extensions/presentation_email_extension.dart'; export 'extensions/keyword_identifier_extension.dart'; +export 'extensions/presentation_mailbox_extension.dart'; // Converter export 'converter/avatar_id_converter.dart';