From 95d91f3959f25865011bd41c746cbde7c5ab269a Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Mon, 4 Jan 2021 16:00:20 +0530 Subject: [PATCH] feat: Added show in chat --- example/lib/chat_info_screen.dart | 31 ++++++++++++++++++++++- example/lib/group_info_screen.dart | 25 ++++++++++++++++++ example/lib/main.dart | 21 +++++++++++++++ lib/src/channel_media_display_screen.dart | 4 +++ lib/src/full_screen_media.dart | 9 +++++++ lib/src/giphy_attachment.dart | 3 +++ lib/src/image_actions_modal.dart | 14 ++++++---- lib/src/image_attachment.dart | 3 +++ lib/src/image_header.dart | 5 ++++ lib/src/message_list_view.dart | 5 ++++ lib/src/message_widget.dart | 6 +++++ lib/src/video_attachment.dart | 3 +++ 12 files changed, 123 insertions(+), 6 deletions(-) diff --git a/example/lib/chat_info_screen.dart b/example/lib/chat_info_screen.dart index d992e73b..535c999b 100644 --- a/example/lib/chat_info_screen.dart +++ b/example/lib/chat_info_screen.dart @@ -5,6 +5,9 @@ import 'package:jiffy/jiffy.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; +import 'main.dart'; +import 'routes/routes.dart'; + /// Detail screen for a 1:1 chat correspondence class ChatInfoScreen extends StatefulWidget { /// User in consideration @@ -190,7 +193,9 @@ class _ChatInfoScreenState extends State { StreamChatTheme.of(context).colorTheme.black.withOpacity(0.5), ), ), - trailing: StreamSvgIcon.right(), + trailing: StreamSvgIcon.right( + color: StreamChatTheme.of(context).colorTheme.grey, + ), onTap: () { final channel = StreamChannel.of(context).channel; @@ -208,6 +213,30 @@ class _ChatInfoScreenState extends State { ), ], paginationParams: PaginationParams(limit: 20), + onShowMessage: (m, c) async { + final client = StreamChat.of(context).client; + final message = m; + final channel = client.channel( + c.type, + id: c.id, + ); + if (channel.state == null) { + await channel.watch(); + } + Navigator.pop(context); + Navigator.pop(context); + Navigator.pop(context); + Navigator.pop(context); + Navigator.pop(context); + Navigator.pushNamed( + context, + Routes.CHANNEL_PAGE, + arguments: ChannelPageArgs( + channel: channel, + initialMessage: message, + ), + ); + }, ), ), ), diff --git a/example/lib/group_info_screen.dart b/example/lib/group_info_screen.dart index 0aa0cfb0..a8fb52e4 100644 --- a/example/lib/group_info_screen.dart +++ b/example/lib/group_info_screen.dart @@ -9,6 +9,7 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'chat_info_screen.dart'; import 'main.dart'; +import 'routes/routes.dart'; class GroupInfoScreen extends StatefulWidget { @override @@ -485,6 +486,30 @@ class _GroupInfoScreenState extends State { ), ], paginationParams: PaginationParams(limit: 20), + onShowMessage: (m, c) async { + final client = StreamChat.of(context).client; + final message = m; + final channel = client.channel( + c.type, + id: c.id, + ); + if (channel.state == null) { + await channel.watch(); + } + Navigator.pop(context); + Navigator.pop(context); + Navigator.pop(context); + Navigator.pop(context); + Navigator.pop(context); + Navigator.pushNamed( + context, + Routes.CHANNEL_PAGE, + arguments: ChannelPageArgs( + channel: channel, + initialMessage: message, + ), + ); + }, ), ), ), diff --git a/example/lib/main.dart b/example/lib/main.dart index 69300312..cc01cec4 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -517,6 +517,27 @@ class ChannelPage extends StatelessWidget { parent: parentMessage, ); }, + onShowMessage: (m, c) async { + final client = StreamChat.of(context).client; + final message = m; + final channel = client.channel( + c.type, + id: c.id, + ); + if (channel.state == null) { + await channel.watch(); + } + Navigator.pop(context); + Navigator.pop(context); + Navigator.pushReplacementNamed( + context, + Routes.CHANNEL_PAGE, + arguments: ChannelPageArgs( + channel: channel, + initialMessage: message, + ), + ); + }, ), Positioned( bottom: 0, diff --git a/lib/src/channel_media_display_screen.dart b/lib/src/channel_media_display_screen.dart index 09d2a8a8..1f8e9257 100644 --- a/lib/src/channel_media_display_screen.dart +++ b/lib/src/channel_media_display_screen.dart @@ -20,10 +20,13 @@ class ChannelMediaDisplayScreen extends StatefulWidget { /// The builder used when the file list is empty. final WidgetBuilder emptyBuilder; + final ShowMessageCallback onShowMessage; + const ChannelMediaDisplayScreen({ this.sortOptions, this.paginationParams, this.emptyBuilder, + this.onShowMessage, }); @override @@ -191,6 +194,7 @@ class _ChannelMediaDisplayScreenState extends State { message: media[position].message, sentAt: media[position].message.createdAt, userName: media[position].message.user.name, + onShowMessage: widget.onShowMessage, ), ), ), diff --git a/lib/src/full_screen_media.dart b/lib/src/full_screen_media.dart index 7e3f3d7d..e164eec8 100644 --- a/lib/src/full_screen_media.dart +++ b/lib/src/full_screen_media.dart @@ -6,9 +6,12 @@ import 'package:photo_view/photo_view.dart'; import 'package:stream_chat_flutter/src/image_footer.dart'; import 'package:stream_chat_flutter/src/image_header.dart'; import 'package:video_player/video_player.dart'; +import 'stream_channel.dart'; import '../stream_chat_flutter.dart'; +typedef ShowMessageCallback = void Function(Message message, Channel channel); + /// A full screen image widget class FullScreenMedia extends StatefulWidget { /// The url of the image @@ -18,6 +21,7 @@ class FullScreenMedia extends StatefulWidget { final int startIndex; final String userName; final DateTime sentAt; + final ShowMessageCallback onShowMessage; /// Instantiate a new FullScreenImage const FullScreenMedia({ @@ -27,6 +31,7 @@ class FullScreenMedia extends StatefulWidget { this.startIndex = 0, this.userName = '', this.sentAt, + this.onShowMessage, }) : super(key: key); @override @@ -167,6 +172,10 @@ class _FullScreenMediaState extends State message: widget.message, urls: widget.mediaAttachments, currentIndex: _currentPage, + onShowMessage: () { + widget.onShowMessage( + widget.message, StreamChannel.of(context).channel); + }, ), ImageFooter( currentPage: _currentPage, diff --git a/lib/src/giphy_attachment.dart b/lib/src/giphy_attachment.dart index cc1a319f..379fe182 100644 --- a/lib/src/giphy_attachment.dart +++ b/lib/src/giphy_attachment.dart @@ -12,6 +12,7 @@ class GiphyAttachment extends StatelessWidget { final MessageTheme messageTheme; final Message message; final Size size; + final ShowMessageCallback onShowMessage; const GiphyAttachment({ Key key, @@ -19,6 +20,7 @@ class GiphyAttachment extends StatelessWidget { this.messageTheme, this.message, this.size, + this.onShowMessage, }) : super(key: key); @override @@ -75,6 +77,7 @@ class GiphyAttachment extends StatelessWidget { userName: message.user.name, sentAt: message.createdAt, message: message, + onShowMessage: onShowMessage, ), ); })); diff --git a/lib/src/image_actions_modal.dart b/lib/src/image_actions_modal.dart index 168581c0..0001df6f 100644 --- a/lib/src/image_actions_modal.dart +++ b/lib/src/image_actions_modal.dart @@ -15,9 +15,15 @@ class ImageActionsModal extends StatelessWidget { final String sentAt; final List urls; final currentIndex; + final VoidCallback onShowMessage; ImageActionsModal( - {this.message, this.userName, this.sentAt, this.urls, this.currentIndex}); + {this.message, + this.userName, + this.sentAt, + this.urls, + this.currentIndex, + this.onShowMessage}); @override Widget build(BuildContext context) { @@ -134,10 +140,8 @@ class ImageActionsModal extends StatelessWidget { size: 24.0, color: StreamChatTheme.of(context).colorTheme.black, - ), () { - Navigator.pop(context); - Navigator.pop(context); - }), + ), + onShowMessage), _buildButton( context, 'Save ${urls[currentIndex].type == 'video' ? 'Video' : 'Image'}', diff --git a/lib/src/image_attachment.dart b/lib/src/image_attachment.dart index 3210949b..f9e3290b 100644 --- a/lib/src/image_attachment.dart +++ b/lib/src/image_attachment.dart @@ -13,6 +13,7 @@ class ImageAttachment extends StatelessWidget { final MessageTheme messageTheme; final Size size; final bool showTitle; + final ShowMessageCallback onShowMessage; const ImageAttachment({ Key key, @@ -21,6 +22,7 @@ class ImageAttachment extends StatelessWidget { @required this.size, this.messageTheme, this.showTitle = true, + this.onShowMessage, }) : super(key: key); @override @@ -56,6 +58,7 @@ class ImageAttachment extends StatelessWidget { userName: message.user.name, sentAt: message.createdAt, message: message, + onShowMessage: onShowMessage, ), ); }, diff --git a/lib/src/image_header.dart b/lib/src/image_header.dart index a9f1173f..6139bc7c 100644 --- a/lib/src/image_header.dart +++ b/lib/src/image_header.dart @@ -13,6 +13,9 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget { /// By default it calls [Navigator.pop] final VoidCallback onBackPressed; + /// Callback to call when pressing the show message button. + final VoidCallback onShowMessage; + /// Callback to call when the header is tapped. final VoidCallback onTitleTap; @@ -35,6 +38,7 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget { this.currentIndex, this.showBackButton = true, this.onBackPressed, + this.onShowMessage, this.onTitleTap, this.onImageTap, this.userName = '', @@ -111,6 +115,7 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget { message: message, urls: urls, currentIndex: currentIndex, + onShowMessage: onShowMessage, ), ); }); diff --git a/lib/src/message_list_view.dart b/lib/src/message_list_view.dart index 40680991..1bcce91f 100644 --- a/lib/src/message_list_view.dart +++ b/lib/src/message_list_view.dart @@ -116,6 +116,7 @@ class MessageListView extends StatefulWidget { this.scrollController, this.itemPositionListener, this.highlightInitialMessage = false, + this.onShowMessage, }) : super(key: key); /// Function used to build a custom message widget @@ -162,6 +163,8 @@ class MessageListView extends StatefulWidget { /// Also See [StreamChannel] final bool highlightInitialMessage; + final ShowMessageCallback onShowMessage; + @override _MessageListViewState createState() => _MessageListViewState(); } @@ -711,6 +714,7 @@ class _MessageListViewState extends State { messageTheme: isMyMessage ? StreamChatTheme.of(context).ownMessageTheme : StreamChatTheme.of(context).otherMessageTheme, + onShowMessage: widget.onShowMessage, ); } @@ -788,6 +792,7 @@ class _MessageListViewState extends State { : StreamChatTheme.of(context).otherMessageTheme, readList: readList, allRead: allRead, + onShowMessage: widget.onShowMessage, ); if (!initialMessageHighlightComplete && diff --git a/lib/src/message_widget.dart b/lib/src/message_widget.dart index 5c175512..474c3bcf 100644 --- a/lib/src/message_widget.dart +++ b/lib/src/message_widget.dart @@ -119,6 +119,8 @@ class MessageWidget extends StatefulWidget { final List readList; + final ShowMessageCallback onShowMessage; + /// If true show the users username next to the timestamp of the message final bool showUsername; final bool showTimestamp; @@ -157,6 +159,7 @@ class MessageWidget extends StatefulWidget { this.onUserAvatarTap, this.onLinkTap, this.onMessageActions, + this.onShowMessage, this.editMessageInputBuilder, this.textBuilder, Map customAttachmentBuilders, @@ -179,6 +182,7 @@ class MessageWidget extends StatefulWidget { MediaQuery.of(context).size.width * 0.8, MediaQuery.of(context).size.height * 0.3, ), + onShowMessage: onShowMessage, ); }, 'video': (context, message, attachment) { @@ -190,6 +194,7 @@ class MessageWidget extends StatefulWidget { MediaQuery.of(context).size.height * 0.3, ), message: message, + onShowMessage: onShowMessage, ); }, 'giphy': (context, message, attachment) { @@ -201,6 +206,7 @@ class MessageWidget extends StatefulWidget { MediaQuery.of(context).size.width * 0.8, MediaQuery.of(context).size.height * 0.3, ), + onShowMessage: onShowMessage, ); }, 'file': (context, message, attachment) { diff --git a/lib/src/video_attachment.dart b/lib/src/video_attachment.dart index 21ede87a..83763aee 100644 --- a/lib/src/video_attachment.dart +++ b/lib/src/video_attachment.dart @@ -14,6 +14,7 @@ class VideoAttachment extends StatefulWidget { final MessageTheme messageTheme; final Size size; final Message message; + final ShowMessageCallback onShowMessage; VideoAttachment({ Key key, @@ -21,6 +22,7 @@ class VideoAttachment extends StatefulWidget { @required this.messageTheme, this.message, this.size, + this.onShowMessage, }) : super(key: key); @override @@ -95,6 +97,7 @@ class _VideoAttachmentState extends State { userName: widget.message.user.name, sentAt: widget.message.createdAt, message: widget.message, + onShowMessage: widget.onShowMessage, ), ), ),