key AuthorController on only what it needs
This commit is contained in:
parent
89f395cede
commit
06306d31a7
5 changed files with 34 additions and 12 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
19
lib/models/configs/author.dart
Normal file
19
lib/models/configs/author.dart
Normal 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,
|
||||
);
|
||||
}
|
||||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue