forked from Nexus/nexus
rename RoomsPinsController to PinnedEventsController
This commit is contained in:
parent
a2d2aeca7a
commit
5bdf5d06b1
2 changed files with 6 additions and 6 deletions
92
lib/controllers/pinned_events_controller.dart
Normal file
92
lib/controllers/pinned_events_controller.dart
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
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 PinnedEventsController extends AsyncNotifier<IList<Event>> {
|
||||
final String roomId;
|
||||
PinnedEventsController(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<PinnedEventsController, IList<Event>, String>(
|
||||
PinnedEventsController.new,
|
||||
);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue