Skip to content

Commit 4c982ef

Browse files
committed
wip start on date separators
1 parent 2d92d80 commit 4c982ef

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

lib/model/message_list.dart

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ class MessageListRecipientHeaderItem extends MessageListItem {
2525
MessageListRecipientHeaderItem(this.message);
2626
}
2727

28+
class MessageListDateSeparatorItem extends MessageListItem {
29+
final Message message;
30+
31+
MessageListDateSeparatorItem(this.message);
32+
}
33+
2834
/// A message to show in the message list.
2935
class MessageListMessageItem extends MessageListItem {
3036
final Message message;
@@ -118,6 +124,7 @@ mixin _MessageSequence {
118124
case MessageListDirection.older: return -1;
119125
}
120126
case MessageListRecipientHeaderItem(:var message):
127+
case MessageListDateSeparatorItem(:var message):
121128
return (message.id <= messageId) ? -1 : 1;
122129
case MessageListMessageItem(:var message): return message.id.compareTo(messageId);
123130
}
@@ -181,16 +188,19 @@ mixin _MessageSequence {
181188
final message = messages[index];
182189
final content = contents[index];
183190
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 {
185198
assert(items.last is MessageListMessageItem);
186199
final prevMessageItem = items.last as MessageListMessageItem;
187200
assert(identical(prevMessageItem.message, messages[index - 1]));
188201
assert(prevMessageItem.isLastInBlock);
189202
prevMessageItem.isLastInBlock = false;
190203
canShareSender = (prevMessageItem.message.senderId == message.senderId);
191-
} else {
192-
items.add(MessageListRecipientHeaderItem(message));
193-
canShareSender = false;
194204
}
195205
items.add(MessageListMessageItem(message, content,
196206
showSender: !canShareSender, isLastInBlock: true));
@@ -227,8 +237,16 @@ mixin _MessageSequence {
227237
}
228238
}
229239

240+
// TODO cut this; update tests
230241
@visibleForTesting
231242
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) {
232250
if (prevMessage is StreamMessage && message is StreamMessage) {
233251
if (prevMessage.streamId != message.streamId) return false;
234252
if (prevMessage.subject != message.subject) return false;
@@ -239,6 +257,7 @@ bool canShareRecipientHeader(Message prevMessage, Message message) {
239257
} else {
240258
return false;
241259
}
260+
return true;
242261

243262
// switch ((prevMessage, message)) {
244263
// case (StreamMessage(), StreamMessage()):
@@ -248,12 +267,13 @@ bool canShareRecipientHeader(Message prevMessage, Message message) {
248267
// default:
249268
// return false;
250269
// }
270+
}
251271

272+
bool messagesSameDay(Message prevMessage, Message message) {
252273
// TODO memoize [DateTime]s... also use memoized for showing date/time in msglist
253274
final prevTime = DateTime.fromMillisecondsSinceEpoch(prevMessage.timestamp * 1000);
254275
final time = DateTime.fromMillisecondsSinceEpoch(message.timestamp * 1000);
255276
if (!_sameDay(prevTime, time)) return false;
256-
257277
return true;
258278
}
259279

lib/widgets/message_list.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,10 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
345345
final header = RecipientHeader(message: data.message, narrow: widget.narrow);
346346
return StickyHeaderItem(allowOverflow: true,
347347
header: header, child: header);
348+
case MessageListDateSeparatorItem():
349+
final header = RecipientHeader(message: data.message, narrow: widget.narrow);
350+
return StickyHeaderItem(allowOverflow: true,
351+
header: header, child: Text("a new day")); // TODO
348352
case MessageListMessageItem():
349353
final header = RecipientHeader(message: data.message, narrow: widget.narrow);
350354
return MessageItem(

0 commit comments

Comments
 (0)