Skip to content

Commit 2546a54

Browse files
authored
refactor(ui): use 'StreamTimestamp' wherever possible (#2153)
* refactor(ui): use 'StreamTimestamp' wherever possible * chore: Update Goldens * fix: fix poll result dialog date format * chore: Update Goldens * chore: trigger build --------- Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
1 parent 2f67cf7 commit 2546a54

File tree

10 files changed

+50
-77
lines changed

10 files changed

+50
-77
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:stream_chat_flutter/src/message_widget/sending_indicator_builder
33
import 'package:stream_chat_flutter/src/message_widget/thread_painter.dart';
44
import 'package:stream_chat_flutter/src/message_widget/thread_participants.dart';
55
import 'package:stream_chat_flutter/src/message_widget/username.dart';
6+
import 'package:stream_chat_flutter/src/misc/timestamp.dart';
67
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
78

89
/// {@template bottomRow}
@@ -198,9 +199,10 @@ class BottomRow extends StatelessWidget {
198199
style: messageTheme.createdAtStyle,
199200
),
200201
if (showTimeStamp)
201-
Text(
202-
Jiffy.parseFromDateTime(message.createdAt.toLocal()).jm,
202+
StreamTimestamp(
203+
date: message.createdAt.toLocal(),
203204
style: messageTheme.createdAtStyle,
205+
formatter: (_, date) => Jiffy.parseFromDateTime(date).jm,
204206
),
205207
if (showSendingIndicator)
206208
sendingIndicatorBuilder?.call(context, message) ??

packages/stream_chat_flutter/lib/src/misc/date_divider.dart

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import 'package:flutter/material.dart';
2+
import 'package:stream_chat_flutter/src/misc/timestamp.dart';
3+
import 'package:stream_chat_flutter/src/utils/date_formatter.dart';
24
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
35

46
/// {@template streamDateDivider}
@@ -20,22 +22,6 @@ class StreamDateDivider extends StatelessWidget {
2022

2123
@override
2224
Widget build(BuildContext context) {
23-
final createdAt = Jiffy.parseFromDateTime(dateTime);
24-
final now = Jiffy.parseFromDateTime(DateTime.now());
25-
26-
var dayInfo = createdAt.MMMd;
27-
if (createdAt.isSame(now, unit: Unit.day)) {
28-
dayInfo = context.translations.todayLabel;
29-
} else if (createdAt.isSame(now.subtract(days: 1), unit: Unit.day)) {
30-
dayInfo = context.translations.yesterdayLabel;
31-
} else if (createdAt.isAfter(now.subtract(days: 7), unit: Unit.day)) {
32-
dayInfo = createdAt.EEEE;
33-
} else if (createdAt.isAfter(now.subtract(years: 1), unit: Unit.day)) {
34-
dayInfo = createdAt.MMMd;
35-
}
36-
37-
if (uppercase) dayInfo = dayInfo.toUpperCase();
38-
3925
final chatThemeData = StreamChatTheme.of(context);
4026
return Center(
4127
child: Container(
@@ -44,11 +30,23 @@ class StreamDateDivider extends StatelessWidget {
4430
color: chatThemeData.colorTheme.overlayDark,
4531
borderRadius: BorderRadius.circular(8),
4632
),
47-
child: Text(
48-
dayInfo,
33+
child: StreamTimestamp(
34+
date: dateTime.toLocal(),
4935
style: chatThemeData.textTheme.footnote.copyWith(
5036
color: chatThemeData.colorTheme.barsBg,
5137
),
38+
formatter: (context, date) {
39+
final timestamp = switch (date) {
40+
_ when date.isToday => context.translations.todayLabel,
41+
_ when date.isYesterday => context.translations.yesterdayLabel,
42+
_ when date.isWithinAWeek => Jiffy.parseFromDateTime(date).EEEE,
43+
_ when date.isWithinAYear => Jiffy.parseFromDateTime(date).MMMd,
44+
_ => Jiffy.parseFromDateTime(date).yMMMd,
45+
};
46+
47+
if (uppercase) return timestamp.toUpperCase();
48+
return timestamp;
49+
},
5250
),
5351
),
5452
);

packages/stream_chat_flutter/lib/src/scroll_view/channel_scroll_view/stream_channel_list_tile.dart

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:collection/collection.dart';
22
import 'package:flutter/material.dart';
33
import 'package:stream_chat_flutter/src/message_widget/sending_indicator_builder.dart';
44
import 'package:stream_chat_flutter/src/misc/empty_widget.dart';
5+
import 'package:stream_chat_flutter/src/misc/timestamp.dart';
56
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
67

78
/// A widget that displays a channel preview.
@@ -277,30 +278,9 @@ class ChannelLastMessageDate extends StatelessWidget {
277278
Widget build(BuildContext context) => BetterStreamBuilder<DateTime>(
278279
stream: channel.lastMessageAtStream,
279280
initialData: channel.lastMessageAt,
280-
builder: (context, data) {
281-
final lastMessageAt = data.toLocal();
282-
283-
String stringDate;
284-
final now = DateTime.now();
285-
286-
final startOfDay = DateTime(now.year, now.month, now.day);
287-
288-
if (lastMessageAt.millisecondsSinceEpoch >=
289-
startOfDay.millisecondsSinceEpoch) {
290-
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).jm;
291-
} else if (lastMessageAt.millisecondsSinceEpoch >=
292-
startOfDay
293-
.subtract(const Duration(days: 1))
294-
.millisecondsSinceEpoch) {
295-
stringDate = context.translations.yesterdayLabel;
296-
} else if (startOfDay.difference(lastMessageAt).inDays < 7) {
297-
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).EEEE;
298-
} else {
299-
stringDate = Jiffy.parseFromDateTime(lastMessageAt.toLocal()).yMd;
300-
}
301-
302-
return Text(
303-
stringDate,
281+
builder: (context, lastMessageAt) {
282+
return StreamTimestamp(
283+
date: lastMessageAt.toLocal(),
304284
style: textStyle,
305285
);
306286
},

packages/stream_chat_flutter/lib/src/scroll_view/message_search_scroll_view/stream_message_search_list_tile.dart

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter/material.dart';
2+
import 'package:stream_chat_flutter/src/misc/timestamp.dart';
23
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
34

45
/// A widget that displays a message search item.
@@ -222,18 +223,8 @@ class MessageSearchTileMessageDate extends StatelessWidget {
222223
@override
223224
Widget build(BuildContext context) {
224225
final createdAt = message.createdAt;
225-
String stringDate;
226-
final now = DateTime.now();
227-
if (now.year != createdAt.year ||
228-
now.month != createdAt.month ||
229-
now.day != createdAt.day) {
230-
stringDate = Jiffy.parseFromDateTime(createdAt.toLocal()).yMd;
231-
} else {
232-
stringDate = Jiffy.parseFromDateTime(createdAt.toLocal()).jm;
233-
}
234-
235-
return Text(
236-
stringDate,
226+
return StreamTimestamp(
227+
date: createdAt.toLocal(),
237228
style: textStyle,
238229
);
239230
}

packages/stream_chat_flutter/lib/src/scroll_view/poll_vote_scroll_view/stream_poll_vote_list_tile.dart

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import 'package:flutter/material.dart';
2+
import 'package:stream_chat_flutter/src/misc/timestamp.dart';
3+
import 'package:stream_chat_flutter/src/utils/date_formatter.dart';
24
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
35

46
/// {@template streamPollVoteListTile}
@@ -141,33 +143,26 @@ class PollVoteUpdatedAt extends StatelessWidget {
141143
Widget build(BuildContext context) {
142144
final theme = StreamChatTheme.of(context);
143145

144-
final createdAt = Jiffy.parseFromDateTime(dateTime);
145-
final now = Jiffy.parseFromDateTime(DateTime.now());
146-
147-
var dayInfo = createdAt.MMMd;
148-
if (createdAt.isSame(now, unit: Unit.day)) {
149-
dayInfo = context.translations.todayLabel;
150-
} else if (createdAt.isSame(now.subtract(days: 1), unit: Unit.day)) {
151-
dayInfo = context.translations.yesterdayLabel;
152-
} else if (createdAt.isAfter(now.subtract(days: 7), unit: Unit.day)) {
153-
dayInfo = createdAt.EEEE;
154-
} else if (createdAt.isAfter(now.subtract(years: 1), unit: Unit.day)) {
155-
dayInfo = createdAt.MMMd;
156-
}
157-
158-
final timeInfo = createdAt.jm;
159-
160146
return Row(
161147
children: [
162-
Text(
163-
dayInfo,
148+
StreamTimestamp(
149+
date: dateTime,
150+
formatter: (context, date) {
151+
if (date.isToday) return context.translations.todayLabel;
152+
if (date.isYesterday) return context.translations.yesterdayLabel;
153+
if (date.isWithinAWeek) return Jiffy.parseFromDateTime(date).EEEE;
154+
if (date.isWithinAYear) return Jiffy.parseFromDateTime(date).MMMd;
155+
156+
return Jiffy.parseFromDateTime(date).yMMMd;
157+
},
164158
style: theme.textTheme.bodyBold.copyWith(
165159
color: theme.colorTheme.textLowEmphasis,
166160
),
167161
),
168162
const SizedBox(width: 8),
169-
Text(
170-
timeInfo,
163+
StreamTimestamp(
164+
date: dateTime,
165+
formatter: (context, date) => Jiffy.parseFromDateTime(date).jm,
171166
style: theme.textTheme.body.copyWith(
172167
color: theme.colorTheme.textLowEmphasis,
173168
),

packages/stream_chat_flutter/lib/src/utils/date_formatter.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,32 @@ String formatDate(BuildContext context, DateTime date) {
1717
return Jiffy.parseFromDateTime(date).yMd;
1818
}
1919

20-
extension on DateTime {
20+
/// Extension on [DateTime] to provide common date comparison utilities.
21+
extension DateTimeComparisonUtils on DateTime {
22+
/// Returns true if the date is today.
2123
bool get isToday {
2224
final jiffyDate = Jiffy.parseFromDateTime(this);
2325
final jiffyNow = Jiffy.parseFromDateTime(DateTime.now());
2426

2527
return jiffyDate.isSame(jiffyNow, unit: Unit.day);
2628
}
2729

30+
/// Returns true if the date was yesterday.
2831
bool get isYesterday {
2932
final jiffyDate = Jiffy.parseFromDateTime(this);
3033
final jiffyNow = Jiffy.parseFromDateTime(DateTime.now());
3134

3235
return jiffyDate.isSame(jiffyNow.subtract(days: 1), unit: Unit.day);
3336
}
3437

38+
/// Returns true if the date is within the last 7 days.
3539
bool get isWithinAWeek {
3640
final jiffyDate = Jiffy.parseFromDateTime(this);
3741
final jiffyNow = Jiffy.parseFromDateTime(DateTime.now());
3842

3943
return jiffyDate.isAfter(jiffyNow.subtract(days: 7), unit: Unit.day);
4044
}
45+
46+
/// Returns true if the date is within the current year.
47+
bool get isWithinAYear => year == DateTime.now().year;
4148
}
Loading
Loading

0 commit comments

Comments
 (0)