TF-1831 Handle system back button in search email

Signed-off-by: dab246 <tdvu@linagora.com>

Signed-off-by: dab246 <tdvu@linagora.com>
(cherry picked from commit f4ffd113f192415c8613bf12fe40db1af902edaf)
This commit is contained in:
dab246
2023-12-09 15:59:20 +07:00
committed by Dat H. Pham
parent 535ac67971
commit bb98f02918
20 changed files with 492 additions and 250 deletions
@@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart';
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
@@ -104,7 +105,6 @@ class ThreadController extends BaseController with EmailActionController {
LoadingMoreStatus loadingMoreStatus = LoadingMoreStatus.idle;
MailboxId? _currentMailboxId;
jmap.State? _currentEmailState;
NavigationRouter? _navigationRouter;
final ScrollController listEmailController = ScrollController();
final FocusNode focusNodeKeyBoard = FocusNode();
final latestEmailSelectedOrUnselected = Rxn<PresentationEmail>();
@@ -123,9 +123,7 @@ class ThreadController extends BaseController with EmailActionController {
SearchEmailFilter get _searchEmailFilter => searchController.searchEmailFilter.value;
String get currentTextSearch => searchController.searchInputController.text;
SearchQuery? get searchQuery => searchController.searchEmailFilter.value.text;
SearchQuery? get searchQuery => _searchEmailFilter.text;
ThreadController(
this._getEmailsInMailboxInteractor,
@@ -174,7 +172,18 @@ class ThreadController extends BaseController with EmailActionController {
openingEmail.value = true;
} else if (success is GetEmailByIdSuccess) {
openingEmail.value = false;
_openEmailDetailView(success.email);
if (searchController.isSearchEmailRunning) {
_openEmailSearchedFromLocationBar(
email: success.email,
searchQuery: searchQuery
);
} else {
if (success.mailboxContain != null) {
_openEmailInsideMailboxFromLocationBar(success.email, success.mailboxContain!);
} else {
_openEmailWithoutMailboxFromLocationBar(success.email);
}
}
} else if (success is CreateNewRuleFilterSuccess) {
_createNewRuleFilterSuccess(success);
}
@@ -191,7 +200,6 @@ class ThreadController extends BaseController with EmailActionController {
loadingMoreStatus = LoadingMoreStatus.completed;
} else if (failure is GetEmailByIdFailure) {
openingEmail.value = false;
_navigationRouter = null;
popAndPush(AppRoutes.unknownRoutePage);
} else if (failure is GetAllEmailFailure) {
mailboxDashBoardController.refreshingMailboxState.value = Left(failure);
@@ -265,32 +273,37 @@ class ThreadController extends BaseController with EmailActionController {
} else if (action is OpenEmailDetailedFromSuggestionQuickSearchAction) {
final mailboxContain = action.presentationEmail.findMailboxContain(mailboxDashBoardController.mapMailboxById);
final newEmail = generateEmailByPlatform(action.presentationEmail);
pressEmailAction(
action.context,
handleEmailActionType(
EmailActionType.preview,
newEmail,
mailboxContain: mailboxContain
mailboxContain: mailboxContain,
context: action.context,
);
mailboxDashBoardController.clearDashBoardAction();
} else if (action is StartSearchEmailAction) {
cancelSelectEmail();
_updateSearchRouteOnBrowser();
_replaceBrowserHistory();
_searchEmail();
mailboxDashBoardController.clearDashBoardAction();
} else if (action is EmptyTrashAction) {
deleteSelectionEmailsPermanently(action.context, DeleteActionType.all);
mailboxDashBoardController.clearDashBoardAction();
} else if (action is SelectEmailByIdAction) {
_navigationRouter = action.navigationRouter;
if (_navigationRouter!.searchQuery != null) {
_activateSearchFromRouter();
}
_getEmailByIdAction(_navigationRouter!.emailId!);
} else if (action is OpenEmailInsideMailboxFromLocationBar) {
_getEmailByIdFromLocationBar(
action.emailId,
mailboxContain: action.presentationMailbox,
);
mailboxDashBoardController.clearDashBoardAction();
} else if (action is SearchEmailByQueryAction) {
_navigationRouter = action.navigationRouter;
_activateSearchFromRouter();
} else if (action is OpenEmailWithoutMailboxFromLocationBar) {
_getEmailByIdFromLocationBar(action.emailId);
mailboxDashBoardController.clearDashBoardAction();
} else if (action is OpenEmailSearchedFromLocationBar) {
_handleOpenEmailSearchedFromLocationBar(
emailId: action.emailId,
searchQuery: action.searchQuery
);
} else if (action is SearchEmailFromLocationBar) {
_handleSearchEmailFromLocationBar(action.searchQuery);
} else if (action is SelectDateRangeToAdvancedSearch || action is ClearDateRangeToAdvancedSearch) {
if (listEmailController.hasClients) {
listEmailController.jumpTo(0);
@@ -356,17 +369,6 @@ class ThreadController extends BaseController with EmailActionController {
});
}
void _activateSearchFromRouter() {
searchController.enableSearch();
searchController.updateTextSearch(_navigationRouter!.searchQuery!.value);
searchController.updateFilterEmail(text: _navigationRouter!.searchQuery!);
if (currentContext != null) {
FocusScope.of(currentContext!).unfocus();
}
searchController.searchFocus.unfocus();
_searchEmail();
}
void _handleErrorGetAllOrRefreshChangesEmail(Object error, StackTrace stackTrace) async {
logError('ThreadController::_handleErrorGetAllOrRefreshChangesEmail():Error: $error');
if (error is CannotCalculateChangesMethodResponseException) {
@@ -735,18 +737,24 @@ class ThreadController extends BaseController with EmailActionController {
filter: _searchEmailFilter.mappingToEmailFilterCondition(moreFilterCondition: _getFilterCondition()),
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
));
} else {
dispatchState(Left(SearchEmailFailure(NotFoundEmailException())));
}
}
void _updateSearchRouteOnBrowser() {
void _replaceBrowserHistory() {
if (PlatformInfo.isWeb) {
final route = RouteUtils.generateRouteBrowser(
AppRoutes.dashboard,
NavigationRouter(
searchQuery: searchQuery,
dashboardType: DashboardType.search)
RouteUtils.replaceBrowserHistory(
title: 'SearchEmail',
url: RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
router: NavigationRouter(
mailboxId: _searchEmailFilter.mailbox?.mailboxId,
searchQuery: searchQuery,
dashboardType: DashboardType.search
)
)
);
RouteUtils.updateRouteOnBrowser('SearchEmail', route);
}
}
@@ -780,7 +788,7 @@ class ThreadController extends BaseController with EmailActionController {
_accountId!,
limit: ThreadConstants.defaultLimit,
sort: _searchEmailFilter.sortOrder ?? _sortOrder,
filter: searchController.searchEmailFilter.value.mappingToEmailFilterCondition(moreFilterCondition: _getFilterCondition()),
filter: _searchEmailFilter.mappingToEmailFilterCondition(moreFilterCondition: _getFilterCondition()),
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
lastEmailId: oldestEmail?.id
));
@@ -877,11 +885,13 @@ class ThreadController extends BaseController with EmailActionController {
}
}
void pressEmailAction(
BuildContext context,
EmailActionType actionType,
PresentationEmail selectedEmail,
{PresentationMailbox? mailboxContain}
void handleEmailActionType(
EmailActionType actionType,
PresentationEmail selectedEmail,
{
PresentationMailbox? mailboxContain,
BuildContext? context,
}
) {
switch(actionType) {
case EmailActionType.preview:
@@ -892,7 +902,7 @@ class ThreadController extends BaseController with EmailActionController {
}
break;
case EmailActionType.selection:
selectEmail(context, selectedEmail);
selectEmail(context!, selectedEmail);
break;
case EmailActionType.markAsRead:
markAsEmailRead(selectedEmail, ReadActions.markAsRead, MarkReadAction.tap);
@@ -907,13 +917,13 @@ class ThreadController extends BaseController with EmailActionController {
markAsStarEmail(selectedEmail, MarkStarAction.unMarkStar);
break;
case EmailActionType.moveToMailbox:
moveToMailbox(context, selectedEmail, mailboxContain: mailboxContain);
moveToMailbox(context!, selectedEmail, mailboxContain: mailboxContain);
break;
case EmailActionType.moveToTrash:
moveToTrash(selectedEmail, mailboxContain: mailboxContain);
break;
case EmailActionType.deletePermanently:
deleteEmailPermanently(context, selectedEmail);
deleteEmailPermanently(context!, selectedEmail);
break;
case EmailActionType.moveToSpam:
popBack();
@@ -924,7 +934,7 @@ class ThreadController extends BaseController with EmailActionController {
unSpam(selectedEmail);
break;
case EmailActionType.openInNewTab:
openEmailInNewTabAction(context, selectedEmail);
openEmailInNewTabAction(context!, selectedEmail);
break;
default:
break;
@@ -939,6 +949,7 @@ class ThreadController extends BaseController with EmailActionController {
void goToSearchView() {
SearchEmailBindings().dependencies();
_replaceBrowserHistory();
mailboxDashBoardController.dispatchRoute(DashboardRoutes.searchEmail);
}
@@ -970,11 +981,13 @@ class ThreadController extends BaseController with EmailActionController {
PresentationEmail generateEmailByPlatform(PresentationEmail currentEmail) {
if (PlatformInfo.isWeb) {
final route = RouteUtils.generateRouteBrowser(
final route = RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
NavigationRouter(
router: NavigationRouter(
emailId: currentEmail.id,
mailboxId: currentMailbox?.id,
mailboxId: searchController.isSearchEmailRunning
? currentEmail.mailboxContain?.mailboxId
: currentMailbox?.id,
searchQuery: searchController.isSearchEmailRunning
? searchQuery
: null,
@@ -990,37 +1003,98 @@ class ThreadController extends BaseController with EmailActionController {
}
}
void _getEmailByIdAction(EmailId emailId) {
void _getEmailByIdFromLocationBar(
EmailId emailId,
{
PresentationMailbox? mailboxContain,
}
) {
if (_session != null && _accountId != null) {
consumeState(_getEmailByIdInteractor.execute(
_session!,
_accountId!,
emailId,
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!)
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
mailboxContain: mailboxContain,
));
} else {
logError('ThreadController::_getEmailByIdFromLocationBar: session & accountId is NULL');
popAndPush(AppRoutes.unknownRoutePage);
}
}
void _openEmailDetailView(PresentationEmail email) {
if (currentContext != null) {
final mailboxContain = email.findMailboxContain(mailboxDashBoardController.mapMailboxById);
final route = RouteUtils.generateRouteBrowser(
void _openEmailInsideMailboxFromLocationBar(
PresentationEmail email,
PresentationMailbox mailboxContain
) {
final presentationEmailWithRouter = email.withRouteWeb(RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
router: NavigationRouter(
emailId: email.id,
mailboxId: mailboxContain.mailboxId,
dashboardType: DashboardType.normal
)
));
handleEmailActionType(
EmailActionType.preview,
presentationEmailWithRouter,
mailboxContain: mailboxContain
);
}
void _openEmailWithoutMailboxFromLocationBar(PresentationEmail email) {
final mailboxContain = email.findMailboxContain(mailboxDashBoardController.mapMailboxById);
if (mailboxContain != null) {
mailboxDashBoardController.setSelectedMailbox(mailboxContain);
final presentationEmailWithRouter = email.withRouteWeb(RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
NavigationRouter(
router: NavigationRouter(
emailId: email.id,
mailboxId: _navigationRouter?.mailboxId,
searchQuery: _navigationRouter?.searchQuery,
dashboardType: _navigationRouter?.dashboardType ?? DashboardType.normal
mailboxId: mailboxContain.mailboxId,
dashboardType: DashboardType.normal
)
);
pressEmailAction(
currentContext!,
));
handleEmailActionType(
EmailActionType.preview,
email.withRouteWeb(route),
presentationEmailWithRouter,
mailboxContain: mailboxContain
);
} else {
searchController.enableSearch();
_searchEmail();
final presentationEmailWithRouter = email.withRouteWeb(RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
router: NavigationRouter(
emailId: email.id,
dashboardType: DashboardType.search
)
));
handleEmailActionType(
EmailActionType.preview,
presentationEmailWithRouter,
mailboxContain: mailboxContain
);
}
_navigationRouter = null;
}
void _openEmailSearchedFromLocationBar({
required PresentationEmail email,
SearchQuery? searchQuery,
}) {
final presentationEmailWithRouter = email.withRouteWeb(RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
router: NavigationRouter(
emailId: email.id,
searchQuery: searchQuery,
dashboardType: DashboardType.search
)
));
handleEmailActionType(
EmailActionType.preview,
presentationEmailWithRouter,
mailboxContain: email.findMailboxContain(mailboxDashBoardController.mapMailboxById)
);
}
void onDragMailBox(bool isDrag) {
@@ -1086,7 +1160,7 @@ class ThreadController extends BaseController with EmailActionController {
return false;
}
DismissDirection getSwipeDirection (bool isWebDesktop, SelectMode selectMode) {
DismissDirection getSwipeDirection(bool isWebDesktop, SelectMode selectMode) {
if (isWebDesktop) {
return DismissDirection.none;
}
@@ -1098,19 +1172,40 @@ class ThreadController extends BaseController with EmailActionController {
return DismissDirection.startToEnd;
}
Future<bool> backButtonPressedCallbackAction(BuildContext context) async {
if (PlatformInfo.isMobile &&
mailboxDashBoardController.selectedMailbox.value?.isInbox == false) {
mailboxDashBoardController.openDefaultMailbox();
return false;
} else {
return true;
}
}
void scrollToTop() {
if (listEmailController.hasClients) {
listEmailController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
}
}
void _handleOpenEmailSearchedFromLocationBar({
required EmailId emailId,
SearchQuery? searchQuery,
}) {
searchController.enableSearch();
if (searchQuery != null) {
searchController.updateTextSearch(searchQuery.value);
searchController.updateFilterEmail(text: searchQuery);
if (currentContext != null) {
FocusScope.of(currentContext!).unfocus();
}
searchController.searchFocus.unfocus();
}
_searchEmail();
_getEmailByIdFromLocationBar(emailId);
mailboxDashBoardController.clearDashBoardAction();
}
void _handleSearchEmailFromLocationBar(SearchQuery searchQuery) {
dispatchState(Right(SearchingState()));
searchController.enableSearch();
searchController.updateTextSearch(searchQuery.value);
searchController.updateFilterEmail(text: searchQuery);
if (currentContext != null) {
FocusScope.of(currentContext!).unfocus();
}
searchController.searchFocus.unfocus();
_searchEmail();
mailboxDashBoardController.clearDashBoardAction();
}
}