Add support for jumping to event links (#103)

Fixes #78.

Reviewed-on: #103
This commit is contained in:
Henry Hiles 2026-09-29 17:00:43 -04:00 • committed by Henry Hiles
commit 1c4bf99be2
16 changed files with 169 additions and 113 deletions

View file

@ -9,8 +9,8 @@ class ContextualEventController(String? _) extends Notifier<int?> {
@override
bool updateShouldNotify(_, _) => true;
static final provider = NotifierProvider.family
.autoDispose<ContextualEventController, int?, String?>(
static final provider =
NotifierProvider.family<ContextualEventController, int?, String?>(
ContextualEventController.new,
);
}

View file

@ -16,11 +16,28 @@ class EventController(final GetEventRequest request)
(event) => event.eventId == request.eventId,
);
return event ??
await ref
.watch(ClientController.provider.notifier)
.getEvent(request)
.onError((_, _) => null);
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

View file

@ -59,7 +59,6 @@ class GomuksListenerController extends AsyncNotifier<void> {
.new({
event.roomId: .new(events: .new({event.rowId: event})),
}),
.new(),
);
break;

View file

@ -35,7 +35,6 @@ class NotificationsController([final NotificationsRequest? request])
),
),
}),
.new(),
);
return .new(mentions.map((event) => (event.rowId, event.roomId)));
@ -79,7 +78,6 @@ class NotificationsController([final NotificationsRequest? request])
),
),
}),
.new(),
);
return currentNotifications.addAll(

View file

@ -77,7 +77,6 @@ class RoomChatController(final ChatParams info)
),
),
}),
.new(),
);
return .new(
timeline: .new(events.map((element) => element.rowId)),
@ -149,7 +148,6 @@ class RoomChatController(final ChatParams info)
),
),
}),
.new(),
);
} else {
final paginationResponse = await client.paginateManual(
@ -173,7 +171,6 @@ class RoomChatController(final ChatParams info)
),
),
}),
.new(),
);
final eventRowIds = paginationResponse.events
@ -274,7 +271,6 @@ class RoomChatController(final ChatParams info)
clientSticky: .new({event.rowId}),
),
}),
.new(),
);
}

View file

@ -33,7 +33,10 @@ class RoomsController extends Notifier<IMap<String, Room>> {
.new(),
);
void update(IMap<String, Room> rooms, ISet<String> leftRooms) {
void update(
IMap<String, Room> rooms, [
ISet<String> leftRooms = const ISet.empty(),
]) {
final merged = rooms.entries.fold(state, (acc, entry) {
final roomId = entry.key;
final incoming = entry.value;