From 09d9ec3ed59e88953e32c8581de4d80e93d450ed Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 16 Jun 2023 02:37:56 +0530 Subject: [PATCH] feat(ui): add support for `quotedMessageBuilder`. Signed-off-by: xsahil03x --- .../message_input/stream_message_input.dart | 27 ++++++++++++------- .../lib/src/message_widget/message_card.dart | 19 +++++++++---- .../src/message_widget/message_widget.dart | 9 +++++++ .../message_widget_content.dart | 6 +++++ 4 files changed, 47 insertions(+), 14 deletions(-) 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 1de6c914..3d80c14f 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 @@ -129,6 +129,7 @@ class StreamMessageInput extends StatefulWidget { this.customAutocompleteTriggers = const [], this.mentionAllAppUsers = false, this.sendButtonBuilder, + this.quotedMessageBuilder, this.shouldKeepFocusAfterMessage, this.validator = _defaultValidator, this.restorationId, @@ -265,6 +266,9 @@ class StreamMessageInput extends StatefulWidget { /// Builder for creating send button final MessageRelatedBuilder? sendButtonBuilder; + /// Builder for building quoted message + final Widget Function(BuildContext, Message)? quotedMessageBuilder; + /// Defines if the [StreamMessageInput] loses focuses after a message is sent. /// The default behaviour keeps focus until a command is enabled. final bool? shouldKeepFocusAfterMessage; @@ -1126,15 +1130,20 @@ class StreamMessageInputState extends State if (!_hasQuotedMessage) return const Offstage(); final containsUrl = _effectiveController.message.quotedMessage!.attachments .any((element) => element.titleLink != null); - return StreamQuotedMessageWidget( - reverse: true, - showBorder: !containsUrl, - message: _effectiveController.message.quotedMessage!, - messageTheme: _streamChatTheme.otherMessageTheme, - padding: const EdgeInsets.fromLTRB(8, 8, 8, 0), - onQuotedMessageClear: widget.onQuotedMessageCleared, - attachmentThumbnailBuilders: widget.attachmentThumbnailBuilders, - ); + + return widget.quotedMessageBuilder?.call( + context, + _effectiveController.message.quotedMessage!, + ) ?? + StreamQuotedMessageWidget( + reverse: true, + showBorder: !containsUrl, + message: _effectiveController.message.quotedMessage!, + messageTheme: _streamChatTheme.otherMessageTheme, + padding: const EdgeInsets.fromLTRB(8, 8, 8, 0), + onQuotedMessageClear: widget.onQuotedMessageCleared, + attachmentThumbnailBuilders: widget.attachmentThumbnailBuilders, + ); } Widget _buildAttachments() { 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 ca3346d9..5cd93efc 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 @@ -29,6 +29,7 @@ class MessageCard extends StatefulWidget { this.borderSide, this.borderRadiusGeometry, this.textBuilder, + this.quotedMessageBuilder, this.onLinkTap, this.onMentionTap, this.onQuotedMessageTap, @@ -82,6 +83,9 @@ class MessageCard extends StatefulWidget { /// {@macro textBuilder} final Widget Function(BuildContext, Message)? textBuilder; + /// {@macro quotedMessageBuilder} + final Widget Function(BuildContext, Message)? quotedMessageBuilder; + /// {@macro onLinkTap} final void Function(String)? onLinkTap; @@ -130,6 +134,7 @@ class _MessageCardState extends State { @override Widget build(BuildContext context) { final onQuotedMessageTap = widget.onQuotedMessageTap; + final quotedMessageBuilder = widget.quotedMessageBuilder; return Card( elevation: 0, @@ -164,11 +169,15 @@ class _MessageCardState extends State { onQuotedMessageTap != null ? () => onQuotedMessageTap(widget.message.quotedMessageId) : null, - child: QuotedMessage( - reverse: widget.reverse, - message: widget.message, - hasNonUrlAttachments: widget.hasNonUrlAttachments, - ), + child: quotedMessageBuilder?.call( + context, + widget.message.quotedMessage!, + ) ?? + QuotedMessage( + reverse: widget.reverse, + message: widget.message, + hasNonUrlAttachments: widget.hasNonUrlAttachments, + ), ), ), if (widget.hasNonUrlAttachments) diff --git a/packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart b/packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart index fe7ccc19..61332a3c 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart @@ -79,6 +79,7 @@ class StreamMessageWidget extends StatefulWidget { this.onMessageActions, this.onShowMessage, this.userAvatarBuilder, + this.quotedMessageBuilder, this.editMessageInputBuilder, this.textBuilder, @Deprecated(''' @@ -354,6 +355,11 @@ class StreamMessageWidget extends StatefulWidget { /// {@endtemplate} final Widget Function(BuildContext, User)? userAvatarBuilder; + /// {@template quotedMessageBuilder} + /// Widget builder for building quoted message + /// {@endtemplate} + final Widget Function(BuildContext, Message)? quotedMessageBuilder; + /// {@template message} /// The message to display. /// {@endtemplate} @@ -577,6 +583,7 @@ class StreamMessageWidget extends StatefulWidget { Future Function(Message)? onConfirmDeleteTap, Widget Function(BuildContext, Message)? editMessageInputBuilder, Widget Function(BuildContext, Message)? textBuilder, + Widget Function(BuildContext, Message)? quotedMessageBuilder, @Deprecated(''' Use [bottomRowBuilderWithDefaultWidget] instead. Will be removed in the next major version. @@ -670,6 +677,7 @@ class StreamMessageWidget extends StatefulWidget { editMessageInputBuilder: editMessageInputBuilder ?? this.editMessageInputBuilder, textBuilder: textBuilder ?? this.textBuilder, + quotedMessageBuilder: quotedMessageBuilder ?? this.quotedMessageBuilder, bottomRowBuilderWithDefaultWidget: _bottomRowBuilderWithDefaultWidget, onMessageActions: onMessageActions ?? this.onMessageActions, message: message ?? this.message, @@ -965,6 +973,7 @@ class _StreamMessageWidgetState extends State borderSide: widget.borderSide, borderRadiusGeometry: widget.borderRadiusGeometry, textBuilder: widget.textBuilder, + quotedMessageBuilder: widget.quotedMessageBuilder, onLinkTap: widget.onLinkTap, onMentionTap: widget.onMentionTap, onQuotedMessageTap: widget.onQuotedMessageTap, diff --git a/packages/stream_chat_flutter/lib/src/message_widget/message_widget_content.dart b/packages/stream_chat_flutter/lib/src/message_widget/message_widget_content.dart index c9e403ad..f8543013 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget/message_widget_content.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget/message_widget_content.dart @@ -63,6 +63,7 @@ class MessageWidgetContent extends StatelessWidget { this.onMentionTap, this.onLinkTap, this.textBuilder, + this.quotedMessageBuilder, @Deprecated(''' Use [bottomRowBuilderWithDefaultWidget] instead. Will be removed in the next major version. @@ -170,6 +171,9 @@ class MessageWidgetContent extends StatelessWidget { /// {@macro textBuilder} final Widget Function(BuildContext, Message)? textBuilder; + /// {@macro quotedMessageBuilder} + final Widget Function(BuildContext, Message)? quotedMessageBuilder; + /// {@macro showReactionPickerIndicator} final bool showReactionPickerIndicator; @@ -351,6 +355,8 @@ class MessageWidgetContent extends StatelessWidget { onMentionTap: onMentionTap, onLinkTap: onLinkTap, textBuilder: textBuilder, + quotedMessageBuilder: + quotedMessageBuilder, borderRadiusGeometry: borderRadiusGeometry, borderSide: borderSide,