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: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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
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 {
|
}) 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),
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue