diff --git a/lib/helpers/extensions/show_leave_room_sheet.dart b/lib/helpers/extensions/show_leave_room_sheet.dart index 7dd8d3a..a981d4b 100644 --- a/lib/helpers/extensions/show_leave_room_sheet.dart +++ b/lib/helpers/extensions/show_leave_room_sheet.dart @@ -18,8 +18,9 @@ extension ShowLeaveRoomSheet on BuildContext { ), TextButton( onPressed: () { - final client = ProviderScope.containerOf(context) - .read(ClientController.provider.notifier); + final client = ProviderScope.containerOf( + context, + ).read(ClientController.provider.notifier); context.withProgressSnackbar( "Leaving $name...", () => client.leaveRoom(roomId), diff --git a/lib/models/room_summary.dart b/lib/models/room_summary.dart index 6d22f6c..f2c8852 100644 --- a/lib/models/room_summary.dart +++ b/lib/models/room_summary.dart @@ -3,7 +3,6 @@ import "package:nexus/models/content/create.dart"; import "package:nexus/models/content/membership.dart"; import "package:nexus/models/join_rule.dart"; import "package:nexus/models/membership_status.dart"; -import "package:nexus/models/room_metadata.dart"; part "room_summary.freezed.dart"; part "room_summary.g.dart"; @@ -41,16 +40,6 @@ class const RoomSummary({ /// Whether this is an invite to a direct message. @JsonKey(includeFromJson: false) final bool isDirect = false, }) with _$RoomSummary { - /// A summary of a room the user is in, from its synced metadata. - factory RoomSummary.fromMetadata(RoomMetadata metadata) => .new( - roomId: metadata.id, - joinedMembers: metadata.lazyLoadSummary?.joinedMemberCount, - avatarUrl: metadata.avatar, - canonicalAlias: metadata.canonicalAlias, - name: metadata.name, - topic: metadata.topic, - ); - factory RoomSummary.fromJson(Map json) => _$RoomSummaryFromJson(json); } diff --git a/lib/widgets/appbar.dart b/lib/widgets/appbar.dart index 226da68..a6489a2 100644 --- a/lib/widgets/appbar.dart +++ b/lib/widgets/appbar.dart @@ -13,9 +13,6 @@ final class const Appbar({ final double? scrolledUnderElevation, final IList actions = const .empty(), final VoidCallback? onTap, - - /// Whether to show the minimize, maximize and close buttons on desktop. - final bool windowControls = true, super.key, }) extends ConsumerWidget implements PreferredSizeWidget { @override @@ -53,7 +50,7 @@ final class const Appbar({ flexibleSpace: GestureDetector(onDoubleTap: maximize), actions: [ ...actions, - if (windowControls && !(Platform.isAndroid || Platform.isIOS)) ...[ + if (!(Platform.isAndroid || Platform.isIOS)) ...[ if (ref .watch(SettingsController.provider) .whenOrNull( diff --git a/lib/widgets/room_appbar.dart b/lib/widgets/room_appbar.dart index e284bc5..bcd4108 100644 --- a/lib/widgets/room_appbar.dart +++ b/lib/widgets/room_appbar.dart @@ -7,7 +7,6 @@ import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/count_badge.dart"; import "package:nexus/widgets/room_menu_button.dart"; import "package:nexus/widgets/room_summary_sheet.dart"; -import "package:nexus/widgets/room_title.dart"; import "package:nexus/widgets/sidebar.dart"; final class const RoomAppbar({ @@ -31,7 +30,17 @@ final class const RoomAppbar({ onTap: room?.metadata == null ? null : () => context.showAdaptiveSheet( - (context) => RoomSummarySheet(.fromMetadata(room!.metadata!)), + (context) => RoomSummarySheet( + .new( + roomId: room!.metadata!.id, + joinedMembers: + room.metadata!.lazyLoadSummary?.joinedMemberCount, + avatarUrl: room.metadata?.avatar, + canonicalAlias: room.metadata?.canonicalAlias, + name: room.metadata?.name, + topic: room.metadata?.topic, + ), + ), ), leading: isDesktop ? room == null @@ -53,9 +62,24 @@ final class const RoomAppbar({ scrolledUnderElevation: 0, title: room == null ? null - : RoomTitle( - room.metadata?.name ?? "Unnamed Room", - topic: room.metadata?.topic, + : Column( + crossAxisAlignment: .start, + children: [ + Text( + room.metadata?.name ?? "Unnamed Room", + overflow: .ellipsis, + maxLines: 1, + ), + if (room.metadata?.topic?.isNotEmpty == true) + Text( + room.metadata!.topic!, + maxLines: 1, + overflow: .ellipsis, + style: Theme.of(context).textTheme.labelMedium?.copyWith( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ], ), actions: .new( room == null diff --git a/lib/widgets/room_list.dart b/lib/widgets/room_list.dart index 9562e0f..bd109f7 100644 --- a/lib/widgets/room_list.dart +++ b/lib/widgets/room_list.dart @@ -9,8 +9,6 @@ import "package:nexus/helpers/extensions/room_destinations.dart"; import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/widgets/adaptive_menu_button.dart"; import "package:nexus/models/nav_page.dart"; -import "package:nexus/widgets/appbar.dart"; -import "package:nexus/widgets/room_title.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/create_room_sheet.dart"; import "package:nexus/widgets/start_dm_sheet.dart"; @@ -18,7 +16,6 @@ import "package:nexus/widgets/divider_widget.dart"; import "package:nexus/widgets/error_dialog.dart"; import "package:nexus/widgets/pages/settings.dart"; import "package:nexus/widgets/join_sheet.dart"; -import "package:nexus/widgets/room_summary_sheet.dart"; import "package:nexus/widgets/room_menu_button.dart"; import "package:nexus/widgets/space_hierarchy_sheet.dart"; import "package:nexus/controllers/key.dart"; @@ -191,7 +188,7 @@ class const SpacesRail({super.key}) extends ConsumerWidget { icon: const Icon(Icons.add), ), const IconButton( - tooltip: "Explore other rooms (Not yet implemented)", + tooltip: "Explore other rooms", onPressed: null, icon: Icon(Icons.explore), ), @@ -235,33 +232,25 @@ class const RoomsPane({super.key}) extends ConsumerWidget { }), ); final isDm = selectedSpace.id == "dms"; - final spaceMetadata = selectedSpace.room?.metadata; return Scaffold( backgroundColor: Colors.transparent, - appBar: Appbar( - // Home and DMs aren't real spaces, so they don't have a summary. - onTap: spaceMetadata == null - ? null - : () => context.showAdaptiveSheet( - (_) => RoomSummarySheet(.fromMetadata(spaceMetadata)), - ), - windowControls: false, + appBar: AppBar( leading: AvatarOrHash( - spaceMetadata?.avatar, + selectedSpace.room?.metadata?.avatar, fallback: selectedSpace.icon == null ? null : Icon(selectedSpace.icon), selectedSpace.title, ), - title: RoomTitle(selectedSpace.title, topic: spaceMetadata?.topic), + title: Text(selectedSpace.title, overflow: .ellipsis), backgroundColor: Colors.transparent, - actions: .new([ + actions: [ RoomMenuButton( selectedSpace.room, children: selectedSpace.allChildRooms, ), - ]), + ], ), body: MaterialUiCompatibilityBridge( child: Builder( @@ -284,81 +273,75 @@ class const RoomsPane({super.key}) extends ConsumerWidget { ), ], ), - child: Padding( - padding: const .only(top: 4), - child: NavigationRailM3E( - fab: selectedSpace.room == null - ? null - : .new( - icon: const Icon(Icons.explore), - label: "Browse space", - tooltip: "Browse and join rooms in this space", - onPressed: () => context.showAdaptiveSheet( - (_) => SpaceHierarchySheet(selectedSpace.id), - ), + child: NavigationRailM3E( + fab: selectedSpace.room == null + ? null + : .new( + icon: const Icon(Icons.explore), + label: "Browse space", + tooltip: "Browse and join rooms in this space", + onPressed: () => context.showAdaptiveSheet( + (_) => SpaceHierarchySheet(selectedSpace.id), ), - expandedWidth: double.infinity, - scrollable: true, - background: Colors.transparent, - type: .alwaysExpand, - selectedIndex: max( - 0, - selectedSpace.allChildRooms.indexWhere( - (room) => room.metadata?.id == selectedRoomId, + ), + expandedWidth: double.infinity, + scrollable: true, + background: Colors.transparent, + type: .alwaysExpand, + selectedIndex: max( + 0, + selectedSpace.allChildRooms.indexWhere( + (room) => room.metadata?.id == selectedRoomId, + ), + ), + sections: [ + .new( + header: selectedSpace.room == null + ? null + : const DividerWidget(Text("Rooms")), + destinations: selectedSpace.children.toDestinations( + isDm: isDm, ), ), - sections: [ - .new( - header: selectedSpace.room == null - ? null - : const DividerWidget(Text("Rooms")), - destinations: selectedSpace.children.toDestinations( + ...selectedSpace.subSpaces.map( + (subSpace) => NavigationRailM3ESection( + header: DividerWidget( + Row( + mainAxisSize: .min, + spacing: 8, + children: [ + if (subSpace.room.metadata?.avatar != null) + AvatarOrHash( + subSpace.room.metadata?.avatar, + subSpace.room.metadata?.name ?? "Unnamed Room", + dimension: 16, + ), + Flexible( + child: Text( + subSpace.room.metadata?.name ?? "Unnamed Space", + maxLines: 1, + overflow: .ellipsis, + ), + ), + ], + ), + ), + destinations: subSpace.children.toDestinations( isDm: isDm, ), ), - ...selectedSpace.subSpaces.map( - (subSpace) => NavigationRailM3ESection( - header: DividerWidget( - Row( - mainAxisSize: .min, - spacing: 8, - children: [ - if (subSpace.room.metadata?.avatar != null) - AvatarOrHash( - subSpace.room.metadata?.avatar, - subSpace.room.metadata?.name ?? - "Unnamed Room", - dimension: 16, - ), - Flexible( - child: Text( - subSpace.room.metadata?.name ?? - "Unnamed Space", - maxLines: 1, - overflow: .ellipsis, - ), - ), - ], - ), - ), - destinations: subSpace.children.toDestinations( - isDm: isDm, - ), - ), - ), - ], - onDestinationSelected: (value) { - ref - .read( - KeyController.provider(KeyController.roomKey) - .notifier, - ) - .set(selectedSpace.allChildRooms[value].metadata?.id); - if (Navigator.of(context).canPop()) { - Navigator.of(context).pop(); - } - }, - ), + ), + ], + onDestinationSelected: (value) { + ref + .read( + KeyController.provider(KeyController.roomKey).notifier, + ) + .set(selectedSpace.allChildRooms[value].metadata?.id); + if (Navigator.of(context).canPop()) { + Navigator.of(context).pop(); + } + }, ), ); }, diff --git a/lib/widgets/room_title.dart b/lib/widgets/room_title.dart deleted file mode 100644 index 94eacc8..0000000 --- a/lib/widgets/room_title.dart +++ /dev/null @@ -1,22 +0,0 @@ -import "package:material_ui/material_ui.dart"; - -/// A room or space's name, with its topic underneath if it has one, for app -/// bars. -class const RoomTitle(final String name, {final String? topic, super.key}) - extends StatelessWidget { - @override - Widget build(BuildContext context) => Column( - crossAxisAlignment: .start, - children: [ - Text(name, overflow: .ellipsis, maxLines: 1), - if (topic?.isNotEmpty == true) - Text( - topic!, - maxLines: 1, - overflow: .ellipsis, - style: Theme.of(context).textTheme.labelMedium - ?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), - ), - ], - ); -}