From 0f563455ffda25ce9667e736d9a9b395a450338a Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Tue, 6 Jan 2026 13:39:51 -0500 Subject: [PATCH] Mark as read button --- README.md | 2 +- lib/controllers/spaces_controller.dart | 2 +- lib/helpers/extensions/room_to_children.dart | 4 ++-- lib/widgets/chat_page/room_menu.dart | 17 +++++++++++++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 359f7fc..f27aeff 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ A simple and user-friendly Matrix client made with Flutter and the Matrix Dart S - [x] Rooms / Spaces - [x] Displaying and choosing - [x] Reading, showing unread - - [ ] Mark as read button on rooms and spaces + - [x] Mark as read button on rooms and spaces - [ ] Searching - [ ] Creating (Rooms, Spaces, and DMs) - [ ] Joining diff --git a/lib/controllers/spaces_controller.dart b/lib/controllers/spaces_controller.dart index 3501de6..408dc00 100644 --- a/lib/controllers/spaces_controller.dart +++ b/lib/controllers/spaces_controller.dart @@ -64,7 +64,7 @@ class SpacesController extends AsyncNotifier> { avatar: space.avatar, id: space.roomData.id, roomData: space.roomData, - children: IList(await space.roomData.getAllChildren(client)), + children: IList(await space.roomData.getAllChildren()), ), ), )), diff --git a/lib/helpers/extensions/room_to_children.dart b/lib/helpers/extensions/room_to_children.dart index afdc99e..d115f9a 100644 --- a/lib/helpers/extensions/room_to_children.dart +++ b/lib/helpers/extensions/room_to_children.dart @@ -5,7 +5,7 @@ import "package:nexus/helpers/extensions/get_full_room.dart"; import "package:nexus/models/full_room.dart"; extension RoomToChildren on Room { - Future> getAllChildren(Client client) async { + Future> getAllChildren() async { final direct = await Future.wait( spaceChildren .map( @@ -19,7 +19,7 @@ extension RoomToChildren on Room { return (await Future.wait( direct.map( (child) async => child.roomData.isSpace - ? await child.roomData.getAllChildren(client) + ? await child.roomData.getAllChildren() : [child], ), )).expand((list) => list).toIList(); diff --git a/lib/widgets/chat_page/room_menu.dart b/lib/widgets/chat_page/room_menu.dart index c5fa322..8169095 100644 --- a/lib/widgets/chat_page/room_menu.dart +++ b/lib/widgets/chat_page/room_menu.dart @@ -2,6 +2,7 @@ import "package:clipboard/clipboard.dart"; import "package:flutter/material.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:matrix/matrix.dart"; +import "package:nexus/helpers/extensions/room_to_children.dart"; import "package:nexus/widgets/form_text_input.dart"; class RoomMenu extends StatelessWidget { @@ -12,6 +13,15 @@ class RoomMenu extends StatelessWidget { Widget build(BuildContext context) { final danger = Theme.of(context).colorScheme.error; + void markRead(String roomId) async { + for (final child in await room.getAllChildren()) { + await child.roomData.setReadMarker( + child.roomData.lastEvent?.eventId, + mRead: child.roomData.lastEvent?.eventId, + ); + } + } + return PopupMenuButton( itemBuilder: (_) => [ PopupMenuItem( @@ -21,6 +31,13 @@ class RoomMenu extends StatelessWidget { }, child: ListTile(leading: Icon(Icons.link), title: Text("Copy Link")), ), + PopupMenuItem( + onTap: () => markRead(room.id), + child: ListTile( + leading: Icon(Icons.check), + title: Text("Mark as Read"), + ), + ), PopupMenuItem( onTap: () => showDialog( context: context,