✨ Think with messages
This commit is contained in:
@@ -43,6 +43,10 @@ class MessageItem extends HookConsumerWidget {
|
||||
final Map<int, double>? progress;
|
||||
final bool showAvatar;
|
||||
final Function(String messageId) onJump;
|
||||
final bool isSelectionMode;
|
||||
final bool isSelected;
|
||||
final Function(String messageId)? onToggleSelection;
|
||||
final Function()? onEnterSelectionMode;
|
||||
|
||||
const MessageItem({
|
||||
super.key,
|
||||
@@ -52,6 +56,10 @@ class MessageItem extends HookConsumerWidget {
|
||||
required this.progress,
|
||||
required this.showAvatar,
|
||||
required this.onJump,
|
||||
this.isSelectionMode = false,
|
||||
this.isSelected = false,
|
||||
this.onToggleSelection,
|
||||
this.onEnterSelectionMode,
|
||||
});
|
||||
|
||||
static const kFlashDuration = 300;
|
||||
@@ -110,6 +118,8 @@ class MessageItem extends HookConsumerWidget {
|
||||
isMobile: isMobile,
|
||||
remoteMessage: remoteMessage,
|
||||
message: message,
|
||||
onToggleSelection: onToggleSelection,
|
||||
onEnterSelectionMode: onEnterSelectionMode,
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -182,17 +192,27 @@ class MessageItem extends HookConsumerWidget {
|
||||
child: InkWell(
|
||||
mouseCursor: MouseCursor.defer,
|
||||
focusColor: Colors.transparent,
|
||||
onLongPress: showActionMenu,
|
||||
onLongPress: () {
|
||||
if (isSelectionMode && onToggleSelection != null) {
|
||||
onToggleSelection!(message.id);
|
||||
} else {
|
||||
showActionMenu();
|
||||
}
|
||||
},
|
||||
onSecondaryTap: showActionMenu,
|
||||
onTap: () {
|
||||
// Jump to related message
|
||||
if ([
|
||||
'messages.update',
|
||||
'messages.delete',
|
||||
].contains(message.type) &&
|
||||
message.meta['message_id'] is String &&
|
||||
message.meta['message_id'] != null) {
|
||||
onJump(message.meta['message_id']);
|
||||
if (isSelectionMode && onToggleSelection != null) {
|
||||
onToggleSelection!(message.id);
|
||||
} else {
|
||||
// Jump to related message
|
||||
if ([
|
||||
'messages.update',
|
||||
'messages.delete',
|
||||
].contains(message.type) &&
|
||||
message.meta['message_id'] is String &&
|
||||
message.meta['message_id'] != null) {
|
||||
onJump(message.meta['message_id']);
|
||||
}
|
||||
}
|
||||
},
|
||||
child: SizedBox(
|
||||
@@ -271,6 +291,8 @@ class MessageActionSheet extends StatefulWidget {
|
||||
final bool isMobile;
|
||||
final dynamic remoteMessage;
|
||||
final LocalChatMessage message;
|
||||
final Function(String messageId)? onToggleSelection;
|
||||
final Function()? onEnterSelectionMode;
|
||||
|
||||
const MessageActionSheet({
|
||||
super.key,
|
||||
@@ -283,6 +305,8 @@ class MessageActionSheet extends StatefulWidget {
|
||||
required this.isMobile,
|
||||
required this.remoteMessage,
|
||||
required this.message,
|
||||
this.onToggleSelection,
|
||||
this.onEnterSelectionMode,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -461,6 +485,21 @@ class _MessageActionSheetState extends State<MessageActionSheet> {
|
||||
},
|
||||
),
|
||||
|
||||
// AI Selection action
|
||||
_ActionListTile(
|
||||
leading: Icon(Symbols.smart_toy),
|
||||
title: Text('Select for AI'),
|
||||
onTap: () {
|
||||
if (widget.onEnterSelectionMode != null) {
|
||||
widget.onEnterSelectionMode!();
|
||||
if (widget.onToggleSelection != null) {
|
||||
widget.onToggleSelection!(widget.message.id);
|
||||
}
|
||||
}
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
|
||||
if (widget.translatableLanguage) const Divider(),
|
||||
if (widget.translatableLanguage)
|
||||
_ActionListTile(
|
||||
|
||||
Reference in New Issue
Block a user