From f7ff775a106e12eda0930fa80ac047832f2efa0a Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 16 Sep 2024 13:14:25 +0700 Subject: [PATCH] TF-3002 [WEB] Remove `BuildContext` in dashboard action --- .../model/save_to_draft_view_event.dart | 35 -------------- .../presentation/action/dashboard_action.dart | 44 ++++-------------- .../advanced_filter_controller.dart | 32 +++++++------ .../mailbox_dashboard_controller.dart | 32 ++++++------- .../mailbox_dashboard_view_web.dart | 17 +++---- ...vanced_search_filter_form_bottom_view.dart | 8 ++-- .../advanced_search_input_form.dart | 6 +-- .../icon_open_advanced_search_widget.dart | 2 +- .../widgets/search_input_form_widget.dart | 27 ++++++----- .../presentation/search_email_controller.dart | 9 ++-- .../email/presentation/search_email_view.dart | 3 +- .../mixin/email_action_controller.dart | 8 +--- .../presentation/thread_controller.dart | 46 ++++++++++--------- .../thread/presentation/thread_view.dart | 33 ++++--------- .../mailbox_dashboard_controller_test.dart | 4 +- 15 files changed, 113 insertions(+), 193 deletions(-) delete mode 100644 lib/features/composer/presentation/model/save_to_draft_view_event.dart diff --git a/lib/features/composer/presentation/model/save_to_draft_view_event.dart b/lib/features/composer/presentation/model/save_to_draft_view_event.dart deleted file mode 100644 index 08c84a326..000000000 --- a/lib/features/composer/presentation/model/save_to_draft_view_event.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:core/presentation/state/success.dart'; -import 'package:flutter/widgets.dart'; -import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:jmap_dart_client/jmap/core/session/session.dart'; -import 'package:jmap_dart_client/jmap/mail/email/email.dart'; -import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; -import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; - -class SaveToDraftViewEvent extends ViewEvent { - final BuildContext context; - final Session session; - final AccountId accountId; - final MailboxId draftMailboxId; - final EmailId? emailIdEditing; - final ComposerArguments? arguments; - - SaveToDraftViewEvent({ - required this.context, - required this.session, - required this.accountId, - required this.draftMailboxId, - this.emailIdEditing, - this.arguments, - }); - - @override - List get props => [ - context, - session, - accountId, - draftMailboxId, - emailIdEditing, - arguments, - ]; -} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart index ae20142cd..787fa6bd6 100644 --- a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart +++ b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart @@ -1,5 +1,4 @@ -import 'package:flutter/cupertino.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/email/email_action_type.dart'; @@ -26,36 +25,33 @@ class CancelSelectionAllEmailAction extends DashBoardAction {} class FilterMessageAction extends DashBoardAction { - final BuildContext context; final FilterMessageOption option; - FilterMessageAction(this.context, this.option); + FilterMessageAction(this.option); @override - List get props => [context, option]; + List get props => [option]; } class HandleEmailActionTypeAction extends DashBoardAction { - final BuildContext context; final EmailActionType emailAction; final List listEmailSelected; - HandleEmailActionTypeAction(this.context, this.listEmailSelected, this.emailAction); + HandleEmailActionTypeAction(this.listEmailSelected, this.emailAction); @override - List get props => [context, listEmailSelected, emailAction]; + List get props => [listEmailSelected, emailAction]; } class OpenEmailDetailedFromSuggestionQuickSearchAction extends DashBoardAction { - final BuildContext context; final PresentationEmail presentationEmail; - OpenEmailDetailedFromSuggestionQuickSearchAction(this.context, this.presentationEmail); + OpenEmailDetailedFromSuggestionQuickSearchAction(this.presentationEmail); @override - List get props => [context, presentationEmail]; + List get props => [presentationEmail]; } class StartSearchEmailAction extends DashBoardAction { @@ -67,15 +63,7 @@ class StartSearchEmailAction extends DashBoardAction { List get props => [filter]; } -class EmptyTrashAction extends DashBoardAction { - - final BuildContext context; - - EmptyTrashAction(this.context); - - @override - List get props => [context]; -} +class EmptyTrashAction extends DashBoardAction {} class ClearSearchEmailAction extends DashBoardAction {} @@ -163,20 +151,6 @@ class CloseSearchEmailViewAction extends DashBoardAction {} class CancelSelectionSearchEmailAction extends DashBoardAction {} -class OpenAdvancedSearchViewAction extends DashBoardAction { - final BuildContext context; +class OpenAdvancedSearchViewAction extends DashBoardAction {} - OpenAdvancedSearchViewAction(this.context); - - @override - List get props => [context]; -} - -class ClearSearchFilterAppliedAction extends DashBoardAction { - final BuildContext context; - - ClearSearchFilterAppliedAction(this.context); - - @override - List get props => [context]; -} \ No newline at end of file +class ClearSearchFilterAppliedAction extends DashBoardAction {} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart index 5b8295e07..10a1d7978 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -78,7 +78,7 @@ class AdvancedFilterController extends BaseController { super.onReady(); } - void clearSearchFilter(BuildContext context) { + void clearSearchFilter() { searchController.clearSearchFilter(); _resetAllToOriginalValue(); _clearAllTextFieldInput(); @@ -86,7 +86,7 @@ class AdvancedFilterController extends BaseController { searchController.clearSortOrder(); searchController.deactivateAdvancedSearch(); searchController.isAdvancedSearchViewOpen.value = false; - _mailboxDashBoardController.searchEmail(context); + _mailboxDashBoardController.searchEmail(); } void _updateFilterEmailFromAdvancedSearchView() { @@ -156,7 +156,7 @@ class AdvancedFilterController extends BaseController { } } - void applyAdvancedSearchFilter(BuildContext context) { + void applyAdvancedSearchFilter() { _updateFilterEmailFromAdvancedSearchView(); if (isAdvancedSearchHasApplied) { searchController.activateAdvancedSearch(); @@ -167,7 +167,7 @@ class AdvancedFilterController extends BaseController { searchController.updateFilterEmail(beforeOption: const None()); } searchController.isAdvancedSearchViewOpen.value = false; - _mailboxDashBoardController.searchEmail(context); + _mailboxDashBoardController.searchEmail(); } Future> getAutoCompleteSuggestion(String word) async { @@ -197,16 +197,20 @@ class AdvancedFilterController extends BaseController { hasAttachment.isTrue; } - void initSearchFilterField(BuildContext context) { + void initSearchFilterField() { subjectFilterInputController.text = StringConvert.writeNullToEmpty(searchEmailFilter.subject); hasKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(searchEmailFilter.text?.value); notKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(searchEmailFilter.notKeyword.firstOrNull); dateFilterSelectedFormAdvancedSearch.value = searchEmailFilter.emailReceiveTimeType; _destinationMailboxSelected = searchEmailFilter.mailbox; - if (searchEmailFilter.mailbox == null) { - mailBoxFilterInputController.text = AppLocalizations.of(context).allFolders; - } else { - mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(searchEmailFilter.mailbox?.getDisplayName(context)); + if (currentContext != null) { + if (searchEmailFilter.mailbox == null) { + mailBoxFilterInputController.text = AppLocalizations.of(currentContext!).allFolders; + } else { + mailBoxFilterInputController.text = StringConvert.writeNullToEmpty( + searchEmailFilter.mailbox?.getDisplayName(currentContext!) + ); + } } hasAttachment.value = searchEmailFilter.hasAttachment; if (searchEmailFilter.from.isEmpty) { @@ -423,9 +427,9 @@ class AdvancedFilterController extends BaseController { _mailboxDashBoardController.dispatchAction(StartSearchEmailAction()); } else if (action is OpenAdvancedSearchViewAction) { - initSearchFilterField(action.context); + initSearchFilterField(); } else if (action is ClearSearchFilterAppliedAction) { - clearSearchFilter(action.context); + clearSearchFilter(); } } ); @@ -468,9 +472,9 @@ class AdvancedFilterController extends BaseController { } } - void onSearchAction(BuildContext context) { - FocusScope.of(context).unfocus(); - applyAdvancedSearchFilter(context); + void onSearchAction() { + FocusManager.instance.primaryFocus?.unfocus(); + applyAdvancedSearchFilter(); } @override diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 9c1de5809..118e1413c 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -667,7 +667,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE; - void searchEmail(BuildContext context, {String? queryString}) { + void searchEmail({String? queryString}) { log('MailboxDashBoardController::searchEmail():'); clearFilterMessageOption(); searchController.clearFilterSuggestion(); @@ -676,17 +676,18 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo } searchController.updateFilterEmail(sortOrderOption: searchController.sortOrderFiltered.value.getSortOrder()); dispatchAction(StartSearchEmailAction()); - KeyboardUtils.hideKeyboard(context); - if (_searchInsideEmailDetailedViewIsActive(context)) { + FocusManager.instance.primaryFocus?.unfocus(); + if (_searchInsideEmailDetailedViewIsActive()) { _closeEmailDetailedView(); } _unSelectedMailbox(); } - bool _searchInsideEmailDetailedViewIsActive(BuildContext context) { + bool _searchInsideEmailDetailedViewIsActive() { return PlatformInfo.isWeb - && responsiveUtils.isDesktop(context) - && dashboardRoute.value == DashboardRoutes.emailDetailed; + && currentContext != null + && responsiveUtils.isDesktop(currentContext!) + && dashboardRoute.value == DashboardRoutes.emailDetailed; } void clearSearchEmail() { @@ -913,7 +914,6 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo } void moveSelectedMultipleEmailToMailbox( - BuildContext context, List listEmails, PresentationMailbox currentMailbox ) async { @@ -1864,8 +1864,8 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo !responsiveUtils.isWebDesktop(context); } - void emptyTrashAction(BuildContext context) { - dispatchAction(EmptyTrashAction(context)); + void emptyTrashAction() { + dispatchAction(EmptyTrashAction()); } void showAppDashboardAction() async { @@ -2487,11 +2487,11 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo return listEmailAddress; } - void searchEmailByFromFields(BuildContext context, EmailAddress emailAddress) { - KeyboardUtils.hideKeyboard(context); + void searchEmailByFromFields(EmailAddress emailAddress) { + FocusManager.instance.primaryFocus?.unfocus(); clearFilterMessageOption(); searchController.clearFilterSuggestion(); - if (_searchInsideEmailDetailedViewIsActive(context)) { + if (_searchInsideEmailDetailedViewIsActive()) { _closeEmailDetailedView(); } _unSelectedMailbox(); @@ -2820,13 +2820,13 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo filterMessageOption.value != FilterMessageOption.all; } - void openAdvancedSearchView(BuildContext context) { - dispatchAction(OpenAdvancedSearchViewAction(context)); + void openAdvancedSearchView() { + dispatchAction(OpenAdvancedSearchViewAction()); searchController.openAdvanceSearch(); } - void clearAllSearchFilterApplied(BuildContext context) { - dispatchAction(ClearSearchFilterAppliedAction(context)); + void clearAllSearchFilterApplied() { + dispatchAction(ClearSearchFilterAppliedAction()); } @override diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index e1d7578c5..fc87bafc3 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -108,7 +108,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { final presentationMailbox = controller.selectedMailbox.value; if (controller.isEmptyTrashBannerEnabledOnWeb(context, presentationMailbox)) { return BannerEmptyTrashWidget( - onTapAction: () => controller.emptyTrashAction(context) + onTapAction: controller.emptyTrashAction ); } else { return const SizedBox.shrink(); @@ -236,7 +236,6 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { controller.dispatchAction(CancelSelectionAllEmailAction()), onEmailActionTypeAction: (listEmails, actionType) => controller.dispatchAction(HandleEmailActionTypeAction( - context, listEmails, actionType )), @@ -353,7 +352,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { imagePaths: controller.imagePaths, isSelected: filterMessageCurrent != FilterMessageOption.all, onSelectFilterMessageOptionAction: _onSelectFilterMessageOptionAction, - onDeleteFilterMessageOptionAction: (_) => _onDeleteFilterMessageOptionAction(context), + onDeleteFilterMessageOptionAction: (_) => _onDeleteFilterMessageOptionAction(), ), ); } @@ -397,17 +396,15 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { context, filterMessageCurrent, (filterMessageSelected) { - controller.dispatchAction(FilterMessageAction( - context, - filterMessageSelected)); + controller.dispatchAction(FilterMessageAction(filterMessageSelected)); }, isSearchEmailRunning: controller.searchController.isSearchEmailRunning ) ); } - void _onDeleteFilterMessageOptionAction(BuildContext context) { - controller.dispatchAction(FilterMessageAction(context, FilterMessageOption.all)); + void _onDeleteFilterMessageOptionAction() { + controller.dispatchAction(FilterMessageAction(FilterMessageOption.all)); } Widget _buildDownloadTaskStateWidget() { @@ -509,7 +506,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { color: AppColor.primaryColor, fontSize: 13, fontWeight: FontWeight.w500), - onTapActionCallback: () => controller.clearAllSearchFilterApplied(context)) + onTapActionCallback: controller.clearAllSearchFilterApplied) else TMailButtonWidget.fromText( text: AppLocalizations.of(context).advancedSearch, @@ -520,7 +517,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { color: AppColor.primaryColor, fontSize: 13, fontWeight: FontWeight.w500), - onTapActionCallback: () => controller.openAdvancedSearchView(context)) + onTapActionCallback: controller.openAdvancedSearchView) ] ), ); diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart index 954384911..218c75b47 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart @@ -45,7 +45,7 @@ class AdvancedSearchFilterFormBottomView extends GetWidget onShowFullListEmailAddressAction: controller.showFullEmailAddress, onUpdateListEmailAddressAction: controller.updateListEmailAddress, onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, - onSearchAction: () => controller.onSearchAction.call(context), + onSearchAction: controller.onSearchAction, )), Obx(() => TextFieldAutocompleteEmailAddressWeb( field: AdvancedSearchFilterField.to, @@ -51,7 +51,7 @@ class AdvancedSearchInputForm extends GetWidget onShowFullListEmailAddressAction: controller.showFullEmailAddress, onUpdateListEmailAddressAction: controller.updateListEmailAddress, onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, - onSearchAction: () => controller.onSearchAction.call(context), + onSearchAction: controller.onSearchAction, )), _buildFilterField( textEditingController: controller.subjectFilterInputController, @@ -287,7 +287,7 @@ class AdvancedSearchInputForm extends GetWidget if (isSelectFormList) { onTap?.call(); } else { - controller.onSearchAction.call(context); + controller.onSearchAction(); popBack(); } }, diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart index 40318b6d1..93c1c48d7 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart @@ -39,7 +39,7 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget { height: 16), onTap: () { log('IconOpenAdvancedSearchWidget::build(): clicked'); - advancedFilterController.initSearchFilterField(context); + advancedFilterController.initSearchFilterField(); searchController.openAdvanceSearch(); }), ), diff --git a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart index 0ab5026e2..99e8e177f 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart @@ -111,20 +111,20 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { ), fetchRecentActionCallback: _searchController.getAllRecentSearchAction, itemRecentBuilder: (context, recent) => RecentSearchItemTileWidget(recent), - onRecentSelected: (recent) => _invokeSelectRecentItem(context, recent), + onRecentSelected: _invokeSelectRecentItem, suggestionsCallback: _dashBoardController.quickSearchEmails, itemBuilder: (context, email) => EmailQuickSearchItemTileWidget(email, _dashBoardController.selectedMailbox.value), - onSuggestionSelected: (presentationEmail) => _invokeSelectSuggestionItem(context, presentationEmail), + onSuggestionSelected: _invokeSelectSuggestionItem, contactItemBuilder: (context, emailAddress) => ContactQuickSearchItem(emailAddress: emailAddress), contactSuggestionsCallback: _dashBoardController.getContactSuggestion, - onContactSuggestionSelected: (emailAddress) => _invokeSelectContactSuggestion(context, emailAddress), + onContactSuggestionSelected: _invokeSelectContactSuggestion, ) ), ); }); } - void _invokeSearchEmailAction(BuildContext context, String query) { + void _invokeSearchEmailAction(String query) { _searchController.searchFocus.unfocus(); _searchController.enableSearch(); @@ -134,33 +134,32 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { if (query.isNotEmpty || _searchController.listFilterOnSuggestionForm.isNotEmpty) { _searchController.applyFilterSuggestionToSearchFilter(_dashBoardController.sessionCurrent?.username); - _dashBoardController.searchEmail(context, queryString: query); + _dashBoardController.searchEmail(queryString: query); } else { _dashBoardController.clearSearchEmail(); } } - void _invokeSelectSuggestionItem(BuildContext context, PresentationEmail presentationEmail) { + void _invokeSelectSuggestionItem(PresentationEmail presentationEmail) { _dashBoardController.dispatchAction( OpenEmailDetailedFromSuggestionQuickSearchAction( - context, presentationEmail ) ); } - void _invokeSelectRecentItem(BuildContext context, RecentSearch recent) { + void _invokeSelectRecentItem(RecentSearch recent) { _searchController.searchInputController.text = recent.value; _searchController.searchFocus.unfocus(); _searchController.enableSearch(); _searchController.applyFilterSuggestionToSearchFilter(_dashBoardController.sessionCurrent?.username); - _dashBoardController.searchEmail(context, queryString: recent.value); + _dashBoardController.searchEmail(queryString: recent.value); } Widget _buildShowAllResultButton(BuildContext context, String keyword) { return InkWell( - onTap: () => _invokeSearchEmailAction(context, keyword.trim()), + onTap: () => _invokeSearchEmailAction(keyword.trim()), child: Padding( padding: const EdgeInsets.all(12), child: Row(children: [ @@ -193,7 +192,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { textInputAction: TextInputAction.done, cursorColor: AppColor.primaryColor, textDirection: DirectionUtils.getDirectionByLanguage(context), - onSubmitted: (keyword) => _invokeSearchEmailAction(context, keyword.trim()), + onSubmitted: (keyword) => _invokeSearchEmailAction(keyword.trim()), decoration: InputDecoration( border: InputBorder.none, focusedBorder: InputBorder.none, @@ -209,7 +208,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { minSize: 40, iconPadding: EdgeInsets.zero, icon: SvgPicture.asset(_imagePaths.icSearchBar, fit: BoxFit.fill), - onTap: () => _invokeSearchEmailAction(context, _searchController.searchInputController.text.trim()) + onTap: () => _invokeSearchEmailAction(_searchController.searchInputController.text.trim()) ) ), clearTextButton: buildIconWeb( @@ -246,10 +245,10 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { }); } - void _invokeSelectContactSuggestion(BuildContext context, EmailAddress emailAddress) { + void _invokeSelectContactSuggestion(EmailAddress emailAddress) { _searchController.searchInputController.clear(); _searchController.searchFocus.unfocus(); _searchController.enableSearch(); - _dashBoardController.searchEmailByFromFields(context, emailAddress); + _dashBoardController.searchEmailByFromFields(emailAddress); } } \ No newline at end of file diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index 929ec2eb5..c9e8cd558 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -813,7 +813,7 @@ class SearchEmailController extends BaseController markAsStarEmail(selectedEmail, MarkStarAction.unMarkStar); break; case EmailActionType.moveToMailbox: - moveToMailbox(context, selectedEmail, mailboxContain: mailboxContain); + moveToMailbox(selectedEmail, mailboxContain: mailboxContain); break; case EmailActionType.moveToTrash: moveToTrash(selectedEmail, mailboxContain: mailboxContain); @@ -856,7 +856,6 @@ class SearchEmailController extends BaseController } void handleSelectionEmailAction( - BuildContext context, EmailActionType actionType, List listEmails ) { @@ -882,7 +881,7 @@ class SearchEmailController extends BaseController cancelSelectionMode(); final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToMailbox(context, listEmails, mailboxContainCurrent); + moveSelectedMultipleEmailToMailbox(listEmails, mailboxContainCurrent); } break; case EmailActionType.moveToTrash: @@ -894,9 +893,9 @@ class SearchEmailController extends BaseController break; case EmailActionType.deletePermanently: final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); - if (mailboxContainCurrent != null) { + if (mailboxContainCurrent != null && currentContext != null) { deleteSelectionEmailsPermanently( - context, + currentContext!, DeleteActionType.multiple, listEmails: listEmails, mailboxCurrent: mailboxContainCurrent, diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index cf0fb6756..2bd1e14e3 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -66,8 +66,7 @@ class SearchEmailView extends GetWidget controller.listResultSearch.listEmailSelected, controller.mailboxDashBoardController.mapMailboxById, onCancelSelection: controller.cancelSelectionMode, - onHandleEmailAction: (actionType, listEmails) => - controller.handleSelectionEmailAction(context, actionType, listEmails)); + onHandleEmailAction: controller.handleSelectionEmailAction); } else { return _buildSearchInputForm(context); } diff --git a/lib/features/thread/presentation/mixin/email_action_controller.dart b/lib/features/thread/presentation/mixin/email_action_controller.dart index 1a4dd5e9b..d6899667b 100644 --- a/lib/features/thread/presentation/mixin/email_action_controller.dart +++ b/lib/features/thread/presentation/mixin/email_action_controller.dart @@ -111,7 +111,6 @@ mixin EmailActionController { } void moveToMailbox( - BuildContext context, PresentationEmail email, {PresentationMailbox? mailboxContain} ) async { @@ -130,12 +129,10 @@ mixin EmailActionController { : await push(AppRoutes.destinationPicker, arguments: arguments); if (destinationMailbox != null && - context.mounted && destinationMailbox is PresentationMailbox && mailboxDashBoardController.sessionCurrent != null ) { _dispatchMoveToAction( - context, accountId, mailboxDashBoardController.sessionCurrent!, email, @@ -146,7 +143,6 @@ mixin EmailActionController { } void _dispatchMoveToAction( - BuildContext context, AccountId accountId, Session session, PresentationEmail emailSelected, @@ -245,12 +241,10 @@ mixin EmailActionController { } void moveSelectedMultipleEmailToMailbox( - BuildContext context, List listEmails, PresentationMailbox mailboxCurrent ) { mailboxDashBoardController.moveSelectedMultipleEmailToMailbox( - context, listEmails, mailboxCurrent); } @@ -284,7 +278,7 @@ mixin EmailActionController { onCancelSelectionEmail: onCancelSelectionEmail); } - void openEmailInNewTabAction(BuildContext context, PresentationEmail email) { + void openEmailInNewTabAction(PresentationEmail email) { AppUtils.launchLink(email.routeWebAsString); } diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 408add795..b80efd6ee 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -287,10 +287,10 @@ class ThreadController extends BaseController with EmailActionController { cancelSelectEmail(); mailboxDashBoardController.clearDashBoardAction(); } else if (action is FilterMessageAction) { - filterMessagesAction(action.context, action.option); + filterMessagesAction(action.option); mailboxDashBoardController.clearDashBoardAction(); } else if (action is HandleEmailActionTypeAction) { - pressEmailSelectionAction(action.context, action.emailAction, action.listEmailSelected); + pressEmailSelectionAction(action.emailAction, action.listEmailSelected); mailboxDashBoardController.clearDashBoardAction(); } else if (action is OpenEmailDetailedFromSuggestionQuickSearchAction) { final mailboxContain = action.presentationEmail.findMailboxContain(mailboxDashBoardController.mapMailboxById); @@ -299,7 +299,6 @@ class ThreadController extends BaseController with EmailActionController { EmailActionType.preview, newEmail, mailboxContain: mailboxContain, - context: action.context, ); mailboxDashBoardController.clearDashBoardAction(); } else if (action is StartSearchEmailAction) { @@ -307,8 +306,8 @@ class ThreadController extends BaseController with EmailActionController { _replaceBrowserHistory(); _searchEmail(); mailboxDashBoardController.clearDashBoardAction(); - } else if (action is EmptyTrashAction) { - deleteSelectionEmailsPermanently(action.context, DeleteActionType.all); + } else if (action is EmptyTrashAction && currentContext != null) { + deleteSelectionEmailsPermanently(currentContext!, DeleteActionType.all); mailboxDashBoardController.clearDashBoardAction(); } else if (action is OpenEmailInsideMailboxFromLocationBar) { _getEmailByIdFromLocationBar( @@ -720,7 +719,7 @@ class ThreadController extends BaseController with EmailActionController { } } - void selectEmail(BuildContext context, PresentationEmail presentationEmailSelected) { + void selectEmail(PresentationEmail presentationEmailSelected) { final emailsInCurrentMailbox = mailboxDashBoardController.emailsInCurrentMailbox; if (_rangeSelectionMode && latestEmailSelectedOrUnselected.value != null && latestEmailSelectedOrUnselected.value?.id != presentationEmailSelected.id) { @@ -780,7 +779,7 @@ class ThreadController extends BaseController with EmailActionController { popBack(); } - void filterMessagesAction(BuildContext context, FilterMessageOption filterOption) { + void filterMessagesAction(FilterMessageOption filterOption) { popBack(); final newFilterOption = mailboxDashBoardController.filterMessageOption.value == filterOption @@ -789,11 +788,12 @@ class ThreadController extends BaseController with EmailActionController { mailboxDashBoardController.filterMessageOption.value = newFilterOption; - appToast.showToastMessage( - context, - newFilterOption.getMessageToast(context), - leadingSVGIcon: newFilterOption.getIconToast(imagePaths), - ); + if (currentContext != null && currentOverlayContext != null) { + appToast.showToastMessage( + currentOverlayContext!, + newFilterOption.getMessageToast(currentContext!), + leadingSVGIcon: newFilterOption.getIconToast(imagePaths)); + } if (searchController.isSearchEmailRunning) { _searchEmail(); @@ -947,7 +947,10 @@ class ThreadController extends BaseController with EmailActionController { } } - void pressEmailSelectionAction(BuildContext context, EmailActionType actionType, List selectionEmail) { + void pressEmailSelectionAction( + EmailActionType actionType, + List selectionEmail + ) { switch(actionType) { case EmailActionType.markAsRead: cancelSelectEmail(); @@ -971,7 +974,7 @@ class ThreadController extends BaseController with EmailActionController { ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) : selectedMailbox; if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToMailbox(context, selectionEmail, mailboxContainCurrent); + moveSelectedMultipleEmailToMailbox(selectionEmail, mailboxContainCurrent); } break; case EmailActionType.moveToTrash: @@ -987,9 +990,9 @@ class ThreadController extends BaseController with EmailActionController { final mailboxContainCurrent = searchController.isSearchEmailRunning ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) : selectedMailbox; - if (mailboxContainCurrent != null) { + if (mailboxContainCurrent != null && currentContext != null) { deleteSelectionEmailsPermanently( - context, + currentContext!, DeleteActionType.multiple, listEmails: selectionEmail, mailboxCurrent: mailboxContainCurrent, @@ -1019,7 +1022,6 @@ class ThreadController extends BaseController with EmailActionController { PresentationEmail selectedEmail, { PresentationMailbox? mailboxContain, - BuildContext? context, } ) { switch(actionType) { @@ -1031,7 +1033,7 @@ class ThreadController extends BaseController with EmailActionController { } break; case EmailActionType.selection: - selectEmail(context!, selectedEmail); + selectEmail(selectedEmail); break; case EmailActionType.markAsRead: markAsEmailRead(selectedEmail, ReadActions.markAsRead, MarkReadAction.tap); @@ -1046,13 +1048,15 @@ class ThreadController extends BaseController with EmailActionController { markAsStarEmail(selectedEmail, MarkStarAction.unMarkStar); break; case EmailActionType.moveToMailbox: - moveToMailbox(context!, selectedEmail, mailboxContain: mailboxContain); + moveToMailbox(selectedEmail, mailboxContain: mailboxContain); break; case EmailActionType.moveToTrash: moveToTrash(selectedEmail, mailboxContain: mailboxContain); break; case EmailActionType.deletePermanently: - deleteEmailPermanently(context!, selectedEmail); + if (currentContext != null) { + deleteEmailPermanently(currentContext!, selectedEmail); + } break; case EmailActionType.moveToSpam: popBack(); @@ -1063,7 +1067,7 @@ class ThreadController extends BaseController with EmailActionController { unSpam(selectedEmail); break; case EmailActionType.openInNewTab: - openEmailInNewTabAction(context!, selectedEmail); + openEmailInNewTabAction(selectedEmail); break; default: break; diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 33bb03417..3f6b52b9b 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -74,13 +74,7 @@ class ThreadView extends GetWidget filterOption: controller.mailboxDashBoardController.filterMessageOption.value, openMailboxAction: controller.openMailboxLeftMenu, cancelEditThreadAction: controller.cancelSelectEmail, - emailSelectionAction: (actionType, selectionEmail) { - return controller.pressEmailSelectionAction( - context, - actionType, - selectionEmail - ); - }, + emailSelectionAction: controller.pressEmailSelectionAction, onContextMenuFilterEmailAction: controller.responsiveUtils.isScreenWithShortestSide(context) ? (filterOption) => controller.openContextMenuAction( context, @@ -94,7 +88,7 @@ class ThreadView extends GetWidget popupMenuFilterEmailActionTile( context, filterOption, - (option) => controller.filterMessagesAction(context, option) + controller.filterMessagesAction ) ) : null @@ -245,12 +239,7 @@ class ThreadView extends GetWidget controller.responsiveUtils, listEmailSelected, controller.mailboxDashBoardController.selectedMailbox.value, - onPressEmailSelectionActionClick: (actionType, selectionEmail) => - controller.pressEmailSelectionAction( - context, - actionType, - selectionEmail - ) + onPressEmailSelectionActionClick: controller.pressEmailSelectionAction ); } else { return const SizedBox.shrink(); @@ -341,7 +330,7 @@ class ThreadView extends GetWidget width: 20, height: 20, fit: BoxFit.fill)) - ..onActionClick((option) => controller.filterMessagesAction(context, option))) + ..onActionClick(controller.filterMessagesAction)) .build()).toList(); } @@ -598,22 +587,20 @@ class ThreadView extends GetWidget searchQuery: controller.searchQuery, mailboxContain: presentationEmail.mailboxContain, isSearchEmailRunning: controller.searchController.isSearchEmailRunning, - emailActionClick: (action, email) => _handleEmailActionClicked(context, email, action), + emailActionClick: _handleEmailActionClicked, onMoreActionClick: (email, position) => _handleEmailContextMenuAction(context, email, position), ), ); } void _handleEmailActionClicked( - BuildContext context, - PresentationEmail presentationEmail, - EmailActionType actionType + EmailActionType actionType, + PresentationEmail presentationEmail ) { controller.handleEmailActionType( actionType, presentationEmail, mailboxContain: presentationEmail.mailboxContain, - context: context ); } @@ -736,7 +723,6 @@ class ThreadView extends GetWidget mailboxContain?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam, email, mailboxContain: mailboxContain, - context: context, )) ).build(); } @@ -760,7 +746,7 @@ class ThreadView extends GetWidget : EdgeInsets.zero) ..onActionClick((email) { popBack(); - controller.openEmailInNewTabAction(context, email); + controller.openEmailInNewTabAction(email); }) ).build(); } @@ -823,7 +809,6 @@ class ThreadView extends GetWidget mailboxContain?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam, email, mailboxContain: mailboxContain, - context: context ) ) ); @@ -847,7 +832,7 @@ class ThreadView extends GetWidget ), onCallbackAction: () { popBack(); - controller.openEmailInNewTabAction(context, email); + controller.openEmailInNewTabAction(email); } ) ); diff --git a/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart b/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart index d30443722..63ab0cce6 100644 --- a/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart +++ b/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart @@ -394,7 +394,7 @@ void main() { when(context.owner).thenReturn(BuildOwner(focusManager: FocusManager())); // expect query in search controller update as expected - mailboxDashboardController.searchEmail(context, queryString: queryString); + mailboxDashboardController.searchEmail(queryString: queryString); expect(searchController.searchEmailFilter.value.text, SearchQuery(queryString)); // expect sort in search controller update as expected @@ -455,7 +455,7 @@ void main() { // mailbox: impossible? due to private field advancedFilterController.updateReceiveDateSearchFilter(context, EmailReceiveTimeType.last30Days); advancedFilterController.updateSortOrder(EmailSortOrderType.relevance); - advancedFilterController.applyAdvancedSearchFilter(context); + advancedFilterController.applyAdvancedSearchFilter(); expect(searchController.searchEmailFilter.value, SearchEmailFilter( from: {fromEmailAddress.email!}, to: {toEmailAddress.email!},