TF-3758 Remove selection mailbox in left menu on mobile

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-05-29 20:51:00 +07:00
committed by Dat H. Pham
parent 6b09fb9faf
commit bdaee54050
5 changed files with 47 additions and 196 deletions
@@ -120,7 +120,6 @@ class MailboxController extends BaseMailboxController
IOSSharingManager? _iosSharingManager; IOSSharingManager? _iosSharingManager;
final currentSelectMode = SelectMode.INACTIVE.obs;
final _activeScrollTop = RxBool(false); final _activeScrollTop = RxBool(false);
final _activeScrollBottom = RxBool(true); final _activeScrollBottom = RxBool(true);
@@ -929,16 +928,6 @@ class MailboxController extends BaseMailboxController
closeMailboxScreen(context); closeMailboxScreen(context);
} }
void enableSelectionMailbox() {
currentSelectMode.value = SelectMode.ACTIVE;
}
void disableSelectionMailbox() {
_cancelSelectMailbox();
}
bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE;
List<MailboxActions> get listActionOfMailboxSelected { List<MailboxActions> get listActionOfMailboxSelected {
final currentMailboxesSelected = listMailboxSelected; final currentMailboxesSelected = listMailboxSelected;
@@ -964,11 +953,6 @@ class MailboxController extends BaseMailboxController
} }
} }
void _cancelSelectMailbox() {
unAllSelectedMailboxNode();
currentSelectMode.value = SelectMode.INACTIVE;
}
List<PresentationMailbox> get listMailboxSelected { List<PresentationMailbox> get listMailboxSelected {
final defaultMailboxSelected = defaultMailboxTree.value final defaultMailboxSelected = defaultMailboxTree.value
.findNodes((node) => node.selectMode == SelectMode.ACTIVE); .findNodes((node) => node.selectMode == SelectMode.ACTIVE);
@@ -1042,7 +1026,6 @@ class MailboxController extends BaseMailboxController
_deleteMailboxFailure(DeleteMultipleMailboxFailure(null)); _deleteMailboxFailure(DeleteMultipleMailboxFailure(null));
} }
_cancelSelectMailbox();
popBack(); popBack();
} }
@@ -1112,7 +1095,6 @@ class MailboxController extends BaseMailboxController
_deleteMailboxFailure(DeleteMultipleMailboxFailure(null)); _deleteMailboxFailure(DeleteMultipleMailboxFailure(null));
} }
_cancelSelectMailbox();
popBack(); popBack();
} }
@@ -1141,8 +1123,6 @@ class MailboxController extends BaseMailboxController
RenameMailboxRequest(presentationMailbox.id, newMailboxName)) RenameMailboxRequest(presentationMailbox.id, newMailboxName))
); );
} }
_cancelSelectMailbox();
} }
void _handleMovingMailbox( void _handleMovingMailbox(
@@ -1324,7 +1304,6 @@ class MailboxController extends BaseMailboxController
mailboxSelected, mailboxSelected,
destinationMailbox: destinationMailbox destinationMailbox: destinationMailbox
); );
_cancelSelectMailbox();
} }
} }
@@ -1352,7 +1331,6 @@ class MailboxController extends BaseMailboxController
} }
void closeMailboxScreen(BuildContext context) { void closeMailboxScreen(BuildContext context) {
_cancelSelectMailbox();
mailboxDashBoardController.closeMailboxMenuDrawer(); mailboxDashBoardController.closeMailboxMenuDrawer();
} }
@@ -7,7 +7,6 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions
import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/folder_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/folder_widget.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/folders_bar_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/folders_bar_widget.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_category_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_category_widget.dart';
@@ -31,69 +30,25 @@ class MailboxView extends BaseMailboxView {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
buildMailboxAppBar(),
Expanded( Expanded(
child: Column(children: [ child: RefreshIndicator(
buildMailboxAppBar(), color: AppColor.primaryColor,
Expanded(child: RefreshIndicator( onRefresh: controller.refreshAllMailbox,
color: AppColor.primaryColor, child: _buildListMailbox(context),
onRefresh: controller.refreshAllMailbox, ),
child: _buildListMailbox(context) ),
)), const Divider(color: AppColor.colorDividerHorizontal),
Obx(() { const QuotasView(),
if (controller.isSelectionEnabled() Container(
&& controller.listActionOfMailboxSelected.isNotEmpty) { width: double.infinity,
return SafeArea( color: Colors.white,
right: false, padding: const EdgeInsets.all(16),
top: false, child: ApplicationVersionWidget(
child: BottomBarSelectionMailboxWidget( padding: EdgeInsets.zero,
controller.listMailboxSelected, title: '${AppLocalizations.of(context).version} ',
controller.listActionOfMailboxSelected, ),
onMailboxActionsClick: (actions, listMailboxSelected) {
return controller.pressMailboxSelectionAction(
context,
actions,
listMailboxSelected
);
}
)
);
} else {
return const SizedBox.shrink();
}
}),
]),
), ),
Obx(() {
if (controller.isSelectionEnabled()) {
return const SizedBox.shrink();
}
return const Column(
mainAxisSize: MainAxisSize.min,
children: [
Divider(color: AppColor.colorDividerHorizontal),
QuotasView()
],
);
}),
Obx(() {
if (!controller.isSelectionEnabled() && controller.responsiveUtils.isPortraitMobile(context)) {
return Container(
width: double.infinity,
color: Colors.white,
padding: const EdgeInsets.all(16),
child: SafeArea(
top: false,
child: ApplicationVersionWidget(
padding: EdgeInsets.zero,
title: '${AppLocalizations.of(context).version} ',
),
),
);
} else {
return const SizedBox.shrink();
}
}),
], ],
), ),
), ),
@@ -121,8 +76,7 @@ class MailboxView extends BaseMailboxView {
}), }),
Obx(() { Obx(() {
if (controller.mailboxDashBoardController.listSendingEmails.isNotEmpty && if (controller.mailboxDashBoardController.listSendingEmails.isNotEmpty &&
PlatformInfo.isMobile && PlatformInfo.isMobile) {
!controller.isSelectionEnabled()) {
return SendingQueueMailboxWidget( return SendingQueueMailboxWidget(
listSendingEmails: controller.mailboxDashBoardController.listSendingEmails, listSendingEmails: controller.mailboxDashBoardController.listSendingEmails,
onOpenSendingQueueAction: () => controller.openSendingQueueViewAction(context), onOpenSendingQueueAction: () => controller.openSendingQueueViewAction(context),
@@ -284,7 +238,6 @@ class MailboxView extends BaseMailboxView {
paddingChild: const EdgeInsetsDirectional.only(start: 14), paddingChild: const EdgeInsetsDirectional.only(start: 14),
parent: Obx(() => MailboxItemWidget( parent: Obx(() => MailboxItemWidget(
mailboxNode: mailboxNode, mailboxNode: mailboxNode,
selectionMode: controller.currentSelectMode.value,
mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value,
onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, controller.imagePaths, mailboxNode.item, controller), onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, controller.imagePaths, mailboxNode.item, controller),
onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item), onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item),
@@ -301,7 +254,6 @@ class MailboxView extends BaseMailboxView {
} else { } else {
return Obx(() => MailboxItemWidget( return Obx(() => MailboxItemWidget(
mailboxNode: mailboxNode, mailboxNode: mailboxNode,
selectionMode: controller.currentSelectMode.value,
mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value,
onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, controller.imagePaths, mailboxNode.item, controller), onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, controller.imagePaths, mailboxNode.item, controller),
onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item), onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item),
@@ -6,5 +6,4 @@ class MailboxItemWidgetStyles {
static const double height = 36; static const double height = 36;
static const double teamMailboxHeight = 52; static const double teamMailboxHeight = 52;
static const double labelIconSpace = 16; static const double labelIconSpace = 16;
static const double teamMailboxLabelSpace = 3;
} }
@@ -1,70 +1,25 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/select_mode.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_item_widget_styles.dart';
class MailboxIconWidget extends StatelessWidget { class MailboxIconWidget extends StatelessWidget {
final String icon;
final ImagePaths imagePaths; const MailboxIconWidget({super.key, required this.icon});
final MailboxNode mailboxNode;
final SelectMode selectionMode;
final OnSelectMailboxNodeAction? onSelectMailboxFolderClick;
final EdgeInsetsGeometry? padding;
const MailboxIconWidget({
super.key,
required this.mailboxNode,
required this.imagePaths,
this.selectionMode = SelectMode.INACTIVE,
this.padding,
this.onSelectMailboxFolderClick,
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Widget? item; return Padding(
padding: const EdgeInsetsDirectional.only(
if (_isSelectionActivatedOnMobile) { end: MailboxItemWidgetStyles.labelIconSpace,
item = InkWell( ),
onTap: () => onSelectMailboxFolderClick?.call(mailboxNode), child: SvgPicture.asset(
child: SvgPicture.asset( icon,
_getSelectionIcon(imagePaths),
width: MailboxIconWidgetStyles.iconSize,
height: MailboxIconWidgetStyles.iconSize,
fit: BoxFit.fill,
)
);
} else if (mailboxNode.item.isPersonal || mailboxNode.item.hasParentId()) {
item = SvgPicture.asset(
mailboxNode.item.getMailboxIcon(imagePaths),
width: MailboxIconWidgetStyles.iconSize, width: MailboxIconWidgetStyles.iconSize,
height: MailboxIconWidgetStyles.iconSize, height: MailboxIconWidgetStyles.iconSize,
fit: BoxFit.fill, fit: BoxFit.fill,
); ),
} );
if (padding != null) {
return Padding(
padding: padding!,
child: item ?? const SizedBox.shrink(),
);
} else {
return item ?? const SizedBox.shrink();
}
} }
}
bool get _isSelectionActivatedOnMobile => PlatformInfo.isMobile && selectionMode == SelectMode.ACTIVE;
String _getSelectionIcon(ImagePaths imagePaths) {
return mailboxNode.selectMode == SelectMode.ACTIVE
? imagePaths.icSelected
: imagePaths.icUnSelected;
}
}
@@ -9,7 +9,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/email/presentation_email.dart'; import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/mailbox/select_mode.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
@@ -21,7 +21,6 @@ import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_icon
class MailboxItemWidget extends StatefulWidget { class MailboxItemWidget extends StatefulWidget {
final MailboxNode mailboxNode; final MailboxNode mailboxNode;
final SelectMode selectionMode;
final MailboxDisplayed mailboxDisplayed; final MailboxDisplayed mailboxDisplayed;
final PresentationMailbox? mailboxNodeSelected; final PresentationMailbox? mailboxNodeSelected;
final MailboxActions? mailboxActions; final MailboxActions? mailboxActions;
@@ -38,7 +37,6 @@ class MailboxItemWidget extends StatefulWidget {
const MailboxItemWidget({ const MailboxItemWidget({
super.key, super.key,
required this.mailboxNode, required this.mailboxNode,
this.selectionMode = SelectMode.INACTIVE,
this.mailboxDisplayed = MailboxDisplayed.mailbox, this.mailboxDisplayed = MailboxDisplayed.mailbox,
this.mailboxNodeSelected, this.mailboxNodeSelected,
this.mailboxActions, this.mailboxActions,
@@ -90,17 +88,8 @@ class _MailboxItemWidgetState extends State<MailboxItemWidget> {
? CrossAxisAlignment.start ? CrossAxisAlignment.start
: CrossAxisAlignment.center, : CrossAxisAlignment.center,
children: [ children: [
MailboxIconWidget( if (_isIconDisplayed)
imagePaths: _imagePaths, MailboxIconWidget(icon: _iconMailbox),
mailboxNode: widget.mailboxNode,
selectionMode: widget.selectionMode,
padding: EdgeInsetsDirectional.only(
end: widget.mailboxNode.item.isTeamMailboxes
? MailboxItemWidgetStyles.teamMailboxLabelSpace
: MailboxItemWidgetStyles.labelIconSpace,
),
onSelectMailboxFolderClick: widget.onSelectMailboxFolderClick,
),
Expanded( Expanded(
child: LabelMailboxItemWidget( child: LabelMailboxItemWidget(
itemKey: _key, itemKey: _key,
@@ -141,17 +130,8 @@ class _MailboxItemWidgetState extends State<MailboxItemWidget> {
: MailboxItemWidgetStyles.height, : MailboxItemWidgetStyles.height,
child: Row( child: Row(
children: [ children: [
MailboxIconWidget( if (_isIconDisplayed)
imagePaths: _imagePaths, MailboxIconWidget(icon: _iconMailbox),
mailboxNode: widget.mailboxNode,
selectionMode: widget.selectionMode,
padding: EdgeInsetsDirectional.only(
end: widget.mailboxNode.item.isTeamMailboxes
? MailboxItemWidgetStyles.teamMailboxLabelSpace
: MailboxItemWidgetStyles.labelIconSpace,
),
onSelectMailboxFolderClick: widget.onSelectMailboxFolderClick,
),
Expanded( Expanded(
child: LabelMailboxItemWidget( child: LabelMailboxItemWidget(
itemKey: _key, itemKey: _key,
@@ -175,9 +155,7 @@ class _MailboxItemWidgetState extends State<MailboxItemWidget> {
color: Colors.transparent, color: Colors.transparent,
child: InkWell( child: InkWell(
onLongPress: () => widget.onLongPressMailboxNodeAction?.call(widget.mailboxNode), onLongPress: () => widget.onLongPressMailboxNodeAction?.call(widget.mailboxNode),
onTap: () => widget.selectionMode == SelectMode.ACTIVE onTap: () => widget.onOpenMailboxFolderClick?.call(widget.mailboxNode),
? widget.onSelectMailboxFolderClick?.call(widget.mailboxNode)
: widget.onOpenMailboxFolderClick?.call(widget.mailboxNode),
borderRadius: const BorderRadius.all(Radius.circular(MailboxItemWidgetStyles.borderRadius)), borderRadius: const BorderRadius.all(Radius.circular(MailboxItemWidgetStyles.borderRadius)),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -192,17 +170,8 @@ class _MailboxItemWidgetState extends State<MailboxItemWidget> {
: MailboxItemWidgetStyles.height, : MailboxItemWidgetStyles.height,
child: Row( child: Row(
children: [ children: [
MailboxIconWidget( if (_isIconDisplayed)
imagePaths: _imagePaths, MailboxIconWidget(icon: _iconMailbox),
mailboxNode: widget.mailboxNode,
selectionMode: widget.selectionMode,
padding: EdgeInsetsDirectional.only(
end: widget.mailboxNode.item.isTeamMailboxes
? MailboxItemWidgetStyles.teamMailboxLabelSpace
: MailboxItemWidgetStyles.labelIconSpace,
),
onSelectMailboxFolderClick: widget.onSelectMailboxFolderClick,
),
Expanded( Expanded(
child: LabelMailboxItemWidget( child: LabelMailboxItemWidget(
itemKey: _key, itemKey: _key,
@@ -255,17 +224,8 @@ class _MailboxItemWidgetState extends State<MailboxItemWidget> {
: Colors.transparent, : Colors.transparent,
child: Row( child: Row(
children: [ children: [
MailboxIconWidget( if (_isIconDisplayed)
imagePaths: _imagePaths, MailboxIconWidget(icon: _iconMailbox),
mailboxNode: widget.mailboxNode,
selectionMode: widget.selectionMode,
padding: EdgeInsetsDirectional.only(
end: widget.mailboxNode.item.isTeamMailboxes
? MailboxItemWidgetStyles.teamMailboxLabelSpace
: MailboxItemWidgetStyles.labelIconSpace,
),
onSelectMailboxFolderClick: widget.onSelectMailboxFolderClick,
),
Expanded( Expanded(
child: LabelMailboxItemWidget( child: LabelMailboxItemWidget(
itemKey: _key, itemKey: _key,
@@ -320,4 +280,11 @@ class _MailboxItemWidgetState extends State<MailboxItemWidget> {
widget.mailboxActions == MailboxActions.create || widget.mailboxActions == MailboxActions.create ||
widget.mailboxActions == MailboxActions.moveEmail widget.mailboxActions == MailboxActions.moveEmail
); );
bool get _isIconDisplayed =>
widget.mailboxNode.item.isPersonal ||
widget.mailboxNode.item.hasParentId();
String get _iconMailbox =>
widget.mailboxNode.item.getMailboxIcon(_imagePaths);
} }