make RoomChatController family take an event ID
This commit is contained in:
parent
66bd75c2f1
commit
66bb820a59
4 changed files with 27 additions and 17 deletions
|
|
@ -17,9 +17,11 @@ import "package:nexus/models/requests/send_message.dart";
|
|||
import "package:nexus/models/room.dart";
|
||||
import "package:nexus/models/room_chat.dart";
|
||||
|
||||
class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
||||
class RoomChatController(final (String roomId, String? withEventId) info)
|
||||
extends AsyncNotifier<RoomChat?> {
|
||||
@override
|
||||
Future<RoomChat?> build() async {
|
||||
final (roomId, eventId) = info;
|
||||
final client = ref.read(ClientController.provider.notifier);
|
||||
final room = ref.watch(
|
||||
RoomsController.provider.select((rooms) => rooms[roomId]),
|
||||
|
|
@ -64,7 +66,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
.redactEvent(
|
||||
RedactEventRequest(
|
||||
eventId: event.eventId,
|
||||
roomId: roomId,
|
||||
roomId: info.$1,
|
||||
reason: reason,
|
||||
),
|
||||
);
|
||||
|
|
@ -75,14 +77,14 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
state = .loading();
|
||||
|
||||
final timelineKeys = ref
|
||||
.read(RoomsController.provider.select((value) => value[roomId]))
|
||||
.read(RoomsController.provider.select((value) => value[info.$1]))
|
||||
?.timeline
|
||||
.keys;
|
||||
final response = await ref
|
||||
.read(ClientController.provider.notifier)
|
||||
.paginate(
|
||||
.new(
|
||||
roomId: roomId,
|
||||
roomId: info.$1,
|
||||
maxTimelineId: timelineKeys?.isNotEmpty == true
|
||||
? timelineKeys?.reduce(min)
|
||||
: null,
|
||||
|
|
@ -97,7 +99,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
.read(RoomsController.provider.notifier)
|
||||
.update(
|
||||
IMap({
|
||||
roomId: Room(
|
||||
info.$1: Room(
|
||||
events: IMap.fromIterable(
|
||||
response.events.addAll(response.relatedEvents),
|
||||
keyMapper: (event) => event.rowId,
|
||||
|
|
@ -126,7 +128,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
if (relationType == .edit) {
|
||||
baseContent = relation?.content;
|
||||
} else {
|
||||
final provider = AttachmentController.provider(roomId);
|
||||
final provider = AttachmentController.provider(info.$1);
|
||||
baseContent = ref.read(provider)?.$2;
|
||||
ref.invalidate(provider);
|
||||
}
|
||||
|
|
@ -146,7 +148,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
final client = ref.read(ClientController.provider.notifier);
|
||||
final event = await client.sendMessage(
|
||||
SendMessageRequest(
|
||||
roomId: roomId,
|
||||
roomId: info.$1,
|
||||
baseContent: baseContent,
|
||||
mentions: Mentions(
|
||||
userIds: [
|
||||
|
|
@ -168,7 +170,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
.read(RoomsController.provider.notifier)
|
||||
.update(
|
||||
.new({
|
||||
roomId: .new(
|
||||
info.$1: .new(
|
||||
events: .new({event.rowId: event}),
|
||||
clientSticky: .new({event.rowId}),
|
||||
),
|
||||
|
|
@ -185,7 +187,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
final client = ref.read(ClientController.provider.notifier);
|
||||
final allReactionEvents = await client.getRelatedEvents(
|
||||
.new(
|
||||
roomId: roomId,
|
||||
roomId: info.$1,
|
||||
eventId: event.eventId,
|
||||
relationType: "m.annotation",
|
||||
),
|
||||
|
|
@ -206,7 +208,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
if (reactionEvent != null) {
|
||||
await ref
|
||||
.watch(ClientController.provider.notifier)
|
||||
.redactEvent(.new(eventId: reactionEvent.eventId, roomId: roomId));
|
||||
.redactEvent(.new(eventId: reactionEvent.eventId, roomId: info.$1));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -215,7 +217,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
|
||||
await client.sendEvent(
|
||||
.new(
|
||||
roomId: roomId,
|
||||
roomId: info.$1,
|
||||
type: EventType.reaction.type,
|
||||
content: ReactionContent(key: reaction),
|
||||
synchronous: true,
|
||||
|
|
@ -227,7 +229,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
|
|||
}
|
||||
|
||||
static final provider = AsyncNotifierProvider.family
|
||||
.autoDispose<RoomChatController, RoomChat?, String>(
|
||||
.autoDispose<RoomChatController, RoomChat?, (String, String?)>(
|
||||
RoomChatController.new,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,9 @@ extension BuildEventOptions on Event {
|
|||
final theme = Theme.of(context);
|
||||
final danger = theme.colorScheme.error;
|
||||
|
||||
final notifier = ref.read(RoomChatController.provider(roomId).notifier);
|
||||
final notifier = ref.read(
|
||||
RoomChatController.provider((roomId, null)).notifier,
|
||||
);
|
||||
final client = ref.read(ClientController.provider.notifier);
|
||||
|
||||
final isPinned = ref
|
||||
|
|
|
|||
|
|
@ -64,8 +64,10 @@ class const ReactionRow(final Event event, {super.key}) extends ConsumerWidget {
|
|||
enabled.value = false;
|
||||
try {
|
||||
final controller = ref.watch(
|
||||
RoomChatController.provider(event.roomId)
|
||||
.notifier,
|
||||
RoomChatController.provider((
|
||||
event.roomId,
|
||||
null,
|
||||
)).notifier,
|
||||
);
|
||||
|
||||
if (selected) {
|
||||
|
|
|
|||
|
|
@ -24,13 +24,14 @@ final class const RoomChat({
|
|||
required final String? roomId,
|
||||
required final bool isDesktop,
|
||||
required final bool showMembersByDefault,
|
||||
final String? initialHighlightedEvent,
|
||||
super.key,
|
||||
}) extends HookConsumerWidget {
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final relatedEvent = useState<Event?>(null);
|
||||
final relationType = useState(RelationType.reply);
|
||||
final highlightedEvent = useState<String?>(null);
|
||||
final highlightedEvent = useState<String?>(initialHighlightedEvent);
|
||||
|
||||
final composerSize = useState<double>(64);
|
||||
|
||||
|
|
@ -59,7 +60,10 @@ final class const RoomChat({
|
|||
|
||||
final roomId = this.roomId!;
|
||||
|
||||
final controllerProvider = RoomChatController.provider(roomId);
|
||||
final controllerProvider = RoomChatController.provider((
|
||||
roomId,
|
||||
initialHighlightedEvent,
|
||||
));
|
||||
final notifier = ref.watch(controllerProvider.notifier);
|
||||
|
||||
final client = ref.read(ClientController.provider.notifier);
|
||||
|
|
|
|||
Loading…
Reference in a new issue