import "package:collection/collection.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/models/event.dart"; import "package:nexus/models/requests/get_event.dart"; class EventController(final GetEventRequest request) extends AsyncNotifier { @override Future build() async { final room = ref.watch( RoomsController.provider.select((value) => value[request.roomId]), ); final event = room?.events.values.firstWhereOrNull( (event) => event.eventId == request.eventId, ); if (event != null) return event; final fetchedEvent = await ref .watch(ClientController.provider.notifier) .getEvent(request) .onError((_, _) => null); if (fetchedEvent != null) { ref .watch(RoomsController.provider.notifier) .update( .new({ request.roomId: .new( events: .new({fetchedEvent.rowId: fetchedEvent}), ), }), ); return fetchedEvent; } return null; } static final provider = AsyncNotifierProvider.family .autoDispose( EventController.new, ); }