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
@@ -1,7 +1,7 @@
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/base/action/ui_action.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class MailboxUIAction extends UIAction {
static final idle = MailboxUIAction();
@@ -31,4 +31,6 @@ class OpenMailboxAction extends MailboxUIAction {
@override
List<Object?> get props => [presentationMailbox];
}
}
class SystemBackToInboxAction extends MailboxUIAction {}
@@ -84,5 +84,8 @@ extension PresentationMailboxExtension on PresentationMailbox {
}
}
Uri get mailboxRouteWeb => RouteUtils.generateRouteBrowser(AppRoutes.dashboard, NavigationRouter(mailboxId: id));
Uri get mailboxRouteWeb => RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
router: NavigationRouter(mailboxId: id)
);
}
@@ -102,6 +102,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
final _activeScrollBottom = RxBool(true);
MailboxId? _newFolderId;
NavigationRouter? _navigationRouter;
final _openMailboxEventController = StreamController<OpenMailboxViewEvent>();
final mailboxListScrollController = ScrollController();
@@ -291,6 +292,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
}
}
mailboxDashBoardController.clearMailboxUIAction();
} else if (action is SystemBackToInboxAction) {
_disableAllSearchEmail();
_switchBackToMailboxDefault();
mailboxDashBoardController.clearMailboxUIAction();
}
});
}
@@ -418,68 +423,122 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
}
void _handleDataFromNavigationRouter() {
log('MailboxController::_handleDataFromNavigationRouter():navigationRouter: $navigationRouter');
if (isHasDataFromRoute) {
if (isRedirectToMailtoURL) {
mailboxDashBoardController.goToComposer(
ComposerArguments.fromMailtoUri(
emailAddress: navigationRouter?.emailAddress,
subject: navigationRouter?.subject,
body: navigationRouter?.body
)
);
}
if (mailboxIdFromNavigationRouter != null) {
_selectMailboxFromRouter();
} else if (emailIdFromNavigationRouter != null) {
mailboxDashBoardController.dispatchAction(SelectEmailByIdAction(navigationRouter!));
_clearNavigationRouter();
} else if (searchQueryFromNavigationRouter != null && searchQueryFromNavigationRouter?.value.isNotEmpty == true) {
mailboxDashBoardController.dispatchAction(SearchEmailByQueryAction(navigationRouter!));
_clearNavigationRouter();
} else {
_clearNavigationRouter();
_selectSelectedMailboxDefault();
_updateSelectedMailboxRouteOnBrowser();
}
} else {
log('MailboxController::_handleDataFromNavigationRouter():navigationRouter: $_navigationRouter');
if (!PlatformInfo.isWeb || _navigationRouter == null) {
_selectSelectedMailboxDefault();
_updateSelectedMailboxRouteOnBrowser();
_replaceBrowserHistory();
return;
}
if (_navigationRouter?.routeName == AppRoutes.mailtoURL) {
mailboxDashBoardController.goToComposer(
ComposerArguments.fromMailtoUri(
emailAddress: _navigationRouter?.emailAddress,
subject: _navigationRouter?.subject,
body: _navigationRouter?.body
)
);
}
switch(_navigationRouter!.dashboardType) {
case DashboardType.search:
if (_navigationRouter!.emailId != null) {
_openEmailSearchedFromLocationBar(
_navigationRouter!.emailId!,
searchQuery: _navigationRouter!.searchQuery,
);
} else if (_navigationRouter!.searchQuery?.value.isNotEmpty == true) {
_searchEmailFromLocationBar(_navigationRouter!.searchQuery!);
} else {
_clearNavigationRouter();
_selectSelectedMailboxDefault();
_replaceBrowserHistory();
}
break;
case DashboardType.normal:
if (_navigationRouter!.mailboxId != null) {
final matchedMailboxNode = findMailboxNodeById(_navigationRouter!.mailboxId!);
if (matchedMailboxNode != null) {
if (_navigationRouter!.emailId != null) {
_openEmailInsideMailboxFromLocationBar(
matchedMailboxNode.item,
_navigationRouter!.emailId!
);
} else {
_openMailboxFromLocationBar(matchedMailboxNode.item);
}
} else {
_clearNavigationRouter();
popAndPush(AppRoutes.unknownRoutePage);
}
} else if (_navigationRouter!.emailId != null) {
_openEmailWithoutMailboxFromLocationBar(_navigationRouter!.emailId!);
} else {
_clearNavigationRouter();
_selectSelectedMailboxDefault();
_replaceBrowserHistory();
}
break;
}
}
NavigationRouter? get navigationRouter => mailboxDashBoardController.navigationRouter;
void _openEmailInsideMailboxFromLocationBar(
PresentationMailbox presentationMailbox,
EmailId emailId
) {
mailboxDashBoardController.setSelectedMailbox(presentationMailbox);
mailboxDashBoardController.dispatchAction(OpenEmailInsideMailboxFromLocationBar(emailId, presentationMailbox));
_clearNavigationRouter();
}
bool get isHasDataFromRoute => PlatformInfo.isWeb && navigationRouter != null;
void _openMailboxFromLocationBar(PresentationMailbox presentationMailbox) {
mailboxDashBoardController.setSelectedMailbox(presentationMailbox);
if (PlatformInfo.isWeb) {
RouteUtils.replaceBrowserHistory(
title: 'Mailbox-${presentationMailbox.mailboxId?.id.value}',
url: RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
router: NavigationRouter(
mailboxId: presentationMailbox.mailboxId,
dashboardType: DashboardType.normal
)
)
);
}
_clearNavigationRouter();
}
MailboxId? get mailboxIdFromNavigationRouter => navigationRouter?.mailboxId;
void _openEmailWithoutMailboxFromLocationBar(EmailId emailId) {
mailboxDashBoardController.dispatchAction(
OpenEmailWithoutMailboxFromLocationBar(emailId)
);
_clearNavigationRouter();
}
EmailId? get emailIdFromNavigationRouter => navigationRouter?.emailId;
void _openEmailSearchedFromLocationBar(
EmailId emailId,
{
SearchQuery? searchQuery,
}
) {
mailboxDashBoardController.dispatchAction(
OpenEmailSearchedFromLocationBar(
emailId,
searchQuery: searchQuery,
)
);
_clearNavigationRouter();
}
SearchQuery? get searchQueryFromNavigationRouter => navigationRouter?.searchQuery;
bool get isRedirectToMailtoURL => navigationRouter?.routeName == AppRoutes.mailtoURL;
void _searchEmailFromLocationBar(SearchQuery searchQuery) {
mailboxDashBoardController.dispatchAction(
SearchEmailFromLocationBar(searchQuery)
);
_clearNavigationRouter();
}
void _clearNavigationRouter() {
mailboxDashBoardController.navigationRouter = null;
}
void _selectMailboxFromRouter() {
final matchedMailboxNode = findMailboxNodeById(mailboxIdFromNavigationRouter!);
if (matchedMailboxNode != null) {
mailboxDashBoardController.setSelectedMailbox(matchedMailboxNode.item);
if (emailIdFromNavigationRouter != null) {
mailboxDashBoardController.dispatchAction(SelectEmailByIdAction(navigationRouter!));
} else {
_updateSelectedMailboxRouteOnBrowser();
}
_clearNavigationRouter();
} else {
_clearNavigationRouter();
popAndPush(AppRoutes.unknownRoutePage);
}
_navigationRouter = null;
}
void _handleOpenMailbox(
@@ -494,7 +553,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
mailboxDashBoardController.clearFilterMessageOption();
}
_disableAllSearchEmail();
_updateSelectedMailboxRouteOnBrowser();
_replaceBrowserHistory();
mailboxDashBoardController.closeMailboxMenuDrawer();
mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread);
}
@@ -779,7 +838,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
void _switchBackToMailboxDefault() {
final inboxMailbox = findMailboxNodeByRole(PresentationMailbox.roleInbox);
mailboxDashBoardController.setSelectedMailbox(inboxMailbox?.item);
_updateSelectedMailboxRouteOnBrowser();
_replaceBrowserHistory();
_autoScrollToTopMailboxList();
}
@@ -911,7 +970,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
if (parameters != null) {
final navigationRouter = RouteUtils.parsingRouteParametersToNavigationRouter(parameters);
log('MailboxController::_handleNavigationRouteParameters():navigationRouter: $navigationRouter');
mailboxDashBoardController.navigationRouter = navigationRouter;
_navigationRouter = navigationRouter;
}
}
@@ -1005,12 +1064,13 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
}
}
void _updateSelectedMailboxRouteOnBrowser() {
void _replaceBrowserHistory() {
log('MailboxController::_updateSelectedMailboxRouteOnBrowser:selectedMailbox: ${selectedMailbox?.id}');
if (PlatformInfo.isWeb) {
final selectedMailboxId = selectedMailbox?.id;
final route = RouteUtils.generateRouteBrowser(
final route = RouteUtils.createUrlWebLocationBar(
AppRoutes.dashboard,
NavigationRouter(
router: NavigationRouter(
mailboxId: selectedMailboxId,
searchQuery: mailboxDashBoardController.searchController.isSearchEmailRunning
? mailboxDashBoardController.searchController.searchQuery
@@ -1020,7 +1080,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
: DashboardType.normal
)
);
RouteUtils.updateRouteOnBrowser('Mailbox-${selectedMailboxId?.id.value}', route);
RouteUtils.replaceBrowserHistory(
title: 'Mailbox-${selectedMailboxId?.id.value}',
url: route
);
}
}
@@ -1060,7 +1123,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
}
_setMapMailbox();
_setOutboxMailbox();
_selectSelectedMailboxDefault();
}
void _handleRefreshChangesAllMailboxSuccess(RefreshChangesAllMailboxSuccess success) async {