add mark as read for rooms/DMs, fixes #24

This commit is contained in:
Henry Hiles 2026-05-09 11:10:52 -04:00
commit 469a625c40
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 56 additions and 49 deletions

View file

@ -7,7 +7,7 @@ import "package:nexus/controllers/via_controller.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
class RoomMenu extends ConsumerWidget { class RoomMenu extends ConsumerWidget {
final Room room; final Room? room;
final IList<Room> children; final IList<Room> children;
const RoomMenu(this.room, {this.children = const IList.empty(), super.key}); const RoomMenu(this.room, {this.children = const IList.empty(), super.key});
@ -20,7 +20,7 @@ class RoomMenu extends ConsumerWidget {
itemBuilder: (_) => [ itemBuilder: (_) => [
PopupMenuItem( PopupMenuItem(
onTap: () async { onTap: () async {
await client.markRead(room); if (room != null) await client.markRead(room!);
await Future.wait(children.map((child) => client.markRead(child))); await Future.wait(children.map((child) => client.markRead(child)));
}, },
child: ListTile( child: ListTile(
@ -28,53 +28,61 @@ class RoomMenu extends ConsumerWidget {
title: Text("Mark as Read"), title: Text("Mark as Read"),
), ),
), ),
PopupMenuItem( if (room != null) ...[
onTap: () async { PopupMenuItem(
final vias = ref.watch(ViaController.provider(room)); onTap: () async {
final vias = ref.watch(ViaController.provider(room!));
await Clipboard.setData( await Clipboard.setData(
ClipboardData( ClipboardData(
text: "matrix:roomid/${room.metadata?.id.substring(1)}$vias)", text:
), "matrix:roomid/${room!.metadata?.id.substring(1)}$vias)",
);
},
child: ListTile(leading: Icon(Icons.link), title: Text("Copy Link")),
),
PopupMenuItem(
onTap: () => showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text("Leave Room"),
content: Text(
"Are you sure you want to leave \"${room.metadata?.name ?? "Unnamed Room"}\"?",
),
actions: [
TextButton(
onPressed: Navigator.of(context).pop,
child: Text("Cancel"),
), ),
TextButton( );
onPressed: () async { },
Navigator.of(context).pop(); child: ListTile(
final snackbar = ScaffoldMessenger.of(context).showSnackBar( leading: Icon(Icons.link),
SnackBar( title: Text("Copy Link"),
content: Text("Leaving room..."),
duration: Duration(days: 1),
),
);
await client.leaveRoom(room);
snackbar.close();
},
child: Text("Leave"),
),
],
), ),
), ),
child: ListTile( PopupMenuItem(
leading: Icon(Icons.logout, color: danger), onTap: () => showDialog(
title: Text("Leave", style: TextStyle(color: danger)), context: context,
builder: (context) => AlertDialog(
title: Text("Leave Room"),
content: Text(
"Are you sure you want to leave \"${room!.metadata?.name ?? "Unnamed Room"}\"?",
),
actions: [
TextButton(
onPressed: Navigator.of(context).pop,
child: Text("Cancel"),
),
TextButton(
onPressed: () async {
Navigator.of(context).pop();
final snackbar = ScaffoldMessenger.of(context)
.showSnackBar(
SnackBar(
content: Text("Leaving room..."),
duration: Duration(days: 1),
),
);
await client.leaveRoom(room!);
snackbar.close();
},
child: Text("Leave"),
),
],
),
),
child: ListTile(
leading: Icon(Icons.logout, color: danger),
title: Text("Leave", style: TextStyle(color: danger)),
),
), ),
), ],
// PopupMenuItem( // PopupMenuItem(
// onTap: () => showDialog( // onTap: () => showDialog(
// context: context, // context: context,

View file

@ -140,11 +140,10 @@ class Sidebar extends HookConsumerWidget {
), ),
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
actions: [ actions: [
if (selectedSpace.room != null) RoomMenu(
RoomMenu( selectedSpace.room,
selectedSpace.room!, children: selectedSpace.children,
children: selectedSpace.children, ),
),
], ],
), ),
body: NavigationRail( body: NavigationRail(