From f3fee026bcb755b53fbe1638600223bbb4c25f4a Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sun, 31 May 2026 21:46:22 -0400 Subject: [PATCH] more elegantly handle empty displaynames --- lib/controllers/client_controller.dart | 8 ++++---- lib/controllers/profile_controller.dart | 6 ++---- lib/controllers/user_controller.dart | 1 + lib/models/content/membership.dart | 10 +++++++++- lib/models/profile.dart | 24 +++++++++++++++--------- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index fd84f5d..f1ff6a6 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -231,10 +231,10 @@ class ClientController extends AsyncNotifier { Future paginate(PaginateRequest request) async => Paginate.fromJson(await _sendCommand("paginate", request.toJson())); - Future getProfile(String userId) async => Profile.fromJsonWithCatch({ - ...(await _sendCommand("get_profile", {"user_id": userId})), - "id": userId, - }); + Future getProfile(String userId) async { + final json = await _sendCommand("get_profile", {"user_id": userId}); + return Profile.fromJsonWithCatch({...json, "id": userId}); + } Future reportEvent(ReportRequest request) => _sendCommand("report_event", request.toJson()); diff --git a/lib/controllers/profile_controller.dart b/lib/controllers/profile_controller.dart index 6131034..9aa0e09 100644 --- a/lib/controllers/profile_controller.dart +++ b/lib/controllers/profile_controller.dart @@ -12,8 +12,6 @@ class ProfileController extends AsyncNotifier { return client.getProfile(userId); } - static final provider = - AsyncNotifierProvider.family( - ProfileController.new, - ); + static final provider = AsyncNotifierProvider.family + .autoDispose(ProfileController.new); } diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart index 5a47ba6..b975ddd 100644 --- a/lib/controllers/user_controller.dart +++ b/lib/controllers/user_controller.dart @@ -1,4 +1,5 @@ import "dart:async"; +import "dart:developer"; import "package:collection/collection.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/members_controller.dart"; diff --git a/lib/models/content/membership.dart b/lib/models/content/membership.dart index aa5a36d..dbbd123 100644 --- a/lib/models/content/membership.dart +++ b/lib/models/content/membership.dart @@ -7,8 +7,16 @@ part "membership.g.dart"; @freezed abstract class MembershipContent extends Content with _$MembershipContent { MembershipContent._(); + + static String? displaynameFromJson(String? displayName) => + displayName?.isEmpty == true ? null : displayName; + factory MembershipContent({ - @JsonKey(name: "displayname") required String? displayName, + @JsonKey( + name: "displayname", + fromJson: MembershipContent.displaynameFromJson, + ) + required String? displayName, @JsonKey(name: "membership") required MembershipStatus status, Uri? avatarUrl, String? reason, diff --git a/lib/models/profile.dart b/lib/models/profile.dart index 6ba2656..6ae1e94 100644 --- a/lib/models/profile.dart +++ b/lib/models/profile.dart @@ -1,26 +1,32 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/membership.dart"; part "profile.freezed.dart"; part "profile.g.dart"; -Object? readPronouns(Map map, _) => - map["m.pronouns"] ?? map["io.fsky.nyx.pronouns"]; - -Object? readTimezone(Map map, _) => - map["m.tz"] ?? map["us.cloke.msc4175.tz"]; - @freezed abstract class Profile with _$Profile { + static Object? readPronouns(Map map, _) => + map["m.pronouns"] ?? map["io.fsky.nyx.pronouns"]; + + static Object? readTimezone(Map map, _) => + map["m.tz"] ?? map["us.cloke.msc4175.tz"]; + const factory Profile({ required String id, String? parseError, Uri? avatarUrl, - @JsonKey(name: "displayname") String? displayName, - @JsonKey(readValue: readTimezone, name: "m.tz") String? timezone, + @JsonKey( + name: "displayname", + fromJson: MembershipContent.displaynameFromJson, + ) + String? displayName, + + @JsonKey(readValue: Profile.readTimezone, name: "m.tz") String? timezone, @Default(IList.empty()) - @JsonKey(readValue: readPronouns, name: "io.fsky.nyx.pronouns") + @JsonKey(readValue: Profile.readPronouns, name: "io.fsky.nyx.pronouns") IList pronouns, }) = _Profile;