TF-934 Select mailbox, email when change route on browser

This commit is contained in:
dab246
2022-11-10 20:14:47 +07:00
committed by Dat H. Pham
parent aa8b80975e
commit 6050ee5386
21 changed files with 491 additions and 287 deletions
@@ -10,6 +10,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
@@ -46,7 +47,6 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart';
@@ -68,6 +68,7 @@ import 'package:tmail_ui_user/features/thread/presentation/model/search_state.da
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.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/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:uuid/uuid.dart';
@@ -108,6 +109,8 @@ class MailboxController extends BaseMailboxController {
dashboardActionWorker,
routerParametersWorker;
PresentationMailbox? get selectedMailbox => mailboxDashBoardController.selectedMailbox.value;
MailboxController(
this._getAllMailboxInteractor,
this._refreshAllMailboxInteractor,
@@ -154,12 +157,9 @@ class MailboxController extends BaseMailboxController {
if (success is GetAllMailboxSuccess) {
_currentMailboxState = success.currentMailboxState;
await buildTree(success.mailboxList);
_setUpMapMailbox(success.mailboxList, defaultMailboxTree.value, folderMailboxTree.value);
_selectMailboxById();
} else if (success is RefreshChangesAllMailboxSuccess) {
_currentMailboxState = success.currentMailboxState;
await refreshTree(success.mailboxList);
_setUpMapMailbox(success.mailboxList, defaultMailboxTree.value, folderMailboxTree.value);
}
});
}
@@ -167,32 +167,34 @@ class MailboxController extends BaseMailboxController {
@override
void onDone() {
viewState.value.fold(
(failure) {
if (failure is CreateNewMailboxFailure) {
_createNewMailboxFailure(failure);
} else if (failure is SearchMailboxFailure) {
_searchMailboxFailure(failure);
} else if (failure is DeleteMultipleMailboxFailure) {
_deleteMailboxFailure(failure);
}
},
(success) {
if (success is CreateNewMailboxSuccess) {
_createNewMailboxSuccess(success);
} else if (success is SearchMailboxSuccess) {
_searchMailboxSuccess(success);
} else if (success is DeleteMultipleMailboxAllSuccess) {
_deleteMultipleMailboxSuccess(success.listMailboxIdDeleted, success.currentMailboxState);
} else if (success is DeleteMultipleMailboxHasSomeSuccess) {
_deleteMultipleMailboxSuccess(success.listMailboxIdDeleted, success.currentMailboxState);
} else if ((success is GetAllMailboxSuccess || success is RefreshChangesAllMailboxSuccess) && isSearchActive()) {
_searchMailboxAction(allMailboxes, searchQuery.value);
} else if (success is RenameMailboxSuccess) {
refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
} else if (success is MoveMailboxSuccess) {
_moveMailboxSuccess(success);
}
(failure) {
if (failure is CreateNewMailboxFailure) {
_createNewMailboxFailure(failure);
} else if (failure is SearchMailboxFailure) {
_searchMailboxFailure(failure);
} else if (failure is DeleteMultipleMailboxFailure) {
_deleteMailboxFailure(failure);
}
},
(success) async {
if (success is GetAllMailboxSuccess || success is RefreshChangesAllMailboxSuccess) {
_initialMailboxVariableStorage();
} else if (success is CreateNewMailboxSuccess) {
_createNewMailboxSuccess(success);
} else if (success is SearchMailboxSuccess) {
_searchMailboxSuccess(success);
} else if (success is DeleteMultipleMailboxAllSuccess) {
_deleteMultipleMailboxSuccess(success.listMailboxIdDeleted, success.currentMailboxState);
} else if (success is DeleteMultipleMailboxHasSomeSuccess) {
_deleteMultipleMailboxSuccess(success.listMailboxIdDeleted, success.currentMailboxState);
} else if ((success is GetAllMailboxSuccess || success is RefreshChangesAllMailboxSuccess) && isSearchActive()) {
_searchMailboxAction(allMailboxes, searchQuery.value);
} else if (success is RenameMailboxSuccess) {
refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
} else if (success is MoveMailboxSuccess) {
_moveMailboxSuccess(success);
}
}
);
}
@@ -313,64 +315,128 @@ class MailboxController extends BaseMailboxController {
}
}
void _setUpMapMailbox(List<PresentationMailbox> allMailbox, MailboxTree defaultTree, MailboxTree folderTree) {
void _initialMailboxVariableStorage() {
_setMapMailbox();
_setOutboxMailbox();
_selectMailboxDefault();
}
void _setMapMailbox() {
final mapDefaultMailboxIdByRole = {
for (var mailboxNode
in defaultTree.root.childrenItems ?? List<MailboxNode>.empty())
for (var mailboxNode in defaultMailboxTree.value.root.childrenItems ?? List<MailboxNode>.empty())
mailboxNode.item.role!: mailboxNode.item.id
};
final mapDefaultMailbox = {
for (var mailboxNode
in defaultTree.root.childrenItems ?? List<MailboxNode>.empty())
mailboxNode.item.role!: mailboxNode.item
};
final mapMailboxById = {
for (var presentationMailbox in allMailbox)
for (var presentationMailbox in allMailboxes)
presentationMailbox.id: presentationMailbox
};
mailboxDashBoardController.setMapDefaultMailboxIdByRole(mapDefaultMailboxIdByRole);
mailboxDashBoardController.setMapMailboxById(mapMailboxById);
}
void _setOutboxMailbox() {
try {
final outboxMailboxIdByRole = mapDefaultMailboxIdByRole[PresentationMailbox.roleOutbox];
final outboxMailboxIdByRole = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleOutbox];
if (outboxMailboxIdByRole == null) {
final outboxMailboxByName = allMailbox
final outboxMailboxByName = allMailboxes
.firstWhere((mailbox) => mailbox.name?.toLowerCase() == PresentationMailbox.lowerCaseOutboxMailboxName);
mailboxDashBoardController.setOutboxMailbox(outboxMailboxByName);
} else {
mailboxDashBoardController.setOutboxMailbox(mapMailboxById[outboxMailboxIdByRole]!);
mailboxDashBoardController.setOutboxMailbox(mailboxDashBoardController.mapMailboxById[outboxMailboxIdByRole]!);
}
} catch (e) {
logError('MailboxController::_setUpMapMailboxIdDefault: Not found outbox mailbox');
logError('MailboxController::_setOutboxMailbox: Not found outbox mailbox');
mailboxDashBoardController.setOutboxMailbox(null);
}
}
var mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
void _selectMailboxDefault() {
final mapDefaultMailbox = {
for (var mailboxNode in defaultMailboxTree.value.root.childrenItems ?? List<MailboxNode>.empty())
mailboxNode.item.role!: mailboxNode.item
};
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
final mapMailboxById = mailboxDashBoardController.mapMailboxById;
final isSearchEmailRunning = mailboxDashBoardController.searchController.isSearchEmailRunning;
PresentationMailbox? mailboxSelected;
if (mailboxCurrent != null) {
if (mailboxCurrent.hasRole()) {
mailboxDashBoardController.setNewFirstSelectedMailbox(mapDefaultMailbox.containsKey(mailboxCurrent.role)
mailboxSelected = mapDefaultMailbox.containsKey(mailboxCurrent.role)
? mapDefaultMailbox[mailboxCurrent.role]
: mailboxCurrent);
: mailboxCurrent;
} else {
mailboxDashBoardController.setNewFirstSelectedMailbox(mapMailboxById.containsKey(mailboxCurrent.id)
mailboxSelected = mapMailboxById.containsKey(mailboxCurrent.id)
? mapMailboxById[mailboxCurrent.id]
: mailboxCurrent);
: mailboxCurrent;
}
} else {
if (!mailboxDashBoardController.searchController.isSearchEmailRunning) {
if (!isSearchEmailRunning) {
if (mapDefaultMailbox.containsKey(PresentationMailbox.roleInbox)) {
mailboxDashBoardController.setNewFirstSelectedMailbox(mapDefaultMailbox[PresentationMailbox.roleInbox]);
mailboxSelected = mapDefaultMailbox[PresentationMailbox.roleInbox];
} else {
if (allMailbox.isNotEmpty) {
mailboxDashBoardController.setNewFirstSelectedMailbox(allMailbox.first);
if (allMailboxes.isNotEmpty) {
mailboxSelected = allMailboxes.first;
}
}
}
}
if (isHasDataFromRoute) {
if (mailboxIdFromNavigationRouter != null) {
_selectMailboxFromRouter();
} else if (emailIdFromNavigationRouter != null) {
mailboxDashBoardController.dispatchAction(
SelectEmailByIdAction(
emailIdFromNavigationRouter!,
mailboxIdFromNavigationRouter,
navigationRouter!.dashboardType
)
);
} else {
mailboxDashBoardController.setSelectedMailbox(mailboxSelected);
_updateSelectedMailboxRouteOnBrowser();
}
} else {
mailboxDashBoardController.setSelectedMailbox(mailboxSelected);
_updateSelectedMailboxRouteOnBrowser();
}
}
NavigationRouter? get navigationRouter => mailboxDashBoardController.navigationRouter;
bool get isHasDataFromRoute => BuildUtils.isWeb && navigationRouter != null;
MailboxId? get mailboxIdFromNavigationRouter => navigationRouter?.mailboxId;
EmailId? get emailIdFromNavigationRouter => navigationRouter?.emailId;
void _clearNavigationRouter() {
mailboxDashBoardController.navigationRouter = null;
}
void _selectMailboxFromRouter() {
final matchedMailboxNode = findMailboxNodeById(mailboxIdFromNavigationRouter!);
if (matchedMailboxNode != null) {
mailboxDashBoardController.setSelectedMailbox(matchedMailboxNode.item);
if (emailIdFromNavigationRouter != null) {
mailboxDashBoardController.dispatchAction(
SelectEmailByIdAction(
emailIdFromNavigationRouter!,
mailboxIdFromNavigationRouter,
navigationRouter!.dashboardType
)
);
} else {
_updateSelectedMailboxRouteOnBrowser();
}
_clearNavigationRouter();
} else {
_clearNavigationRouter();
}
}
void _handleOpenMailbox(
@@ -386,6 +452,7 @@ class MailboxController extends BaseMailboxController {
_disableAllSearchEmail();
mailboxDashBoardController.setSelectedMailbox(presentationMailboxSelected);
_updateSelectedMailboxRouteOnBrowser();
if (mailboxDashBoardController.isDrawerOpen) {
mailboxDashBoardController.closeMailboxMenuDrawer();
@@ -748,7 +815,11 @@ class MailboxController extends BaseMailboxController {
void _switchBackToMailboxDefault() {
final inboxMailbox = findMailboxNodeByRole(PresentationMailbox.roleInbox);
mailboxDashBoardController.setSelectedMailbox(inboxMailbox?.item);
mailboxListScrollController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
_updateSelectedMailboxRouteOnBrowser();
mailboxListScrollController.animateTo(
0,
duration: const Duration(milliseconds: 500),
curve: Curves.fastOutSlowIn);
}
void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) {
@@ -996,30 +1067,11 @@ class MailboxController extends BaseMailboxController {
}
}
void _selectMailboxById() {
if (mailboxDashBoardController.navigationRouter != null) {
final mailboxId = mailboxDashBoardController.navigationRouter?.mailboxId;
if (mailboxId != null) {
final matchedMailboxNode = findMailboxNodeById(mailboxId);
if (matchedMailboxNode != null && currentContext != null) {
mailboxDashBoardController.setSelectedMailbox(matchedMailboxNode.item);
}
}
final emailId = mailboxDashBoardController.navigationRouter?.emailId;
if (emailId != null) {
mailboxDashBoardController.dispatchAction(SelectEmailByIdAction(emailId));
}
mailboxDashBoardController.navigationRouter = null;
}
}
void _handleNavigationRouteParameters(Map<String, String?>? parameters) {
log('MailboxDashBoardController::_handleNavigationRouteParameters(): parameters: $parameters');
log('MailboxController::_handleNavigationRouteParameters(): parameters: $parameters');
if (parameters != null) {
final navigationRouter = RouteUtils.parsingRouteParametersToNavigationRouter(parameters);
log('ThreadController::_handleNavigationRouteParameters():navigationRouter: $navigationRouter');
log('MailboxController::_handleNavigationRouteParameters():navigationRouter: $navigationRouter');
mailboxDashBoardController.navigationRouter = navigationRouter;
}
}
@@ -1053,6 +1105,20 @@ class MailboxController extends BaseMailboxController {
}
}
void _updateSelectedMailboxRouteOnBrowser() {
if (BuildUtils.isWeb) {
final selectedMailboxId = selectedMailbox?.id;
final route = RouteUtils.generateRouteBrowser(
AppRoutes.dashboard,
NavigationRouter(
mailboxId: selectedMailboxId,
dashboardType: DashboardType.normal
)
);
RouteUtils.updateRouteOnBrowser('Mailbox-${selectedMailboxId?.id.value}', route);
}
}
void closeMailboxScreen(BuildContext context) {
_cancelSelectMailbox();
mailboxDashBoardController.closeMailboxMenuDrawer();