TF-1270 Sync route path and mailbox contain for list email after fetched

This commit is contained in:
dab246
2022-12-07 01:15:40 +07:00
committed by Dat H. Pham
parent 54f1fd3a04
commit 7648507907
9 changed files with 189 additions and 96 deletions
@@ -50,12 +50,11 @@ import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.da
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/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/extensions/list_presentation_email_extensions.dart';
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart'; import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.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/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
class SearchEmailController extends BaseController class SearchEmailController extends BaseController
with EmailActionController { with EmailActionController {
@@ -232,7 +231,11 @@ class SearchEmailController extends BaseController
final emailsAfterChanges = resultEmailSearchList; final emailsAfterChanges = resultEmailSearchList;
final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges); final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges);
listResultSearch.value = newListEmail; listResultSearch.value = newListEmail.syncPresentationEmail(
mapMailboxById: mailboxDashBoardController.mapMailboxById,
searchQuery: searchQuery,
isSearchEmailRunning: true
);
listResultSearch.refresh(); listResultSearch.refresh();
} }
@@ -295,7 +298,11 @@ class SearchEmailController extends BaseController
final emailsAfterChanges = resultEmailSearchList; final emailsAfterChanges = resultEmailSearchList;
final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges); final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges);
listResultSearch.value = newListEmail; listResultSearch.value = newListEmail.syncPresentationEmail(
mapMailboxById: mailboxDashBoardController.mapMailboxById,
searchQuery: searchQuery,
isSearchEmailRunning: true
);
if (resultSearchScrollController.hasClients) { if (resultSearchScrollController.hasClients) {
resultSearchScrollController.animateTo( resultSearchScrollController.animateTo(
@@ -336,7 +343,12 @@ class SearchEmailController extends BaseController
final resultEmailSearchList = success.emailList final resultEmailSearchList = success.emailList
.map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById)) .map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))
.where((email) => !listResultSearch.contains(email)) .where((email) => !listResultSearch.contains(email))
.toList(); .toList()
.syncPresentationEmail(
mapMailboxById: mailboxDashBoardController.mapMailboxById,
searchQuery: searchQuery,
isSearchEmailRunning: true
);
listResultSearch.addAll(resultEmailSearchList); listResultSearch.addAll(resultEmailSearchList);
} else { } else {
canSearchMore = false; canSearchMore = false;
@@ -646,7 +658,7 @@ class SearchEmailController extends BaseController
if (mailboxContain?.isDrafts == true) { if (mailboxContain?.isDrafts == true) {
editEmail(selectedEmail); editEmail(selectedEmail);
} else { } else {
previewEmail(context, selectedEmail); previewEmail(selectedEmail);
} }
break; break;
case EmailActionType.selection: case EmailActionType.selection:
@@ -771,23 +783,6 @@ class SearchEmailController extends BaseController
} }
} }
PresentationEmail generateEmailByPlatform(PresentationEmail currentEmail) {
if (BuildUtils.isWeb) {
final route = RouteUtils.generateRouteBrowser(
AppRoutes.dashboard,
NavigationRouter(
emailId: currentEmail.id,
searchQuery: searchQuery,
dashboardType: DashboardType.search
)
);
final emailOnWeb = currentEmail.withRouteWeb(route);
return emailOnWeb;
} else {
return currentEmail;
}
}
@override @override
void onClose() { void onClose() {
textInputSearchController.dispose(); textInputSearchController.dispose();
@@ -421,20 +421,19 @@ class SearchEmailView extends GetWidget<SearchEmailController>
itemExtent: _getItemExtent(context), itemExtent: _getItemExtent(context),
itemCount: listPresentationEmail.length, itemCount: listPresentationEmail.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final mailboxContain = _getMailboxContain(listPresentationEmail[index]); final currentPresentationEmail = listPresentationEmail[index];
final newPresentationEmail = controller.generateEmailByPlatform(listPresentationEmail[index]);
return Obx(() => (EmailTileBuilder( return Obx(() => (EmailTileBuilder(
context, context,
newPresentationEmail, currentPresentationEmail,
controller.selectionMode.value, controller.selectionMode.value,
controller.searchQuery, controller.searchQuery,
controller.mailboxDashBoardController.selectedEmail.value?.id == newPresentationEmail.id, controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id,
isSearchEmailRunning: true, isSearchEmailRunning: true,
padding: SearchEmailUtils.getPaddingSearchResultList(context, _responsiveUtils), padding: SearchEmailUtils.getPaddingSearchResultList(context, _responsiveUtils),
paddingDivider: SearchEmailUtils.getPaddingDividerSearchResultList(context, _responsiveUtils), paddingDivider: SearchEmailUtils.getPaddingDividerSearchResultList(context, _responsiveUtils),
mailboxContain: mailboxContain) mailboxContain: currentPresentationEmail.mailboxContain)
..addOnPressEmailActionClick((action, email) => ..addOnPressEmailActionClick((action, email) =>
controller.pressEmailAction(context, action, email, mailboxContain: mailboxContain)) controller.pressEmailAction(context, action, email, mailboxContain: currentPresentationEmail.mailboxContain))
..addOnMoreActionClick((email, position) => _responsiveUtils.isScreenWithShortestSide(context) ..addOnMoreActionClick((email, position) => _responsiveUtils.isScreenWithShortestSide(context)
? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email))
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))) : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))
@@ -443,10 +442,6 @@ class SearchEmailView extends GetWidget<SearchEmailController>
); );
} }
PresentationMailbox? _getMailboxContain(PresentationEmail currentEmail) {
return currentEmail.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById);
}
double? _getItemExtent(BuildContext context) { double? _getItemExtent(BuildContext context) {
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
return _responsiveUtils.isDesktop(context) ? 52 : 95; return _responsiveUtils.isDesktop(context) ? 52 : 95;
@@ -472,7 +467,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
} }
Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) { Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) {
final mailboxContain = _getMailboxContain(email); final mailboxContain = email.mailboxContain;
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_spam_or_un_spam_action'), const Key('mark_as_spam_or_un_spam_action'),
@@ -0,0 +1,59 @@
import 'package:core/utils/build_utils.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/presentation_email_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
extension ListPresentationEmailExtensions on List<PresentationEmail> {
List<PresentationEmail> syncPresentationEmail({
required Map<MailboxId, PresentationMailbox> mapMailboxById,
PresentationMailbox? selectedMailbox,
bool isSearchEmailRunning = false,
SearchQuery? searchQuery
}) {
final newEmailList = map((presentationEmail) {
final routeUri = _generateNavigationRoute(
currentEmail: presentationEmail,
selectedMailbox: selectedMailbox,
isSearchEmailRunning: isSearchEmailRunning,
searchQuery: searchQuery
);
final mailboxContain = presentationEmail.findMailboxContain(mapMailboxById);
return presentationEmail.syncPresentationEmail(
mailboxContain: mailboxContain,
routeWeb: routeUri
);
}).toList();
return newEmailList;
}
Uri? _generateNavigationRoute({
required PresentationEmail currentEmail,
PresentationMailbox? selectedMailbox,
bool isSearchEmailRunning = false,
SearchQuery? searchQuery,
}) {
if (BuildUtils.isWeb) {
final route = RouteUtils.generateRouteBrowser(
AppRoutes.dashboard,
NavigationRouter(
emailId: currentEmail.id,
mailboxId: selectedMailbox?.id,
searchQuery: isSearchEmailRunning ? searchQuery : null,
dashboardType: isSearchEmailRunning ? DashboardType.search : DashboardType.normal
)
);
return route;
} else {
return null;
}
}
}
@@ -24,12 +24,10 @@ import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_reques
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.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';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
mixin EmailActionController on ViewAsDialogActionMixin { mixin EmailActionController on ViewAsDialogActionMixin {
@@ -47,15 +45,9 @@ mixin EmailActionController on ViewAsDialogActionMixin {
mailboxDashBoardController.goToComposer(arguments); mailboxDashBoardController.goToComposer(arguments);
} }
void previewEmail(BuildContext context, PresentationEmail presentationEmail) { void previewEmail(PresentationEmail presentationEmail) {
log('EmailActionController::previewEmail():presentationEmailId: ${presentationEmail.id}'); log('EmailActionController::previewEmail():presentationEmailId: ${presentationEmail.id}');
mailboxDashBoardController.setSelectedEmail(presentationEmail); mailboxDashBoardController.openEmailDetailedView(presentationEmail);
mailboxDashBoardController.dispatchRoute(DashboardRoutes.emailDetailed);
if (BuildUtils.isWeb && presentationEmail.routeWeb != null) {
RouteUtils.updateRouteOnBrowser(
'Email-${presentationEmail.id.id.value}',
presentationEmail.routeWeb!);
}
} }
void moveToTrash(PresentationEmail email, {PresentationMailbox? mailboxContain}) async { void moveToTrash(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
@@ -57,6 +57,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_i
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/extensions/list_presentation_email_extensions.dart';
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart'; import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart';
@@ -369,7 +370,13 @@ class ThreadController extends BaseController with EmailActionController {
void _getAllEmailSuccess(GetAllEmailSuccess success) { void _getAllEmailSuccess(GetAllEmailSuccess success) {
_currentEmailState = success.currentEmailState; _currentEmailState = success.currentEmailState;
log('ThreadController::_getAllEmailSuccess():_currentEmailState: $_currentEmailState'); log('ThreadController::_getAllEmailSuccess():_currentEmailState: $_currentEmailState');
emailList.value = success.emailList; emailList.value = success.emailList.syncPresentationEmail(
mapMailboxById: mailboxDashBoardController.mapMailboxById,
selectedMailbox: currentMailbox,
searchQuery: searchController.searchQuery,
isSearchEmailRunning: searchController.isSearchEmailRunning
);
if (listEmailController.hasClients) { if (listEmailController.hasClients) {
listEmailController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.fastOutSlowIn); listEmailController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
} }
@@ -381,7 +388,12 @@ class ThreadController extends BaseController with EmailActionController {
final emailsBeforeChanges = emailList; final emailsBeforeChanges = emailList;
final emailsAfterChanges = success.emailList; final emailsAfterChanges = success.emailList;
final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges); final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges);
emailList.value = newListEmail; emailList.value = newListEmail.syncPresentationEmail(
mapMailboxById: mailboxDashBoardController.mapMailboxById,
selectedMailbox: currentMailbox,
searchQuery: searchController.searchQuery,
isSearchEmailRunning: searchController.isSearchEmailRunning
);
if (emailList.isEmpty) { if (emailList.isEmpty) {
refreshAllEmail(); refreshAllEmail();
@@ -497,7 +509,14 @@ class ThreadController extends BaseController with EmailActionController {
if (success.emailList.isNotEmpty) { if (success.emailList.isNotEmpty) {
final appendableList = success.emailList final appendableList = success.emailList
.where(_belongToCurrentMailboxId) .where(_belongToCurrentMailboxId)
.where(_notDuplicatedInCurrentList); .where(_notDuplicatedInCurrentList)
.toList()
.syncPresentationEmail(
mapMailboxById: mailboxDashBoardController.mapMailboxById,
selectedMailbox: currentMailbox,
searchQuery: searchController.searchQuery,
isSearchEmailRunning: searchController.isSearchEmailRunning
);
emailList.addAll(appendableList); emailList.addAll(appendableList);
} else { } else {
@@ -662,7 +681,12 @@ class ThreadController extends BaseController with EmailActionController {
final emailsSearchBeforeChanges = emailList; final emailsSearchBeforeChanges = emailList;
final emailsSearchAfterChanges = resultEmailSearchList; final emailsSearchAfterChanges = resultEmailSearchList;
final newListEmailSearch = emailsSearchAfterChanges.combine(emailsSearchBeforeChanges); final newListEmailSearch = emailsSearchAfterChanges.combine(emailsSearchBeforeChanges);
emailList.value = newListEmailSearch; emailList.value = newListEmailSearch.syncPresentationEmail(
mapMailboxById: mailboxDashBoardController.mapMailboxById,
selectedMailbox: currentMailbox,
searchQuery: searchController.searchQuery,
isSearchEmailRunning: searchController.isSearchEmailRunning
);
searchController.autoFocus.value = true; searchController.autoFocus.value = true;
} }
@@ -685,7 +709,13 @@ class ThreadController extends BaseController with EmailActionController {
final resultEmailSearchList = success.emailList final resultEmailSearchList = success.emailList
.map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById)) .map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))
.where((email) => !emailList.contains(email)) .where((email) => !emailList.contains(email))
.toList(); .toList()
.syncPresentationEmail(
mapMailboxById: mailboxDashBoardController.mapMailboxById,
selectedMailbox: currentMailbox,
searchQuery: searchController.searchQuery,
isSearchEmailRunning: searchController.isSearchEmailRunning
);
emailList.addAll(resultEmailSearchList); emailList.addAll(resultEmailSearchList);
} else { } else {
canSearchMore = false; canSearchMore = false;
@@ -773,7 +803,7 @@ class ThreadController extends BaseController with EmailActionController {
if (mailboxContain?.isDrafts == true) { if (mailboxContain?.isDrafts == true) {
editEmail(selectedEmail); editEmail(selectedEmail);
} else { } else {
previewEmail(context, selectedEmail); previewEmail(selectedEmail);
} }
break; break;
case EmailActionType.selection: case EmailActionType.selection:
@@ -875,10 +905,6 @@ class ThreadController extends BaseController with EmailActionController {
} }
} }
PresentationMailbox? getMailboxContain(PresentationEmail currentEmail) {
return currentEmail.findMailboxContain(mailboxDashBoardController.mapMailboxById);
}
void _getEmailByIdAction(EmailId emailId) { void _getEmailByIdAction(EmailId emailId) {
if (_accountId != null) { if (_accountId != null) {
consumeState(_getEmailByIdInteractor.execute( consumeState(_getEmailByIdInteractor.execute(
@@ -339,21 +339,20 @@ class ThreadView extends GetWidget<ThreadController>
itemExtent: _getItemExtent(context), itemExtent: _getItemExtent(context),
itemCount: listPresentationEmail.length, itemCount: listPresentationEmail.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final mailboxContain = controller.getMailboxContain(listPresentationEmail[index]); final currentPresentationEmail = listPresentationEmail[index];
final newPresentationEmail = controller.generateEmailByPlatform(listPresentationEmail[index]);
return Obx(() => Draggable<List<PresentationEmail>>( return Obx(() => Draggable<List<PresentationEmail>>(
maxSimultaneousDrags: kIsWeb ? null : 0, maxSimultaneousDrags: kIsWeb ? null : 0,
data: controller.listEmailDrag, data: controller.listEmailDrag,
child: (EmailTileBuilder( child: (EmailTileBuilder(
context, context,
newPresentationEmail, currentPresentationEmail,
controller.mailboxDashBoardController.currentSelectMode.value, controller.mailboxDashBoardController.currentSelectMode.value,
controller.searchQuery, controller.searchQuery,
controller.mailboxDashBoardController.selectedEmail.value?.id == newPresentationEmail.id, controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id,
mailboxContain: mailboxContain, mailboxContain: currentPresentationEmail.mailboxContain,
isSearchEmailRunning: controller.searchController.isSearchEmailRunning) isSearchEmailRunning: controller.searchController.isSearchEmailRunning)
..addOnPressEmailActionClick((action, email) => ..addOnPressEmailActionClick((action, email) =>
controller.pressEmailAction(context, action, email, mailboxContain: mailboxContain)) controller.pressEmailAction(context, action, email, mailboxContain: currentPresentationEmail.mailboxContain))
..addOnMoreActionClick((email, position) => _responsiveUtils.isScreenWithShortestSide(context) ..addOnMoreActionClick((email, position) => _responsiveUtils.isScreenWithShortestSide(context)
? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email))
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))) : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))
@@ -361,17 +360,17 @@ class ThreadView extends GetWidget<ThreadController>
feedback: _buildFeedBackWidget(context), feedback: _buildFeedBackWidget(context),
childWhenDragging: (EmailTileBuilder( childWhenDragging: (EmailTileBuilder(
context, context,
newPresentationEmail, currentPresentationEmail,
controller.mailboxDashBoardController.currentSelectMode.value, controller.mailboxDashBoardController.currentSelectMode.value,
controller.searchQuery, controller.searchQuery,
controller.mailboxDashBoardController.selectedEmail.value?.id == newPresentationEmail.id, controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id,
mailboxContain: mailboxContain, mailboxContain: currentPresentationEmail.mailboxContain,
isSearchEmailRunning: controller.searchController.isSearchEmailRunning, isSearchEmailRunning: controller.searchController.isSearchEmailRunning,
isDrag: true) isDrag: true)
).build(), ).build(),
dragAnchorStrategy: pointerDragAnchorStrategy, dragAnchorStrategy: pointerDragAnchorStrategy,
onDragStarted: () { onDragStarted: () {
controller.calculateDragValue(newPresentationEmail); controller.calculateDragValue(currentPresentationEmail);
}, },
)); ));
}), }),
@@ -500,7 +499,7 @@ class ThreadView extends GetWidget<ThreadController>
} }
List<Widget> _contextMenuActionTile(BuildContext context, PresentationEmail email) { List<Widget> _contextMenuActionTile(BuildContext context, PresentationEmail email) {
final mailboxContain = controller.getMailboxContain(email); final mailboxContain = email.mailboxContain;
return <Widget>[ return <Widget>[
_openInNewTabContextMenuItemAction(context, email), _openInNewTabContextMenuItemAction(context, email),
@@ -565,7 +564,7 @@ class ThreadView extends GetWidget<ThreadController>
} }
List<PopupMenuEntry> _popupMenuActionTile(BuildContext context, PresentationEmail email) { List<PopupMenuEntry> _popupMenuActionTile(BuildContext context, PresentationEmail email) {
final mailboxContain = controller.getMailboxContain(email); final mailboxContain = email.mailboxContain;
return [ return [
_buildOpenInNewTabPopupMenuItem(context, email, mailboxContain), _buildOpenInNewTabPopupMenuItem(context, email, mailboxContain),
+6 -2
View File
@@ -8,6 +8,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.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/extensions/email_address_extension.dart'; import 'package:model/extensions/email_address_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/mailbox/select_mode.dart'; import 'package:model/mailbox/select_mode.dart';
class PresentationEmail with EquatableMixin { class PresentationEmail with EquatableMixin {
@@ -29,6 +30,7 @@ class PresentationEmail with EquatableMixin {
final List<MailboxName?>? mailboxNames; final List<MailboxName?>? mailboxNames;
final SelectMode selectMode; final SelectMode selectMode;
final Uri? routeWeb; final Uri? routeWeb;
final PresentationMailbox? mailboxContain;
PresentationEmail( PresentationEmail(
this.id, this.id,
@@ -48,7 +50,8 @@ class PresentationEmail with EquatableMixin {
this.mailboxIds, this.mailboxIds,
this.mailboxNames, this.mailboxNames,
this.selectMode = SelectMode.INACTIVE, this.selectMode = SelectMode.INACTIVE,
this.routeWeb this.routeWeb,
this.mailboxContain
} }
); );
@@ -95,6 +98,7 @@ class PresentationEmail with EquatableMixin {
mailboxIds, mailboxIds,
mailboxNames, mailboxNames,
selectMode, selectMode,
routeWeb routeWeb,
mailboxContain
]; ];
} }
+2 -7
View File
@@ -1,5 +1,4 @@
import 'package:http_parser/http_parser.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_body_part.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_body_part.dart';
@@ -25,7 +24,7 @@ extension EmailExtension on Email {
} }
Set<String> getRecipientEmailAddressList() { Set<String> getRecipientEmailAddressList() {
final listEmailAddress = Set<String>(); final listEmailAddress = <String>{};
final listToAddress = to.getListAddress() ?? []; final listToAddress = to.getListAddress() ?? [];
final listCcAddress = cc.getListAddress() ?? []; final listCcAddress = cc.getListAddress() ?? [];
final listBccAddress = bcc.getListAddress() ?? []; final listBccAddress = bcc.getListAddress() ?? [];
@@ -100,11 +99,7 @@ extension EmailExtension on Email {
?.where((emailBody) => emailBody.partId != null && emailBody.type != null) ?.where((emailBody) => emailBody.partId != null && emailBody.type != null)
.toList() ?? <EmailBodyPart>[]; .toList() ?? <EmailBodyPart>[];
final mapHtmlBody = Map<PartId, MediaType>.fromIterable( final mapHtmlBody = { for (var emailBody in newHtmlBody) emailBody.partId! : emailBody.type! };
newHtmlBody,
key: (emailBody) => emailBody.partId!,
value: (emailBody) => emailBody.type!,
);
final emailContents = bodyValues?.entries final emailContents = bodyValues?.entries
.map((entries) => EmailContent(mapHtmlBody[entries.key].toEmailContentType(), entries.value.value)) .map((entries) => EmailContent(mapHtmlBody[entries.key].toEmailContentType(), entries.value.value))
@@ -35,23 +35,24 @@ extension PresentationEmailExtension on PresentationEmail {
PresentationEmail toggleSelect() { PresentationEmail toggleSelect() {
return PresentationEmail( return PresentationEmail(
this.id, this.id,
keywords: keywords, keywords: keywords,
size: size, size: size,
receivedAt: receivedAt, receivedAt: receivedAt,
hasAttachment: hasAttachment, hasAttachment: hasAttachment,
preview: preview, preview: preview,
subject: subject, subject: subject,
sentAt: sentAt, sentAt: sentAt,
from: from, from: from,
to: to, to: to,
cc: cc, cc: cc,
bcc: bcc, bcc: bcc,
replyTo: replyTo, replyTo: replyTo,
mailboxIds: mailboxIds, mailboxIds: mailboxIds,
mailboxNames: mailboxNames, mailboxNames: mailboxNames,
selectMode: selectMode == SelectMode.INACTIVE ? SelectMode.ACTIVE : SelectMode.INACTIVE, selectMode: selectMode == SelectMode.INACTIVE ? SelectMode.ACTIVE : SelectMode.INACTIVE,
routeWeb: routeWeb routeWeb: routeWeb,
mailboxContain: mailboxContain
); );
} }
@@ -73,7 +74,8 @@ extension PresentationEmailExtension on PresentationEmail {
mailboxIds: mailboxIds, mailboxIds: mailboxIds,
mailboxNames: mailboxNames, mailboxNames: mailboxNames,
selectMode: selectMode, selectMode: selectMode,
routeWeb: routeWeb routeWeb: routeWeb,
mailboxContain: mailboxContain
); );
} }
@@ -155,7 +157,8 @@ extension PresentationEmailExtension on PresentationEmail {
mailboxIds: mailboxIds, mailboxIds: mailboxIds,
mailboxNames: listMailboxName, mailboxNames: listMailboxName,
selectMode: selectMode, selectMode: selectMode,
routeWeb: routeWeb routeWeb: routeWeb,
mailboxContain: mailboxContain
); );
} }
@@ -190,7 +193,8 @@ extension PresentationEmailExtension on PresentationEmail {
mailboxIds: mailboxIds, mailboxIds: mailboxIds,
mailboxNames: mailboxNames, mailboxNames: mailboxNames,
selectMode: selectMode, selectMode: selectMode,
routeWeb: routeWeb routeWeb: routeWeb,
mailboxContain: mailboxContain
); );
} }
@@ -212,7 +216,31 @@ extension PresentationEmailExtension on PresentationEmail {
mailboxIds: mailboxIds, mailboxIds: mailboxIds,
mailboxNames: mailboxNames, mailboxNames: mailboxNames,
selectMode: selectMode, selectMode: selectMode,
routeWeb: routeWeb routeWeb: routeWeb,
mailboxContain: mailboxContain
);
}
PresentationEmail syncPresentationEmail({PresentationMailbox? mailboxContain, Uri? routeWeb}) {
return PresentationEmail(
this.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,
mailboxIds: mailboxIds,
mailboxNames: mailboxNames,
selectMode: selectMode,
routeWeb: routeWeb,
mailboxContain: mailboxContain
); );
} }
} }