feat: Added show in chat

This commit is contained in:
Deven Joshi
2021-01-04 16:00:20 +05:30
parent 43446713c8
commit 95d91f3959
12 changed files with 123 additions and 6 deletions
+30 -1
View File
@@ -5,6 +5,9 @@ import 'package:jiffy/jiffy.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.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 /// Detail screen for a 1:1 chat correspondence
class ChatInfoScreen extends StatefulWidget { class ChatInfoScreen extends StatefulWidget {
/// User in consideration /// User in consideration
@@ -190,7 +193,9 @@ class _ChatInfoScreenState extends State<ChatInfoScreen> {
StreamChatTheme.of(context).colorTheme.black.withOpacity(0.5), StreamChatTheme.of(context).colorTheme.black.withOpacity(0.5),
), ),
), ),
trailing: StreamSvgIcon.right(), trailing: StreamSvgIcon.right(
color: StreamChatTheme.of(context).colorTheme.grey,
),
onTap: () { onTap: () {
final channel = StreamChannel.of(context).channel; final channel = StreamChannel.of(context).channel;
@@ -208,6 +213,30 @@ class _ChatInfoScreenState extends State<ChatInfoScreen> {
), ),
], ],
paginationParams: PaginationParams(limit: 20), 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,
),
);
},
), ),
), ),
), ),
+25
View File
@@ -9,6 +9,7 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'chat_info_screen.dart'; import 'chat_info_screen.dart';
import 'main.dart'; import 'main.dart';
import 'routes/routes.dart';
class GroupInfoScreen extends StatefulWidget { class GroupInfoScreen extends StatefulWidget {
@override @override
@@ -485,6 +486,30 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
), ),
], ],
paginationParams: PaginationParams(limit: 20), 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,
),
);
},
), ),
), ),
), ),
+21
View File
@@ -517,6 +517,27 @@ class ChannelPage extends StatelessWidget {
parent: parentMessage, 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( Positioned(
bottom: 0, bottom: 0,
@@ -20,10 +20,13 @@ class ChannelMediaDisplayScreen extends StatefulWidget {
/// The builder used when the file list is empty. /// The builder used when the file list is empty.
final WidgetBuilder emptyBuilder; final WidgetBuilder emptyBuilder;
final ShowMessageCallback onShowMessage;
const ChannelMediaDisplayScreen({ const ChannelMediaDisplayScreen({
this.sortOptions, this.sortOptions,
this.paginationParams, this.paginationParams,
this.emptyBuilder, this.emptyBuilder,
this.onShowMessage,
}); });
@override @override
@@ -191,6 +194,7 @@ class _ChannelMediaDisplayScreenState extends State<ChannelMediaDisplayScreen> {
message: media[position].message, message: media[position].message,
sentAt: media[position].message.createdAt, sentAt: media[position].message.createdAt,
userName: media[position].message.user.name, userName: media[position].message.user.name,
onShowMessage: widget.onShowMessage,
), ),
), ),
), ),
+9
View File
@@ -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_footer.dart';
import 'package:stream_chat_flutter/src/image_header.dart'; import 'package:stream_chat_flutter/src/image_header.dart';
import 'package:video_player/video_player.dart'; import 'package:video_player/video_player.dart';
import 'stream_channel.dart';
import '../stream_chat_flutter.dart'; import '../stream_chat_flutter.dart';
typedef ShowMessageCallback = void Function(Message message, Channel channel);
/// A full screen image widget /// A full screen image widget
class FullScreenMedia extends StatefulWidget { class FullScreenMedia extends StatefulWidget {
/// The url of the image /// The url of the image
@@ -18,6 +21,7 @@ class FullScreenMedia extends StatefulWidget {
final int startIndex; final int startIndex;
final String userName; final String userName;
final DateTime sentAt; final DateTime sentAt;
final ShowMessageCallback onShowMessage;
/// Instantiate a new FullScreenImage /// Instantiate a new FullScreenImage
const FullScreenMedia({ const FullScreenMedia({
@@ -27,6 +31,7 @@ class FullScreenMedia extends StatefulWidget {
this.startIndex = 0, this.startIndex = 0,
this.userName = '', this.userName = '',
this.sentAt, this.sentAt,
this.onShowMessage,
}) : super(key: key); }) : super(key: key);
@override @override
@@ -167,6 +172,10 @@ class _FullScreenMediaState extends State<FullScreenMedia>
message: widget.message, message: widget.message,
urls: widget.mediaAttachments, urls: widget.mediaAttachments,
currentIndex: _currentPage, currentIndex: _currentPage,
onShowMessage: () {
widget.onShowMessage(
widget.message, StreamChannel.of(context).channel);
},
), ),
ImageFooter( ImageFooter(
currentPage: _currentPage, currentPage: _currentPage,
+3
View File
@@ -12,6 +12,7 @@ class GiphyAttachment extends StatelessWidget {
final MessageTheme messageTheme; final MessageTheme messageTheme;
final Message message; final Message message;
final Size size; final Size size;
final ShowMessageCallback onShowMessage;
const GiphyAttachment({ const GiphyAttachment({
Key key, Key key,
@@ -19,6 +20,7 @@ class GiphyAttachment extends StatelessWidget {
this.messageTheme, this.messageTheme,
this.message, this.message,
this.size, this.size,
this.onShowMessage,
}) : super(key: key); }) : super(key: key);
@override @override
@@ -75,6 +77,7 @@ class GiphyAttachment extends StatelessWidget {
userName: message.user.name, userName: message.user.name,
sentAt: message.createdAt, sentAt: message.createdAt,
message: message, message: message,
onShowMessage: onShowMessage,
), ),
); );
})); }));
+9 -5
View File
@@ -15,9 +15,15 @@ class ImageActionsModal extends StatelessWidget {
final String sentAt; final String sentAt;
final List<Attachment> urls; final List<Attachment> urls;
final currentIndex; final currentIndex;
final VoidCallback onShowMessage;
ImageActionsModal( ImageActionsModal(
{this.message, this.userName, this.sentAt, this.urls, this.currentIndex}); {this.message,
this.userName,
this.sentAt,
this.urls,
this.currentIndex,
this.onShowMessage});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -134,10 +140,8 @@ class ImageActionsModal extends StatelessWidget {
size: 24.0, size: 24.0,
color: color:
StreamChatTheme.of(context).colorTheme.black, StreamChatTheme.of(context).colorTheme.black,
), () { ),
Navigator.pop(context); onShowMessage),
Navigator.pop(context);
}),
_buildButton( _buildButton(
context, context,
'Save ${urls[currentIndex].type == 'video' ? 'Video' : 'Image'}', 'Save ${urls[currentIndex].type == 'video' ? 'Video' : 'Image'}',
+3
View File
@@ -13,6 +13,7 @@ class ImageAttachment extends StatelessWidget {
final MessageTheme messageTheme; final MessageTheme messageTheme;
final Size size; final Size size;
final bool showTitle; final bool showTitle;
final ShowMessageCallback onShowMessage;
const ImageAttachment({ const ImageAttachment({
Key key, Key key,
@@ -21,6 +22,7 @@ class ImageAttachment extends StatelessWidget {
@required this.size, @required this.size,
this.messageTheme, this.messageTheme,
this.showTitle = true, this.showTitle = true,
this.onShowMessage,
}) : super(key: key); }) : super(key: key);
@override @override
@@ -56,6 +58,7 @@ class ImageAttachment extends StatelessWidget {
userName: message.user.name, userName: message.user.name,
sentAt: message.createdAt, sentAt: message.createdAt,
message: message, message: message,
onShowMessage: onShowMessage,
), ),
); );
}, },
+5
View File
@@ -13,6 +13,9 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget {
/// By default it calls [Navigator.pop] /// By default it calls [Navigator.pop]
final VoidCallback onBackPressed; final VoidCallback onBackPressed;
/// Callback to call when pressing the show message button.
final VoidCallback onShowMessage;
/// Callback to call when the header is tapped. /// Callback to call when the header is tapped.
final VoidCallback onTitleTap; final VoidCallback onTitleTap;
@@ -35,6 +38,7 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget {
this.currentIndex, this.currentIndex,
this.showBackButton = true, this.showBackButton = true,
this.onBackPressed, this.onBackPressed,
this.onShowMessage,
this.onTitleTap, this.onTitleTap,
this.onImageTap, this.onImageTap,
this.userName = '', this.userName = '',
@@ -111,6 +115,7 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget {
message: message, message: message,
urls: urls, urls: urls,
currentIndex: currentIndex, currentIndex: currentIndex,
onShowMessage: onShowMessage,
), ),
); );
}); });
+5
View File
@@ -116,6 +116,7 @@ class MessageListView extends StatefulWidget {
this.scrollController, this.scrollController,
this.itemPositionListener, this.itemPositionListener,
this.highlightInitialMessage = false, this.highlightInitialMessage = false,
this.onShowMessage,
}) : super(key: key); }) : super(key: key);
/// Function used to build a custom message widget /// Function used to build a custom message widget
@@ -162,6 +163,8 @@ class MessageListView extends StatefulWidget {
/// Also See [StreamChannel] /// Also See [StreamChannel]
final bool highlightInitialMessage; final bool highlightInitialMessage;
final ShowMessageCallback onShowMessage;
@override @override
_MessageListViewState createState() => _MessageListViewState(); _MessageListViewState createState() => _MessageListViewState();
} }
@@ -711,6 +714,7 @@ class _MessageListViewState extends State<MessageListView> {
messageTheme: isMyMessage messageTheme: isMyMessage
? StreamChatTheme.of(context).ownMessageTheme ? StreamChatTheme.of(context).ownMessageTheme
: StreamChatTheme.of(context).otherMessageTheme, : StreamChatTheme.of(context).otherMessageTheme,
onShowMessage: widget.onShowMessage,
); );
} }
@@ -788,6 +792,7 @@ class _MessageListViewState extends State<MessageListView> {
: StreamChatTheme.of(context).otherMessageTheme, : StreamChatTheme.of(context).otherMessageTheme,
readList: readList, readList: readList,
allRead: allRead, allRead: allRead,
onShowMessage: widget.onShowMessage,
); );
if (!initialMessageHighlightComplete && if (!initialMessageHighlightComplete &&
+6
View File
@@ -119,6 +119,8 @@ class MessageWidget extends StatefulWidget {
final List<Read> readList; final List<Read> readList;
final ShowMessageCallback onShowMessage;
/// If true show the users username next to the timestamp of the message /// If true show the users username next to the timestamp of the message
final bool showUsername; final bool showUsername;
final bool showTimestamp; final bool showTimestamp;
@@ -157,6 +159,7 @@ class MessageWidget extends StatefulWidget {
this.onUserAvatarTap, this.onUserAvatarTap,
this.onLinkTap, this.onLinkTap,
this.onMessageActions, this.onMessageActions,
this.onShowMessage,
this.editMessageInputBuilder, this.editMessageInputBuilder,
this.textBuilder, this.textBuilder,
Map<String, AttachmentBuilder> customAttachmentBuilders, Map<String, AttachmentBuilder> customAttachmentBuilders,
@@ -179,6 +182,7 @@ class MessageWidget extends StatefulWidget {
MediaQuery.of(context).size.width * 0.8, MediaQuery.of(context).size.width * 0.8,
MediaQuery.of(context).size.height * 0.3, MediaQuery.of(context).size.height * 0.3,
), ),
onShowMessage: onShowMessage,
); );
}, },
'video': (context, message, attachment) { 'video': (context, message, attachment) {
@@ -190,6 +194,7 @@ class MessageWidget extends StatefulWidget {
MediaQuery.of(context).size.height * 0.3, MediaQuery.of(context).size.height * 0.3,
), ),
message: message, message: message,
onShowMessage: onShowMessage,
); );
}, },
'giphy': (context, message, attachment) { 'giphy': (context, message, attachment) {
@@ -201,6 +206,7 @@ class MessageWidget extends StatefulWidget {
MediaQuery.of(context).size.width * 0.8, MediaQuery.of(context).size.width * 0.8,
MediaQuery.of(context).size.height * 0.3, MediaQuery.of(context).size.height * 0.3,
), ),
onShowMessage: onShowMessage,
); );
}, },
'file': (context, message, attachment) { 'file': (context, message, attachment) {
+3
View File
@@ -14,6 +14,7 @@ class VideoAttachment extends StatefulWidget {
final MessageTheme messageTheme; final MessageTheme messageTheme;
final Size size; final Size size;
final Message message; final Message message;
final ShowMessageCallback onShowMessage;
VideoAttachment({ VideoAttachment({
Key key, Key key,
@@ -21,6 +22,7 @@ class VideoAttachment extends StatefulWidget {
@required this.messageTheme, @required this.messageTheme,
this.message, this.message,
this.size, this.size,
this.onShowMessage,
}) : super(key: key); }) : super(key: key);
@override @override
@@ -95,6 +97,7 @@ class _VideoAttachmentState extends State<VideoAttachment> {
userName: widget.message.user.name, userName: widget.message.user.name,
sentAt: widget.message.createdAt, sentAt: widget.message.createdAt,
message: widget.message, message: widget.message,
onShowMessage: widget.onShowMessage,
), ),
), ),
), ),