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 {
|
Future<void> addPin(Event event) async {
|
||||||
final client = ref.read(ClientController.provider.notifier);
|
|
||||||
final current = await future;
|
final current = await future;
|
||||||
|
|
||||||
if (current.any((ev) => ev.eventId == event.eventId)) {
|
return setPinned(
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final updatedPinnedIds = [
|
|
||||||
...current.map((ev) => ev.eventId),
|
|
||||||
event.eventId,
|
|
||||||
];
|
|
||||||
|
|
||||||
await client.setState(
|
|
||||||
.new(
|
.new(
|
||||||
roomId: roomId,
|
pinnedEvents: .new(
|
||||||
type: EventType.pinnedEvents.type,
|
current
|
||||||
stateKey:
|
.map((element) => element.eventId)
|
||||||
"", //The empty string stands for m.room.pinned_events according to matrix spec.
|
.toIList()
|
||||||
content: {"pinned": updatedPinnedIds},
|
.add(event.eventId),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> removePin(Event event) async {
|
Future<void> removePin(Event event) async {
|
||||||
final client = ref.read(ClientController.provider.notifier);
|
|
||||||
final current = await future;
|
final current = await future;
|
||||||
|
|
||||||
if (!current.any((ev) => ev.eventId == event.eventId)) {
|
return setPinned(
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final updatedPinnedIds = [
|
|
||||||
...current
|
|
||||||
.where((ev) => ev.eventId != event.eventId)
|
|
||||||
.map((ev) => ev.eventId),
|
|
||||||
];
|
|
||||||
|
|
||||||
await client.setState(
|
|
||||||
.new(
|
.new(
|
||||||
roomId: roomId,
|
pinnedEvents: .new(
|
||||||
type: EventType.pinnedEvents.type,
|
current
|
||||||
stateKey: "", //The empty string stands for m.room.pinned_events according to matrix spec.
|
.map((element) => element.eventId)
|
||||||
content: {"pinned": updatedPinnedIds},
|
.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
|
static final provider = AsyncNotifierProvider.family
|
||||||
.autoDispose<PinnedEventsController, IList<Event>, String>(
|
.autoDispose<PinnedEventsController, IList<Event>, String>(
|
||||||
PinnedEventsController.new,
|
PinnedEventsController.new,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import "package:freezed_annotation/freezed_annotation.dart";
|
import "package:freezed_annotation/freezed_annotation.dart";
|
||||||
|
import "package:nexus/models/content/content.dart";
|
||||||
part "set_state_request.freezed.dart";
|
part "set_state_request.freezed.dart";
|
||||||
part "set_state_request.g.dart";
|
part "set_state_request.g.dart";
|
||||||
|
|
||||||
|
|
@ -8,7 +9,7 @@ abstract class SetStateRequest with _$SetStateRequest {
|
||||||
required String roomId,
|
required String roomId,
|
||||||
required String type,
|
required String type,
|
||||||
required String stateKey,
|
required String stateKey,
|
||||||
required Map<String, dynamic> content,
|
required Content content,
|
||||||
@Default(0) int delayMs,
|
@Default(0) int delayMs,
|
||||||
}) = _SetStateRequest;
|
}) = _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.