feat: Added show in chat
This commit is contained in:
@@ -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,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -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'}',
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 &&
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user