From c60840997d7e9d2d37cfda2421ef1d1691dcf008 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin <59914433+mdmohsin7@users.noreply.github.com> Date: Thu, 23 Jan 2025 21:02:27 +0530 Subject: [PATCH 1/2] select text screen and option in menu --- app/lib/pages/chat/select_text_screen.dart | 33 +++++++++++++++++++ .../chat/widgets/message_action_menu.dart | 7 ++++ 2 files changed, 40 insertions(+) create mode 100644 app/lib/pages/chat/select_text_screen.dart diff --git a/app/lib/pages/chat/select_text_screen.dart b/app/lib/pages/chat/select_text_screen.dart new file mode 100644 index 000000000..c27cf6746 --- /dev/null +++ b/app/lib/pages/chat/select_text_screen.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:friend_private/backend/schema/message.dart'; + +import 'widgets/markdown_message_widget.dart'; + +class SelectTextScreen extends StatelessWidget { + final ServerMessage message; + const SelectTextScreen({super.key, required this.message}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Theme.of(context).colorScheme.primary, + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.primary, + automaticallyImplyLeading: true, + title: const Text('Select Text'), + centerTitle: false, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new), + onPressed: () { + Navigator.pop(context); + }, + ), + elevation: 0, + ), + body: Padding( + padding: const EdgeInsets.all(10.0), + child: SelectionArea(child: getMarkdownWidget(context, message.text)), + ), + ); + } +} diff --git a/app/lib/pages/chat/widgets/message_action_menu.dart b/app/lib/pages/chat/widgets/message_action_menu.dart index 4875168c0..d3edd5e0a 100644 --- a/app/lib/pages/chat/widgets/message_action_menu.dart +++ b/app/lib/pages/chat/widgets/message_action_menu.dart @@ -4,6 +4,7 @@ import 'markdown_message_widget.dart'; class MessageActionMenu extends StatelessWidget { final Function()? onCopy; + final Function()? onSelectText; final Function()? onShare; final Function()? onReport; final String message; @@ -11,6 +12,7 @@ class MessageActionMenu extends StatelessWidget { const MessageActionMenu({ super.key, this.onCopy, + this.onSelectText, this.onShare, this.onReport, required this.message, @@ -46,6 +48,11 @@ class MessageActionMenu extends StatelessWidget { icon: Icons.copy, onTap: onCopy, ), + _buildActionButton( + title: 'Select Text', + icon: Icons.description_outlined, + onTap: onSelectText, + ), _buildActionButton( title: 'Share', icon: Icons.share, From 83f2aaddaf9734196a5d991cc87224a2473f5797 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin <59914433+mdmohsin7@users.noreply.github.com> Date: Thu, 23 Jan 2025 21:02:57 +0530 Subject: [PATCH 2/2] mixpanel events to better track chat options usage --- app/lib/pages/chat/page.dart | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/app/lib/pages/chat/page.dart b/app/lib/pages/chat/page.dart index 08c3e68ef..30297e231 100644 --- a/app/lib/pages/chat/page.dart +++ b/app/lib/pages/chat/page.dart @@ -9,6 +9,7 @@ import 'package:friend_private/backend/preferences.dart'; import 'package:friend_private/backend/schema/app.dart'; import 'package:friend_private/backend/schema/conversation.dart'; import 'package:friend_private/backend/schema/message.dart'; +import 'package:friend_private/pages/chat/select_text_screen.dart'; import 'package:friend_private/pages/chat/widgets/ai_message.dart'; import 'package:friend_private/pages/chat/widgets/animated_mini_banner.dart'; import 'package:friend_private/pages/chat/widgets/user_message.dart'; @@ -17,6 +18,7 @@ import 'package:friend_private/providers/home_provider.dart'; import 'package:friend_private/providers/conversation_provider.dart'; import 'package:friend_private/providers/message_provider.dart'; import 'package:friend_private/utils/analytics/mixpanel.dart'; +import 'package:friend_private/utils/other/temp.dart'; import 'package:friend_private/widgets/dialog.dart'; import 'package:friend_private/widgets/extensions/string.dart'; import 'package:gradient_borders/gradient_borders.dart'; @@ -241,20 +243,29 @@ class ChatPageState extends State with AutomaticKeepAliveClientMixin { builder: (context) => MessageActionMenu( message: message.text.decodeString, onCopy: () async { + MixpanelManager() + .track('Chat Message Copied', properties: {'message': message.text}); await Clipboard.setData(ClipboardData(text: message.text.decodeString)); - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text( - 'Message copied to clipboard.', - style: TextStyle( - color: Color.fromARGB(255, 255, 255, 255), - fontSize: 12.0, + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'Message copied to clipboard.', + style: TextStyle( + color: Color.fromARGB(255, 255, 255, 255), + fontSize: 12.0, + ), ), + duration: Duration(milliseconds: 2000), ), - duration: Duration(milliseconds: 2000), - ), - ); - Navigator.pop(context); + ); + Navigator.pop(context); + } + }, + onSelectText: () { + MixpanelManager().track('Chat Message Text Selected', + properties: {'message': message.text}); + routeToPage(context, SelectTextScreen(message: message)); }, onShare: () { MixpanelManager() @@ -291,6 +302,8 @@ class ChatPageState extends State with AutomaticKeepAliveClientMixin { Navigator.of(context).pop(); }, () { + MixpanelManager().track('Chat Message Reported', + properties: {'message': message.text}); Navigator.of(context).pop(); Navigator.of(context).pop(); context.read().removeLocalMessage(message.id); @@ -313,7 +326,6 @@ class ChatPageState extends State with AutomaticKeepAliveClientMixin { ); }, ); - // Navigator.pop(context); }, ), );