TF-3704 Fix menu bounces when collapse/expand folder

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-05-07 02:53:37 +07:00
committed by Dat H. Pham
parent f2e854c2f0
commit aca0538b6b
16 changed files with 367 additions and 281 deletions
@@ -5,31 +5,41 @@ import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:core/utils/direction_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/expand_mode.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/expand_mode_extension.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/utils/mailbox_method_action_define.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
class MailBoxVisibilityFolderTileBuilder extends StatefulWidget {
final MailboxNode _mailboxNode;
final ImagePaths _imagePaths;
final OnClickExpandMailboxNodeAction? onClickExpandMailboxNodeAction;
final OnClickSubscribeMailboxAction? onClickSubscribeMailboxAction;
const MailBoxVisibilityFolderTileBuilder(
this._imagePaths,
this._mailboxNode, {
Key? key,
this.onClickExpandMailboxNodeAction,
this.onClickSubscribeMailboxAction
}) : super(key: key);
@override
State<MailBoxVisibilityFolderTileBuilder> createState() => _MailBoxVisibilityFolderTileBuilderState();
}
class _MailBoxVisibilityFolderTileBuilderState extends State<MailBoxVisibilityFolderTileBuilder> {
final _imagePaths = Get.find<ImagePaths>();
final GlobalKey _key = GlobalKey();
@override
Widget build(BuildContext context) {
return Material(
key: _key,
color: Colors.transparent,
child: InkWell(
onTap: () {},
@@ -40,7 +50,7 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
children: [
_buildLeadingMailboxItem(context),
Expanded(child: _buildTitleFolderItem(context)),
if (!_mailboxNode.item.isDefault)
if (!widget._mailboxNode.item.isDefault)
_buildSubscribeButton(context),
const SizedBox(width: 32),
]
@@ -55,58 +65,53 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
Visibility.maintain(
visible: _mailboxNode.hasChildren() && _mailboxNode.item.isPersonal,
visible: widget._mailboxNode.hasChildren() && widget._mailboxNode.item.isPersonal,
child: TMailButtonWidget.fromIcon(
icon: _getExpandIcon(context, _imagePaths),
iconColor: _mailboxNode.item.allowedToDisplay
icon: widget._mailboxNode.expandMode.getIcon(
_imagePaths,
DirectionUtils.isDirectionRTLByLanguage(context),
),
iconColor: widget._mailboxNode.item.allowedToDisplay
? Colors.black
: AppColor.colorIconUnSubscribedMailbox,
padding: const EdgeInsets.all(5),
iconSize: 20,
backgroundColor: Colors.transparent,
tooltipMessage: _mailboxNode.expandMode == ExpandMode.EXPAND
? AppLocalizations.of(context).collapse
: AppLocalizations.of(context).expand,
onTapActionCallback: () => onClickExpandMailboxNodeAction?.call(_mailboxNode)
tooltipMessage: widget._mailboxNode.expandMode.getTooltipMessage(AppLocalizations.of(context)),
onTapActionCallback: () =>
widget.onClickExpandMailboxNodeAction?.call(
widget._mailboxNode,
_key,
)
),
),
if (!_mailboxNode.item.isTeamMailboxes)
if (!widget._mailboxNode.item.isTeamMailboxes)
_buildMailboxIcon(context),
]
);
}
String _getExpandIcon(BuildContext context, ImagePaths imagePaths) {
if (_mailboxNode.expandMode == ExpandMode.EXPAND) {
return imagePaths.icArrowBottom;
} else {
return DirectionUtils.isDirectionRTLByLanguage(context)
? imagePaths.icArrowLeft
: imagePaths.icArrowRight;
}
}
Widget _buildTitleFolderItem(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_mailboxNode.item.getDisplayName(context),
widget._mailboxNode.item.getDisplayName(context),
maxLines: 1,
softWrap: CommonTextStyle.defaultSoftWrap,
overflow: CommonTextStyle.defaultTextOverFlow,
style: TextStyle(
fontSize: _mailboxNode.item.isTeamMailboxes ? 16 : 14,
color: _mailboxNode.item.allowedToDisplay
fontSize: widget._mailboxNode.item.isTeamMailboxes ? 16 : 14,
color: widget._mailboxNode.item.allowedToDisplay
? Colors.black
: AppColor.colorTitleAUnSubscribedMailbox,
fontWeight: _mailboxNode.item.isTeamMailboxes
fontWeight: widget._mailboxNode.item.isTeamMailboxes
? FontWeight.w500
: FontWeight.normal),
),
if (_mailboxNode.item.isTeamMailboxes)
if (widget._mailboxNode.item.isTeamMailboxes)
Text(
_mailboxNode.item.emailTeamMailBoxes,
widget._mailboxNode.item.emailTeamMailBoxes,
maxLines: 1,
softWrap: CommonTextStyle.defaultSoftWrap,
overflow: CommonTextStyle.defaultTextOverFlow,
@@ -123,10 +128,10 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
return Padding(
padding: const EdgeInsetsDirectional.only(end: 8),
child: SvgPicture.asset(
_mailboxNode.item.getMailboxIcon(_imagePaths),
widget._mailboxNode.item.getMailboxIcon(_imagePaths),
width: 20,
height: 20,
colorFilter: _mailboxNode.item.allowedToDisplay
colorFilter: widget._mailboxNode.item.allowedToDisplay
? AppColor.primaryColor.asFilter()
: AppColor.colorIconUnSubscribedMailbox.asFilter(),
fit: BoxFit.fill
@@ -138,12 +143,12 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
return Material(
color: Colors.transparent,
child: InkWell(
onTap: () => onClickSubscribeMailboxAction?.call(_mailboxNode),
onTap: () => widget.onClickSubscribeMailboxAction?.call(widget._mailboxNode),
borderRadius: const BorderRadius.all(Radius.circular(5)),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
child: Text(
_mailboxNode.item.isSubscribedMailbox
widget._mailboxNode.item.isSubscribedMailbox
? AppLocalizations.of(context).hide
: AppLocalizations.of(context).show,
maxLines: 1,