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:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/user.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/content/membership.dart";
import "package:nexus/models/event.dart";
class AuthorController(final Event event) class AuthorController(final AuthorConfig config)
extends AsyncNotifier<MembershipContent> { extends AsyncNotifier<MembershipContent> {
@override @override
Future<MembershipContent> build() async { Future<MembershipContent> build() async {
final member = await ref.watch( final member = await ref.watch(
UserController.provider(.new(roomId: event.roomId, userId: event.sender)) UserController.provider(
.future, .new(roomId: config.roomId, userId: config.userId),
).future,
); );
return .new( return .new(
status: member.status, status: member.status,
avatarUrl: event.pmp?.avatarUrl ?? member.avatarUrl, avatarUrl: config.avatarUrl ?? member.avatarUrl,
displayName: event.pmp?.displayName ?? member.displayName, displayName: config.displayName ?? member.displayName,
); );
} }
static final provider = static final provider =
AsyncNotifierProvider.family<AuthorController, MembershipContent, Event>( AsyncNotifierProvider.family<
AuthorController.new, 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 { }) extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) => 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( AsyncData(:final value) || AsyncLoading(:final value?) => InkWell(
onTap: () => onTap: () =>
context.showUserPopover(event.sender, roomId: event.roomId), context.showUserPopover(event.sender, roomId: event.roomId),

View file

@ -18,7 +18,7 @@ class const MessageDisplayname(
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final color = ref.displaynameColor(event.roomId, event.sender); 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) || AsyncData(:final MembershipContent? value) ||
AsyncLoading(:final value) || AsyncLoading(:final value) ||
AsyncError(:final value) => InkWell( AsyncError(:final value) => InkWell(

View file

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