@@ -25,6 +25,12 @@ class MessageListRecipientHeaderItem extends MessageListItem {
25
25
MessageListRecipientHeaderItem (this .message);
26
26
}
27
27
28
+ class MessageListDateSeparatorItem extends MessageListItem {
29
+ final Message message;
30
+
31
+ MessageListDateSeparatorItem (this .message);
32
+ }
33
+
28
34
/// A message to show in the message list.
29
35
class MessageListMessageItem extends MessageListItem {
30
36
final Message message;
@@ -118,6 +124,7 @@ mixin _MessageSequence {
118
124
case MessageListDirection .older: return - 1 ;
119
125
}
120
126
case MessageListRecipientHeaderItem (: var message):
127
+ case MessageListDateSeparatorItem (: var message):
121
128
return (message.id <= messageId) ? - 1 : 1 ;
122
129
case MessageListMessageItem (: var message): return message.id.compareTo (messageId);
123
130
}
@@ -181,16 +188,19 @@ mixin _MessageSequence {
181
188
final message = messages[index];
182
189
final content = contents[index];
183
190
bool canShareSender;
184
- if (index > 0 && canShareRecipientHeader (messages[index - 1 ], message)) {
191
+ if (index == 0 || ! haveSameRecipient (messages[index - 1 ], message)) {
192
+ items.add (MessageListRecipientHeaderItem (message));
193
+ canShareSender = false ;
194
+ } else if (! messagesSameDay (messages[index - 1 ], message)) {
195
+ items.add (MessageListDateSeparatorItem (message));
196
+ canShareSender = false ;
197
+ } else {
185
198
assert (items.last is MessageListMessageItem );
186
199
final prevMessageItem = items.last as MessageListMessageItem ;
187
200
assert (identical (prevMessageItem.message, messages[index - 1 ]));
188
201
assert (prevMessageItem.isLastInBlock);
189
202
prevMessageItem.isLastInBlock = false ;
190
203
canShareSender = (prevMessageItem.message.senderId == message.senderId);
191
- } else {
192
- items.add (MessageListRecipientHeaderItem (message));
193
- canShareSender = false ;
194
204
}
195
205
items.add (MessageListMessageItem (message, content,
196
206
showSender: ! canShareSender, isLastInBlock: true ));
@@ -227,8 +237,16 @@ mixin _MessageSequence {
227
237
}
228
238
}
229
239
240
+ // TODO cut this; update tests
230
241
@visibleForTesting
231
242
bool canShareRecipientHeader (Message prevMessage, Message message) {
243
+ if (! haveSameRecipient (prevMessage, message)) return false ;
244
+ if (! messagesSameDay (prevMessage, message)) return false ;
245
+ return true ;
246
+ }
247
+
248
+ @visibleForTesting
249
+ bool haveSameRecipient (Message prevMessage, Message message) {
232
250
if (prevMessage is StreamMessage && message is StreamMessage ) {
233
251
if (prevMessage.streamId != message.streamId) return false ;
234
252
if (prevMessage.subject != message.subject) return false ;
@@ -239,6 +257,7 @@ bool canShareRecipientHeader(Message prevMessage, Message message) {
239
257
} else {
240
258
return false ;
241
259
}
260
+ return true ;
242
261
243
262
// switch ((prevMessage, message)) {
244
263
// case (StreamMessage(), StreamMessage()):
@@ -248,12 +267,13 @@ bool canShareRecipientHeader(Message prevMessage, Message message) {
248
267
// default:
249
268
// return false;
250
269
// }
270
+ }
251
271
272
+ bool messagesSameDay (Message prevMessage, Message message) {
252
273
// TODO memoize [DateTime]s... also use memoized for showing date/time in msglist
253
274
final prevTime = DateTime .fromMillisecondsSinceEpoch (prevMessage.timestamp * 1000 );
254
275
final time = DateTime .fromMillisecondsSinceEpoch (message.timestamp * 1000 );
255
276
if (! _sameDay (prevTime, time)) return false ;
256
-
257
277
return true ;
258
278
}
259
279
0 commit comments