1
0
Fork 0
forked from Nexus/nexus
nexus/lib/controllers/pinned_events_controller.dart

69 lines
2.1 KiB
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/event_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();
if (pinnedStateEvent.content case PinnedEventsContent content) {
return (await Future.wait(
content.pinnedEvents.map(
(eventId) => ref.watch(
EventController.provider(
.new(eventId: eventId, roomId: roomId),
).future,
),
),
)).nonNulls.toIList();
}
return .new();
}
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,
);
}