treewide cleanups
This commit is contained in:
parent
53d9c2b1e6
commit
853116ab2f
3 changed files with 88 additions and 138 deletions
|
|
@ -243,17 +243,14 @@ class RoomChatController(final ChatParams info)
|
|||
ref.invalidate(provider);
|
||||
}
|
||||
|
||||
var taggedMessage = text;
|
||||
|
||||
for (final tag in tags) {
|
||||
final escaped = RegExp.escape(tag.id);
|
||||
final pattern = RegExp(r"@+(" + escaped + r")(#[^#]*#)?");
|
||||
|
||||
taggedMessage = taggedMessage.replaceAllMapped(
|
||||
pattern,
|
||||
// Replaces each formatted tag, like "@id#name#", with its ID
|
||||
final taggedMessage = tags.fold(
|
||||
text,
|
||||
(message, tag) => message.replaceAllMapped(
|
||||
RegExp(r"@+(" + RegExp.escape(tag.id) + r")(#[^#]*#)?"),
|
||||
(match) => match.group(1)!,
|
||||
);
|
||||
}
|
||||
),
|
||||
);
|
||||
|
||||
final client = ref.read(ClientController.provider.notifier);
|
||||
final event = await client.sendMessage(
|
||||
|
|
|
|||
|
|
@ -25,55 +25,50 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
|
|||
MapEntry(spaceId, edges.map((edge) => edge.childId).toList()),
|
||||
);
|
||||
|
||||
Set<String> collectDescendants(String startId) {
|
||||
final visited = <String>{};
|
||||
final stack = [startId];
|
||||
|
||||
while (stack.isNotEmpty) {
|
||||
final current = stack.removeLast();
|
||||
final children = childrenById[current] ?? const [];
|
||||
|
||||
for (final child in children) {
|
||||
if (visited.add(child)) {
|
||||
stack.add(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return visited;
|
||||
}
|
||||
/// Everything under [spaceId], however deep, skipping any already
|
||||
/// [visited] so cycles end.
|
||||
ISet<String> collectDescendants(
|
||||
String spaceId, [
|
||||
ISet<String> visited = const .empty(),
|
||||
]) => (childrenById[spaceId] ?? const []).fold(
|
||||
visited,
|
||||
(visited, childId) => visited.contains(childId)
|
||||
? visited
|
||||
: collectDescendants(childId, visited.add(childId)),
|
||||
);
|
||||
|
||||
Space buildSpace(String spaceId) {
|
||||
final space = rooms[spaceId];
|
||||
final directChildrenIds = childrenById[spaceId] ?? const [];
|
||||
|
||||
final directRooms = <Room>[];
|
||||
final subSpaces = <Subspace>[];
|
||||
|
||||
for (final childId in directChildrenIds) {
|
||||
final room = rooms[childId];
|
||||
if (room == null) continue;
|
||||
|
||||
if (childrenById.containsKey(childId)) {
|
||||
final descendants = collectDescendants(childId);
|
||||
|
||||
subSpaces.add(
|
||||
.new(
|
||||
room: room,
|
||||
children: .new(descendants.map((id) => rooms[id]).nonNulls),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
directRooms.add(room);
|
||||
}
|
||||
}
|
||||
|
||||
return .new(
|
||||
id: spaceId,
|
||||
room: space,
|
||||
title: space?.metadata?.name ?? "Unnamed Space",
|
||||
children: .new(directRooms),
|
||||
subSpaces: .new(subSpaces),
|
||||
children: .new(
|
||||
directChildrenIds
|
||||
.where((childId) => !childrenById.containsKey(childId))
|
||||
.map((childId) => rooms[childId])
|
||||
.nonNulls,
|
||||
),
|
||||
subSpaces: .new(
|
||||
directChildrenIds
|
||||
.where(childrenById.containsKey)
|
||||
.map(
|
||||
(childId) => switch (rooms[childId]) {
|
||||
final room? => Subspace(
|
||||
room: room,
|
||||
children: .new(
|
||||
collectDescendants(childId)
|
||||
.map((id) => rooms[id])
|
||||
.nonNulls,
|
||||
),
|
||||
),
|
||||
null => null,
|
||||
},
|
||||
)
|
||||
.nonNulls,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,53 +1,48 @@
|
|||
import "package:collection/collection.dart";
|
||||
import "package:fast_immutable_collections/fast_immutable_collections.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/client_state.dart";
|
||||
import "package:nexus/models/content/content.dart";
|
||||
import "package:nexus/models/content/membership.dart";
|
||||
import "package:nexus/models/content/power_levels.dart";
|
||||
import "package:nexus/models/event.dart";
|
||||
import "package:nexus/models/room.dart";
|
||||
|
||||
class ViaController(final Room room) extends Notifier<String> {
|
||||
@override
|
||||
String build() {
|
||||
final servers = <String>{};
|
||||
final powerLevelUsers =
|
||||
switch (room.state[EventType.powerLevels.type]?[""]) {
|
||||
final rowId? => switch (room.events[rowId]?.content) {
|
||||
PowerLevelsContent(:final users) => users.keys.toIList(),
|
||||
_ => null,
|
||||
},
|
||||
null => null,
|
||||
} ??
|
||||
.new([]);
|
||||
|
||||
void addUserId(String? userId) {
|
||||
final server = userId?.split(":").lastOrNull;
|
||||
if (server != null) {
|
||||
servers.add(server);
|
||||
}
|
||||
}
|
||||
final joinedMembers =
|
||||
(room.state[EventType.membership.type]?.values ?? const [])
|
||||
.map(
|
||||
(rowId) => switch (room.events[rowId]) {
|
||||
Event(
|
||||
stateKey: final userId?,
|
||||
content: MembershipContent(status: .join),
|
||||
) =>
|
||||
userId,
|
||||
_ => null,
|
||||
},
|
||||
)
|
||||
.nonNulls
|
||||
.toIList();
|
||||
|
||||
addUserId(ref.watch(ClientStateController.provider)?.userId);
|
||||
|
||||
final powerLevelsEventId = room.state[EventType.powerLevels.type]?[""];
|
||||
final powerLevels = powerLevelsEventId == null
|
||||
? null
|
||||
: room.events[powerLevelsEventId];
|
||||
|
||||
if (powerLevels?.content case PowerLevelsContent(:final users)) {
|
||||
for (final userId in users.keys) {
|
||||
addUserId(userId);
|
||||
if (servers.length >= 5) break;
|
||||
}
|
||||
}
|
||||
|
||||
final members = room.state[EventType.membership.type]?.values.toIList();
|
||||
for (var i = 0; servers.length < 5; i++) {
|
||||
final membershipEventId = members?.getOrNull(i);
|
||||
final member = membershipEventId == null
|
||||
? null
|
||||
: room.events[membershipEventId];
|
||||
|
||||
if (member?.content case MembershipContent(:final status)) {
|
||||
if (status == .join) {
|
||||
addUserId(member?.stateKey);
|
||||
}
|
||||
}
|
||||
|
||||
if (members?.getOrNull(i) == null) break;
|
||||
}
|
||||
final servers = [?ref.watch(ClientStateController.provider)?.userId]
|
||||
.toIList()
|
||||
.addAll(powerLevelUsers)
|
||||
.addAll(joinedMembers)
|
||||
.map((userId) => userId.substring(userId.indexOf(":") + 1))
|
||||
.whereNoDuplicates()
|
||||
.take(5)
|
||||
.toISet();
|
||||
|
||||
return servers.isEmpty
|
||||
? ""
|
||||
|
|
|
|||
Loading…
Reference in a new issue