TF-1270 Sync route path and mailbox contain for list email after fetched
This commit is contained in:
@@ -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),
|
||||||
|
|||||||
@@ -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
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user