Compare commits

..
5 changed files with 18 additions and 28 deletions

View file

@ -17,11 +17,9 @@ 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, String? withEventId) info) class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
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]),
@ -66,7 +64,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
.redactEvent( .redactEvent(
RedactEventRequest( RedactEventRequest(
eventId: event.eventId, eventId: event.eventId,
roomId: info.$1, roomId: roomId,
reason: reason, reason: reason,
), ),
); );
@ -77,14 +75,14 @@ class RoomChatController(final (String roomId, String? withEventId) info)
state = .loading(); state = .loading();
final timelineKeys = ref final timelineKeys = ref
.read(RoomsController.provider.select((value) => value[info.$1])) .read(RoomsController.provider.select((value) => value[roomId]))
?.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: info.$1, roomId: roomId,
maxTimelineId: timelineKeys?.isNotEmpty == true maxTimelineId: timelineKeys?.isNotEmpty == true
? timelineKeys?.reduce(min) ? timelineKeys?.reduce(min)
: null, : null,
@ -99,7 +97,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
.read(RoomsController.provider.notifier) .read(RoomsController.provider.notifier)
.update( .update(
IMap({ IMap({
info.$1: Room( roomId: 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,
@ -128,7 +126,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
if (relationType == .edit) { if (relationType == .edit) {
baseContent = relation?.content; baseContent = relation?.content;
} else { } else {
final provider = AttachmentController.provider(info.$1); final provider = AttachmentController.provider(roomId);
baseContent = ref.read(provider)?.$2; baseContent = ref.read(provider)?.$2;
ref.invalidate(provider); ref.invalidate(provider);
} }
@ -148,7 +146,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
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: info.$1, roomId: roomId,
baseContent: baseContent, baseContent: baseContent,
mentions: Mentions( mentions: Mentions(
userIds: [ userIds: [
@ -170,7 +168,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
.read(RoomsController.provider.notifier) .read(RoomsController.provider.notifier)
.update( .update(
.new({ .new({
info.$1: .new( roomId: .new(
events: .new({event.rowId: event}), events: .new({event.rowId: event}),
clientSticky: .new({event.rowId}), clientSticky: .new({event.rowId}),
), ),
@ -187,7 +185,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
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: info.$1, roomId: roomId,
eventId: event.eventId, eventId: event.eventId,
relationType: "m.annotation", relationType: "m.annotation",
), ),
@ -208,7 +206,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
if (reactionEvent != null) { if (reactionEvent != null) {
await ref await ref
.watch(ClientController.provider.notifier) .watch(ClientController.provider.notifier)
.redactEvent(.new(eventId: reactionEvent.eventId, roomId: info.$1)); .redactEvent(.new(eventId: reactionEvent.eventId, roomId: roomId));
} }
} }
@ -217,7 +215,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
await client.sendEvent( await client.sendEvent(
.new( .new(
roomId: info.$1, roomId: roomId,
type: EventType.reaction.type, type: EventType.reaction.type,
content: ReactionContent(key: reaction), content: ReactionContent(key: reaction),
synchronous: true, synchronous: true,
@ -229,7 +227,7 @@ class RoomChatController(final (String roomId, String? withEventId) info)
} }
static final provider = AsyncNotifierProvider.family static final provider = AsyncNotifierProvider.family
.autoDispose<RoomChatController, RoomChat?, (String, String?)>( .autoDispose<RoomChatController, RoomChat?, String>(
RoomChatController.new, RoomChatController.new,
); );
} }

View file

@ -27,9 +27,7 @@ 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( final notifier = ref.read(RoomChatController.provider(roomId).notifier);
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

View file

@ -15,7 +15,7 @@ final class ChatScroll({
required final ScrollController scrollController, required final ScrollController scrollController,
required final Future<void> Function(String id) jumpToId, required final Future<void> Function(String id) jumpToId,
}) { }) {
factory use({ static ChatScroll use({
required AsyncValue<RoomChat?> controllerData, required AsyncValue<RoomChat?> controllerData,
required Future<void> Function() loadOlder, required Future<void> Function() loadOlder,
required Future<void> Function() markRead, required Future<void> Function() markRead,

View file

@ -64,10 +64,8 @@ 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(( RoomChatController.provider(event.roomId)
event.roomId, .notifier,
null,
)).notifier,
); );
if (selected) { if (selected) {

View file

@ -24,14 +24,13 @@ 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?>(initialHighlightedEvent); final highlightedEvent = useState<String?>(null);
final composerSize = useState<double>(64); final composerSize = useState<double>(64);
@ -60,10 +59,7 @@ final class const RoomChat({
final roomId = this.roomId!; final roomId = this.roomId!;
final controllerProvider = RoomChatController.provider(( final controllerProvider = RoomChatController.provider(roomId);
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);