✨ 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:island/widgets/post/post_shared.dart';
|
||||||
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
import 'package:swipe_to/swipe_to.dart';
|
||||||
import 'package:island/widgets/content/sheet.dart';
|
import 'package:island/widgets/content/sheet.dart';
|
||||||
|
|
||||||
class MessageItemAction {
|
class MessageItemAction {
|
||||||
@@ -159,14 +160,35 @@ class MessageItem extends HookConsumerWidget {
|
|||||||
return Stack(
|
return Stack(
|
||||||
clipBehavior: Clip.none,
|
clipBehavior: Clip.none,
|
||||||
children: [
|
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,
|
mouseCursor: MouseCursor.defer,
|
||||||
focusColor: Colors.transparent,
|
focusColor: Colors.transparent,
|
||||||
onLongPress: showActionMenu,
|
onLongPress: showActionMenu,
|
||||||
onSecondaryTap: showActionMenu,
|
onSecondaryTap: showActionMenu,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
// Jump to related message
|
// 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'] is String &&
|
||||||
message.meta['message_id'] != null) {
|
message.meta['message_id'] != null) {
|
||||||
onJump(message.meta['message_id']);
|
onJump(message.meta['message_id']);
|
||||||
@@ -214,6 +236,7 @@ class MessageItem extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
if (isHovered.value && !isMobile)
|
if (isHovered.value && !isMobile)
|
||||||
Positioned(
|
Positioned(
|
||||||
top: -15,
|
top: -15,
|
||||||
@@ -314,7 +337,9 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
// Header
|
// Header
|
||||||
Row(
|
SizedBox(
|
||||||
|
height: 24,
|
||||||
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
Symbols.article,
|
Symbols.article,
|
||||||
@@ -347,12 +372,13 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
|||||||
},
|
},
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
constraints: const BoxConstraints(
|
constraints: const BoxConstraints(
|
||||||
minWidth: 24,
|
minWidth: 32,
|
||||||
minHeight: 24,
|
minHeight: 24,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
),
|
||||||
const Gap(8),
|
const Gap(8),
|
||||||
// Selectable content
|
// Selectable content
|
||||||
SelectableText(
|
SelectableText(
|
||||||
@@ -403,7 +429,7 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
|||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
if (widget.isCurrentUser) const Divider(height: 8),
|
if (widget.isCurrentUser) const Divider(),
|
||||||
|
|
||||||
_ActionListTile(
|
_ActionListTile(
|
||||||
leading: Icon(Symbols.reply),
|
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)
|
if (widget.translatableLanguage)
|
||||||
_ActionListTile(
|
_ActionListTile(
|
||||||
leading: Icon(Symbols.translate),
|
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)
|
if (widget.isMobile)
|
||||||
_ActionListTile(
|
_ActionListTile(
|
||||||
leading: Icon(Symbols.copy_all),
|
leading: Icon(Symbols.copy_all),
|
||||||
|
Reference in New Issue
Block a user