💄 Optimize message action area

This commit is contained in:
2025-10-09 00:00:25 +08:00
parent 0a301c4c9b
commit 77bae4d6fd

View File

@@ -383,6 +383,54 @@ class MessageHoverActionMenu extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// General actions (available for all users)
final generalActions = [
if (!isCurrentUser) // Hide reply for message author
IconButton(
icon: Icon(Symbols.reply, size: 16),
onPressed: () => onAction?.call(MessageItemAction.reply),
tooltip: 'reply'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
),
IconButton(
icon: Icon(Symbols.forward, size: 16),
onPressed: () => onAction?.call(MessageItemAction.forward),
tooltip: 'forward'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
),
if (translatableLanguage)
IconButton(
icon: Icon(Symbols.translate, size: 16),
onPressed: translate,
tooltip:
translatedText == null ? 'translate'.tr() : 'translated'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
),
];
// Author-only actions (edit/delete)
final authorActions = [
if (isCurrentUser)
IconButton(
icon: Icon(Symbols.edit, size: 16),
onPressed: () => onAction?.call(MessageItemAction.edit),
tooltip: 'edit'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
),
if (isCurrentUser)
IconButton(
icon: Icon(Symbols.delete, size: 16, color: Colors.red),
onPressed: () => _handleDelete(context),
tooltip: 'delete'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
),
];
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surfaceContainerHighest, color: Theme.of(context).colorScheme.surfaceContainerHighest,
@@ -398,45 +446,18 @@ class MessageHoverActionMenu extends StatelessWidget {
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
if (isCurrentUser) // General actions (left side)
IconButton( ...generalActions,
icon: Icon(Symbols.edit, size: 16), // Separator (only if both general and author actions exist)
onPressed: () => onAction?.call(MessageItemAction.edit), if (generalActions.isNotEmpty && authorActions.isNotEmpty)
tooltip: 'edit'.tr(), Container(
padding: const EdgeInsets.all(8), width: 1,
constraints: const BoxConstraints(minWidth: 32, minHeight: 32), height: 24,
), color: Theme.of(context).colorScheme.outlineVariant,
if (isCurrentUser) margin: const EdgeInsets.symmetric(horizontal: 4),
IconButton(
icon: Icon(Symbols.delete, size: 16),
onPressed: () => _handleDelete(context),
tooltip: 'delete'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
),
IconButton(
icon: Icon(Symbols.reply, size: 16),
onPressed: () => onAction?.call(MessageItemAction.reply),
tooltip: 'reply'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
),
IconButton(
icon: Icon(Symbols.forward, size: 16),
onPressed: () => onAction?.call(MessageItemAction.forward),
tooltip: 'forward'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
),
if (translatableLanguage)
IconButton(
icon: Icon(Symbols.translate, size: 16),
onPressed: translate,
tooltip:
translatedText == null ? 'translate'.tr() : 'translated'.tr(),
padding: const EdgeInsets.all(8),
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
), ),
// Author actions (right side)
...authorActions,
], ],
), ),
); );