diff --git a/src/components/game-distribution/GameCover.tsx b/src/components/game-distribution/GameCover.tsx index 78c542ec9..3ed8a64bb 100644 --- a/src/components/game-distribution/GameCover.tsx +++ b/src/components/game-distribution/GameCover.tsx @@ -15,15 +15,20 @@ export function GameCover({ compact = false, priority = false, objectKey, + owner = false, }: { game: GameDistributionGame; compact?: boolean; /** 首屏 hero 用的封面立即加载,列表卡片保持延迟加载。 */ priority?: boolean; objectKey?: string | null; + /** 作者自己的作品列表传 `owner`:未发布 / 待审 / 被驳回的封面也能换签预览。 */ + owner?: boolean; }) { const targetKey = (objectKey ?? game.coverObjectKey ?? '').trim(); - const { resolvedUrl } = useGameDistributionMediaReadUrl(targetKey); + const { resolvedUrl } = useGameDistributionMediaReadUrl(targetKey, { + gameId: owner ? game.id : undefined, + }); return (
({ createGame: vi.fn(), createGameVersion: vi.fn(), getGameDistributionMediaReadUrl: vi.fn().mockResolvedValue(''), + getOwnerGameDistributionMediaReadUrl: vi.fn().mockResolvedValue(''), getGameVersion: vi.fn(), listMyGames: vi.fn(), submitGameVersion: vi.fn(), @@ -699,6 +700,7 @@ test('更新模式在既有 gameId 下创建新版本并沿用公开修订号', await waitFor(() => expect(resolveGamePublishImagePreview).toHaveBeenCalledWith( 'game-distribution/cover/old.png', + 'game-1', ), ); expect(screen.queryByText(/本次发布需要重新选择一次封面图片/u)).toBeNull(); @@ -791,6 +793,7 @@ test('线上封面没有冻结快照时沿用游戏行封面对象键', async () await waitFor(() => expect(resolveGamePublishImagePreview).toHaveBeenCalledWith( 'game-distribution/cover/legacy.png', + 'game-1', ), ); const file = await buildZipFile(); diff --git a/src/components/game-distribution/MyGamesPage.test.tsx b/src/components/game-distribution/MyGamesPage.test.tsx index b8132f917..e9502432f 100644 --- a/src/components/game-distribution/MyGamesPage.test.tsx +++ b/src/components/game-distribution/MyGamesPage.test.tsx @@ -9,7 +9,9 @@ import { cancelGameVersion, deleteMyGame, type GameDistributionMyGame, + getGameDistributionMediaReadUrl, getGameVersion, + getOwnerGameDistributionMediaReadUrl, listMyGames, loadVersionRecoveryActions, submitGameVersion, @@ -23,6 +25,7 @@ vi.mock('../../services/gameDistributionClient', () => ({ cancelGameVersion: vi.fn(), deleteMyGame: vi.fn(), getGameDistributionMediaReadUrl: vi.fn().mockResolvedValue(''), + getOwnerGameDistributionMediaReadUrl: vi.fn().mockResolvedValue(''), getGameVersion: vi.fn(), listMyGames: vi.fn(), loadVersionRecoveryActions: vi.fn(), @@ -123,6 +126,8 @@ beforeEach(() => { vi.mocked(cancelGameVersion).mockReset(); vi.mocked(deleteMyGame).mockReset(); vi.mocked(getGameVersion).mockReset(); + vi.mocked(getOwnerGameDistributionMediaReadUrl).mockReset(); + vi.mocked(getOwnerGameDistributionMediaReadUrl).mockResolvedValue(''); vi.mocked(listMyGames).mockReset(); vi.mocked(loadVersionRecoveryActions).mockReset(); vi.mocked(submitGameVersion).mockReset(); @@ -172,6 +177,23 @@ test('展示审核中状态与驳回理由', async () => { expect(screen.getByText('驳回理由:封面需要替换')).toBeTruthy(); }); +test('作者自有作品封面走 owner 作用域换签,未发布也能预览', async () => { + vi.mocked(listMyGames).mockResolvedValue([ + createGame({ coverObjectKey: 'game-distribution/cover/mine.png' }), + ]); + + renderPage(createAuthValue()); + + await waitFor(() => + expect(getOwnerGameDistributionMediaReadUrl).toHaveBeenCalledWith( + 'game-1', + 'game-distribution/cover/mine.png', + undefined, + ), + ); + expect(getGameDistributionMediaReadUrl).not.toHaveBeenCalled(); +}); + test('下架已公开游戏会带上当前 publicationRevision', async () => { const game = createGame({ status: 'published', diff --git a/src/components/game-distribution/MyGamesPage.tsx b/src/components/game-distribution/MyGamesPage.tsx index d8a8fffa6..ef8511829 100644 --- a/src/components/game-distribution/MyGamesPage.tsx +++ b/src/components/game-distribution/MyGamesPage.tsx @@ -494,7 +494,7 @@ export function MyGamesPage({ const isHistoryOpen = expandedGameId === game.id; return (
- +