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> { final String roomId; PinnedEventsController(this.roomId); @override Future> 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 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, String>( PinnedEventsController.new, ); }