forked from Nexus/nexus
69 lines
2.1 KiB
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,
|
|
);
|
|
}
|