Skip to content

Commit bbb6704

Browse files
committed
wip msglist: Accept anchor on MessageListPage; TODO test
TODO test: on jump and then new store, preserve jumped anchor (rather than reset to original anchor) This is NFC as to the live app, because nothing yet passes this argument.
1 parent 7ac1759 commit bbb6704

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

lib/widgets/message_list.dart

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,17 @@ abstract class MessageListPageState {
141141
}
142142

143143
class MessageListPage extends StatefulWidget {
144-
const MessageListPage({super.key, required this.initNarrow});
144+
const MessageListPage({
145+
super.key,
146+
required this.initNarrow,
147+
this.initAnchorMessageId,
148+
});
145149

146150
static AccountRoute<void> buildRoute({int? accountId, BuildContext? context,
147-
required Narrow narrow}) {
151+
required Narrow narrow, int? initAnchorMessageId}) {
148152
return MaterialAccountWidgetRoute(accountId: accountId, context: context,
149-
page: MessageListPage(initNarrow: narrow));
153+
page: MessageListPage(
154+
initNarrow: narrow, initAnchorMessageId: initAnchorMessageId));
150155
}
151156

152157
/// The [MessageListPageState] above this context in the tree.
@@ -162,6 +167,7 @@ class MessageListPage extends StatefulWidget {
162167
}
163168

164169
final Narrow initNarrow;
170+
final int? initAnchorMessageId; // TODO(#1564) highlight target upon load
165171

166172
@override
167173
State<MessageListPage> createState() => _MessageListPageState();
@@ -240,6 +246,10 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
240246
actions.add(_TopicListButton(streamId: streamId));
241247
}
242248

249+
// TODO(#80): default to anchor firstUnread, instead of newest
250+
final initAnchor = widget.initAnchorMessageId == null
251+
? AnchorCode.newest : NumericAnchor(widget.initAnchorMessageId!);
252+
243253
// Insert a PageRoot here, to provide a context that can be used for
244254
// MessageListPage.ancestorOf.
245255
return PageRoot(child: Scaffold(
@@ -259,7 +269,8 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
259269
// we matched to the Figma in 21dbae120. See another frame, which uses that:
260270
// https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=147%3A9088&mode=dev
261271
body: Builder(
262-
builder: (BuildContext context) => Column(
272+
builder: (BuildContext context) {
273+
return Column(
263274
// Children are expected to take the full horizontal space
264275
// and handle the horizontal device insets.
265276
// The bottom inset should be handled by the last child only.
@@ -279,11 +290,13 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
279290
child: MessageList(
280291
key: _messageListKey,
281292
narrow: narrow,
293+
initAnchor: initAnchor,
282294
onNarrowChanged: _narrowChanged,
283295
))),
284296
if (ComposeBox.hasComposeBox(narrow))
285297
ComposeBox(key: _composeBoxKey, narrow: narrow)
286-
]))));
298+
]);
299+
})));
287300
}
288301
}
289302

@@ -479,9 +492,15 @@ const kFetchMessagesBufferPixels = (kMessageListFetchBatchSize / 2) * _kShortMes
479492
/// When there is no [ComposeBox], also takes responsibility
480493
/// for dealing with the bottom inset.
481494
class MessageList extends StatefulWidget {
482-
const MessageList({super.key, required this.narrow, required this.onNarrowChanged});
495+
const MessageList({
496+
super.key,
497+
required this.narrow,
498+
required this.initAnchor,
499+
required this.onNarrowChanged,
500+
});
483501

484502
final Narrow narrow;
503+
final Anchor initAnchor;
485504
final void Function(Narrow newNarrow) onNarrowChanged;
486505

487506
@override
@@ -504,8 +523,9 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
504523

505524
@override
506525
void onNewStore() { // TODO(#464) try to keep using old model until new one gets messages
526+
final anchor = _model == null ? widget.initAnchor : _model!.anchor;
507527
_model?.dispose();
508-
_initModel(PerAccountStoreWidget.of(context));
528+
_initModel(PerAccountStoreWidget.of(context), anchor);
509529
}
510530

511531
@override
@@ -516,10 +536,7 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
516536
super.dispose();
517537
}
518538

519-
void _initModel(PerAccountStore store) {
520-
// TODO(#82): get anchor as page/route argument, instead of using newest
521-
// TODO(#80): default to anchor firstUnread, instead of newest
522-
final anchor = AnchorCode.newest;
539+
void _initModel(PerAccountStore store, Anchor anchor) {
523540
_model = MessageListView.init(store: store,
524541
narrow: widget.narrow, anchor: anchor);
525542
model.addListener(_modelChanged);

0 commit comments

Comments
 (0)