diff --git a/packages/flutter_community_chat_view/example/lib/main.dart b/packages/flutter_community_chat_view/example/lib/main.dart index 782a0dc..f07cec9 100644 --- a/packages/flutter_community_chat_view/example/lib/main.dart +++ b/packages/flutter_community_chat_view/example/lib/main.dart @@ -41,7 +41,22 @@ class _MyStatefulWidgetState extends State { sender: janUser, text: 'Met mij gaat het goed, dankje!', timestamp: DateTime.now().subtract(const Duration(days: 2)), - ) + ), + ChatTextMessageModel( + sender: pietUser, + text: 'Mooi zo!', + timestamp: DateTime.now().subtract(const Duration(days: 1)), + ), + ChatTextMessageModel( + sender: pietUser, + text: 'Hoe gaat het?', + timestamp: DateTime.now(), + ), + ChatTextMessageModel( + sender: janUser, + text: 'Met mij gaat het goed, dankje!', + timestamp: DateTime.now().subtract(const Duration(days: 2)), + ), ]; static final chat = PersonalChatModel( diff --git a/packages/flutter_community_chat_view/lib/src/components/chat_detail_row.dart b/packages/flutter_community_chat_view/lib/src/components/chat_detail_row.dart index 2fd8104..8178c18 100644 --- a/packages/flutter_community_chat_view/lib/src/components/chat_detail_row.dart +++ b/packages/flutter_community_chat_view/lib/src/components/chat_detail_row.dart @@ -10,11 +10,13 @@ import 'package:flutter_community_chat_view/src/services/date_formatter.dart'; class ChatDetailRow extends StatefulWidget { const ChatDetailRow({ + required this.isFirstMessage, required this.message, required this.userAvatarBuilder, super.key, }); + final bool isFirstMessage; final ChatMessageModel message; final UserAvatarBuilder userAvatarBuilder; @@ -27,21 +29,24 @@ class _ChatDetailRowState extends State { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.only(bottom: 43.0), + padding: EdgeInsets.only(top: widget.isFirstMessage ? 25.0 : 0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0), - child: widget.message.sender.imageUrl != null && - widget.message.sender.imageUrl!.isNotEmpty - ? ChatImage( - image: widget.message.sender.imageUrl!, - ) - : widget.userAvatarBuilder( - widget.message.sender, - 30, - ), + Opacity( + opacity: widget.isFirstMessage ? 1 : 0, + child: Padding( + padding: const EdgeInsets.only(left: 10.0), + child: widget.message.sender.imageUrl != null && + widget.message.sender.imageUrl!.isNotEmpty + ? ChatImage( + image: widget.message.sender.imageUrl!, + ) + : widget.userAvatarBuilder( + widget.message.sender, + 30, + ), + ), ), Expanded( child: Container( @@ -51,13 +56,33 @@ class _ChatDetailRowState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text( - widget.message.sender.fullName?.toUpperCase() ?? '', - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, + if (widget.isFirstMessage) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + widget.message.sender.fullName?.toUpperCase() ?? + '', + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + _dateFormatter.format( + date: widget.message.timestamp, + showFullDate: true, + ), + style: const TextStyle( + fontSize: 12, + color: Color(0xFFBBBBBB), + ), + ), + ), + ], ), - ), Padding( padding: const EdgeInsets.only(top: 3.0), child: widget.message is ChatTextMessageModel @@ -73,19 +98,6 @@ class _ChatDetailRowState extends State { .imageUrl, ), ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - _dateFormatter.format( - date: widget.message.timestamp, - showFullDate: true, - ), - style: const TextStyle( - fontSize: 12, - color: Color(0xFFBBBBBB), - ), - ), - ), ], ), ), diff --git a/packages/flutter_community_chat_view/lib/src/screens/chat_detail_screen.dart b/packages/flutter_community_chat_view/lib/src/screens/chat_detail_screen.dart index 83738fd..7aa660f 100644 --- a/packages/flutter_community_chat_view/lib/src/screens/chat_detail_screen.dart +++ b/packages/flutter_community_chat_view/lib/src/screens/chat_detail_screen.dart @@ -151,19 +151,30 @@ class _ChatDetailScreenState extends State { Expanded( child: StreamBuilder>( stream: _chatMessages, - builder: (BuildContext context, snapshot) => ListView( - reverse: true, - padding: const EdgeInsets.only(top: 24.0), - children: [ - for (var message - in (snapshot.data ?? widget.chat?.messages ?? []) - .reversed) + builder: (BuildContext context, snapshot) { + var messages = snapshot.data ?? widget.chat?.messages ?? []; + ChatMessageModel? lastMessage; + var messageWidgets = []; + + for (var message in messages) { + var isFirstMessage = lastMessage == null || + lastMessage.sender.id != message.sender.id; + messageWidgets.add( ChatDetailRow( message: message, + isFirstMessage: isFirstMessage, userAvatarBuilder: widget.options.userAvatarBuilder, ), - ], - ), + ); + lastMessage = message; + } + + return ListView( + reverse: true, + padding: const EdgeInsets.only(top: 24.0), + children: messageWidgets.reversed.toList(), + ); + }, ), ), if (widget.chat != null)