Compare commits

...

2 commits

Author SHA1 Message Date
5f9622e1c9
try to fix android build 2026-06-05 21:39:51 -04:00
6e02cce84f
WIP subspace support 2026-06-05 21:23:06 -04:00
12 changed files with 58 additions and 45 deletions

View file

@ -88,6 +88,7 @@ class SpacesController extends Notifier<IList<Space>> {
final children = childRoomsBySpaceId[id] ?? .new();
return Space(
subSpaces: const IList.empty(), // TODO
id: id,
title: room.metadata?.name ?? "Unnamed Room",
room: room,
@ -103,12 +104,14 @@ class SpacesController extends Notifier<IList<Space>> {
title: "Home",
icon: Icons.home,
children: homeRooms,
subSpaces: .new(),
),
.new(
id: "dms",
title: "Direct Messages",
icon: Icons.people,
children: dmRooms,
subSpaces: .new(),
),
...topLevelSpacesList,
]

View file

@ -1,4 +1,5 @@
import "dart:io";
import "package:dynamic_color/dynamic_color.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter/foundation.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
@ -17,7 +18,6 @@ import "package:nexus/widgets/error_dialog.dart";
import "package:nexus/widgets/loading.dart";
import "package:window_manager/window_manager.dart";
import "package:flutter/material.dart";
import "package:dynamic_system_colors/dynamic_system_colors.dart";
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

View file

@ -2,6 +2,7 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter/widgets.dart";
import "package:freezed_annotation/freezed_annotation.dart";
import "package:nexus/models/room.dart";
import "package:nexus/models/subspace.dart";
part "space.freezed.dart";
@freezed
@ -12,5 +13,6 @@ abstract class Space with _$Space {
IconData? icon,
Room? room,
required IList<Room> children,
required IList<Subspace> subSpaces,
}) = _Space;
}

10
lib/models/subspace.dart Normal file
View file

@ -0,0 +1,10 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:freezed_annotation/freezed_annotation.dart";
import "package:nexus/models/room.dart";
part "subspace.freezed.dart";
@freezed
abstract class Subspace with _$Subspace {
const factory Subspace({required Room room, required IList<Room> children}) =
_Subspace;
}

View file

@ -84,9 +84,15 @@ class JoinDialog extends HookWidget {
space?.id ??
spaces
.firstWhere(
(space) => space.children.any(
(child) => child.metadata?.id == id,
),
(space) =>
space.children.any(
(child) =>
child.metadata?.id == id,
) ||
space.subSpaces.any(
(child) =>
child.room.metadata?.id == id,
),
)
.id,
);

View file

@ -1,9 +1,11 @@
import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter/material.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:navigation_rail_m3e/navigation_rail_m3e.dart";
import "package:nexus/controllers/key_controller.dart";
import "package:nexus/controllers/spaces_controller.dart";
import "package:nexus/models/room.dart";
import "package:nexus/widgets/avatar_or_hash.dart";
import "package:nexus/widgets/join_dialog.dart";
import "package:nexus/widgets/room_menu.dart";
@ -43,6 +45,27 @@ class Sidebar extends HookConsumerWidget {
? null
: indexOfSelectedRoom;
List<NavigationRailM3EDestination> roomsToDestinations(IList<Room> rooms) =>
rooms
.map(
(room) => NavigationRailM3EDestination(
label: room.metadata?.name ?? "Unnamed Room",
badgeCount: switch (room.metadata?.unreadNotifications) {
0 || null => room.metadata?.unreadMessages == 0 ? null : 0,
int unread => unread,
},
icon: AvatarOrHash(
room.metadata?.avatar,
room.metadata?.name ?? "Unnamed Room",
fallback: selectedSpaceId == "dms"
? null
: Icon(Icons.numbers),
// space.client.headers,
),
),
)
.toList();
return Drawer(
width: 340,
shape: Border(),
@ -189,29 +212,15 @@ class Sidebar extends HookConsumerWidget {
selectedIndex: selectedRoomIndex ?? 0,
sections: [
.new(
destinations: selectedSpace.children
.map(
(room) => NavigationRailM3EDestination(
label: room.metadata?.name ?? "Unnamed Room",
badgeCount: switch (room
.metadata
?.unreadNotifications) {
0 || null =>
room.metadata?.unreadMessages == 0 ? null : 0,
int unread => unread,
},
icon: AvatarOrHash(
room.metadata?.avatar,
room.metadata?.name ?? "Unnamed Room",
fallback: selectedSpaceId == "dms"
? null
: Icon(Icons.numbers),
// space.client.headers,
),
),
)
.toList(),
destinations: roomsToDestinations(selectedSpace.children),
),
for (final subSpace in selectedSpace.subSpaces)
.new(
header: Text(
subSpace.room.metadata?.name ?? "Unnamed Room",
),
destinations: roomsToDestinations(subSpace.children),
),
],
onDestinationSelected: (value) {
selectedRoomIdNotifier.set(

View file

@ -7,7 +7,6 @@
#include "generated_plugin_registrant.h"
#include <dynamic_color/dynamic_color_plugin.h>
#include <dynamic_system_colors/dynamic_color_plugin.h>
#include <file_selector_linux/file_selector_plugin.h>
#include <media_kit_libs_linux/media_kit_libs_linux_plugin.h>
#include <media_kit_video/media_kit_video_plugin.h>
@ -19,9 +18,6 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) dynamic_color_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin");
dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);
g_autoptr(FlPluginRegistrar) dynamic_system_colors_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin");
dynamic_color_plugin_register_with_registrar(dynamic_system_colors_registrar);
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);

View file

@ -4,7 +4,6 @@
list(APPEND FLUTTER_PLUGIN_LIST
dynamic_color
dynamic_system_colors
file_selector_linux
media_kit_libs_linux
media_kit_video

View file

@ -282,7 +282,7 @@ packages:
source: hosted
version: "2.1.2"
dynamic_color:
dependency: transitive
dependency: "direct main"
description:
name: dynamic_color
sha256: "43a5a6679649a7731ab860334a5812f2067c2d9ce6452cf069c5e0c25336c17c"
@ -297,14 +297,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.0.7"
dynamic_system_colors:
dependency: "direct main"
description:
name: dynamic_system_colors
sha256: "6cda994363fe362e3c433e068af83feffc2c9a26ba0be7ecdb2b96f676d2dfd8"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
emoji_text_field:
dependency: "direct main"
description:

View file

@ -33,7 +33,7 @@ dependencies:
image_picker: 1.2.2
file_picker: 11.0.2
path: 1.9.1
dynamic_system_colors: 1.9.0
dynamic_color: 1.8.1
collection: 1.19.1
window_manager: 0.5.1
color_hash: 1.0.1

View file

@ -7,7 +7,6 @@
#include "generated_plugin_registrant.h"
#include <dynamic_color/dynamic_color_plugin_c_api.h>
#include <dynamic_system_colors/dynamic_color_plugin_c_api.h>
#include <file_selector_windows/file_selector_windows.h>
#include <media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h>
#include <media_kit_video/media_kit_video_plugin_c_api.h>
@ -16,8 +15,6 @@
#include <window_manager/window_manager_plugin.h>
void RegisterPlugins(flutter::PluginRegistry* registry) {
DynamicColorPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
DynamicColorPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
FileSelectorWindowsRegisterWithRegistrar(

View file

@ -4,7 +4,6 @@
list(APPEND FLUTTER_PLUGIN_LIST
dynamic_color
dynamic_system_colors
file_selector_windows
media_kit_libs_windows_video
media_kit_video