Skip to content

Commit b3bac84

Browse files
msglist: Use distinct background colors for DM messages.
This commit modifies DmMessage and its DateSeparator to use a different background color from StreamMessage. Fixes #681.
1 parent e0df0ed commit b3bac84

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

lib/widgets/message_list.dart

+20-3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class MessageListTheme extends ThemeExtension<MessageListTheme> {
3030
static final light = MessageListTheme._(
3131
dateSeparator: Colors.black,
3232
dateSeparatorText: const HSLColor.fromAHSL(0.75, 0, 0, 0.15).toColor(),
33+
dmMessageBgDefault: const HSLColor.fromAHSL(1, 45, 0.20, 0.96).toColor(),
3334
dmRecipientHeaderBg: const HSLColor.fromAHSL(1, 46, 0.35, 0.93).toColor(),
3435
messageTimestamp: const HSLColor.fromAHSL(0.8, 0, 0, 0.2).toColor(),
3536
recipientHeaderText: const HSLColor.fromAHSL(1, 0, 0, 0.15).toColor(),
@@ -55,6 +56,7 @@ class MessageListTheme extends ThemeExtension<MessageListTheme> {
5556
static final dark = MessageListTheme._(
5657
dateSeparator: Colors.white,
5758
dateSeparatorText: const HSLColor.fromAHSL(0.75, 0, 0, 1).toColor(),
59+
dmMessageBgDefault: const HSLColor.fromAHSL(1, 46, 0.07, 0.16).toColor(),
5860
dmRecipientHeaderBg: const HSLColor.fromAHSL(1, 46, 0.15, 0.2).toColor(),
5961
messageTimestamp: const HSLColor.fromAHSL(0.8, 0, 0, 0.85).toColor(),
6062
recipientHeaderText: const HSLColor.fromAHSL(0.8, 0, 0, 1).toColor(),
@@ -79,6 +81,7 @@ class MessageListTheme extends ThemeExtension<MessageListTheme> {
7981
MessageListTheme._({
8082
required this.dateSeparator,
8183
required this.dateSeparatorText,
84+
required this.dmMessageBgDefault,
8285
required this.dmRecipientHeaderBg,
8386
required this.messageTimestamp,
8487
required this.recipientHeaderText,
@@ -103,6 +106,7 @@ class MessageListTheme extends ThemeExtension<MessageListTheme> {
103106

104107
final Color dateSeparator;
105108
final Color dateSeparatorText;
109+
final Color dmMessageBgDefault;
106110
final Color dmRecipientHeaderBg;
107111
final Color messageTimestamp;
108112
final Color recipientHeaderText;
@@ -118,6 +122,7 @@ class MessageListTheme extends ThemeExtension<MessageListTheme> {
118122
MessageListTheme copyWith({
119123
Color? dateSeparator,
120124
Color? dateSeparatorText,
125+
Color? dmMessageBgDefault,
121126
Color? dmRecipientHeaderBg,
122127
Color? messageTimestamp,
123128
Color? recipientHeaderText,
@@ -132,6 +137,7 @@ class MessageListTheme extends ThemeExtension<MessageListTheme> {
132137
return MessageListTheme._(
133138
dateSeparator: dateSeparator ?? this.dateSeparator,
134139
dateSeparatorText: dateSeparatorText ?? this.dateSeparatorText,
140+
dmMessageBgDefault: dmMessageBgDefault ?? this.dmMessageBgDefault,
135141
dmRecipientHeaderBg: dmRecipientHeaderBg ?? this.dmRecipientHeaderBg,
136142
messageTimestamp: messageTimestamp ?? this.messageTimestamp,
137143
recipientHeaderText: recipientHeaderText ?? this.recipientHeaderText,
@@ -153,6 +159,7 @@ class MessageListTheme extends ThemeExtension<MessageListTheme> {
153159
return MessageListTheme._(
154160
dateSeparator: Color.lerp(dateSeparator, other.dateSeparator, t)!,
155161
dateSeparatorText: Color.lerp(dateSeparatorText, other.dateSeparatorText, t)!,
162+
dmMessageBgDefault: Color.lerp(dmMessageBgDefault, other.dmMessageBgDefault, t)!,
156163
dmRecipientHeaderBg: Color.lerp(dmRecipientHeaderBg, other.dmRecipientHeaderBg, t)!,
157164
messageTimestamp: Color.lerp(messageTimestamp, other.messageTimestamp, t)!,
158165
recipientHeaderText: Color.lerp(recipientHeaderText, other.recipientHeaderText, t)!,
@@ -165,6 +172,13 @@ class MessageListTheme extends ThemeExtension<MessageListTheme> {
165172
unsubscribedStreamRecipientHeaderBg: Color.lerp(unsubscribedStreamRecipientHeaderBg, other.unsubscribedStreamRecipientHeaderBg, t)!,
166173
);
167174
}
175+
176+
Color getMessageBackgroundColor(Message message) {
177+
return switch (message) {
178+
StreamMessage() => streamMessageBgDefault,
179+
DmMessage() => dmMessageBgDefault,
180+
};
181+
}
168182
}
169183

170184
/// The interface for the state of a [MessageListPage].
@@ -933,8 +947,9 @@ class DateSeparator extends StatelessWidget {
933947

934948
final line = BorderSide(width: 0, color: messageListTheme.dateSeparator);
935949

936-
// TODO(#681) use different color for DM messages
937-
return ColoredBox(color: messageListTheme.streamMessageBgDefault,
950+
final backgroundColor = messageListTheme.getMessageBackgroundColor(message);
951+
952+
return ColoredBox(color: backgroundColor,
938953
child: Padding(
939954
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 2),
940955
child: Row(children: [
@@ -975,13 +990,15 @@ class MessageItem extends StatelessWidget {
975990
Widget build(BuildContext context) {
976991
final message = item.message;
977992
final messageListTheme = MessageListTheme.of(context);
993+
final backgroundColor = messageListTheme.getMessageBackgroundColor(message);
994+
978995
return StickyHeaderItem(
979996
allowOverflow: !item.isLastInBlock,
980997
header: header,
981998
child: _UnreadMarker(
982999
isRead: message.flags.contains(MessageFlag.read),
9831000
child: ColoredBox(
984-
color: messageListTheme.streamMessageBgDefault,
1001+
color: backgroundColor,
9851002
child: Column(children: [
9861003
MessageWithPossibleSender(item: item),
9871004
if (trailingWhitespace != null && item.isLastInBlock) SizedBox(height: trailingWhitespace!),

test/widgets/message_list_test.dart

+10-6
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,11 @@ void main() {
256256
tester.platformDispatcher.platformBrightnessTestValue = Brightness.light;
257257
addTearDown(tester.platformDispatcher.clearPlatformBrightnessTestValue);
258258

259-
final message = eg.streamMessage();
260-
await setupMessageListPage(tester, messages: [message]);
259+
final streamMessage = eg.streamMessage();
260+
final dmMessage = eg.dmMessage(from: eg.selfUser, to: [eg.otherUser]);
261+
await setupMessageListPage(tester, messages: [streamMessage, dmMessage]);
261262

262-
Color backgroundColor() {
263+
Color getBackgroundColor(Message message) {
263264
final coloredBoxFinder = find.descendant(
264265
of: find.byWidgetPredicate((w) => w is MessageItem && w.item.message.id == message.id),
265266
matching: find.byType(ColoredBox),
@@ -268,17 +269,20 @@ void main() {
268269
return widget.color;
269270
}
270271

271-
check(backgroundColor()).isSameColorAs(MessageListTheme.light.streamMessageBgDefault);
272+
check(getBackgroundColor(streamMessage)).isSameColorAs(MessageListTheme.light.streamMessageBgDefault);
273+
check(getBackgroundColor(dmMessage)).isSameColorAs(MessageListTheme.light.dmMessageBgDefault);
272274

273275
tester.platformDispatcher.platformBrightnessTestValue = Brightness.dark;
274276
await tester.pump();
275277

276278
await tester.pump(kThemeAnimationDuration * 0.4);
277279
final expectedLerped = MessageListTheme.light.lerp(MessageListTheme.dark, 0.4);
278-
check(backgroundColor()).isSameColorAs(expectedLerped.streamMessageBgDefault);
280+
check(getBackgroundColor(streamMessage)).isSameColorAs(expectedLerped.streamMessageBgDefault);
281+
check(getBackgroundColor(dmMessage)).isSameColorAs(expectedLerped.dmMessageBgDefault);
279282

280283
await tester.pump(kThemeAnimationDuration * 0.6);
281-
check(backgroundColor()).isSameColorAs(MessageListTheme.dark.streamMessageBgDefault);
284+
check(getBackgroundColor(streamMessage)).isSameColorAs(MessageListTheme.dark.streamMessageBgDefault);
285+
check(getBackgroundColor(dmMessage)).isSameColorAs(MessageListTheme.dark.dmMessageBgDefault);
282286
});
283287

284288
group('fetch initial batch of messages', () {

0 commit comments

Comments
 (0)