mirror of
https://github.com/Iconica-Development/flutter_chat.git
synced 2025-05-19 02:43:50 +02:00
feat: remove extra message info when it is from the same user
This commit is contained in:
parent
5d4aadc62e
commit
08e695517b
3 changed files with 79 additions and 41 deletions
|
@ -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(
|
||||
|
|
|
@ -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<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(
|
||||
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<ChatDetailRow> {
|
|||
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<ChatDetailRow> {
|
|||
.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),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue