TF-934 Implement search by query when open new tab

This commit is contained in:
dab246
2022-11-11 00:11:48 +07:00
committed by Dat H. Pham
parent 6050ee5386
commit 71abe0cf37
22 changed files with 224 additions and 120 deletions
@@ -4,6 +4,7 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/build_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
@@ -46,6 +47,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
}
void previewEmail(BuildContext context, PresentationEmail presentationEmail) {
log('EmailActionController::previewEmail():presentationEmailId: ${presentationEmail.id}');
mailboxDashBoardController.setSelectedEmail(presentationEmail);
mailboxDashBoardController.dispatchRoute(DashboardRoutes.emailDetailed);
if (BuildUtils.isWeb && presentationEmail.routeWeb != null) {
@@ -55,14 +57,13 @@ mixin EmailActionController on ViewAsDialogActionMixin {
}
}
void moveToTrash(PresentationEmail email) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
void moveToTrash(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
final accountId = mailboxDashBoardController.accountId.value;
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash];
if (currentMailbox != null && accountId != null && trashMailboxId != null) {
if (mailboxContain != null && accountId != null && trashMailboxId != null) {
_moveToTrashAction(accountId, MoveToMailboxRequest(
{currentMailbox.id: [email.id]},
{mailboxContain.id: [email.id]},
trashMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
@@ -75,14 +76,13 @@ mixin EmailActionController on ViewAsDialogActionMixin {
mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
}
void moveToSpam(PresentationEmail email) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
void moveToSpam(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
final accountId = mailboxDashBoardController.accountId.value;
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
if (currentMailbox != null && accountId != null && spamMailboxId != null) {
if (mailboxContain != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(accountId, MoveToMailboxRequest(
{currentMailbox.id: [email.id]},
{mailboxContain.id: [email.id]},
spamMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
@@ -111,11 +111,14 @@ mixin EmailActionController on ViewAsDialogActionMixin {
mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
}
void moveToMailbox(BuildContext context, PresentationEmail email) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
void moveToMailbox(
BuildContext context,
PresentationEmail email,
{PresentationMailbox? mailboxContain}
) async {
final accountId = mailboxDashBoardController.accountId.value;
if (currentMailbox != null && accountId != null) {
if (mailboxContain != null && accountId != null) {
final arguments = DestinationPickerArguments(accountId, MailboxActions.moveEmail);
if (BuildUtils.isWeb) {
@@ -129,7 +132,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
accountId,
mailboxDashBoardController.sessionCurrent!,
email,
currentMailbox,
mailboxContain,
destinationMailbox);
}
});
@@ -146,7 +149,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
accountId,
mailboxDashBoardController.sessionCurrent!,
email,
currentMailbox,
mailboxContain,
destinationMailbox);
}
}
@@ -90,9 +90,9 @@ class ThreadController extends BaseController with EmailActionController {
bool canLoadMore = true;
bool canSearchMore = true;
bool _isLoadingMore = false;
get isLoadingMore => _isLoadingMore;
MailboxId? _currentMailboxId;
jmap.State? _currentEmailState;
NavigationRouter? _navigationRouter;
final ScrollController listEmailController = ScrollController();
final FocusNode focusNodeKeyBoard = FocusNode();
final latestEmailSelectedOrUnselected = Rxn<PresentationEmail>();
@@ -102,6 +102,8 @@ class ThreadController extends BaseController with EmailActionController {
..add(EmailComparator(EmailComparatorProperty.receivedAt)
..setIsAscending(false));
bool get isLoadingMore => _isLoadingMore;
AccountId? get _accountId => mailboxDashBoardController.accountId.value;
PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value;
@@ -157,6 +159,7 @@ class ThreadController extends BaseController with EmailActionController {
_isLoadingMore = false;
} else if (failure is GetEmailByIdFailure) {
openingEmail.value = false;
_navigationRouter = null;
}
},
(success) {
@@ -176,7 +179,7 @@ class ThreadController extends BaseController with EmailActionController {
openingEmail.value = true;
} else if (success is GetEmailByIdSuccess) {
openingEmail.value = false;
_openEmailDetailView(success.email, success.mailboxId, success.dashboardType);
_openEmailDetailView(success.email);
}
}
);
@@ -246,13 +249,22 @@ class ThreadController extends BaseController with EmailActionController {
mailboxDashBoardController.clearDashBoardAction();
} else if (action is StartSearchEmailAction) {
cancelSelectEmail();
_updateSearchRouteOnBrowser();
_searchEmail();
mailboxDashBoardController.clearDashBoardAction();
} else if (action is EmptyTrashAction) {
deleteSelectionEmailsPermanently(action.context, DeleteActionType.all);
mailboxDashBoardController.clearDashBoardAction();
} else if (action is SelectEmailByIdAction) {
_getEmailByIdAction(action.emailId, action.mailboxId, action.dashboardType);
_navigationRouter = action.navigationRouter;
if (_navigationRouter!.searchQuery != null) {
_activateSearchFromRouter();
}
_getEmailByIdAction(_navigationRouter!.emailId!);
mailboxDashBoardController.clearDashBoardAction();
} else if (action is SearchEmailByQueryAction) {
_navigationRouter = action.navigationRouter;
_activateSearchFromRouter();
mailboxDashBoardController.clearDashBoardAction();
}
});
@@ -312,6 +324,18 @@ class ThreadController extends BaseController with EmailActionController {
viewStateWorker.dispose();
}
void _activateSearchFromRouter() {
searchController.autoFocus.value = false;
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(dynamic error) async {
logError('ThreadController::_handleErrorGetAllOrRefreshChangesEmail():Error: $error');
if (error is CannotCalculateChangesMethodResponseException) {
@@ -334,7 +358,6 @@ class ThreadController extends BaseController with EmailActionController {
canLoadMore = true;
_isLoadingMore = false;
cancelSelectEmail();
mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread);
}
void _getAllEmailSuccess(GetAllEmailSuccess success) {
@@ -613,6 +636,18 @@ class ThreadController extends BaseController with EmailActionController {
}
}
void _updateSearchRouteOnBrowser() {
if (BuildUtils.isWeb) {
final route = RouteUtils.generateRouteBrowser(
AppRoutes.dashboard,
NavigationRouter(
searchQuery: searchQuery,
dashboardType: DashboardType.search)
);
RouteUtils.updateRouteOnBrowser('SearchEmail', route);
}
}
void _searchEmailsSuccess(SearchEmailSuccess success) {
final resultEmailSearchList = success.emailList
.map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))
@@ -622,6 +657,7 @@ class ThreadController extends BaseController with EmailActionController {
final emailsSearchAfterChanges = resultEmailSearchList;
final newListEmailSearch = emailsSearchAfterChanges.combine(emailsSearchBeforeChanges);
emailList.value = newListEmailSearch;
searchController.autoFocus.value = true;
}
void searchMoreEmails() {
@@ -750,17 +786,17 @@ class ThreadController extends BaseController with EmailActionController {
markAsStarEmail(selectedEmail, MarkStarAction.unMarkStar);
break;
case EmailActionType.moveToMailbox:
moveToMailbox(context, selectedEmail);
moveToMailbox(context, selectedEmail, mailboxContain: mailboxContain);
break;
case EmailActionType.moveToTrash:
moveToTrash(selectedEmail);
moveToTrash(selectedEmail, mailboxContain: mailboxContain);
break;
case EmailActionType.deletePermanently:
deleteEmailPermanently(context, selectedEmail);
break;
case EmailActionType.moveToSpam:
popBack();
moveToSpam(selectedEmail);
moveToSpam(selectedEmail, mailboxContain: mailboxContain);
break;
case EmailActionType.unSpam:
popBack();
@@ -815,6 +851,9 @@ class ThreadController extends BaseController with EmailActionController {
NavigationRouter(
emailId: currentEmail.id,
mailboxId: currentMailbox?.id,
searchQuery: searchController.isSearchEmailRunning
? searchQuery
: null,
dashboardType: searchController.isSearchEmailRunning
? DashboardType.search
: DashboardType.normal
@@ -827,30 +866,29 @@ class ThreadController extends BaseController with EmailActionController {
}
}
void _getEmailByIdAction(EmailId emailId, MailboxId? mailboxId, DashboardType dashboardType) {
PresentationMailbox? getMailboxContain(PresentationEmail currentEmail) {
return currentEmail.findMailboxContain(mailboxDashBoardController.mapMailboxById);
}
void _getEmailByIdAction(EmailId emailId) {
if (_accountId != null) {
consumeState(_getEmailByIdInteractor.execute(
_accountId!,
emailId,
mailboxId: mailboxId,
dashboardType: dashboardType,
properties: ThreadConstants.propertiesDefault));
}
}
void _openEmailDetailView(
PresentationEmail email,
MailboxId? mailboxId,
DashboardType dashboardType
) {
void _openEmailDetailView(PresentationEmail email) {
if (currentContext != null) {
final mailboxContain = email.findMailboxContain(mailboxDashBoardController.mapMailboxById);
final route = RouteUtils.generateRouteBrowser(
AppRoutes.dashboard,
NavigationRouter(
emailId: email.id,
mailboxId: mailboxId,
dashboardType: dashboardType
mailboxId: _navigationRouter?.mailboxId,
searchQuery: _navigationRouter?.searchQuery,
dashboardType: _navigationRouter?.dashboardType ?? DashboardType.normal
)
);
pressEmailAction(
@@ -860,5 +898,6 @@ class ThreadController extends BaseController with EmailActionController {
mailboxContain: mailboxContain
);
}
_navigationRouter = null;
}
}
@@ -335,7 +335,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
itemExtent: _getItemExtent(context),
itemCount: listPresentationEmail.length,
itemBuilder: (context, index) {
final mailboxContain = _getMailboxContain(listPresentationEmail[index]);
final mailboxContain = controller.getMailboxContain(listPresentationEmail[index]);
final newPresentationEmail = controller.generateEmailByPlatform(listPresentationEmail[index]);
return Obx(() => Draggable<List<PresentationEmail>>(
maxSimultaneousDrags: kIsWeb ? null : 0,
@@ -375,12 +375,6 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
);
}
PresentationMailbox? _getMailboxContain(PresentationEmail currentEmail) {
return controller.searchController.isSearchEmailRunning
? currentEmail.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById)
: controller.currentMailbox;
}
Widget _buildFeedBackWidget(BuildContext context) {
return SizedBox(
height: 60,
@@ -508,7 +502,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
}
Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) {
final mailboxContain = _getMailboxContain(email);
final mailboxContain = controller.getMailboxContain(email);
return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_spam_or_un_spam_action'),
SvgPicture.asset(
@@ -421,7 +421,7 @@ class EmailTileBuilder with BaseEmailItemTile {
: EmailActionType.markAsRead,
_presentationEmail)),
const SizedBox(width: 5),
if (mailboxContain?.isDrafts == false)
if (mailboxContain != null && mailboxContain?.isDrafts == false)
... [
buildIconWeb(
minSize: 18,