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()
|
||||||
|
.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