Skip to content

sticky_header: Rewrite sticky headers completely; write tests #288

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Aug 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 32 additions & 19 deletions lib/widgets/message_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -280,11 +280,10 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
child: Padding(
padding: EdgeInsets.symmetric(vertical: 16.0),
child: CircularProgressIndicator())), // TODO perhaps a different indicator
MessageListMessageItem(:var message, :var content) =>
MessageListMessageItem() =>
MessageItem(
trailing: i == 0 ? const SizedBox(height: 8) : const SizedBox(height: 11),
message: message,
content: content)
item: data),
};
});
}
Expand Down Expand Up @@ -323,39 +322,51 @@ class ScrollToBottomButton extends StatelessWidget {
}
}

class RecipientHeader extends StatelessWidget {
const RecipientHeader({super.key, required this.message});

final Message message;

@override
Widget build(BuildContext context) {
// TODO recipient headings depend on narrow
final message = this.message;
switch (message) {
case StreamMessage():
final store = PerAccountStoreWidget.of(context);
final subscription = store.subscriptions[message.streamId];
return StreamTopicRecipientHeader(
message: message, streamColor: colorForStream(subscription));
case DmMessage():
return DmRecipientHeader(message: message);
}
}
}

class MessageItem extends StatelessWidget {
const MessageItem({
super.key,
required this.message,
required this.content,
required this.item,
this.trailing,
});

final Message message;
final ZulipContent content;
final MessageListMessageItem item;
final Widget? trailing;

@override
Widget build(BuildContext context) {
// TODO recipient headings depend on narrow

final store = PerAccountStoreWidget.of(context);
final message = item.message;

Color highlightBorderColor;
Color restBorderColor;
Widget recipientHeader;
if (message is StreamMessage) {
final msg = (message as StreamMessage);
final subscription = store.subscriptions[msg.streamId];
final subscription = store.subscriptions[message.streamId];
highlightBorderColor = colorForStream(subscription);
restBorderColor = _kStreamMessageBorderColor;
recipientHeader = StreamTopicRecipientHeader(
message: msg, streamColor: highlightBorderColor);
} else if (message is DmMessage) {
final msg = (message as DmMessage);
highlightBorderColor = _kDmRecipientHeaderColor;
restBorderColor = _kDmRecipientHeaderColor;
recipientHeader = DmRecipientHeader(message: msg);
} else {
throw Exception("impossible message type: ${message.runtimeType}");
}
Expand All @@ -371,12 +382,14 @@ class MessageItem extends StatelessWidget {
shape: Border(
left: recipientBorder, bottom: restBorder, right: restBorder));

return StickyHeader(
final recipientHeader = RecipientHeader(message: message);
return StickyHeaderItem(
header: recipientHeader,
content: Column(children: [
child: Column(children: [
recipientHeader,
DecoratedBox(
decoration: borderDecoration,
child: MessageWithSender(message: message, content: content)),
child: MessageWithSender(message: message, content: item.content)),
if (trailing != null) trailing!,
]));

Expand Down
Loading