[Message Input] Add reply_to_message_id in case of threadless reply
Signed-off-by: Sahil Kumar <[email protected]>
This commit is contained in:
+22
-16
@@ -110,7 +110,7 @@ class MessageInput extends StatefulWidget {
|
|||||||
this.actionsLocation = ActionsLocation.left,
|
this.actionsLocation = ActionsLocation.left,
|
||||||
this.attachmentThumbnailBuilders,
|
this.attachmentThumbnailBuilders,
|
||||||
this.focusNode,
|
this.focusNode,
|
||||||
this.replyMessage,
|
this.replyToMessage,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
/// Message to edit
|
/// Message to edit
|
||||||
@@ -160,7 +160,7 @@ class MessageInput extends StatefulWidget {
|
|||||||
final FocusNode focusNode;
|
final FocusNode focusNode;
|
||||||
|
|
||||||
///
|
///
|
||||||
final Message replyMessage;
|
final Message replyToMessage;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
MessageInputState createState() => MessageInputState();
|
MessageInputState createState() => MessageInputState();
|
||||||
@@ -203,9 +203,9 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
/// The editing controller passed to the input TextField
|
/// The editing controller passed to the input TextField
|
||||||
TextEditingController textEditingController;
|
TextEditingController textEditingController;
|
||||||
|
|
||||||
Message _replyMessage;
|
Message _replyToMessage;
|
||||||
|
|
||||||
bool get _hasReplyMessage => _replyMessage != null;
|
bool get _hasReplyToMessage => _replyToMessage != null;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -224,7 +224,7 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
if (_hasReplyMessage)
|
if (_hasReplyToMessage)
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
@@ -242,7 +242,7 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
visualDensity: VisualDensity.compact,
|
visualDensity: VisualDensity.compact,
|
||||||
icon: StreamSvgIcon.close_small(),
|
icon: StreamSvgIcon.close_small(),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
setState(() => _replyMessage = null);
|
setState(() => _replyToMessage = null);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -417,7 +417,7 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
_buildRepyToMessage(),
|
_buildReplyToMessage(),
|
||||||
_buildAttachments(),
|
_buildAttachments(),
|
||||||
LimitedBox(
|
LimitedBox(
|
||||||
maxHeight: widget.maxHeight,
|
maxHeight: widget.maxHeight,
|
||||||
@@ -1321,20 +1321,20 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
_commandsOverlay = null;
|
_commandsOverlay = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildRepyToMessage() {
|
Widget _buildReplyToMessage() {
|
||||||
if (!_hasReplyMessage) {
|
if (!_hasReplyToMessage) {
|
||||||
return Offstage();
|
return Offstage();
|
||||||
}
|
}
|
||||||
final containsUrl = _replyMessage.attachments
|
final containsUrl = _replyToMessage.attachments
|
||||||
?.any((element) => element.ogScrapeUrl != null) ==
|
?.any((element) => element.ogScrapeUrl != null) ==
|
||||||
true;
|
true;
|
||||||
return Transform(
|
return Transform(
|
||||||
transform: Matrix4.rotationY(pi),
|
transform: Matrix4.rotationY(pi),
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: ReplyMessageWidget(
|
child: ReplyToMessageWidget(
|
||||||
reverse: true,
|
reverse: true,
|
||||||
showBorder: !containsUrl,
|
showBorder: !containsUrl,
|
||||||
message: _replyMessage,
|
message: _replyToMessage,
|
||||||
messageTheme: StreamChatTheme.of(context).otherMessageTheme,
|
messageTheme: StreamChatTheme.of(context).otherMessageTheme,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -1982,7 +1982,7 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
|
|
||||||
textEditingController.clear();
|
textEditingController.clear();
|
||||||
_attachments.clear();
|
_attachments.clear();
|
||||||
_replyMessage = null;
|
_replyToMessage = null;
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_messageIsPresent = false;
|
_messageIsPresent = false;
|
||||||
@@ -2014,6 +2014,12 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (widget.replyToMessage != null) {
|
||||||
|
message = message.copyWith(
|
||||||
|
replyToMessageId: widget.replyToMessage.id,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (widget.preMessageSending != null) {
|
if (widget.preMessageSending != null) {
|
||||||
message = await widget.preMessageSending(message);
|
message = await widget.preMessageSending(message);
|
||||||
}
|
}
|
||||||
@@ -2057,7 +2063,7 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
_replyMessage = widget.replyMessage;
|
_replyToMessage = widget.replyToMessage;
|
||||||
|
|
||||||
_focusNode = widget.focusNode ?? FocusNode();
|
_focusNode = widget.focusNode ?? FocusNode();
|
||||||
|
|
||||||
@@ -2124,8 +2130,8 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
@override
|
@override
|
||||||
void didUpdateWidget(MessageInput oldWidget) {
|
void didUpdateWidget(MessageInput oldWidget) {
|
||||||
super.didUpdateWidget(oldWidget);
|
super.didUpdateWidget(oldWidget);
|
||||||
if (widget.replyMessage?.id != _replyMessage?.id) {
|
if (widget.replyToMessage?.id != _replyToMessage?.id) {
|
||||||
_replyMessage = widget.replyMessage;
|
_replyToMessage = widget.replyToMessage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,9 +58,6 @@ class MessageWidget extends StatefulWidget {
|
|||||||
/// The message
|
/// The message
|
||||||
final Message message;
|
final Message message;
|
||||||
|
|
||||||
/// The replyMessage
|
|
||||||
final Message replyMessage;
|
|
||||||
|
|
||||||
/// The message theme
|
/// The message theme
|
||||||
final MessageTheme messageTheme;
|
final MessageTheme messageTheme;
|
||||||
|
|
||||||
@@ -140,7 +137,6 @@ class MessageWidget extends StatefulWidget {
|
|||||||
Key key,
|
Key key,
|
||||||
@required this.message,
|
@required this.message,
|
||||||
@required this.messageTheme,
|
@required this.messageTheme,
|
||||||
this.replyMessage,
|
|
||||||
this.reverse = false,
|
this.reverse = false,
|
||||||
this.translateUserAvatar = true,
|
this.translateUserAvatar = true,
|
||||||
this.shape,
|
this.shape,
|
||||||
@@ -241,7 +237,7 @@ class _MessageWidgetState extends State<MessageWidget> {
|
|||||||
bool get showInChannel =>
|
bool get showInChannel =>
|
||||||
widget.showInChannelIndicator && widget.message?.showInChannel == true;
|
widget.showInChannelIndicator && widget.message?.showInChannel == true;
|
||||||
|
|
||||||
bool get _hasReplyMessage => widget.replyMessage != null;
|
bool get _hasReplyToMessage => widget.message?.replyToMessage != null;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -352,7 +348,7 @@ class _MessageWidgetState extends State<MessageWidget> {
|
|||||||
shape: widget.shape ??
|
shape: widget.shape ??
|
||||||
RoundedRectangleBorder(
|
RoundedRectangleBorder(
|
||||||
side: isOnlyEmoji &&
|
side: isOnlyEmoji &&
|
||||||
!_hasReplyMessage
|
!_hasReplyToMessage
|
||||||
? BorderSide.none
|
? BorderSide.none
|
||||||
: widget.borderSide ??
|
: widget.borderSide ??
|
||||||
BorderSide(
|
BorderSide(
|
||||||
@@ -383,10 +379,11 @@ class _MessageWidgetState extends State<MessageWidget> {
|
|||||||
mainAxisSize:
|
mainAxisSize:
|
||||||
MainAxisSize.min,
|
MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
if (_hasReplyMessage)
|
if (_hasReplyToMessage)
|
||||||
ReplyMessageWidget(
|
ReplyToMessageWidget(
|
||||||
message: widget
|
message: widget
|
||||||
.replyMessage,
|
.message
|
||||||
|
.replyToMessage,
|
||||||
messageTheme: isMyMessage
|
messageTheme: isMyMessage
|
||||||
? StreamChatTheme.of(
|
? StreamChatTheme.of(
|
||||||
context)
|
context)
|
||||||
@@ -941,7 +938,7 @@ class _MessageWidgetState extends State<MessageWidget> {
|
|||||||
if (widget.message.attachments
|
if (widget.message.attachments
|
||||||
?.any((element) => element.ogScrapeUrl != null) ==
|
?.any((element) => element.ogScrapeUrl != null) ==
|
||||||
true &&
|
true &&
|
||||||
!_hasReplyMessage)
|
!_hasReplyToMessage)
|
||||||
_buildUrlAttachment(),
|
_buildUrlAttachment(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -953,7 +950,7 @@ class _MessageWidgetState extends State<MessageWidget> {
|
|||||||
widget.message.text.characters.every((c) => Emoji.byChar(c) != null);
|
widget.message.text.characters.every((c) => Emoji.byChar(c) != null);
|
||||||
|
|
||||||
Color _getBackgroundColor() {
|
Color _getBackgroundColor() {
|
||||||
if (_hasReplyMessage) {
|
if (_hasReplyToMessage) {
|
||||||
return widget.messageTheme.messageBackgroundColor;
|
return widget.messageTheme.messageBackgroundColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class _VideoAttachmentThumbnailState extends State<_VideoAttachmentThumbnail> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
class ReplyMessageWidget extends StatelessWidget {
|
class ReplyToMessageWidget extends StatelessWidget {
|
||||||
/// The message
|
/// The message
|
||||||
final Message message;
|
final Message message;
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ class ReplyMessageWidget extends StatelessWidget {
|
|||||||
attachmentThumbnailBuilders;
|
attachmentThumbnailBuilders;
|
||||||
|
|
||||||
///
|
///
|
||||||
ReplyMessageWidget({
|
ReplyToMessageWidget({
|
||||||
Key key,
|
Key key,
|
||||||
@required this.message,
|
@required this.message,
|
||||||
@required this.messageTheme,
|
@required this.messageTheme,
|
||||||
|
|||||||
+2
-1
@@ -28,7 +28,8 @@ dependencies:
|
|||||||
file_picker: ^2.0.12
|
file_picker: ^2.0.12
|
||||||
image_picker: ^0.6.7+2
|
image_picker: ^0.6.7+2
|
||||||
flutter_keyboard_visibility: ^3.3.0
|
flutter_keyboard_visibility: ^3.3.0
|
||||||
stream_chat: ^0.2.20
|
stream_chat:
|
||||||
|
path: ../stream-chat-dart
|
||||||
mime: ^0.9.6+3
|
mime: ^0.9.6+3
|
||||||
video_compress: ^2.1.1
|
video_compress: ^2.1.1
|
||||||
visibility_detector: ^0.1.5
|
visibility_detector: ^0.1.5
|
||||||
|
|||||||
Reference in New Issue
Block a user