diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 71edefe6..3ffd0e24 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -1,7 +1,28 @@ +import 'package:emojis/emoji.dart'; +import 'package:characters/characters.dart'; + +final _emojis = Emoji.all(); + extension StringExtension on String { String capitalize() { return "${this[0].toUpperCase()}${this.substring(1)}"; } + + // Emojis guidelines + // 1 to 3 emojis: big size with no text bubble. + // 4+ emojis or emojis+text: standard size with text bubble. + bool get isOnlyEmoji { + final characters = this.trim().characters; + if (characters.isEmpty) return false; + if (characters.length > 3) return false; + return characters.every((c) { + return _emojis.firstWhere( + (Emoji emoji) => emoji.char.contains(c), + orElse: () => null, + ) != + null; + }); + } } /// List extension diff --git a/lib/src/message_list_view.dart b/lib/src/message_list_view.dart index 6f61e261..095b6b73 100644 --- a/lib/src/message_list_view.dart +++ b/lib/src/message_list_view.dart @@ -17,6 +17,7 @@ import '../stream_chat_flutter.dart'; import 'date_divider.dart'; import 'stream_channel.dart'; import 'swipeable.dart'; +import 'extension.dart'; typedef MessageBuilder = Widget Function( BuildContext, @@ -708,7 +709,7 @@ class _MessageListViewState extends State { Message message, ) { final isMyMessage = message.user.id == StreamChat.of(context).user.id; - final isOnlyEmoji = textIsOnlyEmoji(message.text); + final isOnlyEmoji = message.text.isOnlyEmoji; return MessageWidget( showThreadReplyIndicator: false, @@ -808,7 +809,7 @@ class _MessageListViewState extends State { final showInChannelIndicator = !_isThreadConversation && isThreadMessage; final showThreadReplyIndicator = !_isThreadConversation && hasReplies; - final isOnlyEmoji = textIsOnlyEmoji(message.text); + final isOnlyEmoji = message.text.isOnlyEmoji; Widget child = MessageWidget( key: ValueKey('MESSAGE-${message.id}'), diff --git a/lib/src/message_widget.dart b/lib/src/message_widget.dart index e9ea4873..cd14ac40 100644 --- a/lib/src/message_widget.dart +++ b/lib/src/message_widget.dart @@ -938,7 +938,7 @@ class _MessageWidgetState extends State { ); } - bool get isOnlyEmoji => textIsOnlyEmoji(widget.message.text); + bool get isOnlyEmoji => widget.message.text.isOnlyEmoji; Color _getBackgroundColor() { if (hasQuotedMessage) { diff --git a/lib/src/quoted_message_widget.dart b/lib/src/quoted_message_widget.dart index d012e15a..8a102635 100644 --- a/lib/src/quoted_message_widget.dart +++ b/lib/src/quoted_message_widget.dart @@ -125,7 +125,7 @@ class QuotedMessageWidget extends StatelessWidget { } Widget _buildMessage(BuildContext context) { - final isOnlyEmoji = textIsOnlyEmoji(message.text); + final isOnlyEmoji = message.text.isOnlyEmoji; var msg = _hasAttachments && !_containsText ? message.copyWith(text: message.attachments.last?.title ?? '') : message; diff --git a/lib/src/utils.dart b/lib/src/utils.dart index be10263e..333b96f1 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -1,4 +1,3 @@ -import 'package:emojis/emoji.dart'; import 'package:flutter/material.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -215,16 +214,3 @@ StreamSvgIcon getFileTypeImage(String type) { break; } } - -final _emojis = Emoji.all(); - -bool textIsOnlyEmoji(String text) { - return text.trim().characters.isNotEmpty && - text.trim().characters.every((c) => - _emojis.firstWhere( - (Emoji emoji) => emoji.char.contains(c), - orElse: () => null, - ) != - null) && - text.characters.length < 4; -}