diff --git a/packages/stream_chat_flutter/lib/src/message_actions_modal/message_actions_modal.dart b/packages/stream_chat_flutter/lib/src/message_actions_modal/message_actions_modal.dart index 8a5d4740..a8aec217 100644 --- a/packages/stream_chat_flutter/lib/src/message_actions_modal/message_actions_modal.dart +++ b/packages/stream_chat_flutter/lib/src/message_actions_modal/message_actions_modal.dart @@ -101,20 +101,10 @@ class _MessageActionsModalState extends State { final user = StreamChat.of(context).currentUser; final roughMaxSize = size.width * 2 / 3; - var messageTextLength = widget.message.text!.length; - if (widget.message.quotedMessage != null) { - var quotedMessageLength = - (widget.message.quotedMessage!.text?.length ?? 0) + 40; - if (widget.message.quotedMessage!.attachments.isNotEmpty) { - quotedMessageLength += 40; - } - if (quotedMessageLength > messageTextLength) { - messageTextLength = quotedMessageLength; - } - } - final roughSentenceSize = messageTextLength * - (widget.messageTheme.messageTextStyle?.fontSize ?? 1) * - 1.2; + + final roughSentenceSize = widget.message + .roughMessageSize(widget.messageTheme.messageTextStyle?.fontSize); + final divFactor = widget.message.attachments.isNotEmpty ? 1 : (roughSentenceSize == 0 ? 1 : (roughSentenceSize / roughMaxSize)); @@ -289,6 +279,12 @@ class _MessageActionsModalState extends State { ) { var result = 0.0; var cont = true; + + print('INFO - max width: ${constraints.maxWidth}. ' + 'shiftFactor: $shiftFactor ' + 'divFactor: $divFactor ' + 'cont: $cont'); + if (user?.id == widget.message.user?.id) { if (divFactor >= 1.0) { // This calculation is hacky and does not cover all bases!!! @@ -358,6 +354,8 @@ class _MessageActionsModalState extends State { } } + print('INFO - result: $result'); + // Ensure reactions don't get pushed past the edge of the screen. // // Hacky!!! Needs improvement!!! diff --git a/packages/stream_chat_flutter/lib/src/message_widget/reactions/message_reactions_modal.dart b/packages/stream_chat_flutter/lib/src/message_widget/reactions/message_reactions_modal.dart index 281a37cc..e87a8970 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget/reactions/message_reactions_modal.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget/reactions/message_reactions_modal.dart @@ -47,19 +47,9 @@ class StreamMessageReactionsModal extends StatelessWidget { _userPermissions.contains(PermissionType.sendReaction); final roughMaxSize = size.width * 2 / 3; - var messageTextLength = message.text!.length; - if (message.quotedMessage != null) { - var quotedMessageLength = message.quotedMessage!.text!.length + 40; - if (message.quotedMessage!.attachments.isNotEmpty) { - quotedMessageLength += 40; - } - if (quotedMessageLength > messageTextLength) { - messageTextLength = quotedMessageLength; - } - } - final roughSentenceSize = messageTextLength * - (messageTheme.messageTextStyle?.fontSize ?? 1) * - 1.2; + + final roughSentenceSize = + message.roughMessageSize(messageTheme.messageTextStyle?.fontSize); final divFactor = message.attachments.isNotEmpty ? 1 : (roughSentenceSize == 0 ? 1 : (roughSentenceSize / roughMaxSize)); diff --git a/packages/stream_chat_flutter/lib/src/utils/extensions.dart b/packages/stream_chat_flutter/lib/src/utils/extensions.dart index 448674dd..8e6ef86e 100644 --- a/packages/stream_chat_flutter/lib/src/utils/extensions.dart +++ b/packages/stream_chat_flutter/lib/src/utils/extensions.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:diacritic/diacritic.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/foundation.dart'; @@ -12,6 +13,16 @@ extension StringExtension on String { String capitalize() => isNotEmpty ? '${this[0].toUpperCase()}${substring(1).toLowerCase()}' : ''; + /// Returns the biggest line of a text. + String biggestLine() { + if (contains('\n')) { + return split('\n') + .reduce((curr, next) => curr.length > next.length ? curr : next); + } else { + return this; + } + } + /// Returns whether the string contains only emoji's or not. /// /// Emojis guidelines @@ -353,6 +364,24 @@ extension MessageX on Message { return copyWith(text: messageTextToRender); } + /// Returns an approximation of message size + double roughMessageSize(double? fontSize) { + var messageTextLength = text!.biggestLine().length; + + if (quotedMessage != null) { + var quotedMessageLength = + (quotedMessage!.text?.biggestLine().length ?? 0) + 40; + if (quotedMessage!.attachments.isNotEmpty) { + quotedMessageLength += 40; + } + if (quotedMessageLength > messageTextLength) { + messageTextLength = quotedMessageLength; + } + } + + return messageTextLength * (fontSize ?? 1) * 1.2; + } + /// It returns the message with the translated text if available locally Message translate(String language) => copyWith(text: i18n?['${language}_text'] ?? text);