@@ -240,6 +240,14 @@ void showTopicActionSheet(BuildContext context, {
240240 pageContext: context);
241241 }));
242242
243+ final unreadCount = store.unreads.countInTopicNarrow (channelId, topic);
244+ if (unreadCount > 0 ) {
245+ optionButtons.add (MarkTopicAsReadButton (
246+ channelId: channelId,
247+ topic: topic,
248+ pageContext: context));
249+ }
250+
243251 if (optionButtons.isEmpty) {
244252 // TODO(a11y): This case makes a no-op gesture handler; as a consequence,
245253 // we're presenting some UI (to people who use screen-reader software) as
@@ -372,6 +380,30 @@ class UserTopicUpdateButton extends ActionSheetMenuItemButton {
372380 }
373381}
374382
383+ class MarkTopicAsReadButton extends ActionSheetMenuItemButton {
384+ const MarkTopicAsReadButton ({
385+ super .key,
386+ required this .channelId,
387+ required this .topic,
388+ required super .pageContext,
389+ });
390+
391+ final int channelId;
392+ final TopicName topic;
393+
394+ @override IconData get icon => ZulipIcons .message_checked;
395+
396+ @override
397+ String label (ZulipLocalizations zulipLocalizations) {
398+ return zulipLocalizations.actionSheetOptionMarkTopicAsRead;
399+ }
400+
401+ @override void onPressed () async {
402+ if (! pageContext.mounted) return ;
403+ await markNarrowAsRead (pageContext, TopicNarrow (channelId, topic));
404+ }
405+ }
406+
375407/// Show a sheet of actions you can take on a message in the message list.
376408///
377409/// Must have a [MessageListPage] ancestor.
0 commit comments