diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cad9ac4..da05acca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## [3.0.0] +* **Fix**: [415](https://github.com/SimformSolutionsPvtLtd/chatview/pull/415) + Adjust emoji display logic to handle multiple emojis display width and added + `maxOutSideBubbleEmojis` parameter in `EmojiMessageConfig`. * **Fix**: [358](https://github.com/SimformSolutionsPvtLtd/chatview/issues/358) Fix issue of Image selected from the locally is unable to display in message (windows). * **Feat**: [414](https://github.com/SimformSolutionsPvtLtd/chatview/pull/414) diff --git a/example/lib/main.dart b/example/lib/main.dart index 168389a8..ba61cc2a 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -844,6 +844,9 @@ class _ExampleOneChatScreenState extends State { } return const SizedBox.shrink(); }, + emojiMessageConfig: const EmojiMessageConfiguration( + maxOutSideBubbleEmojis: 1, + ), ), profileCircleConfig: const ProfileCircleConfiguration( padding: EdgeInsets.only(right: 4), diff --git a/lib/src/extensions/extensions.dart b/lib/src/extensions/extensions.dart index 45090bb2..d7371e70 100644 --- a/lib/src/extensions/extensions.dart +++ b/lib/src/extensions/extensions.dart @@ -125,7 +125,7 @@ extension ValidateString on String { final regex = _urlRegex.allMatches(this); final urls = []; for (final match in regex) { - if (match.group(0) case final url?) { + if (match.group(0) case final url? when url.isUrl) { urls.add(url); } } diff --git a/lib/src/models/config_models/emoji_message_configuration.dart b/lib/src/models/config_models/emoji_message_configuration.dart index 1b181a4e..96f2f8af 100644 --- a/lib/src/models/config_models/emoji_message_configuration.dart +++ b/lib/src/models/config_models/emoji_message_configuration.dart @@ -25,6 +25,7 @@ class EmojiMessageConfiguration { const EmojiMessageConfiguration({ this.padding, this.textStyle, + this.maxOutSideBubbleEmojis, }); /// Used for giving padding to emoji messages. @@ -32,4 +33,8 @@ class EmojiMessageConfiguration { /// Used for giving text style to emoji messages. final TextStyle? textStyle; + + /// Maximum number of emojis to show outside the bubble + /// for emoji-only messages. + final int? maxOutSideBubbleEmojis; } diff --git a/lib/src/widgets/message_view.dart b/lib/src/widgets/message_view.dart index 6da99329..41405ee5 100644 --- a/lib/src/widgets/message_view.dart +++ b/lib/src/widgets/message_view.dart @@ -161,6 +161,8 @@ class _MessageViewState extends State Widget get _messageView { final message = widget.message.message; final emojiMessageConfiguration = messageConfig?.emojiMessageConfig; + final maxOutSideBubbleEmojis = + emojiMessageConfiguration?.maxOutSideBubbleEmojis; return Padding( padding: EdgeInsets.only( bottom: widget.message.reaction.reactions.isNotEmpty ? 6 : 0, @@ -169,11 +171,13 @@ class _MessageViewState extends State crossAxisAlignment: CrossAxisAlignment.end, children: [ (() { - if (message.isAllEmoji) { + if (message.isAllEmoji && + (maxOutSideBubbleEmojis == null || + message.characters.length <= maxOutSideBubbleEmojis)) { return Stack( clipBehavior: Clip.none, children: [ - Padding( + Container( padding: emojiMessageConfiguration?.padding ?? EdgeInsets.fromLTRB( leftPadding2, @@ -183,6 +187,9 @@ class _MessageViewState extends State ? 14 : 0, ), + constraints: BoxConstraints( + maxWidth: widget.chatBubbleMaxWidth ?? + MediaQuery.sizeOf(context).width * 0.75), child: Transform.scale( scale: widget.shouldHighlight ? widget.highlightScale