From 590a339d0d51e2de12007c7591ec9ecdd4735348 Mon Sep 17 00:00:00 2001 From: Freek van de Ven Date: Thu, 20 Feb 2025 13:34:37 +0100 Subject: [PATCH] feat: add senderTitleResolver to override the default sender.firstName for chat messages --- CHANGELOG.md | 1 + packages/flutter_chat/lib/src/config/chat_options.dart | 10 ++++++++++ .../chat_detail/widgets/default_message_builder.dart | 8 +++++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9744590..9e402ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ - Added imagePickerBuilder to the builders in the ChatOptions to override the image picker with a custom implementation that needs to return a Future - Changed the ChatBottomInputSection to be multiline and go from 45px to 120px in height depending on how many lines are in the textfield - Added chatScreenBuilder to the userstory configuration to customize the specific chat screen with a ChatModel as argument +- Added senderTitleResolver to the ChatOptions to resolve the title of the sender in the chat message ## 4.0.0 - Move to the new user story architecture diff --git a/packages/flutter_chat/lib/src/config/chat_options.dart b/packages/flutter_chat/lib/src/config/chat_options.dart index 78397a6..21408ae 100644 --- a/packages/flutter_chat/lib/src/config/chat_options.dart +++ b/packages/flutter_chat/lib/src/config/chat_options.dart @@ -18,6 +18,7 @@ class ChatOptions { this.messageTheme, this.messageThemeResolver = _defaultMessageThemeResolver, this.chatTitleResolver, + this.senderTitleResolver, this.iconEnabledColor, this.iconDisabledColor, this.chatAlignment, @@ -72,6 +73,11 @@ class ChatOptions { /// the chat in the ChatDetailScreen. final ChatTitleResolver? chatTitleResolver; + /// If [senderTitleResolver] is set, it will be used to get the title of + /// the sender in a chat message. If not set, the [sender.firstName] is used. + /// [sender] can be null if the message is an event. + final SenderTitleResolver? senderTitleResolver; + /// The alignment of the chatmessages in the ChatDetailScreen. /// Defaults to [Alignment.bottomCenter] final Alignment? chatAlignment; @@ -90,6 +96,10 @@ class ChatOptions { /// a chat. typedef ChatTitleResolver = String? Function(ChatModel chat); +/// Typedef for the senderTitleResolver function that is used to get a title for +/// a sender. +typedef SenderTitleResolver = String? Function(UserModel? user); + /// Typedef for the messageThemeResolver function that is used to get a /// [MessageTheme] for a message. This can return null so you can fall back to /// default values for some messages. diff --git a/packages/flutter_chat/lib/src/screens/chat_detail/widgets/default_message_builder.dart b/packages/flutter_chat/lib/src/screens/chat_detail/widgets/default_message_builder.dart index a76ec91..e21bd5f 100644 --- a/packages/flutter_chat/lib/src/screens/chat_detail/widgets/default_message_builder.dart +++ b/packages/flutter_chat/lib/src/screens/chat_detail/widgets/default_message_builder.dart @@ -149,8 +149,10 @@ class _ChatMessageBubble extends StatelessWidget { showFullDate: isNewDate || previousMessage == null, ); - var senderTitle = Text( - sender?.firstName ?? "", + var senderTitle = + options.senderTitleResolver?.call(sender) ?? sender?.firstName ?? ""; + var senderTitleText = Text( + senderTitle, style: theme.textTheme.titleMedium, ); @@ -176,7 +178,7 @@ class _ChatMessageBubble extends StatelessWidget { children: [ if (messageTheme.showName! && !isSameSender) ...[ SizedBox(height: options.spacing.chatBetweenMessagesPadding), - senderTitle, + senderTitleText, ], const SizedBox(height: 4), DefaultChatMessageContainer(