TF-1063 Disable search email when open mailbox

This commit is contained in:
dab246
2022-11-03 01:24:27 +07:00
committed by Dat H. Pham
parent 95721008c1
commit 46fa9b3006
14 changed files with 275 additions and 196 deletions
@@ -14,7 +14,6 @@ import 'package:model/extensions/presentation_email_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/mailbox/select_mode.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
typedef OnPressEmailActionClick = void Function(EmailActionType, PresentationEmail);
typedef OnMoreActionClick = void Function(PresentationEmail, RelativeRect?);
@@ -25,11 +24,10 @@ mixin BaseEmailItemTile {
final imagePaths = Get.find<ImagePaths>();
Widget buildMailboxContain(
SearchStatus state,
bool advancedSearchActivated,
PresentationEmail email
bool isSearchEmailRunning,
PresentationEmail email
) {
if (hasMailboxLabel(state, advancedSearchActivated, email)) {
if (hasMailboxLabel(isSearchEmailRunning, email)) {
return Container(
margin: const EdgeInsets.only(left: 8),
padding: const EdgeInsets.symmetric(
@@ -55,8 +53,9 @@ mixin BaseEmailItemTile {
}
}
bool isSearchEnabled(SearchStatus state, bool advancedSearchActivated, SearchQuery? query) =>
(state == SearchStatus.ACTIVE || advancedSearchActivated) && query?.value.isNotEmpty == true;
bool isSearchEnabled(bool isSearchEmailRunning, SearchQuery? query) {
return isSearchEmailRunning && query?.value.isNotEmpty == true;
}
FontWeight buildFontForReadEmail(PresentationEmail email) =>
!email.hasRead ? FontWeight.w600 : FontWeight.normal;
@@ -64,8 +63,8 @@ mixin BaseEmailItemTile {
Color buildTextColorForReadEmail(PresentationEmail email) =>
email.hasRead ? AppColor.colorContentEmail : AppColor.colorNameEmail;
bool hasMailboxLabel(SearchStatus state, bool advancedSearchActivated, PresentationEmail email) {
return (state == SearchStatus.ACTIVE || advancedSearchActivated) && email.mailboxName.isNotEmpty;
bool hasMailboxLabel(bool isSearchEmailRunning, PresentationEmail email) {
return isSearchEmailRunning && email.mailboxName.isNotEmpty;
}
String informationSender(PresentationEmail email, PresentationMailbox? mailbox) {
@@ -79,11 +78,10 @@ mixin BaseEmailItemTile {
Widget buildInformationSender(
PresentationEmail email,
PresentationMailbox? mailbox,
SearchStatus state,
bool advancedSearchActivated,
bool isSearchEmailRunning,
SearchQuery? query
) {
if (isSearchEnabled(state, advancedSearchActivated, query)) {
if (isSearchEnabled(isSearchEmailRunning, query)) {
return RichTextBuilder(
informationSender(email, mailbox),
query?.value ?? '',
@@ -113,12 +111,11 @@ mixin BaseEmailItemTile {
}
Widget buildEmailTitle(
PresentationEmail email,
SearchStatus state,
bool advancedSearchActivated,
SearchQuery? query
PresentationEmail email,
bool isSearchEmailRunning,
SearchQuery? query
) {
if (isSearchEnabled(state, advancedSearchActivated, query)) {
if (isSearchEnabled(isSearchEmailRunning, query)) {
return RichTextBuilder(
email.getEmailTitle(),
query?.value ?? '',
@@ -147,12 +144,11 @@ mixin BaseEmailItemTile {
}
Widget buildEmailPartialContent(
PresentationEmail email,
SearchStatus state,
bool advancedSearchActivated,
SearchQuery? query
PresentationEmail email,
bool isSearchEmailRunning,
SearchQuery? query
) {
if (isSearchEnabled(state, advancedSearchActivated, query)) {
if (isSearchEnabled(isSearchEmailRunning, query)) {
return RichTextBuilder(
email.getPartialContent(),
query?.value ?? '',
@@ -243,7 +243,6 @@ class ThreadController extends BaseController {
if (_currentMailboxId != mailbox.id) {
_currentMailboxId = mailbox.id;
_resetToOriginalValue();
disableSearch();
_getAllEmail();
}
} else if (mailbox == null) { // disable current mailbox when search active
@@ -292,9 +291,6 @@ class ThreadController extends BaseController {
action.presentationEmail,
mailboxContain: mailboxContain);
mailboxDashBoardController.clearDashBoardAction();
} else if (action is DisableSearchEmailAction) {
closeSearchEmailAction();
mailboxDashBoardController.clearDashBoardAction();
} else if (action is StartSearchEmailAction) {
_searchEmail();
mailboxDashBoardController.clearDashBoardAction();
@@ -639,7 +635,7 @@ class ThreadController extends BaseController {
message: newFilterOption.getMessageToast(context),
icon: newFilterOption.getIconToast(_imagePaths));
if (isSearchActive() || searchController.isAdvancedSearchHasApply.isTrue) {
if (isSearchActive() || searchController.advancedSearchIsActivated.isTrue) {
_searchEmail(filterMessageOption: _getFilterCondition());
} else {
refreshAllEmail();
@@ -926,34 +922,16 @@ class ThreadController extends BaseController {
bool isSearchActive() => searchController.isSearchActive();
bool isAdvanceSearchActive() => searchController.isAdvanceSearchActive();
bool get isAllSearchInActive => !searchController.isSearchActive() &&
searchController.isAdvancedSearchViewOpen.isFalse;
void enableSearch(BuildContext context) {
searchController.enableSearch();
}
void disableSearch() {
searchController.searchIsActive.value = false;
searchController.disableSearch();
}
void closeSearchEmailAction() {
disableSearch();
cancelSelectEmail();
refreshAllEmail();
}
void clearTextSearch() {
searchController.clearTextSearch();
}
void _searchEmail({UnsignedInt? limit, EmailFilterCondition? filterMessageOption}) {
if (_accountId != null && searchQuery != null) {
searchController.searchIsActive.value = true;
searchController.activateSimpleSearch();
filterMessageOption = EmailFilterCondition(
notKeyword: filterMessageOption?.notKeyword,
@@ -84,22 +84,15 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
}
Widget _buildSearchBarView(BuildContext context) {
return Obx(() {
if (!controller.searchController.isSearchActive()) {
return Container(
color: Colors.white,
padding: EdgeInsets.symmetric(
horizontal: 16,
vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0),
margin: const EdgeInsets.only(
bottom: !BuildUtils.isWeb ? 16 : 0),
child: SearchBarView(_imagePaths,
hintTextSearch: AppLocalizations.of(context).search_emails,
onOpenSearchViewAction: () => controller.goToSearchView()));
} else {
return const SizedBox.shrink();
}
});
return Container(
color: Colors.white,
padding: EdgeInsets.symmetric(
horizontal: 16,
vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0),
margin: const EdgeInsets.only(bottom: !BuildUtils.isWeb ? 16 : 0),
child: SearchBarView(_imagePaths,
hintTextSearch: AppLocalizations.of(context).search_emails,
onOpenSearchViewAction: controller.goToSearchView));
}
Widget _buildVacationNotificationMessage(BuildContext context) {
@@ -251,7 +244,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
return Obx(() => controller.viewState.value.fold(
(failure) => const SizedBox.shrink(),
(success) {
if (controller.isSearchActive() || controller.isAdvanceSearchActive()) {
if (controller.isSearchActive() || controller.searchController.advancedSearchIsActivated.isTrue) {
return success is SearchingState
? Padding(padding: const EdgeInsets.symmetric(vertical: 16), child: loadingWidget)
: const SizedBox.shrink();
@@ -318,7 +311,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
&& !controller.isLoadingMore
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent
) {
if (controller.isSearchActive() || controller.isAdvanceSearchActive()) {
if (controller.isSearchActive() || controller.searchController.advancedSearchIsActivated.isTrue) {
controller.searchMoreEmails();
} else {
controller.loadMoreEmails();
@@ -341,13 +334,12 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
context,
listPresentationEmail[index],
controller.mailboxDashBoardController.currentSelectMode.value,
controller.searchController.searchState.value.searchStatus,
controller.searchQuery,
controller.mailboxDashBoardController.selectedEmail.value?.id == listPresentationEmail[index].id,
mailboxCurrent: controller.searchController.isSearchEmailRunning
? listPresentationEmail[index].findMailboxContain(controller.mailboxDashBoardController.mapMailboxById)
: controller.currentMailbox,
advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue)
isSearchEmailRunning: controller.searchController.isSearchEmailRunning)
..addOnPressEmailActionClick((action, email) =>
controller.pressEmailAction(
context,
@@ -358,22 +350,22 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
: controller.currentMailbox))
..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context)
? controller.openContextMenuAction(context, _contextMenuActionTile(context, email))
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))))
.build(),
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))
).build(),
feedback: _buildFeedBackWidget(context),
childWhenDragging: (EmailTileBuilder(
context,
listPresentationEmail[index],
controller.mailboxDashBoardController.currentSelectMode.value,
controller.searchController.searchState.value.searchStatus,
controller.searchQuery,
controller.mailboxDashBoardController.selectedEmail.value?.id == listPresentationEmail[index].id,
mailboxCurrent: controller.searchController.isSearchEmailRunning
? listPresentationEmail[index].findMailboxContain(
controller.mailboxDashBoardController.mapMailboxById)
: controller.currentMailbox,
advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue, isDrag: true))
.build(),
isSearchEmailRunning: controller.searchController.isSearchEmailRunning,
isDrag: true)
).build(),
dragAnchorStrategy: pointerDragAnchorStrategy,
onDragStarted: () {
controller.calculateDragValue(listPresentationEmail[index]);
@@ -1,10 +1,12 @@
import 'package:core/core.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:model/model.dart';
import 'package:model/email/email_action_type.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/mailbox/select_mode.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/presentation/mixin/base_email_item_tile.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
class EmailTileBuilder with BaseEmailItemTile {
@@ -12,9 +14,8 @@ class EmailTileBuilder with BaseEmailItemTile {
final BuildContext _context;
final SelectMode _selectModeAll;
final PresentationMailbox? mailboxCurrent;
final SearchStatus _searchStatus;
final SearchQuery? _searchQuery;
final bool advancedSearchActivated;
final bool isSearchEmailRunning;
final EdgeInsets? padding;
final EdgeInsets? paddingDivider;
final bool isDrag;
@@ -26,11 +27,10 @@ class EmailTileBuilder with BaseEmailItemTile {
this._context,
this._presentationEmail,
this._selectModeAll,
this._searchStatus,
this._searchQuery,
this._isShowingEmailContent,
{
this.advancedSearchActivated = false,
this.isSearchEmailRunning = false,
this.mailboxCurrent,
this.padding,
this.paddingDivider,
@@ -82,11 +82,10 @@ class EmailTileBuilder with BaseEmailItemTile {
height: 9,
fit: BoxFit.fill)),
Expanded(child: buildInformationSender(
_presentationEmail,
mailboxCurrent,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
mailboxCurrent,
isSearchEmailRunning,
_searchQuery)),
if (_presentationEmail.hasAttachment == true)
Padding(
padding: const EdgeInsets.only(left: 8),
@@ -107,14 +106,12 @@ class EmailTileBuilder with BaseEmailItemTile {
mainAxisSize: MainAxisSize.min,
children: [
Expanded(child: buildEmailTitle(
_presentationEmail,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
isSearchEmailRunning,
_searchQuery)),
buildMailboxContain(
_searchStatus,
advancedSearchActivated,
_presentationEmail),
isSearchEmailRunning,
_presentationEmail),
if (_presentationEmail.hasStarred)
Padding(
padding: const EdgeInsets.only(left: 8),
@@ -126,10 +123,9 @@ class EmailTileBuilder with BaseEmailItemTile {
padding: const EdgeInsets.only(top: 6),
child: Row(children: [
Expanded(child: buildEmailPartialContent(
_presentationEmail,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
isSearchEmailRunning,
_searchQuery)),
])
),
],
@@ -1,11 +1,15 @@
import 'package:core/core.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:model/model.dart';
import 'package:model/email/email_action_type.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/mailbox/select_mode.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/presentation/mixin/base_email_item_tile.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class EmailTileBuilder with BaseEmailItemTile {
@@ -14,9 +18,8 @@ class EmailTileBuilder with BaseEmailItemTile {
final BuildContext _context;
final SelectMode _selectModeAll;
final PresentationMailbox? mailboxCurrent;
final SearchStatus _searchStatus;
final SearchQuery? _searchQuery;
final bool advancedSearchActivated;
final bool isSearchEmailRunning;
final EdgeInsets? padding;
final EdgeInsets? paddingDivider;
final bool isDrag;
@@ -32,11 +35,10 @@ class EmailTileBuilder with BaseEmailItemTile {
this._context,
this._presentationEmail,
this._selectModeAll,
this._searchStatus,
this._searchQuery,
this._isShowingEmailContent,
{
this.advancedSearchActivated = false,
this.isSearchEmailRunning = false,
this.mailboxCurrent,
this.padding,
this.paddingDivider,
@@ -137,11 +139,11 @@ class EmailTileBuilder with BaseEmailItemTile {
height: 9,
fit: BoxFit.fill)),
Expanded(child: buildInformationSender(
_presentationEmail,
mailboxCurrent,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
mailboxCurrent,
isSearchEmailRunning,
_searchQuery
)),
if (_presentationEmail.hasAttachment == true)
Padding(
padding: const EdgeInsets.only(left: 8),
@@ -160,14 +162,14 @@ class EmailTileBuilder with BaseEmailItemTile {
mainAxisSize: MainAxisSize.min,
children: [
Expanded(child: buildEmailTitle(
_presentationEmail,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
isSearchEmailRunning,
_searchQuery
)),
buildMailboxContain(
_searchStatus,
advancedSearchActivated,
_presentationEmail),
isSearchEmailRunning,
_presentationEmail
),
if (_presentationEmail.hasStarred)
Padding(
padding: const EdgeInsets.only(left: 8),
@@ -178,10 +180,10 @@ class EmailTileBuilder with BaseEmailItemTile {
const SizedBox(height: 8),
Row(children: [
Expanded(child: buildEmailPartialContent(
_presentationEmail,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
isSearchEmailRunning,
_searchQuery
)),
]),
]),
)
@@ -233,11 +235,11 @@ class EmailTileBuilder with BaseEmailItemTile {
height: 9,
fit: BoxFit.fill)),
Expanded(child: buildInformationSender(
_presentationEmail,
mailboxCurrent,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
mailboxCurrent,
isSearchEmailRunning,
_searchQuery
)),
if (isHoverItem)
const SizedBox(width: 120)
else
@@ -248,14 +250,14 @@ class EmailTileBuilder with BaseEmailItemTile {
mainAxisSize: MainAxisSize.min,
children: [
Expanded(child: buildEmailTitle(
_presentationEmail,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
isSearchEmailRunning,
_searchQuery
)),
buildMailboxContain(
_searchStatus,
advancedSearchActivated,
_presentationEmail),
isSearchEmailRunning,
_presentationEmail
),
if (_presentationEmail.hasStarred)
Padding(
padding: const EdgeInsets.only(left: 8),
@@ -266,10 +268,10 @@ class EmailTileBuilder with BaseEmailItemTile {
const SizedBox(height: 8),
Row(children: [
Expanded(child: buildEmailPartialContent(
_presentationEmail,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
isSearchEmailRunning,
_searchQuery
)),
]),
]),
if (_selectModeAll == SelectMode.INACTIVE)
@@ -354,11 +356,11 @@ class EmailTileBuilder with BaseEmailItemTile {
SizedBox(
width: 160,
child: buildInformationSender(
_presentationEmail,
mailboxCurrent,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
_presentationEmail,
mailboxCurrent,
isSearchEmailRunning,
_searchQuery
)),
const SizedBox(width: 24),
Expanded(child: _buildSubjectAndContent()),
const SizedBox(width: 16),
@@ -476,9 +478,9 @@ class EmailTileBuilder with BaseEmailItemTile {
Widget _buildDateTimeForDesktopScreen() {
return Row(children: [
buildMailboxContain(
_searchStatus,
advancedSearchActivated,
_presentationEmail),
isSearchEmailRunning,
_presentationEmail
),
if (_presentationEmail.hasAttachment == true)
Padding(
padding: const EdgeInsets.only(left: 8),
@@ -508,19 +510,19 @@ class EmailTileBuilder with BaseEmailItemTile {
return Row(children: [
if (_presentationEmail.getEmailTitle().isNotEmpty)
Container(
constraints: BoxConstraints(maxWidth: constraints.maxWidth / 2),
padding: const EdgeInsets.only(right: 12),
child: buildEmailTitle(
_presentationEmail,
_searchStatus,
advancedSearchActivated,
_searchQuery)),
Expanded(child: Container(
child: buildEmailPartialContent(
constraints: BoxConstraints(maxWidth: constraints.maxWidth / 2),
padding: const EdgeInsets.only(right: 12),
child: buildEmailTitle(
_presentationEmail,
_searchStatus,
advancedSearchActivated,
_searchQuery))
isSearchEmailRunning,
_searchQuery
)),
Expanded(child: Container(
child: buildEmailPartialContent(
_presentationEmail,
isSearchEmailRunning,
_searchQuery
))
),
]);
});