Support for pinned messages #49

Merged
Henry-Hiles merged 24 commits from istalri/nexus:support_pinned_messages into main 2026-07-14 19:29:47 -04:00
2 changed files with 28 additions and 34 deletions
Showing only changes of commit 29d565fda5 - Show all commits

rework logic in PinnedEventsController, make

`SetStateEvent.content` a `Content`
Henry Hiles 2026-07-14 15:39:57 -04:00
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -42,53 +42,46 @@ class PinnedEventsController extends AsyncNotifier<IList<Event>> {
}
Future<void> addPin(Event event) async {
final client = ref.read(ClientController.provider.notifier);
final current = await future;
if (current.any((ev) => ev.eventId == event.eventId)) {
return;
}
final updatedPinnedIds = [
...current.map((ev) => ev.eventId),
event.eventId,
];
await client.setState(
return setPinned(
.new(
roomId: roomId,
type: EventType.pinnedEvents.type,
stateKey:
"", //The empty string stands for m.room.pinned_events according to matrix spec.
content: {"pinned": updatedPinnedIds},
pinnedEvents: .new(
current
.map((element) => element.eventId)
.toIList()
.add(event.eventId),
),
),
);
}
Future<void> removePin(Event event) async {
final client = ref.read(ClientController.provider.notifier);
final current = await future;
if (!current.any((ev) => ev.eventId == event.eventId)) {
return;
}
final updatedPinnedIds = [
...current
.where((ev) => ev.eventId != event.eventId)
.map((ev) => ev.eventId),
];
await client.setState(
return setPinned(
.new(
roomId: roomId,
type: EventType.pinnedEvents.type,
stateKey: "", //The empty string stands for m.room.pinned_events according to matrix spec.
content: {"pinned": updatedPinnedIds},
pinnedEvents: .new(
current
.map((element) => element.eventId)
.toIList()
istalri marked this conversation as resolved Outdated

I think I'd prefer a removePin and addPin, separate methods. And of course this needs to be called from the context menu. The context menu should have an option of "Pin" if the event is not pinned (not present in pinned events controller), and you have permission to pin, or "Unpin" if the event IS pinned, and you have permission to pin.

I think I'd prefer a `removePin` and `addPin`, separate methods. And of course this needs to be called from the context menu. The context menu should have an option of "Pin" if the event is not pinned (not present in pinned events controller), and you have permission to pin, or "Unpin" if the event IS pinned, and you have permission to pin.

Yeah, makes sense, seperation of concern is a useful standard. This would make it cleaner.

Yeah, makes sense, seperation of concern is a useful standard. This would make it cleaner.
.remove(event.eventId),
),
),
);
}
Future<void> setPinned(PinnedEventsContent content) => ref
.read(ClientController.provider.notifier)
.setState(
.new(
roomId: roomId,
type: EventType.pinnedEvents.type,
stateKey: "",
content: content,
),
);
static final provider = AsyncNotifierProvider.family
.autoDispose<PinnedEventsController, IList<Event>, String>(
PinnedEventsController.new,

View file

@ -1,4 +1,5 @@
import "package:freezed_annotation/freezed_annotation.dart";
import "package:nexus/models/content/content.dart";
part "set_state_request.freezed.dart";
part "set_state_request.g.dart";
@ -8,7 +9,7 @@ abstract class SetStateRequest with _$SetStateRequest {
required String roomId,
required String type,
required String stateKey,
required Map<String, dynamic> content,
required Content content,
@Default(0) int delayMs,
}) = _SetStateRequest;