1
0
Fork 0
forked from Nexus/nexus

rename RoomsPinsController to PinnedEventsController

This commit is contained in:
Henry Hiles 2026-07-06 20:07:02 -04:00
commit 5bdf5d06b1
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 6 additions and 6 deletions

View file

@ -1,92 +0,0 @@
import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/client_controller.dart";
import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/models/content/content.dart";
import "package:nexus/models/content/pinned_events.dart";
import "package:nexus/models/event.dart";
class RoomPinsController extends AsyncNotifier<IList<Event>> {
final String roomId;
RoomPinsController(this.roomId);
@override
Future<IList<Event>> build() async {
final room = ref.watch(
RoomsController.provider.select((rooms) => rooms[roomId]),
);
if (room == null) return .new();
final pinnedRowId = room.state[EventType.pinnedEvents.type]?[""];
final pinnedStateEvent = pinnedRowId == null
? null
: room.events[pinnedRowId];
if (pinnedStateEvent == null) return .new();
final pinnedContent = switch (pinnedStateEvent.content) {
PinnedEventsContent content => content,
_ => null,
};
if (pinnedContent == null || pinnedContent.pinned.isEmpty) {
return .new();
}
final localEvents = <Event>[];
final missingIds = <String>[];
for (final eventId in pinnedContent.pinned) {
final localEvent = room.events.values.firstWhereOrNull(
(e) => e.eventId == eventId,
);
if (localEvent != null) {
localEvents.add(localEvent);
} else {
missingIds.add(eventId);
}
}
if (missingIds.isNotEmpty) {
final client = ref.read(ClientController.provider.notifier);
final fetched = await Future.wait(
missingIds.map(
(id) => client.getEvent(.new(roomId: roomId, eventId: id)),
),
);
localEvents.addAll(fetched.whereType<Event>());
}
return localEvents.toIList();
}
Future<void> togglePin(Event event) async {
final client = ref.read(ClientController.provider.notifier);
final current = await future;
final updatedPinnedIds = current.any((e) => e.eventId == event.eventId)
? current
.where((e) => e.eventId != event.eventId)
.map((e) => e.eventId)
.toList()
: [...current.map((e) => e.eventId), event.eventId];
await client.sendEvent(
.new(
roomId: roomId,
type: EventType.pinnedEvents.type,
stateKey: "",
content: {"pinned": updatedPinnedIds},
),
);
}
static final provider = AsyncNotifierProvider.family
.autoDispose<RoomPinsController, IList<Event>, String>(
RoomPinsController.new,
);
}