diff --git a/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx b/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx index 9b9a11f0..ecab6ae3 100644 --- a/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx +++ b/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx @@ -15295,6 +15295,7 @@ export function PlatformEntryFlowShellImpl({ { vi.useRealTimers(); }); @@ -133,6 +157,26 @@ test('PlatformWorkDetailView prefers resolved public user display name', () => { expect(screen.queryByText('137****6613')).toBeNull(); }); +test('PlatformWorkDetailView prefers resolved username for wooden fish works', () => { + render( + , + ); + + expect(screen.getByText('lotus_user')).toBeTruthy(); + expect(screen.queryByText('敲木鱼玩家')).toBeNull(); + expect(screen.queryByText('公开昵称')).toBeNull(); +}); + test('PlatformWorkDetailView calls like handler', () => { const onLike = vi.fn(); render( diff --git a/src/components/platform-entry/PlatformWorkDetailView.tsx b/src/components/platform-entry/PlatformWorkDetailView.tsx index 65d3c404..a6ec1c88 100644 --- a/src/components/platform-entry/PlatformWorkDetailView.tsx +++ b/src/components/platform-entry/PlatformWorkDetailView.tsx @@ -25,6 +25,7 @@ import { isBarkBattleGalleryEntry, isEdutainmentGalleryEntry, type PlatformPublicGalleryCard, + resolvePlatformWorkAuthorDisplayName, resolvePlatformPublicWorkCode, resolvePlatformWorldCoverSlides, resolvePlatformWorldStats, @@ -33,6 +34,7 @@ import { export interface PlatformWorkDetailViewProps { entry: PlatformPublicGalleryCard; authorAvatarUrl?: string | null; + authorUsername?: string | null; authorDisplayName?: string | null; isBusy: boolean; error?: string | null; @@ -86,6 +88,7 @@ const PLATFORM_WORK_COVER_CAROUSEL_INTERVAL_MS = 4200; export function PlatformWorkDetailView({ entry, authorAvatarUrl, + authorUsername, authorDisplayName, isBusy, visibleCoverCount = 1, @@ -109,8 +112,10 @@ export function PlatformWorkDetailView({ const hasCoverCarousel = coverSlides.length > 1; const publicWorkCode = resolvePlatformPublicWorkCode(entry); const normalizedAuthorAvatarUrl = authorAvatarUrl?.trim() ?? ''; - const resolvedAuthorDisplayName = - authorDisplayName?.trim() || entry.authorDisplayName; + const resolvedAuthorDisplayName = resolvePlatformWorkAuthorDisplayName( + entry, + authorUsername?.trim() || authorDisplayName?.trim() || null, + ); const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>( 'idle', ); diff --git a/src/components/rpg-entry/RpgEntryHomeView.tsx b/src/components/rpg-entry/RpgEntryHomeView.tsx index 5c6045a2..9cd49445 100644 --- a/src/components/rpg-entry/RpgEntryHomeView.tsx +++ b/src/components/rpg-entry/RpgEntryHomeView.tsx @@ -149,6 +149,7 @@ import { isWoodenFishGalleryEntry, type PlatformPublicGalleryCard, type PlatformWorldCardLike, + resolvePlatformWorkAuthorDisplayName, resolvePlatformPublicWorkCode, resolvePlatformWorldCoverImage, resolvePlatformWorldCoverSlides, @@ -655,7 +656,7 @@ function WorldCard({ const remixCount = getPlatformWorldRemixCount(entry); const likeCount = getPlatformWorldLikeCount(entry); const typeLabel = describePublicGalleryCardKind(entry); - const authorName = resolvePublicEntryAuthorDisplayText( + const authorName = resolvePlatformWorkAuthorDisplayName( entry, authorUsername, ); @@ -1024,7 +1025,7 @@ function RecommendRuntimeMeta({ }) { const likeCount = getPlatformWorldLikeCount(entry); const remixCount = getPlatformWorldRemixCount(entry); - const authorName = resolvePublicEntryAuthorDisplayText( + const authorName = resolvePlatformWorkAuthorDisplayName( entry, authorUsername, ); @@ -1935,17 +1936,6 @@ function getPublicAuthorAvatarLabel(authorDisplayName: string) { return Array.from(authorDisplayName.trim() || '玩')[0] ?? '玩'; } -function resolvePublicEntryAuthorDisplayText( - entry: PlatformPublicGalleryCard, - authorUsername?: string | null, -) { - if (isWoodenFishGalleryEntry(entry)) { - return authorUsername?.trim() || entry.authorDisplayName.trim() || '玩家'; - } - - return entry.authorDisplayName.trim() || '玩家'; -} - function getPlatformWorldLikeCount(entry: PlatformWorldCardLike) { return Math.max(0, Math.round(entry.likeCount ?? 0)); } diff --git a/src/components/rpg-entry/rpgEntryWorldPresentation.test.ts b/src/components/rpg-entry/rpgEntryWorldPresentation.test.ts index 5c39a03b..8628fae3 100644 --- a/src/components/rpg-entry/rpgEntryWorldPresentation.test.ts +++ b/src/components/rpg-entry/rpgEntryWorldPresentation.test.ts @@ -18,6 +18,7 @@ import { mapWoodenFishWorkToPlatformGalleryCard, type PlatformEdutainmentGalleryCard, type PlatformPuzzleGalleryCard, + resolvePlatformWorkAuthorDisplayName, resolvePlatformPublicWorkCode, resolvePlatformWorldFallbackCoverImage, } from './rpgEntryWorldPresentation'; @@ -197,6 +198,30 @@ test('maps wooden fish work to platform gallery card with WF public code', () => expect(buildPlatformWorldDisplayTags(card, 2)).toEqual(['敲木鱼']); }); +test('resolves public work author from live username before stored author name', () => { + const card = mapWoodenFishWorkToPlatformGalleryCard({ + publicWorkCode: 'WF-AUTHOR1', + workId: 'wooden-fish-work-author', + profileId: 'wooden-fish-profile-author', + ownerUserId: 'user-author', + authorDisplayName: '敲木鱼玩家', + workTitle: '莲花木鱼', + workDescription: '莲花主题敲木鱼。', + coverImageSrc: null, + themeTags: ['敲木鱼'], + publicationStatus: 'published', + playCount: 0, + updatedAt: '2026-05-20T00:00:00.000Z', + publishedAt: '2026-05-20T00:00:00.000Z', + generationStatus: 'ready', + }); + + expect(resolvePlatformWorkAuthorDisplayName(card, 'lotus_user')).toBe( + 'lotus_user', + ); + expect(resolvePlatformWorkAuthorDisplayName(card, ' ')).toBe('敲木鱼玩家'); +}); + test('keeps baby object match public card code and template label intact', () => { const card: PlatformEdutainmentGalleryCard = { sourceType: 'edutainment', diff --git a/src/components/rpg-entry/rpgEntryWorldPresentation.ts b/src/components/rpg-entry/rpgEntryWorldPresentation.ts index 308d0903..b81747e6 100644 --- a/src/components/rpg-entry/rpgEntryWorldPresentation.ts +++ b/src/components/rpg-entry/rpgEntryWorldPresentation.ts @@ -862,6 +862,13 @@ export function formatPlatformWorkDisplayTags( ].slice(0, limit); } +export function resolvePlatformWorkAuthorDisplayName( + entry: PlatformPublicGalleryCard, + authorUsername?: string | null, +) { + return authorUsername?.trim() || entry.authorDisplayName.trim() || '玩家'; +} + export function buildPlatformWorldDisplayTags( entry: PlatformWorldCardLike, limit = 3,