TF-3006 [MOBILE] Handle mail address in quick search bar

This commit is contained in:
dab246
2024-09-17 14:16:04 +07:00
committed by Dat H. Pham
parent 3392bf16bc
commit 6a59efe3c7
@@ -38,6 +38,7 @@ import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.
import 'package:tmail_ui_user/features/email/domain/state/store_event_attendance_status_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/store_event_attendance_status_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart';
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.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/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_recent_search_latest_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_recent_search_latest_state.dart';
@@ -362,46 +363,45 @@ class SearchEmailController extends BaseController
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
textInputSearchFocus.unfocus(); textInputSearchFocus.unfocus();
if (session != null && accountId != null) { if (session == null || accountId == null) {
resultSearchViewState.value = Right(SearchingState()); consumeState(Stream.value(Left(SearchEmailFailure(NotFoundSessionException()))));
canSearchMore = true; return;
searchIsRunning.value = true;
cancelSelectionMode();
if (PlatformInfo.isWeb) {
RouteUtils.replaceBrowserHistory(
title: 'SearchEmail',
url: RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
router: NavigationRouter(
searchQuery: searchQuery,
dashboardType: DashboardType.search
)
)
);
}
if (emailSortOrderType.value.isScrollByPosition()) {
_updateSimpleSearchFilter(
positionOption: const Some(0),
beforeOption: const None(),
);
} else {
_updateSimpleSearchFilter(
positionOption: const None(),
beforeOption: const None(),
);
}
consumeState(_searchEmailInteractor.execute(
session!,
accountId!,
limit: ThreadConstants.defaultLimit,
position: searchEmailFilter.value.position,
sort: emailSortOrderType.value.getSortOrder().toNullable(),
filter: searchEmailFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
));
} }
resultSearchViewState.value = Right(SearchingState());
canSearchMore = true;
searchMoreState = SearchMoreState.idle;
searchIsRunning.value = true;
cancelSelectionMode();
if (PlatformInfo.isWeb) {
RouteUtils.replaceBrowserHistory(
title: 'SearchEmail',
url: RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
router: NavigationRouter(
searchQuery: searchQuery,
dashboardType: DashboardType.search
)
)
);
}
_updateSimpleSearchFilter(
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None(),
beforeOption: const None(),
);
consumeState(_searchEmailInteractor.execute(
session!,
accountId!,
limit: ThreadConstants.defaultLimit,
position: searchEmailFilter.value.position,
sort: emailSortOrderType.value.getSortOrder().toNullable(),
filter: searchEmailFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
));
} }
void _searchEmailsSuccess(SearchEmailSuccess success) { void _searchEmailsSuccess(SearchEmailSuccess success) {
@@ -484,24 +484,18 @@ class SearchEmailController extends BaseController
searchMoreState = SearchMoreState.completed; searchMoreState = SearchMoreState.completed;
} }
void showAllResultSearchAction(BuildContext context, String query) { void showAllResultSearchAction(BuildContext context, String queryString) {
setTextInputSearchForm(query); setTextInputSearchForm(queryString);
_updateSimpleSearchFilter( _searchEmailByQueryString(
textOption: Some(SearchQuery(query)), context: context,
beforeOption: const None(), queryString: queryString);
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
);
_searchEmailAction(context);
} }
void searchEmailByRecentAction(BuildContext context, RecentSearch recentSearch) { void searchEmailByRecentAction(BuildContext context, RecentSearch recentSearch) {
setTextInputSearchForm(recentSearch.value); setTextInputSearchForm(recentSearch.value);
_updateSimpleSearchFilter( _searchEmailByQueryString(
textOption: Some(SearchQuery(recentSearch.value)), context: context,
beforeOption: const None(), queryString: recentSearch.value);
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
);
_searchEmailAction(context);
} }
void searchEmailByEmailAddressAction( void searchEmailByEmailAddressAction(
@@ -512,30 +506,34 @@ class SearchEmailController extends BaseController
currentSearchText.value = ''; currentSearchText.value = '';
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
textOption: const None(), textOption: const None(),
fromOption: Some({emailAddress.emailAddress}), fromOption: Some({emailAddress.emailAddress}));
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
void submitSearchAction(BuildContext context, String query) { void _searchEmailByQueryString({
_updateSimpleSearchFilter( required BuildContext context,
textOption: Some(SearchQuery(query)), required String queryString
beforeOption: const None(), }) {
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None() log('SearchEmailController::_searchEmailByQueryString:QueryString = $queryString');
); resultSearchViewState.value = Right(SearchingState());
_searchEmailAction(context); listRecentSearch.clear();
listSuggestionSearch.clear();
listResultSearch.clear();
emailReceiveTimeType.value = EmailReceiveTimeType.allTime;
emailSortOrderType.value = EmailSortOrderType.mostRecent;
searchEmailFilter.value = SearchEmailFilter.initial();
searchIsRunning.value = false;
final isMailAddress = EmailUtils.isEmailAddressValid(queryString);
if (isMailAddress) {
searchEmailByEmailAddressAction(context, EmailAddress(null, queryString));
} else {
_updateSimpleSearchFilter(textOption: Some(SearchQuery(queryString)));
_searchEmailAction(context);
}
} }
void selectHasAttachmentSearchFilter(BuildContext context) { void selectHasAttachmentSearchFilter(BuildContext context) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(hasAttachmentOption: const Some(true));
hasAttachmentOption: const Some(true),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
@@ -544,13 +542,7 @@ class SearchEmailController extends BaseController
if (!listKeyword.contains(KeyWordIdentifier.emailFlagged.value)) { if (!listKeyword.contains(KeyWordIdentifier.emailFlagged.value)) {
listKeyword.add(KeyWordIdentifier.emailFlagged.value); listKeyword.add(KeyWordIdentifier.emailFlagged.value);
} }
_updateSimpleSearchFilter( _updateSimpleSearchFilter(hasKeywordOption: Some(listKeyword));
hasKeywordOption: Some(listKeyword),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
@@ -585,10 +577,8 @@ class SearchEmailController extends BaseController
textOption: searchQuery == null textOption: searchQuery == null
? Some(SearchQuery.initial()) ? Some(SearchQuery.initial())
: optionOf(searchEmailFilter.value.text), : optionOf(searchEmailFilter.value.text),
beforeOption: const None(),
startDateOption: optionOf(newStartDate?.toUTCDate()), startDateOption: optionOf(newStartDate?.toUTCDate()),
endDateOption: optionOf(newEndDate?.toUTCDate()), endDateOption: optionOf(newEndDate?.toUTCDate()),
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
); );
_setEmailReceiveTimeType(emailReceiveTimeType); _setEmailReceiveTimeType(emailReceiveTimeType);
@@ -601,10 +591,8 @@ class SearchEmailController extends BaseController
textOption: searchQuery == null textOption: searchQuery == null
? Some(SearchQuery.initial()) ? Some(SearchQuery.initial())
: optionOf(searchEmailFilter.value.text), : optionOf(searchEmailFilter.value.text),
beforeOption: const None(),
startDateOption: const None(), startDateOption: const None(),
endDateOption: const None(), endDateOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
); );
_setEmailReceiveTimeType(emailReceiveTimeType); _setEmailReceiveTimeType(emailReceiveTimeType);
@@ -614,10 +602,6 @@ class SearchEmailController extends BaseController
void selectSortOrderQuickSearchFilter(BuildContext context, EmailSortOrderType sortOrderType) { void selectSortOrderQuickSearchFilter(BuildContext context, EmailSortOrderType sortOrderType) {
popBack(); popBack();
_updateSimpleSearchFilter(
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
);
emailSortOrderType.value = sortOrderType; emailSortOrderType.value = sortOrderType;
_searchEmailAction(context); _searchEmailAction(context);
} }
@@ -638,11 +622,7 @@ class SearchEmailController extends BaseController
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
mailboxOption: destinationMailbox.id == PresentationMailbox.unifiedMailbox.id mailboxOption: destinationMailbox.id == PresentationMailbox.unifiedMailbox.id
? const None() ? const None()
: Some(destinationMailbox), : Some(destinationMailbox)
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
); );
if (context.mounted) { if (context.mounted) {
@@ -712,18 +692,10 @@ class SearchEmailController extends BaseController
switch(prefixEmailAddress) { switch(prefixEmailAddress) {
case PrefixEmailAddress.from: case PrefixEmailAddress.from:
_updateSimpleSearchFilter( _updateSimpleSearchFilter(fromOption: Some(searchEmailFilter.value.from));
fromOption: Some(searchEmailFilter.value.from),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
);
break; break;
case PrefixEmailAddress.to: case PrefixEmailAddress.to:
_updateSimpleSearchFilter( _updateSimpleSearchFilter(toOption: Some(searchEmailFilter.value.to));
toOption: Some(searchEmailFilter.value.to),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
);
break; break;
default: default:
break; break;
@@ -766,10 +738,11 @@ class SearchEmailController extends BaseController
} }
void onTextSearchSubmitted(BuildContext context, String text) { void onTextSearchSubmitted(BuildContext context, String text) {
if (text.trim().isNotEmpty) { final queryString = text.trim();
saveRecentSearch(RecentSearch.now(text.trim())); if (queryString.isNotEmpty) {
saveRecentSearch(RecentSearch.now(queryString));
} }
submitSearchAction(context, text); _searchEmailByQueryString(context: context, queryString: queryString);
} }
void setTextInputSearchForm(String value) { void setTextInputSearchForm(String value) {
@@ -991,80 +964,40 @@ class SearchEmailController extends BaseController
textOption: searchQuery == null textOption: searchQuery == null
? Some(SearchQuery.initial()) ? Some(SearchQuery.initial())
: optionOf(searchEmailFilter.value.text), : optionOf(searchEmailFilter.value.text),
beforeOption: const None(),
startDateOption: const None(), startDateOption: const None(),
endDateOption: const None(), endDateOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
); );
_setEmailReceiveTimeType(EmailReceiveTimeType.allTime); _setEmailReceiveTimeType(EmailReceiveTimeType.allTime);
_searchEmailAction(context); _searchEmailAction(context);
} }
void _deleteSortOrderSearchFilter(BuildContext context) { void _deleteSortOrderSearchFilter(BuildContext context) {
_updateSimpleSearchFilter(
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
);
emailSortOrderType.value = EmailSortOrderType.mostRecent; emailSortOrderType.value = EmailSortOrderType.mostRecent;
_searchEmailAction(context); _searchEmailAction(context);
} }
void _deleteFromSearchFilter(BuildContext context) { void _deleteFromSearchFilter(BuildContext context) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(fromOption: const None());
fromOption: const None(),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
void _deleteToSearchFilter(BuildContext context) { void _deleteToSearchFilter(BuildContext context) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(toOption: const None());
toOption: const None(),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
void _deleteHasAttachmentSearchFilter(BuildContext context) { void _deleteHasAttachmentSearchFilter(BuildContext context) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(hasAttachmentOption: const None());
hasAttachmentOption: const None(),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
void _deleteFolderSearchFilter(BuildContext context) { void _deleteFolderSearchFilter(BuildContext context) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(mailboxOption: const None());
mailboxOption: const None(),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
void _deleteStarredSearchFilter(BuildContext context) { void _deleteStarredSearchFilter(BuildContext context) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(hasKeywordOption: const None());
hasKeywordOption: const None(),
beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition()
? const Some(0)
: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }