Add ability to copy links for rooms and spaces

This commit is contained in:
Henry Hiles 2025-12-03 13:50:06 -05:00
commit f7c6c3bb6a
No known key found for this signature in database
8 changed files with 52 additions and 4 deletions

View file

@ -35,7 +35,6 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
title: "Home",
children: topLevelRooms,
icon: Icon(Icons.home),
fake: true,
),
Space(
client: client,
@ -46,7 +45,6 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
.map((room) => room.fullRoom),
),
icon: Icon(Icons.person),
fake: true,
),
...(await Future.wait(
topLevelSpaces.map(
@ -54,6 +52,7 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
client: client,
title: space.title,
avatar: space.avatar,
roomData: space.roomData,
children: await Future.wait(
space.roomData.spaceChildren
.map(

View file

@ -10,7 +10,7 @@ abstract class Space with _$Space {
required String title,
required List<FullRoom> children,
required Client client,
@Default(false) bool fake,
Room? roomData,
Uri? avatar,
Icon? icon,
}) = _Space;

View file

@ -3,6 +3,7 @@ import "package:nexus/helpers/extensions/get_headers.dart";
import "package:nexus/models/full_room.dart";
import "package:nexus/widgets/appbar.dart";
import "package:nexus/widgets/avatar_or_hash.dart";
import "package:nexus/widgets/chat_page/room_menu.dart";
class RoomAppbar extends StatelessWidget implements PreferredSizeWidget {
final bool isDesktop;
@ -48,10 +49,12 @@ class RoomAppbar extends StatelessWidget implements PreferredSizeWidget {
],
),
actions: [
IconButton(onPressed: () {}, icon: Icon(Icons.push_pin)),
IconButton(
onPressed: () => onOpenMemberList(context),
icon: Icon(Icons.people),
),
RoomMenu(room.roomData),
],
);
}

View file

@ -0,0 +1,33 @@
import "package:clipboard/clipboard.dart";
import "package:flutter/material.dart";
import "package:matrix/matrix.dart";
class RoomMenu extends StatelessWidget {
final Room room;
const RoomMenu(this.room, {super.key});
@override
Widget build(BuildContext context) {
final danger = Theme.of(context).colorScheme.error;
return PopupMenuButton(
itemBuilder: (_) => [
PopupMenuItem(
onTap: () async {
final link = await room.matrixToInviteLink();
await FlutterClipboard.copy(link.toString());
},
child: ListTile(leading: Icon(Icons.link), title: Text("Copy Link")),
),
PopupMenuItem(
onTap: () =>
showDialog(context: context, builder: (context) => AlertDialog()),
child: ListTile(
leading: Icon(Icons.logout, color: danger),
title: Text("Leave", style: TextStyle(color: danger)),
),
),
],
);
}
}

View file

@ -9,6 +9,7 @@ import "package:nexus/helpers/extensions/better_when.dart";
import "package:nexus/helpers/extensions/get_headers.dart";
import "package:nexus/pages/settings_page.dart";
import "package:nexus/widgets/avatar_or_hash.dart";
import "package:nexus/widgets/chat_page/room_menu.dart";
class Sidebar extends HookConsumerWidget {
const Sidebar({super.key});
@ -116,6 +117,9 @@ class Sidebar extends HookConsumerWidget {
overflow: TextOverflow.ellipsis,
),
backgroundColor: Colors.transparent,
actions: [
if (space.roomData != null) RoomMenu(space.roomData!),
],
),
body: NavigationRail(
scrollable: true,