From 190f2674969e3ca5b1ab88054906dc241ebf4932 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 16 Jun 2023 02:13:56 +0530 Subject: [PATCH] refactor(ui): refactor stream quouted message. Signed-off-by: xsahil03x --- .../message_input/quoted_message_widget.dart | 69 +++++++++++-------- .../message_input/stream_message_input.dart | 1 + .../lib/src/message_widget/message_card.dart | 23 +++++-- .../src/message_widget/quoted_message.dart | 38 +++------- 4 files changed, 65 insertions(+), 66 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input/quoted_message_widget.dart b/packages/stream_chat_flutter/lib/src/message_input/quoted_message_widget.dart index 554e8d12..a61ced63 100644 --- a/packages/stream_chat_flutter/lib/src/message_input/quoted_message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/message_input/quoted_message_widget.dart @@ -20,7 +20,6 @@ class StreamQuotedMessageWidget extends StatelessWidget { this.textLimit = 170, this.attachmentThumbnailBuilders, this.padding = const EdgeInsets.all(8), - this.onTap, this.onQuotedMessageClear, }); @@ -46,9 +45,6 @@ class StreamQuotedMessageWidget extends StatelessWidget { /// Padding around the widget final EdgeInsetsGeometry padding; - /// Callback for tap on widget - final GestureTapCallback? onTap; - /// Callback for clearing quoted messages. final VoidCallback? onQuotedMessageClear; @@ -77,19 +73,12 @@ class StreamQuotedMessageWidget extends StatelessWidget { showOnlineStatus: false, ), ]; - return MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: onTap, - child: Padding( - padding: padding, - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisSize: MainAxisSize.min, - children: reverse ? children.reversed.toList() : children, - ), - ), + return Padding( + padding: padding, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisSize: MainAxisSize.min, + children: reverse ? children.reversed.toList() : children, ), ); } @@ -258,23 +247,26 @@ class _ParseAttachments extends StatelessWidget { child = attachmentBuilder(context, attachment); } } - child = AbsorbPointer(child: child); + + final isImageFile = attachment.title?.mimeType?.type == 'image'; + final isVideoFile = attachment.title?.mimeType?.type == 'video'; + return Material( clipBehavior: Clip.hardEdge, type: MaterialType.transparency, - shape: attachment.type == 'file' + shape: attachment.type == 'file' && (!isImageFile && !isVideoFile) ? null : RoundedRectangleBorder( side: const BorderSide(width: 0, color: Colors.transparent), borderRadius: BorderRadius.circular(8), ), - child: child, + child: AbsorbPointer(child: child), ); } Map get _defaultAttachmentBuilder { - return { + final builders = { 'image': (_, attachment) { return StreamImageAttachment( attachment: attachment, @@ -315,16 +307,33 @@ class _ParseAttachments extends StatelessWidget { fit: BoxFit.cover, ); }, - 'file': (_, attachment) { - return SizedBox( - height: 32, - width: 32, - child: getFileTypeImage( - attachment.extraData['mime_type'] as String?, - ), - ); - }, }; + + builders['file'] = (_, attachment) { + return SizedBox( + height: 32, + width: 32, + child: Builder( + builder: (context) { + final isImageFile = attachment.title?.mimeType?.type == 'image'; + if (isImageFile) { + return builders['image']!(context, attachment); + } + + final isVideoFile = attachment.title?.mimeType?.type == 'video'; + if (isVideoFile) { + return builders['video']!(context, attachment); + } + + return getFileTypeImage( + attachment.extraData['mime_type'] as String?, + ); + }, + ), + ); + }; + + return builders; } } diff --git a/packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart b/packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart index cca0ab19..1de6c914 100644 --- a/packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart @@ -1133,6 +1133,7 @@ class StreamMessageInputState extends State messageTheme: _streamChatTheme.otherMessageTheme, padding: const EdgeInsets.fromLTRB(8, 8, 8, 0), onQuotedMessageClear: widget.onQuotedMessageCleared, + attachmentThumbnailBuilders: widget.attachmentThumbnailBuilders, ); } diff --git a/packages/stream_chat_flutter/lib/src/message_widget/message_card.dart b/packages/stream_chat_flutter/lib/src/message_widget/message_card.dart index e7f1d506..ca3346d9 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget/message_card.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget/message_card.dart @@ -129,8 +129,11 @@ class _MessageCardState extends State { @override Widget build(BuildContext context) { + final onQuotedMessageTap = widget.onQuotedMessageTap; + return Card( elevation: 0, + clipBehavior: Clip.hardEdge, margin: EdgeInsets.symmetric( horizontal: (widget.isFailedState ? 15.0 : 0.0) + (widget.showUserAvatar == DisplayWidget.gone ? 0 : 4.0), @@ -150,15 +153,23 @@ class _MessageCardState extends State { maxWidth: widthLimit ?? double.infinity, ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, children: [ if (widget.hasQuotedMessage) - QuotedMessage( - reverse: widget.reverse, - message: widget.message, - hasNonUrlAttachments: widget.hasNonUrlAttachments, - onQuotedMessageTap: widget.onQuotedMessageTap, + MouseRegion( + cursor: SystemMouseCursors.click, + child: InkWell( + onTap: !widget.message.quotedMessage!.isDeleted && + onQuotedMessageTap != null + ? () => onQuotedMessageTap(widget.message.quotedMessageId) + : null, + child: QuotedMessage( + reverse: widget.reverse, + message: widget.message, + hasNonUrlAttachments: widget.hasNonUrlAttachments, + ), + ), ), if (widget.hasNonUrlAttachments) ParseAttachments( diff --git a/packages/stream_chat_flutter/lib/src/message_widget/quoted_message.dart b/packages/stream_chat_flutter/lib/src/message_widget/quoted_message.dart index f75bdbe7..673853af 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget/quoted_message.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget/quoted_message.dart @@ -7,63 +7,41 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; /// /// Used in [QuotedMessageCard]. Should not be used elsewhere. /// {@endtemplate} -class QuotedMessage extends StatefulWidget { +class QuotedMessage extends StatelessWidget { /// {@macro quotedMessage} const QuotedMessage({ super.key, required this.message, required this.reverse, required this.hasNonUrlAttachments, - this.onQuotedMessageTap, }); /// {@macro message} final Message message; - /// {@macro onQuotedMessageTap} - final OnQuotedMessageTap? onQuotedMessageTap; - /// {@macro reverse} final bool reverse; /// {@macro hasNonUrlAttachments} final bool hasNonUrlAttachments; - @override - State createState() => _QuotedMessageState(); -} - -class _QuotedMessageState extends State { - late StreamChatState _streamChat; - late StreamChatThemeData _streamChatTheme; - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - _streamChatTheme = StreamChatTheme.of(context); - _streamChat = StreamChat.of(context); - } - @override Widget build(BuildContext context) { - final isMyMessage = widget.message.user?.id == _streamChat.currentUser?.id; - final onTap = widget.message.quotedMessage?.isDeleted != true && - widget.onQuotedMessageTap != null - ? () => widget.onQuotedMessageTap!(widget.message.quotedMessageId) - : null; - final chatThemeData = _streamChatTheme; + final streamChat = StreamChat.of(context); + final chatThemeData = StreamChatTheme.of(context); + + final isMyMessage = message.user?.id == streamChat.currentUser?.id; return StreamQuotedMessageWidget( - onTap: onTap, - message: widget.message.quotedMessage!, + message: message.quotedMessage!, messageTheme: isMyMessage ? chatThemeData.otherMessageTheme : chatThemeData.ownMessageTheme, - reverse: widget.reverse, + reverse: reverse, padding: EdgeInsets.only( right: 8, left: 8, top: 8, - bottom: widget.hasNonUrlAttachments ? 8 : 0, + bottom: hasNonUrlAttachments ? 8 : 0, ), ); }