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,11 +29,13 @@ 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(
opacity: widget.isFirstMessage ? 1 : 0,
child: Padding(
padding: const EdgeInsets.only(left: 10.0), padding: const EdgeInsets.only(left: 10.0),
child: widget.message.sender.imageUrl != null && child: widget.message.sender.imageUrl != null &&
widget.message.sender.imageUrl!.isNotEmpty widget.message.sender.imageUrl!.isNotEmpty
@ -43,6 +47,7 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
30, 30,
), ),
), ),
),
Expanded( Expanded(
child: Container( child: Container(
child: Padding( child: Padding(
@ -50,29 +55,19 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [
if (widget.isFirstMessage)
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
widget.message.sender.fullName?.toUpperCase() ?? '', widget.message.sender.fullName?.toUpperCase() ??
'',
style: const TextStyle( style: const TextStyle(
fontSize: 14, fontSize: 14,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
), ),
), ),
Padding(
padding: const EdgeInsets.only(top: 3.0),
child: widget.message is ChatTextMessageModel
? Text(
(widget.message as ChatTextMessageModel).text,
style: const TextStyle(fontSize: 16),
overflow: TextOverflow.ellipsis,
maxLines: 999,
)
: CachedNetworkImage(
imageUrl:
(widget.message as ChatImageMessageModel)
.imageUrl,
),
),
Padding( Padding(
padding: const EdgeInsets.only(top: 5.0), padding: const EdgeInsets.only(top: 5.0),
child: Text( child: Text(
@ -88,6 +83,23 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
), ),
], ],
), ),
Padding(
padding: const EdgeInsets.only(top: 3.0),
child: widget.message is ChatTextMessageModel
? Text(
(widget.message as ChatTextMessageModel).text,
style: const TextStyle(fontSize: 16),
overflow: TextOverflow.ellipsis,
maxLines: 999,
)
: CachedNetworkImage(
imageUrl:
(widget.message as ChatImageMessageModel)
.imageUrl,
),
),
],
),
), ),
), ),
), ),

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)