diff --git a/lib/controllers/room_chat.dart b/lib/controllers/room_chat.dart index 35dee48..7e1aeb2 100644 --- a/lib/controllers/room_chat.dart +++ b/lib/controllers/room_chat.dart @@ -23,7 +23,7 @@ class RoomChatController(final (String roomId, String? contextualEvent) info) Future build() async { final (roomId, eventId) = info; final client = ref.read(ClientController.provider.notifier); - final room = ref.watch( + final room = ref.read( RoomsController.provider.select((rooms) => rooms[roomId]), ); @@ -34,43 +34,39 @@ class RoomChatController(final (String roomId, String? contextualEvent) info) await ref.read(RoomsController.provider.notifier).addState(roomId, state); } - if (info.$2 == null || - room.events.values.map((e) => e.eventId).contains(info.$2)) { - return .new( - events: room.timeline - .toEntryIList( - compare: (a, b) => (a?.key ?? 0).compareTo(b?.key ?? 0), - ) - .map((element) => element.value) - .toIList() - .addAll(room.clientSticky) - .map((entry) { - final foundEvent = entry == null ? null : room.events[entry]; + final timeline = room.timeline + .toEntryIList(compare: (a, b) => (a?.key ?? 0).compareTo(b?.key ?? 0)) + .map((element) => element.value) + .toIList() + .addAll(room.clientSticky) + .map((entry) { + final foundEvent = entry == null ? null : room.events[entry]; - final editedEvent = - foundEvent == null || foundEvent.lastEditRowId == 0 - ? null - : room.events[foundEvent.lastEditRowId]; + final editedEvent = + foundEvent == null || foundEvent.lastEditRowId == 0 + ? null + : room.events[foundEvent.lastEditRowId]; - return editedEvent == null - ? foundEvent - : foundEvent?.copyWith( - content: editedEvent.content, - localContent: editedEvent.localContent, - ); - }) - .nonNulls - .toIList(), - hasMore: room.hasMore, - ); - } - { + return editedEvent == null + ? foundEvent + : foundEvent?.copyWith( + content: editedEvent.content, + localContent: editedEvent.localContent, + ); + }) + .nonNulls + .toIList(); + + if (info.$2 == null || timeline.map((e) => e.eventId).contains(info.$2)) { + ref.watch(RoomsController.provider.select((rooms) => rooms[roomId])); + + return .new(timeline: timeline, hasMore: room.hasMore); + } else { final context = await client.getEventContext( .new(roomId: roomId, eventId: info.$2!, limit: 20), ); - return .new( - events: context.events, + timeline: context.before.add(context.event).addAll(context.after), hasMore: true, historicalData: .new(start: context.start, end: context.end), ); diff --git a/lib/helpers/hooks/chat_scroll.dart b/lib/helpers/hooks/chat_scroll.dart index 6420726..065a215 100644 --- a/lib/helpers/hooks/chat_scroll.dart +++ b/lib/helpers/hooks/chat_scroll.dart @@ -32,8 +32,8 @@ final class ChatScroll({ useEffect(() { if (anchorId.value == null) { if (controllerData case AsyncData(:final value?) - when value.events.isNotEmpty) { - anchorId.value = value.events.last.eventId; + when value.timeline.isNotEmpty) { + anchorId.value = value.timeline.last.eventId; } } @@ -41,7 +41,7 @@ final class ChatScroll({ }, [controllerData]); final ({IList history, IList live}) split = useMemoized(() { - final items = controllerData.value?.events; + final items = controllerData.value?.timeline; final anchor = anchorIdValue; if (items == null || anchor == null) { diff --git a/lib/models/event_context.dart b/lib/models/event_context.dart index e7b1cb1..6103c7d 100644 --- a/lib/models/event_context.dart +++ b/lib/models/event_context.dart @@ -8,7 +8,7 @@ part "event_context.g.dart"; @Freezed(toJson: false, fromJson: false) @JsonSerializable() class const EventContext({ - required final IList events, + required final Event event, required final IList before, required final IList after, required final String start, diff --git a/lib/models/room_chat.dart b/lib/models/room_chat.dart index ca9799c..6044909 100644 --- a/lib/models/room_chat.dart +++ b/lib/models/room_chat.dart @@ -8,7 +8,7 @@ part "room_chat.g.dart"; @Freezed(toJson: false, fromJson: false) @JsonSerializable() class const RoomChat({ - required final IList events, + required final IList timeline, required final bool hasMore, final HistoricalData? historicalData, }) with _$RoomChat {