Support for pinned messages #49
2 changed files with 28 additions and 34 deletions
rework logic in PinnedEventsController, make
`SetStateEvent.content` a `Content`
commit
29d565fda5
|
|
@ -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
|
||||
.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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue
I think I'd prefer a
removePinandaddPin, 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.