TF-3762 Update style for Clean button of Trash/Spam folder

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-06-02 11:27:39 +07:00
committed by Dat H. Pham
parent a0f824ab03
commit 7d9089c21b
3 changed files with 74 additions and 42 deletions
@@ -1,16 +1,8 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class EmptyMailboxPopupDialogWidgetStyles { class EmptyMailboxPopupDialogWidgetStyles {
static const EdgeInsetsGeometry emptyButtonPadding = EdgeInsetsDirectional.symmetric(vertical: 4, horizontal: 10); static const EdgeInsetsGeometry emptyButtonPadding =
EdgeInsetsDirectional.symmetric(vertical: 4, horizontal: 8);
static const Color emptyButtonBackground = Colors.transparent;
static const TextStyle emptyButtonTextStyle = TextStyle(
fontWeight: FontWeight.w400,
fontSize: 15,
color: AppColor.colorTextBody
);
static const Offset dialogOverlayOffset = Offset(0.0, 50.0); static const Offset dialogOverlayOffset = Offset(0.0, 50.0);
} }
@@ -1,3 +1,4 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_portal/flutter_portal.dart';
@@ -7,15 +8,19 @@ import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/empty_mailbox_dialog_overlay.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/empty_mailbox_dialog_overlay.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnPopupVisibleChange = void Function(bool visible);
class EmptyMailboxPopupDialogWidget extends StatefulWidget { class EmptyMailboxPopupDialogWidget extends StatefulWidget {
final MailboxNode mailboxNode; final MailboxNode mailboxNode;
final OnEmptyMailboxActionCallback onEmptyMailboxActionCallback; final OnEmptyMailboxActionCallback onEmptyMailboxActionCallback;
final OnPopupVisibleChange? onPopupVisibleChange;
const EmptyMailboxPopupDialogWidget({ const EmptyMailboxPopupDialogWidget({
super.key, super.key,
required this.mailboxNode, required this.mailboxNode,
required this.onEmptyMailboxActionCallback, required this.onEmptyMailboxActionCallback,
this.onPopupVisibleChange,
}); });
@override @override
@@ -26,13 +31,20 @@ class _EmptyMailboxPopupDialogWidgetState extends State<EmptyMailboxPopupDialogW
bool _visible = false; bool _visible = false;
void _setVisible(bool visible) {
if (_visible != visible) {
setState(() => _visible = visible);
widget.onPopupVisibleChange?.call(visible);
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return PortalTarget( return PortalTarget(
visible: _visible, visible: _visible,
portalFollower: GestureDetector( portalFollower: GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () => setState(() => _visible = false) onTap: () => _setVisible(false),
), ),
child: PortalTarget( child: PortalTarget(
anchor: const Aligned( anchor: const Aligned(
@@ -42,19 +54,21 @@ class _EmptyMailboxPopupDialogWidgetState extends State<EmptyMailboxPopupDialogW
), ),
portalFollower: EmptyMailboxDialogOverlay( portalFollower: EmptyMailboxDialogOverlay(
mailboxNode: widget.mailboxNode, mailboxNode: widget.mailboxNode,
onCancelActionClick: () => setState(() => _visible = false), onCancelActionClick: () => _setVisible(false),
onEmptyMailboxActionCallback: (mailboxNode) { onEmptyMailboxActionCallback: (mailboxNode) {
setState(() => _visible = false); _setVisible(false);
widget.onEmptyMailboxActionCallback.call(mailboxNode); widget.onEmptyMailboxActionCallback.call(mailboxNode);
}, },
), ),
visible: _visible, visible: _visible,
child: TMailButtonWidget.fromText( child: TMailButtonWidget.fromText(
text: AppLocalizations.of(context).clean, text: AppLocalizations.of(context).clean,
textStyle: EmptyMailboxPopupDialogWidgetStyles.emptyButtonTextStyle, textStyle: Theme.of(context).textTheme.bodySmall?.copyWith(
backgroundColor: EmptyMailboxPopupDialogWidgetStyles.emptyButtonBackground, color: AppColor.steelGrayA540,
),
backgroundColor: Colors.transparent,
padding: EmptyMailboxPopupDialogWidgetStyles.emptyButtonPadding, padding: EmptyMailboxPopupDialogWidgetStyles.emptyButtonPadding,
onTapActionCallback: () => setState(() => _visible = true) onTapActionCallback: () => _setVisible(true),
) )
) )
); );
@@ -12,7 +12,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/widgets/empty_mailbo
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_expand_button.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_expand_button.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/trailing_mailbox_item_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/trailing_mailbox_item_widget.dart';
class LabelMailboxItemWidget extends StatelessWidget { class LabelMailboxItemWidget extends StatefulWidget {
final GlobalKey itemKey; final GlobalKey itemKey;
final ResponsiveUtils responsiveUtils; final ResponsiveUtils responsiveUtils;
@@ -39,18 +39,26 @@ class LabelMailboxItemWidget extends StatelessWidget {
this.onClickExpandMailboxNodeAction, this.onClickExpandMailboxNodeAction,
}); });
@override
State<LabelMailboxItemWidget> createState() => _LabelMailboxItemWidgetState();
}
class _LabelMailboxItemWidgetState extends State<LabelMailboxItemWidget> {
bool _popupVisible = false;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final displayNameWidget = TextOverflowBuilder( final displayNameWidget = TextOverflowBuilder(
mailboxNode.item.getDisplayName(context), widget.mailboxNode.item.getDisplayName(context),
style: isSelected style: widget.isSelected
? ThemeUtils.textStyleInter700(color: Colors.black, fontSize: 14) ? ThemeUtils.textStyleInter700(color: Colors.black, fontSize: 14)
: ThemeUtils.textStyleBodyBody3(color: Colors.black), : ThemeUtils.textStyleBodyBody3(color: Colors.black),
); );
final nameWithExpandIcon = Row( final nameWithExpandIcon = Row(
children: [ children: [
if (mailboxNode.hasChildren()) if (widget.mailboxNode.hasChildren())
Flexible(child: displayNameWidget) Flexible(child: displayNameWidget)
else else
Flexible( Flexible(
@@ -59,25 +67,25 @@ class LabelMailboxItemWidget extends StatelessWidget {
child: displayNameWidget, child: displayNameWidget,
), ),
), ),
if (mailboxNode.hasChildren()) if (widget.mailboxNode.hasChildren())
MailboxExpandButton( MailboxExpandButton(
itemKey: itemKey, itemKey: widget.itemKey,
mailboxNode: mailboxNode, mailboxNode: widget.mailboxNode,
imagePaths: imagePaths, imagePaths: widget.imagePaths,
onExpandFolderActionClick: onClickExpandMailboxNodeAction, onExpandFolderActionClick: widget.onClickExpandMailboxNodeAction,
), ),
], ],
); );
if (!showTrailing) { if (!widget.showTrailing) {
if (mailboxNode.item.isTeamMailboxes) { if (widget.mailboxNode.item.isTeamMailboxes) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
nameWithExpandIcon, nameWithExpandIcon,
TextOverflowBuilder( TextOverflowBuilder(
mailboxNode.item.emailTeamMailBoxes, widget.mailboxNode.item.emailTeamMailBoxes,
style: Theme.of(context).textTheme.bodyMedium?.copyWith( style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontSize: LabelMailboxItemWidgetStyles.labelFolderTextSize, fontSize: LabelMailboxItemWidgetStyles.labelFolderTextSize,
color: LabelMailboxItemWidgetStyles.teamMailboxEmailTextColor, color: LabelMailboxItemWidgetStyles.teamMailboxEmailTextColor,
@@ -92,35 +100,40 @@ class LabelMailboxItemWidget extends StatelessWidget {
} }
final trailingWidget = TrailingMailboxItemWidget( final trailingWidget = TrailingMailboxItemWidget(
mailboxNode: mailboxNode, mailboxNode: widget.mailboxNode,
responsiveUtils: responsiveUtils, responsiveUtils: widget.responsiveUtils,
imagePaths: imagePaths, imagePaths: widget.imagePaths,
isItemHovered: isItemHovered, isItemHovered: widget.isItemHovered,
onMenuActionClick: onMenuActionClick, onMenuActionClick: widget.onMenuActionClick,
); );
final childWidget = Row( final childWidget = Row(
children: [ children: [
Expanded(child: nameWithExpandIcon), Expanded(child: nameWithExpandIcon),
if (responsiveUtils.isWebDesktop(context) && if (_showCleanButton(context))
mailboxNode.item.allowedHasEmptyAction) Offstage(
EmptyMailboxPopupDialogWidget( offstage: !_shouldShowPopup,
mailboxNode: mailboxNode, child: EmptyMailboxPopupDialogWidget(
onEmptyMailboxActionCallback: (mailboxNode) => mailboxNode: widget.mailboxNode,
onEmptyMailboxActionCallback?.call(mailboxNode), onEmptyMailboxActionCallback: (mailboxNode) {
_onPopupVisibleChange(false);
widget.onEmptyMailboxActionCallback?.call(mailboxNode);
},
onPopupVisibleChange: _onPopupVisibleChange,
),
), ),
trailingWidget, trailingWidget,
], ],
); );
if (mailboxNode.item.isTeamMailboxes) { if (widget.mailboxNode.item.isTeamMailboxes) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
childWidget, childWidget,
TextOverflowBuilder( TextOverflowBuilder(
mailboxNode.item.emailTeamMailBoxes, widget.mailboxNode.item.emailTeamMailBoxes,
style: Theme.of(context).textTheme.bodyMedium?.copyWith( style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontSize: LabelMailboxItemWidgetStyles.labelFolderTextSize, fontSize: LabelMailboxItemWidgetStyles.labelFolderTextSize,
color: LabelMailboxItemWidgetStyles.teamMailboxEmailTextColor, color: LabelMailboxItemWidgetStyles.teamMailboxEmailTextColor,
@@ -133,4 +146,17 @@ class LabelMailboxItemWidget extends StatelessWidget {
return childWidget; return childWidget;
} }
} }
void _onPopupVisibleChange(bool visible) {
if (_popupVisible != visible) {
setState(() => _popupVisible = visible);
}
}
bool get _shouldShowPopup => widget.isItemHovered || _popupVisible;
bool _showCleanButton(BuildContext context) {
return widget.responsiveUtils.isWebDesktop(context) &&
widget.mailboxNode.item.allowedHasEmptyAction;
}
} }