This commit is contained in:
Henry Hiles 2025-12-07 16:31:03 -05:00
commit 63a9d2d169
No known key found for this signature in database
15 changed files with 388 additions and 299 deletions

View file

@ -18,10 +18,8 @@ class EventsController extends AsyncNotifier<GetRoomEventsResponse> {
return response;
}
Future<GetRoomEventsResponse> prev() async {
final resp = await build(from: ref.read(FromController.provider(room)));
return resp;
}
Future<GetRoomEventsResponse> prev() async =>
build(from: ref.read(FromController.provider(room)));
static final provider = AsyncNotifierProvider.autoDispose
.family<EventsController, GetRoomEventsResponse, Room>(

View file

@ -9,17 +9,15 @@ class MessageController extends AsyncNotifier<TextMessage?> {
@override
Future<TextMessage?> build() async {
final room = await ref.watch(
SelectedRoomController.provider.selectAsync((a) => a),
);
final room = await ref.watch(SelectedRoomController.provider.future);
if (room == null) return null;
final event = await room.roomData.getEventById(id);
return (await event?.toMessage(mustBeText: true)) as TextMessage?;
}
static final provider =
AsyncNotifierProvider.family<MessageController, TextMessage?, String>(
static final provider = AsyncNotifierProvider.family
.autoDispose<MessageController, TextMessage?, String>(
MessageController.new,
);
}

View file

@ -3,6 +3,7 @@ import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_chat_core/flutter_chat_core.dart" as chat;
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:matrix/matrix.dart";
import "package:nexus/controllers/avatar_controller.dart";
import "package:nexus/controllers/events_controller.dart";
import "package:nexus/helpers/extensions/event_to_message.dart";
import "package:nexus/helpers/extensions/list_to_messages.dart";
@ -13,7 +14,9 @@ class RoomChatController extends AsyncNotifier<ChatController> {
@override
Future<ChatController> build() async {
final response = await ref.watch(EventsController.provider(room).future);
final response = await ref.watch(
EventsController.provider(room).selectAsync((a) => a),
);
ref.onDispose(
room.client.onTimelineEvent.stream.listen((event) async {
@ -75,10 +78,10 @@ class RoomChatController extends AsyncNotifier<ChatController> {
.watch(EventsController.provider(room).notifier)
.prev();
await controller.insertAllMessages(
await response.chunk.toMessages(room),
index: 0,
);
final messages = await response.chunk.toMessages(room);
await controller.insertAllMessages(messages, index: 0);
ref.notifyListeners();
}
Future<void> markRead() async {
@ -92,30 +95,22 @@ class RoomChatController extends AsyncNotifier<ChatController> {
Future<void> updateMessage(Message message, Message newMessage) async =>
(await future).updateMessage(message, newMessage);
Future<void> send(Message message, {Message? replyTo}) async {
final controller = await future;
controller.insertMessage(message);
if (message is TextMessage) {
await room.sendTextEvent(
message.text,
Future<void> send(String message, {Message? replyTo}) async =>
room.sendTextEvent(
message,
inReplyTo: replyTo == null ? null : await room.getEventById(replyTo.id),
);
}
// TODO: Handle other types of message
}
Future<chat.User> resolveUser(String id) async {
final user = await room.client.getUserProfile(id);
return chat.User(
id: id,
name: user.displayname,
imageSource: (await user.avatarUrl?.getThumbnailUri(
// TODO: Fix use of account avatar not room avatar
room.client,
width: 24,
height: 24,
))?.toString(),
imageSource: user.avatarUrl == null
? null
: (await ref.watch(
AvatarController.provider(user.avatarUrl!.toString()).future,
)).toString(),
);
}

View file

@ -7,7 +7,9 @@ import "package:nexus/models/space.dart";
class SelectedSpaceController extends AsyncNotifier<Space> {
@override
Future<Space> build() async {
final spaces = await ref.watch(SpacesController.provider.future);
final spaces = await ref.watch(
SpacesController.provider.selectAsync((data) => data),
);
final selectedSpaceId = ref.watch(
KeyController.provider(KeyController.spaceKey),
);

View file

@ -41,7 +41,7 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
title: "Home",
id: "home",
children: topLevelRooms,
icon: Icon(Icons.home),
icon: Icons.home,
),
Space(
client: client,
@ -54,7 +54,7 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
.map((room) => room.fullRoom),
),
),
icon: Icon(Icons.person),
icon: Icons.person,
),
...(await Future.wait(
topLevelSpaces.map(

View file

@ -10,9 +10,7 @@ class ThumbnailController extends AsyncNotifier<String?> {
@override
Future<String?> build({String? from}) async {
final client = await ref.watch(ClientController.provider.future);
final uri = await Uri.tryParse(data.uri)?.getDownloadUri(
client,
); // TODO: Should use thumb when c10y fixes animated thumbs
final uri = await Uri.tryParse(data.uri)?.getDownloadUri(client);
return uri.toString();
}