✨ Message item swipe to
This commit is contained in:
@@ -25,6 +25,7 @@ import 'package:island/widgets/content/embed/embed_list.dart';
|
||||
import 'package:island/widgets/post/post_shared.dart';
|
||||
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
import 'package:swipe_to/swipe_to.dart';
|
||||
import 'package:island/widgets/content/sheet.dart';
|
||||
|
||||
class MessageItemAction {
|
||||
@@ -159,14 +160,35 @@ class MessageItem extends HookConsumerWidget {
|
||||
return Stack(
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
InkWell(
|
||||
SwipeTo(
|
||||
rightSwipeWidget: Transform.flip(
|
||||
flipX: true,
|
||||
child: Icon(Symbols.menu_open),
|
||||
).padding(left: 16),
|
||||
leftSwipeWidget: Icon(
|
||||
isCurrentUser ? Symbols.forward : Symbols.reply,
|
||||
).padding(right: 16),
|
||||
onLeftSwipe: (details) {
|
||||
if (onAction != null) {
|
||||
if (isCurrentUser) {
|
||||
onAction!(MessageItemAction.forward);
|
||||
} else {
|
||||
onAction!(MessageItemAction.reply);
|
||||
}
|
||||
}
|
||||
},
|
||||
onRightSwipe: (details) => showActionMenu(),
|
||||
child: InkWell(
|
||||
mouseCursor: MouseCursor.defer,
|
||||
focusColor: Colors.transparent,
|
||||
onLongPress: showActionMenu,
|
||||
onSecondaryTap: showActionMenu,
|
||||
onTap: () {
|
||||
// Jump to related message
|
||||
if (['messages.update', 'messages.delete'].contains(message.type) &&
|
||||
if ([
|
||||
'messages.update',
|
||||
'messages.delete',
|
||||
].contains(message.type) &&
|
||||
message.meta['message_id'] is String &&
|
||||
message.meta['message_id'] != null) {
|
||||
onJump(message.meta['message_id']);
|
||||
@@ -214,6 +236,7 @@ class MessageItem extends HookConsumerWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (isHovered.value && !isMobile)
|
||||
Positioned(
|
||||
top: -15,
|
||||
@@ -314,7 +337,9 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
// Header
|
||||
Row(
|
||||
SizedBox(
|
||||
height: 24,
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(
|
||||
Symbols.article,
|
||||
@@ -347,12 +372,13 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
||||
},
|
||||
padding: EdgeInsets.zero,
|
||||
constraints: const BoxConstraints(
|
||||
minWidth: 24,
|
||||
minWidth: 32,
|
||||
minHeight: 24,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const Gap(8),
|
||||
// Selectable content
|
||||
SelectableText(
|
||||
@@ -403,7 +429,7 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
if (widget.isCurrentUser) const Divider(height: 8),
|
||||
if (widget.isCurrentUser) const Divider(),
|
||||
|
||||
_ActionListTile(
|
||||
leading: Icon(Symbols.reply),
|
||||
@@ -422,7 +448,7 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
||||
},
|
||||
),
|
||||
|
||||
if (widget.translatableLanguage) const Divider(height: 8),
|
||||
if (widget.translatableLanguage) const Divider(),
|
||||
if (widget.translatableLanguage)
|
||||
_ActionListTile(
|
||||
leading: Icon(Symbols.translate),
|
||||
@@ -439,7 +465,7 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
||||
},
|
||||
),
|
||||
|
||||
if (widget.isMobile) const Divider(height: 8),
|
||||
if (widget.isMobile) const Divider(),
|
||||
if (widget.isMobile)
|
||||
_ActionListTile(
|
||||
leading: Icon(Symbols.copy_all),
|
||||
|
Reference in New Issue
Block a user