forked from Henry-Hiles/nexus
wip
This commit is contained in:
parent
97f2673b55
commit
c084bc4caf
12 changed files with 182 additions and 156 deletions
|
|
@ -1,23 +1,57 @@
|
|||
import "package:fast_immutable_collections/fast_immutable_collections.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/client_controller.dart";
|
||||
import "package:nexus/helpers/extensions/get_full_room.dart";
|
||||
import "package:nexus/models/full_room.dart";
|
||||
import "package:nexus/models/read_receipt.dart";
|
||||
import "package:nexus/models/room.dart";
|
||||
|
||||
class RoomsController extends AsyncNotifier<IList<FullRoom>> {
|
||||
class RoomsController extends Notifier<IMap<String, Room>> {
|
||||
@override
|
||||
Future<IList<FullRoom>> build() async {
|
||||
final client = await ref.watch(ClientController.provider.future);
|
||||
IMap<String, Room> build() => const IMap.empty();
|
||||
|
||||
ref.onDispose(
|
||||
client.onSync.stream.listen((_) => ref.invalidateSelf()).cancel,
|
||||
void update(IMap<String, Room> rooms, ISet<String> leftRooms) {
|
||||
final merged = rooms.entries.fold(state, (acc, entry) {
|
||||
final roomId = entry.key;
|
||||
final incoming = entry.value;
|
||||
final existing = acc[roomId];
|
||||
|
||||
return acc.add(
|
||||
roomId,
|
||||
existing?.copyWith(
|
||||
metadata: incoming.metadata ?? existing.metadata,
|
||||
events: existing.events.addAll(incoming.events),
|
||||
state: incoming.state.entries.fold(
|
||||
existing.state,
|
||||
(stateAcc, event) => stateAcc.add(
|
||||
event.key,
|
||||
(stateAcc[event.key] ?? IMap<dynamic, dynamic>()).addAll(
|
||||
event.value,
|
||||
),
|
||||
),
|
||||
),
|
||||
timeline: incoming.reset
|
||||
? incoming.timeline
|
||||
: existing.timeline.addAll(incoming.timeline),
|
||||
receipts: incoming.receipts.entries.fold(
|
||||
existing.receipts,
|
||||
(receiptAcc, event) => receiptAcc.add(
|
||||
event.key,
|
||||
(receiptAcc[event.key] ?? IList<ReadReceipt>()).addAll(
|
||||
event.value,
|
||||
),
|
||||
),
|
||||
),
|
||||
) ??
|
||||
incoming,
|
||||
);
|
||||
});
|
||||
|
||||
final prunedList = leftRooms.fold(
|
||||
merged,
|
||||
(acc, roomId) => acc.remove(roomId),
|
||||
);
|
||||
|
||||
return IList(await Future.wait(client.rooms.map((room) => room.fullRoom)));
|
||||
state = prunedList;
|
||||
}
|
||||
|
||||
static final provider =
|
||||
AsyncNotifierProvider<RoomsController, IList<FullRoom>>(
|
||||
RoomsController.new,
|
||||
);
|
||||
static final provider = NotifierProvider<RoomsController, IMap<String, Room>>(
|
||||
RoomsController.new,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue