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,
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(

View file

@ -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,11 +29,13 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
@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(
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
@ -43,6 +47,7 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
30,
),
),
),
Expanded(
child: Container(
child: Padding(
@ -50,29 +55,19 @@ class _ChatDetailRowState extends State<ChatDetailRow> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
if (widget.isFirstMessage)
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
widget.message.sender.fullName?.toUpperCase() ?? '',
widget.message.sender.fullName?.toUpperCase() ??
'',
style: const TextStyle(
fontSize: 14,
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: const EdgeInsets.only(top: 5.0),
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(
child: StreamBuilder<List<ChatMessageModel>>(
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 = <Widget>[];
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)