Skip to content

Commit 92e4fcd

Browse files
d3xvnxsahil03x
andauthored
feat(ui): added edited label to messages (#2032)
* added edited label to messages * lint and test fixes * changelog * added tests * chore: re-run drift build_runner --------- Co-authored-by: Sahil Kumar <[email protected]>
1 parent 91c42a9 commit 92e4fcd

28 files changed

+4311
-131
lines changed

packages/stream_chat/lib/src/core/models/message.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class Message extends Equatable {
4444
this.localUpdatedAt,
4545
DateTime? deletedAt,
4646
this.localDeletedAt,
47+
this.messageTextUpdatedAt,
4748
this.user,
4849
this.pinned = false,
4950
this.pinnedAt,
@@ -192,6 +193,10 @@ class Message extends Equatable {
192193
@JsonKey(includeToJson: false)
193194
DateTime? get deletedAt => localDeletedAt ?? remoteDeletedAt;
194195

196+
/// Reserved field indicating when the message text was edited.
197+
@JsonKey(includeToJson: false)
198+
final DateTime? messageTextUpdatedAt;
199+
195200
/// Indicates when the message was deleted locally.
196201
@JsonKey(includeToJson: false, includeFromJson: false)
197202
final DateTime? localDeletedAt;
@@ -265,6 +270,7 @@ class Message extends Equatable {
265270
'created_at',
266271
'updated_at',
267272
'deleted_at',
273+
'message_text_updated_at',
268274
'user',
269275
'pinned',
270276
'pinned_at',
@@ -304,6 +310,7 @@ class Message extends Equatable {
304310
DateTime? localUpdatedAt,
305311
DateTime? deletedAt,
306312
DateTime? localDeletedAt,
313+
DateTime? messageTextUpdatedAt,
307314
User? user,
308315
bool? pinned,
309316
DateTime? pinnedAt,
@@ -373,6 +380,7 @@ class Message extends Equatable {
373380
localUpdatedAt: localUpdatedAt ?? this.localUpdatedAt,
374381
deletedAt: deletedAt ?? remoteDeletedAt,
375382
localDeletedAt: localDeletedAt ?? this.localDeletedAt,
383+
messageTextUpdatedAt: messageTextUpdatedAt ?? this.messageTextUpdatedAt,
376384
user: user ?? this.user,
377385
pinned: pinned ?? this.pinned,
378386
pinnedAt: pinnedAt ?? this.pinnedAt,
@@ -413,6 +421,7 @@ class Message extends Equatable {
413421
localUpdatedAt: other.localUpdatedAt,
414422
deletedAt: other.remoteDeletedAt,
415423
localDeletedAt: other.localDeletedAt,
424+
messageTextUpdatedAt: other.messageTextUpdatedAt,
416425
user: other.user,
417426
pinned: other.pinned,
418427
pinnedAt: other.pinnedAt,
@@ -472,6 +481,7 @@ class Message extends Equatable {
472481
remoteUpdatedAt,
473482
localDeletedAt,
474483
remoteDeletedAt,
484+
messageTextUpdatedAt,
475485
user,
476486
pinned,
477487
pinnedAt,

packages/stream_chat/lib/src/core/models/message.g.dart

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/stream_chat_flutter/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## Upcoming
2+
3+
✅ Added
4+
5+
- Messages by default now show an "Edited" label if text is edited. Use `showEditedLabel` to disable this functionality.
6+
17
## 8.1.0
28

39
🐞 Fixed

packages/stream_chat_flutter/example/ios/Runner/AppDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import UIKit
22
import Flutter
33

4-
@UIApplicationMain
4+
@main
55
@objc class AppDelegate: FlutterAppDelegate {
66
override func application(
77
_ application: UIApplication,

packages/stream_chat_flutter/lib/src/localization/translations.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ abstract class Translations {
6969
/// The label for message deleted
7070
String get messageDeletedLabel;
7171

72+
/// The label for showing the message is edited
73+
String get editedMessageLabel;
74+
7275
/// The label for message reactions
7376
String get messageReactionsLabel;
7477

@@ -455,6 +458,9 @@ class DefaultTranslations implements Translations {
455458
@override
456459
String get messageDeletedLabel => 'Message deleted';
457460

461+
@override
462+
String get editedMessageLabel => 'Edited';
463+
458464
@override
459465
String get messageReactionsLabel => 'Message Reactions';
460466

packages/stream_chat_flutter/lib/src/message_widget/bottom_row.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class BottomRow extends StatelessWidget {
2020
required this.showInChannel,
2121
required this.showTimeStamp,
2222
required this.showUsername,
23+
required this.showEditedLabel,
2324
required this.reverse,
2425
required this.showSendingIndicator,
2526
required this.hasUrlAttachments,
@@ -56,6 +57,9 @@ class BottomRow extends StatelessWidget {
5657
/// {@macro showUsername}
5758
final bool showUsername;
5859

60+
/// {@macro showEdited}
61+
final bool showEditedLabel;
62+
5963
/// {@macro reverse}
6064
final bool reverse;
6165

@@ -104,6 +108,7 @@ class BottomRow extends StatelessWidget {
104108
bool? showInChannel,
105109
bool? showTimeStamp,
106110
bool? showUsername,
111+
bool? showEditedLabel,
107112
bool? reverse,
108113
bool? showSendingIndicator,
109114
bool? hasUrlAttachments,
@@ -127,6 +132,7 @@ class BottomRow extends StatelessWidget {
127132
showInChannel: showInChannel ?? this.showInChannel,
128133
showTimeStamp: showTimeStamp ?? this.showTimeStamp,
129134
showUsername: showUsername ?? this.showUsername,
135+
showEditedLabel: showEditedLabel ?? this.showEditedLabel,
130136
reverse: reverse ?? this.reverse,
131137
showSendingIndicator: showSendingIndicator ?? this.showSendingIndicator,
132138
hasUrlAttachments: hasUrlAttachments ?? this.hasUrlAttachments,
@@ -156,6 +162,7 @@ class BottomRow extends StatelessWidget {
156162
final threadParticipants = message.threadParticipants?.take(2);
157163
final showThreadParticipants = threadParticipants?.isNotEmpty == true;
158164
final replyCount = message.replyCount;
165+
final isEdited = message.messageTextUpdatedAt != null;
159166

160167
var msg = context.translations.threadReplyLabel;
161168
if (showThreadReplyIndicator && replyCount! > 1) {
@@ -185,6 +192,11 @@ class BottomRow extends StatelessWidget {
185192
message: message,
186193
messageTheme: messageTheme,
187194
),
195+
if (showEditedLabel && isEdited)
196+
Text(
197+
context.translations.editedMessageLabel,
198+
style: messageTheme.createdAtStyle,
199+
),
188200
if (showTimeStamp)
189201
Text(
190202
Jiffy.parseFromDateTime(message.createdAt.toLocal()).jm,

packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class StreamMessageWidget extends StatefulWidget {
6363
this.onConfirmDeleteTap,
6464
this.showUsername = true,
6565
this.showTimestamp = true,
66+
this.showEditedLabel = true,
6667
this.showReactions = true,
6768
this.showDeleteMessage = true,
6869
this.showEditMessage = true,
@@ -268,6 +269,11 @@ class StreamMessageWidget extends StatefulWidget {
268269
/// {@endtemplate}
269270
final bool showTimestamp;
270271

272+
/// {@template showTimestamp}
273+
/// Show edited label if message is edited
274+
/// {@endtemplate}
275+
final bool showEditedLabel;
276+
271277
/// {@template showReplyMessage}
272278
/// Show reply action
273279
/// {@endtemplate}
@@ -415,6 +421,7 @@ class StreamMessageWidget extends StatefulWidget {
415421
ShowMessageCallback? onShowMessage,
416422
bool? showUsername,
417423
bool? showTimestamp,
424+
bool? showEditedLabel,
418425
bool? showReplyMessage,
419426
bool? showThreadReplyMessage,
420427
bool? showEditMessage,
@@ -465,6 +472,7 @@ class StreamMessageWidget extends StatefulWidget {
465472
widthFactor: widthFactor ?? this.widthFactor,
466473
showUserAvatar: showUserAvatar ?? this.showUserAvatar,
467474
showSendingIndicator: showSendingIndicator ?? this.showSendingIndicator,
475+
showEditedLabel: showEditedLabel ?? this.showEditedLabel,
468476
showReactions: showReactions ?? this.showReactions,
469477
showThreadReplyIndicator:
470478
showThreadReplyIndicator ?? this.showThreadReplyIndicator,
@@ -525,6 +533,10 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
525533

526534
bool get showTimeStamp => widget.showTimestamp;
527535

536+
bool get showEditedLabel => widget.showEditedLabel;
537+
538+
bool get isTextEdited => widget.message.messageTextUpdatedAt != null;
539+
528540
bool get showInChannel => widget.showInChannelIndicator;
529541

530542
/// {@template hasQuotedMessage}
@@ -582,7 +594,8 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
582594
showUsername ||
583595
showTimeStamp ||
584596
showInChannel ||
585-
showSendingIndicator;
597+
showSendingIndicator ||
598+
isTextEdited;
586599

587600
/// {@template isPinned}
588601
/// Whether [StreamMessageWidget.message] is pinned or not.
@@ -695,6 +708,7 @@ class _StreamMessageWidgetState extends State<StreamMessageWidget>
695708
streamChatTheme: _streamChatTheme,
696709
showUsername: showUsername,
697710
showTimeStamp: showTimeStamp,
711+
showEditedLabel: showEditedLabel,
698712
showThreadReplyIndicator: showThreadReplyIndicator,
699713
showSendingIndicator: showSendingIndicator,
700714
showInChannel: showInChannel,

packages/stream_chat_flutter/lib/src/message_widget/message_widget_content.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class MessageWidgetContent extends StatelessWidget {
6161
required this.showThreadReplyIndicator,
6262
required this.showTimeStamp,
6363
required this.showUsername,
64+
required this.showEditedLabel,
6465
required this.messageWidget,
6566
this.onUserAvatarTap,
6667
this.borderRadiusGeometry,
@@ -210,6 +211,9 @@ class MessageWidgetContent extends StatelessWidget {
210211
/// {@macro showUsername}
211212
final bool showUsername;
212213

214+
/// {@macro showEdited}
215+
final bool showEditedLabel;
216+
213217
/// {@macro messageWidget}
214218
final StreamMessageWidget messageWidget;
215219

@@ -437,6 +441,7 @@ class MessageWidgetContent extends StatelessWidget {
437441
showThreadReplyIndicator: showThreadReplyIndicator,
438442
showTimeStamp: showTimeStamp,
439443
showUsername: showUsername,
444+
showEditedLabel: showEditedLabel,
440445
streamChatTheme: streamChatTheme,
441446
streamChat: streamChat,
442447
hasNonUrlAttachments: hasNonUrlAttachments,

packages/stream_chat_flutter/test/src/message_list_view/bottom_row_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ void main() {
4545
showUsername: false,
4646
showInChannel: true,
4747
showTimeStamp: false,
48+
showEditedLabel: false,
4849
reverse: false,
4950
showSendingIndicator: false,
5051
hasUrlAttachments: false,

packages/stream_chat_localizations/example/lib/add_new_lang.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ class NnStreamChatLocalizations extends GlobalStreamChatLocalizations {
108108
@override
109109
String get messageDeletedLabel => 'Message deleted';
110110

111+
@override
112+
String get editedMessageLabel => 'Edited';
113+
111114
@override
112115
String get messageReactionsLabel => 'Message Reactions';
113116

0 commit comments

Comments
 (0)