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