TF-1427 Apply new design for search mailbox on mobile/tablet

This commit is contained in:
dab246
2023-02-09 16:43:37 +07:00
committed by Dat Vu
parent 705dd5d28c
commit 2cc2e17bf2
16 changed files with 153 additions and 47 deletions
@@ -596,10 +596,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
bool isSearchActive() => searchState.value.searchStatus == SearchStatus.ACTIVE;
void enableSearch() {
_cancelSelectMailbox();
void openSearchViewAction(BuildContext context) {
SearchMailboxBindings().dependencies();
mailboxDashBoardController.searchMailboxActivated.value = true;
closeMailboxScreen(context);
}
void disableSearch() {
@@ -233,8 +233,8 @@ class MailboxView extends GetWidget<MailboxController> {
color: AppColor.colorTextButton,
fit: BoxFit.fill
),
tooltip: AppLocalizations.of(context).search_folder,
onTap: controller.enableSearch
tooltip: AppLocalizations.of(context).search_folder,
onTap: () => controller.openSearchViewAction(context)
),
buildIconWeb(
minSize: 40,
@@ -160,7 +160,7 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
color: AppColor.colorTextButton,
fit: BoxFit.fill
),
onTap: controller.enableSearch
onTap: () => controller.openSearchViewAction(context)
),
buildIconWeb(
minSize: 40,
@@ -463,14 +463,21 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
return (MailboxBottomSheetActionTileBuilder(
Key('${contextMenuItem.action.name}_action'),
SvgPicture.asset(
contextMenuItem.action.getContextMenuIcon(_imagePaths),
color: contextMenuItem.action.getColorContextMenuIcon()),
contextMenuItem.action.getContextMenuIcon(_imagePaths),
color: contextMenuItem.action.getColorContextMenuIcon(),
width: 24,
height: 24
),
contextMenuItem.action.getTitleContextMenu(context),
mailbox,
absorbing: !contextMenuItem.isActivated,
opacity: !contextMenuItem.isActivated)
..onActionClick((mailbox) =>
controller.handleMailboxAction(context, contextMenuItem.action, mailbox)))
..actionTextStyle(textStyle: const TextStyle(
fontSize: 16,
color: Colors.black,
fontWeight: FontWeight.w500
))
..onActionClick((mailbox) => controller.handleMailboxAction(context, contextMenuItem.action, mailbox)))
.build();
}
@@ -495,15 +502,17 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, Popu
absorbing: !contextMenuItem.isActivated,
child: Opacity(
opacity: contextMenuItem.isActivated ? 1.0 : 0.3,
child: popupItem(contextMenuItem.action.getContextMenuIcon(_imagePaths),
contextMenuItem.action.getTitleContextMenu(context),
colorIcon: contextMenuItem.action.getColorContextMenuIcon(),
styleName: TextStyle(
fontWeight: FontWeight.normal,
fontSize: 17,
color: contextMenuItem.action.getColorContextMenuTitle()),
onCallbackAction: () =>
controller.handleMailboxAction(context, contextMenuItem.action, mailbox)),
child: popupItem(
contextMenuItem.action.getContextMenuIcon(_imagePaths),
contextMenuItem.action.getTitleContextMenu(context),
colorIcon: contextMenuItem.action.getColorContextMenuIcon(),
styleName: TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: contextMenuItem.action.getColorContextMenuTitle()
),
onCallbackAction: () => controller.handleMailboxAction(context, contextMenuItem.action, mailbox)
),
),
));
}
@@ -69,15 +69,15 @@ extension MailboxActionsExtension on MailboxActions {
case MailboxActions.enableSpamReport:
return imagePaths.icSpamReportEnable;
case MailboxActions.markAsRead:
return imagePaths.icRead;
return imagePaths.icMarkAsRead;
case MailboxActions.move:
return imagePaths.icMove;
return imagePaths.icMoveMailbox;
case MailboxActions.rename:
return imagePaths.icRenameMailbox;
case MailboxActions.delete:
return imagePaths.icDelete;
return imagePaths.icDeleteMailbox;
case MailboxActions.disableMailbox:
return imagePaths.icEyeOff;
return imagePaths.icHideMailbox;
default:
return '';
}
@@ -96,12 +96,8 @@ extension MailboxActionsExtension on MailboxActions {
switch(this) {
case MailboxActions.delete:
return AppColor.colorActionDeleteConfirmDialog;
case MailboxActions.disableSpamReport:
case MailboxActions.enableSpamReport:
case MailboxActions.disableMailbox:
return AppColor.primaryColor;
default:
return Colors.black;
return AppColor.primaryColor;
}
}
@@ -8,6 +8,7 @@ typedef OnClickOpenMailboxAction = void Function(PresentationMailbox);
typedef OnClickOpenMenuMailboxAction = void Function(RelativeRect, PresentationMailbox);
typedef OnSelectMailboxAction = void Function(PresentationMailbox);
typedef OnDragEmailToMailboxAccepted = void Function(List<PresentationEmail>, PresentationMailbox);
typedef OnLongPressMailboxAction = void Function(PresentationMailbox);
typedef OnClickExpandMailboxNodeAction = void Function(MailboxNode);
typedef OnClickOpenMailboxNodeAction = void Function(MailboxNode);
@@ -30,7 +30,7 @@ class MailBoxFolderTileBuilder {
OnSelectMailboxNodeAction? _onSelectMailboxFolderClick;
OnClickOpenMenuMailboxNodeAction? _onMenuActionClick;
OnDragEmailToMailboxAccepted? _onDragItemAccepted;
OnLongPressMailboxNodeAction? _onLongPressSpamReport;
OnLongPressMailboxNodeAction? _onLongPressMailboxNodeAction;
bool isHoverItem = false;
@@ -68,8 +68,8 @@ class MailBoxFolderTileBuilder {
_onDragItemAccepted = onDragItemAccepted;
}
void addOnLongPressMailboxNodeAction(OnLongPressMailboxNodeAction onLongPressSpamReport) {
_onLongPressSpamReport = onLongPressSpamReport;
void addOnLongPressMailboxNodeAction(OnLongPressMailboxNodeAction onLongPressMailboxNodeAction) {
_onLongPressMailboxNodeAction = onLongPressMailboxNodeAction;
}
Widget build() => DragTarget<List<PresentationEmail>>(
@@ -1,4 +1,5 @@
import 'package:core/core.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/state/failure.dart';
@@ -150,8 +151,9 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
final newMailboxState = mailboxState ?? currentMailboxState;
dashboardController.dispatchMailboxUIAction(RefreshChangeMailboxAction(newMailboxState));
final accountId = dashboardController.accountId.value;
if (accountId != null && newMailboxState != null) {
consumeState(_refreshAllMailboxInteractor.execute(accountId, newMailboxState));
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null && newMailboxState != null) {
consumeState(_refreshAllMailboxInteractor.execute(session, accountId, newMailboxState));
}
}
@@ -362,6 +364,14 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
}
}
void openMailboxAction(BuildContext context, PresentationMailbox mailbox) {
dashboardController.openMailboxAction(context, mailbox);
if (!responsiveUtils.isWebDesktop(context)) {
closeSearchView(context);
}
}
void clearAllTextInputSearchForm() {
textInputSearchController.clear();
currentSearchQuery.value = '';
@@ -1,4 +1,5 @@
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/text/text_field_builder.dart';
@@ -43,7 +44,7 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
if (!controller.responsiveUtils.isWebDesktop(context))
const Divider(color: AppColor.colorDividerComposer, height: 1),
_buildLoadingView(),
Expanded(child: _buildMailboxListView())
Expanded(child: _buildMailboxListView(context))
]),
),
),
@@ -68,9 +69,9 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
Widget _buildSearchInputForm(BuildContext context) {
return Row(children: [
buildIconWeb(
minSize: 30,
minSize: SearchMailboxUtils.getIconSize(context, controller.responsiveUtils),
iconPadding: EdgeInsets.zero,
splashRadius: 10,
splashRadius: SearchMailboxUtils.getIconSplashRadius(context, controller.responsiveUtils),
icon: SvgPicture.asset(
controller.imagePaths.icBack,
color: AppColor.colorTextButton,
@@ -89,7 +90,7 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
alignment: Alignment.center,
child: Row(children: [
Padding(
padding: const EdgeInsets.only(left: 5, right: 2),
padding: SearchMailboxUtils.getPaddingInputSearchIcon(context, controller.responsiveUtils),
child: buildIconWeb(
minSize: 40,
iconPadding: EdgeInsets.zero,
@@ -157,10 +158,10 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
)).build();
}
Widget _buildMailboxListView() {
Widget _buildMailboxListView(BuildContext context) {
return Obx(() {
return ListView.builder(
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
padding: SearchMailboxUtils.getPaddingListViewMailboxSearched(context, controller.responsiveUtils),
key: const Key('list_mailbox_searched'),
itemCount: controller.listMailboxSearched.length,
shrinkWrap: true,
@@ -171,8 +172,9 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
controller.responsiveUtils,
controller.listMailboxSearched[index],
onDragEmailToMailboxAccepted: controller.dashboardController.dragSelectedMultipleEmailToMailboxAction,
onClickOpenMailboxAction: (mailbox) => controller.dashboardController.openMailboxAction(context, mailbox),
onClickOpenMenuMailboxAction: (position, mailbox) => _openMailboxMenuAction(context, position, mailbox),
onClickOpenMailboxAction: (mailbox) => controller.openMailboxAction(context, mailbox),
onClickOpenMenuMailboxAction: (position, mailbox) => _openMailboxMenuAction(context, mailbox, position: position),
onLongPressMailboxAction: (mailbox) => _openMailboxMenuAction(context, mailbox),
);
}
);
@@ -185,7 +187,11 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
: MailboxActions.enableSpamReport;
}
void _openMailboxMenuAction(BuildContext context, RelativeRect position, PresentationMailbox mailbox) {
void _openMailboxMenuAction(
BuildContext context,
PresentationMailbox mailbox,
{RelativeRect? position}
) {
final mailboxActionsSupported = [
MailboxActions.openInNewTab,
if (mailbox.isPersonal && mailbox.isSpam)
@@ -241,6 +247,8 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
Key('${contextMenuItem.action.name}_action'),
SvgPicture.asset(
contextMenuItem.action.getContextMenuIcon(controller.imagePaths),
width: 24,
height: 24,
color: contextMenuItem.action.getColorContextMenuIcon()
),
contextMenuItem.action.getTitleContextMenu(context),
@@ -279,6 +287,7 @@ class SearchMailboxView extends GetWidget<SearchMailboxController>
child: popupItem(contextMenuItem.action.getContextMenuIcon(controller.imagePaths),
contextMenuItem.action.getTitleContextMenu(context),
colorIcon: contextMenuItem.action.getColorContextMenuIcon(),
iconSize: 24,
styleName: TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
@@ -7,9 +7,49 @@ class SearchMailboxUtils {
return const EdgeInsets.symmetric(vertical: 8, horizontal: 16);
} else {
if (responsiveUtils.isScreenWithShortestSide(context)) {
return const EdgeInsets.symmetric(horizontal: 10);
return const EdgeInsets.symmetric(horizontal: 16, vertical: 8);
} else {
return const EdgeInsets.symmetric(horizontal: 32);
return const EdgeInsets.symmetric(horizontal: 32, vertical: 8);
}
}
}
static EdgeInsets getPaddingInputSearchIcon(BuildContext context, ResponsiveUtils responsiveUtils) {
if (responsiveUtils.isWebDesktop(context)) {
return const EdgeInsets.only(left: 5, right: 2);
} else {
if (responsiveUtils.isScreenWithShortestSide(context)) {
return const EdgeInsets.only(left: 10, right: 16);
} else {
return const EdgeInsets.only(left: 10, right: 16);
}
}
}
static double getIconSize(BuildContext context, ResponsiveUtils responsiveUtils) {
if (responsiveUtils.isWebDesktop(context)) {
return 30;
} else {
return 40;
}
}
static double getIconSplashRadius(BuildContext context, ResponsiveUtils responsiveUtils) {
if (responsiveUtils.isWebDesktop(context)) {
return 10;
} else {
return 15;
}
}
static EdgeInsets getPaddingListViewMailboxSearched(BuildContext context, ResponsiveUtils responsiveUtils) {
if (responsiveUtils.isWebDesktop(context)) {
return const EdgeInsets.only(left: 16, right: 16, bottom: 16);
} else {
if (responsiveUtils.isScreenWithShortestSide(context)) {
return const EdgeInsets.all(16);
} else {
return const EdgeInsets.symmetric(horizontal: 32, vertical: 16);
}
}
}
@@ -18,6 +18,7 @@ class MailboxSearchedItemBuilder extends StatefulWidget {
final OnClickOpenMailboxAction? onClickOpenMailboxAction;
final OnClickOpenMenuMailboxAction? onClickOpenMenuMailboxAction;
final OnDragEmailToMailboxAccepted? onDragEmailToMailboxAccepted;
final OnLongPressMailboxAction? onLongPressMailboxAction;
const MailboxSearchedItemBuilder(
this._imagePaths,
@@ -27,7 +28,8 @@ class MailboxSearchedItemBuilder extends StatefulWidget {
Key? key,
this.onClickOpenMailboxAction,
this.onClickOpenMenuMailboxAction,
this.onDragEmailToMailboxAccepted
this.onDragEmailToMailboxAccepted,
this.onLongPressMailboxAction
}
) : super(key: key);
@@ -89,6 +91,7 @@ class _MailboxSearchedItemBuilderState extends State<MailboxSearchedItemBuilder>
return ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 8),
onTap: _onTapMailboxAction,
onLongPress: _onLongPressMailboxAction,
leading: _buildMailboxIcon(),
title: _buildTitleItem(),
subtitle: _buildSubtitleItem()
@@ -102,6 +105,10 @@ class _MailboxSearchedItemBuilderState extends State<MailboxSearchedItemBuilder>
}
}
void _onLongPressMailboxAction() {
widget.onLongPressMailboxAction?.call(widget._presentationMailbox);
}
Widget _buildMailboxIcon() {
return SvgPicture.asset(
widget._presentationMailbox.isSubscribed?.value == true