feat: remove extra message info when it is from the same user

This commit is contained in:
Freek van de Ven 2023-11-02 23:15:06 +01:00
parent 5d4aadc62e
commit 08e695517b
3 changed files with 79 additions and 41 deletions

View file

@ -41,7 +41,22 @@ class _MyStatefulWidgetState extends State<MyStatefulWidget> {
sender: janUser, sender: janUser,
text: 'Met mij gaat het goed, dankje!', text: 'Met mij gaat het goed, dankje!',
timestamp: DateTime.now().subtract(const Duration(days: 2)), 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( static final chat = PersonalChatModel(

View file

@ -10,11 +10,13 @@ import 'package:flutter_community_chat_view/src/services/date_formatter.dart';
class ChatDetailRow extends StatefulWidget { class ChatDetailRow extends StatefulWidget {
const ChatDetailRow({ const ChatDetailRow({
required this.isFirstMessage,
required this.message, required this.message,
required this.userAvatarBuilder, required this.userAvatarBuilder,
super.key, super.key,
}); });
final bool isFirstMessage;
final ChatMessageModel message; final ChatMessageModel message;
final UserAvatarBuilder userAvatarBuilder; final UserAvatarBuilder userAvatarBuilder;
@ -27,21 +29,24 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
@override @override
Widget build(BuildContext context) => Padding( Widget build(BuildContext context) => Padding(
padding: const EdgeInsets.only(bottom: 43.0), padding: EdgeInsets.only(top: widget.isFirstMessage ? 25.0 : 0),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( Opacity(
padding: const EdgeInsets.only(left: 10.0), opacity: widget.isFirstMessage ? 1 : 0,
child: widget.message.sender.imageUrl != null && child: Padding(
widget.message.sender.imageUrl!.isNotEmpty padding: const EdgeInsets.only(left: 10.0),
? ChatImage( child: widget.message.sender.imageUrl != null &&
image: widget.message.sender.imageUrl!, widget.message.sender.imageUrl!.isNotEmpty
) ? ChatImage(
: widget.userAvatarBuilder( image: widget.message.sender.imageUrl!,
widget.message.sender, )
30, : widget.userAvatarBuilder(
), widget.message.sender,
30,
),
),
), ),
Expanded( Expanded(
child: Container( child: Container(
@ -51,13 +56,33 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Text( if (widget.isFirstMessage)
widget.message.sender.fullName?.toUpperCase() ?? '', Row(
style: const TextStyle( mainAxisAlignment: MainAxisAlignment.spaceBetween,
fontSize: 14, children: [
fontWeight: FontWeight.w500, 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(
padding: const EdgeInsets.only(top: 3.0), padding: const EdgeInsets.only(top: 3.0),
child: widget.message is ChatTextMessageModel child: widget.message is ChatTextMessageModel
@ -73,19 +98,6 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
.imageUrl, .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),
),
),
),
], ],
), ),
), ),

View file

@ -151,19 +151,30 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
Expanded( Expanded(
child: StreamBuilder<List<ChatMessageModel>>( child: StreamBuilder<List<ChatMessageModel>>(
stream: _chatMessages, stream: _chatMessages,
builder: (BuildContext context, snapshot) => ListView( builder: (BuildContext context, snapshot) {
reverse: true, var messages = snapshot.data ?? widget.chat?.messages ?? [];
padding: const EdgeInsets.only(top: 24.0), ChatMessageModel? lastMessage;
children: [ var messageWidgets = <Widget>[];
for (var message
in (snapshot.data ?? widget.chat?.messages ?? []) for (var message in messages) {
.reversed) var isFirstMessage = lastMessage == null ||
lastMessage.sender.id != message.sender.id;
messageWidgets.add(
ChatDetailRow( ChatDetailRow(
message: message, message: message,
isFirstMessage: isFirstMessage,
userAvatarBuilder: widget.options.userAvatarBuilder, 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) if (widget.chat != null)