diff --git a/lib/shared/business_logic/models/res/sc_user_badge_res.dart b/lib/shared/business_logic/models/res/sc_user_badge_res.dart index 00fb829..590ce5a 100644 --- a/lib/shared/business_logic/models/res/sc_user_badge_res.dart +++ b/lib/shared/business_logic/models/res/sc_user_badge_res.dart @@ -40,10 +40,19 @@ class SCUserBadgeRes { } List get displayBadges { + return shortDisplayBadges; + } + + List get shortDisplayBadges { final source = shortBadges.isNotEmpty ? shortBadges : badges; return source.where(isShortDisplayBadge).toList(); } + List get longDisplayBadges { + final source = longBadges.isNotEmpty ? longBadges : badges; + return source.where(isLongDisplayBadge).toList(); + } + List get honorWallBadges { final source = shortBadges.isNotEmpty @@ -130,6 +139,12 @@ class SCUserBadgeRes { return true; } + static bool isLongDisplayBadge(WearBadge badge) { + final sourceType = badge.sourceType?.trim().toUpperCase() ?? ""; + final type = badge.type?.trim().toUpperCase() ?? ""; + return type == "LONG" || type == "VIP" || sourceType == "VIP"; + } + static bool _isHonorWallBadge(WearBadge badge) { return isShortDisplayBadge(badge); } diff --git a/lib/ui_kit/widgets/badge/sc_user_badge_strip.dart b/lib/ui_kit/widgets/badge/sc_user_badge_strip.dart index 41c90c5..35c4a13 100644 --- a/lib/ui_kit/widgets/badge/sc_user_badge_strip.dart +++ b/lib/ui_kit/widgets/badge/sc_user_badge_strip.dart @@ -6,11 +6,14 @@ import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; import 'package:yumi/shared/data_sources/sources/repositories/sc_user_repository_impl.dart'; import 'package:yumi/ui_kit/components/sc_compontent.dart'; +enum SCUserBadgeDisplayScope { short, long, all } + class SCUserBadgeStrip extends StatefulWidget { const SCUserBadgeStrip({ super.key, this.userId, this.fallbackBadges = const [], + this.displayScope = SCUserBadgeDisplayScope.short, this.height, this.badgeHeight, this.longBadgeWidth, @@ -23,6 +26,7 @@ class SCUserBadgeStrip extends StatefulWidget { final String? userId; final List fallbackBadges; + final SCUserBadgeDisplayScope displayScope; final double? height; final double? badgeHeight; final double? longBadgeWidth; @@ -100,8 +104,7 @@ class _SCUserBadgeStripState extends State { return FutureBuilder( future: future, builder: (context, snapshot) { - final remoteBadges = - snapshot.data?.displayBadges ?? const []; + final remoteBadges = _remoteBadges(snapshot.data); final badges = remoteBadges.isNotEmpty ? remoteBadges : _fallbackBadges; return _buildBadges(badges, stripHeight); }, @@ -110,11 +113,38 @@ class _SCUserBadgeStripState extends State { List get _fallbackBadges { return widget.fallbackBadges - .where(SCUserBadgeRes.isShortDisplayBadge) + .where(_matchesDisplayScope) .where((badge) => _badgeUrl(badge).isNotEmpty) .toList(); } + List _remoteBadges(SCUserBadgeRes? data) { + if (data == null) { + return const []; + } + switch (widget.displayScope) { + case SCUserBadgeDisplayScope.long: + return data.longDisplayBadges; + case SCUserBadgeDisplayScope.all: + return data.allBadges + .where((badge) => _badgeUrl(badge).isNotEmpty) + .toList(); + case SCUserBadgeDisplayScope.short: + return data.shortDisplayBadges; + } + } + + bool _matchesDisplayScope(WearBadge badge) { + switch (widget.displayScope) { + case SCUserBadgeDisplayScope.long: + return SCUserBadgeRes.isLongDisplayBadge(badge); + case SCUserBadgeDisplayScope.all: + return true; + case SCUserBadgeDisplayScope.short: + return SCUserBadgeRes.isShortDisplayBadge(badge); + } + } + Widget _buildBadges(List rawBadges, double stripHeight) { final badges = widget.maxBadges == null diff --git a/lib/ui_kit/widgets/room/room_user_info_card.dart b/lib/ui_kit/widgets/room/room_user_info_card.dart index bdea8dd..b5b68ed 100644 --- a/lib/ui_kit/widgets/room/room_user_info_card.dart +++ b/lib/ui_kit/widgets/room/room_user_info_card.dart @@ -498,6 +498,7 @@ class _RoomUserInfoCardState extends State { return SCUserBadgeStrip( userId: userId, fallbackBadges: _roomCardFallbackBadges(ref, profile), + displayScope: SCUserBadgeDisplayScope.long, height: 82.w, badgeHeight: 34.5.w, longBadgeWidth: 87.w, diff --git a/test/sc_user_badge_res_test.dart b/test/sc_user_badge_res_test.dart index 38ad475..b59ed8e 100644 --- a/test/sc_user_badge_res_test.dart +++ b/test/sc_user_badge_res_test.dart @@ -33,6 +33,7 @@ void main() { }); expect(result.allBadges.map((badge) => badge.id), ['vip', 'old', 'new']); + expect(result.longDisplayBadges.map((badge) => badge.id), ['vip']); expect(result.displayBadges.map((badge) => badge.id), ['old', 'new']); expect(result.honorWallBadges.map((badge) => badge.id), ['new', 'old']); }); @@ -70,6 +71,10 @@ void main() { ], }); + expect(result.longDisplayBadges.map((badge) => badge.id), [ + 'long', + 'vip', + ]); expect(result.displayBadges.map((badge) => badge.id), [ 'activity', 'achievement',