key AuthorController on only what it needs

This commit is contained in:
Henry Hiles 2026-11-14 11:43:30 -05:00
commit 06306d31a7
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
5 changed files with 34 additions and 12 deletions

View file

@ -2,27 +2,30 @@ import "dart:async";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/user.dart";
import "package:nexus/models/configs/author.dart";
import "package:nexus/models/content/membership.dart";
import "package:nexus/models/event.dart";
class AuthorController(final Event event)
class AuthorController(final AuthorConfig config)
extends AsyncNotifier<MembershipContent> {
@override
Future<MembershipContent> build() async {
final member = await ref.watch(
UserController.provider(.new(roomId: event.roomId, userId: event.sender))
.future,
UserController.provider(
.new(roomId: config.roomId, userId: config.userId),
).future,
);
return .new(
status: member.status,
avatarUrl: event.pmp?.avatarUrl ?? member.avatarUrl,
displayName: event.pmp?.displayName ?? member.displayName,
avatarUrl: config.avatarUrl ?? member.avatarUrl,
displayName: config.displayName ?? member.displayName,
);
}
static final provider =
AsyncNotifierProvider.family<AuthorController, MembershipContent, Event>(
AuthorController.new,
);
AsyncNotifierProvider.family<
AuthorController,
MembershipContent,
AuthorConfig
>(AuthorController.new);
}

View file

@ -0,0 +1,19 @@
import "package:freezed_annotation/freezed_annotation.dart";
import "package:nexus/models/event.dart";
part "author.freezed.dart";
@freezed
class const AuthorConfig({
required final String roomId,
required final String userId,
final Uri? avatarUrl,
final String? displayName,
}) with _$AuthorConfig {
factory AuthorConfig.fromEvent(Event event) => .new(
roomId: event.roomId,
userId: event.sender,
avatarUrl: event.pmp?.avatarUrl,
displayName: event.pmp?.displayName,
);
}

View file

@ -13,7 +13,7 @@ class const MessageAvatar(
}) extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) =>
switch (ref.watch(AuthorController.provider(event))) {
switch (ref.watch(AuthorController.provider(.fromEvent(event)))) {
AsyncData(:final value) || AsyncLoading(:final value?) => InkWell(
onTap: () =>
context.showUserPopover(event.sender, roomId: event.roomId),

View file

@ -18,7 +18,7 @@ class const MessageDisplayname(
Widget build(BuildContext context, WidgetRef ref) {
final color = ref.displaynameColor(event.roomId, event.sender);
return switch (ref.watch(AuthorController.provider(event))) {
return switch (ref.watch(AuthorController.provider(.fromEvent(event)))) {
AsyncData(:final MembershipContent? value) ||
AsyncLoading(:final value) ||
AsyncError(:final value) => InkWell(

View file

@ -47,7 +47,7 @@ class UserSpan(
return UserSpan(
context,
ref.watch(AuthorController.provider(event)).value?.displayName ??
ref.watch(AuthorController.provider(.fromEvent(event))).value?.displayName ??
event.sender.localpart,
userId: event.sender,
roomId: event.roomId,