mirror of
https://github.com/Iconica-Development/flutter_chat.git
synced 2025-05-19 10:53:51 +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,
|
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(
|
||||||
|
|
|
@ -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,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue