feat: 前端改为通过签名地址读取生成资源

This commit is contained in:
2026-04-21 16:45:05 +08:00
parent fcaf7bdb38
commit 78dcad1222
26 changed files with 779 additions and 76 deletions

View File

@@ -32,7 +32,9 @@ import type { HydratedSavedGameSnapshot } from '../../persistence/runtimeSnapsho
import type { AuthUser } from '../../services/authService';
import type { PlatformBrowseHistoryEntry } from '../../services/platformBrowseHistory';
import type { CustomWorldProfile } from '../../types';
import { useResolvedAssetReadUrl } from '../../hooks/useResolvedAssetReadUrl';
import { useAuthUi } from '../auth/AuthUiContext';
import { ResolvedAssetImage } from '../ResolvedAssetImage';
import { PlatformBrandLogo } from './PlatformBrandLogo';
import {
buildPlatformWorldTags,
@@ -53,6 +55,35 @@ const MOBILE_PAGE_STAGE_CLASS =
const DESKTOP_PAGE_STAGE_CLASS =
'platform-page-stage platform-remap-surface space-y-5 pb-4';
function ResolvedAssetBackdrop({
src,
alt,
className,
ariaHidden = false,
}: {
src?: string | null;
alt: string;
className: string;
ariaHidden?: boolean;
}) {
const { resolvedUrl, shouldResolve } = useResolvedAssetReadUrl(src);
// 私有 OSS 封面在签名地址返回前保持现有底色层,避免浏览器直接访问旧 generated-* 路径。
const displaySrc = resolvedUrl || (!shouldResolve ? src?.trim() ?? '' : '');
if (!displaySrc) {
return null;
}
return (
<img
src={displaySrc}
alt={alt}
aria-hidden={ariaHidden}
className={className}
/>
);
}
function SectionHeader({ title, detail }: { title: string; detail: string }) {
return (
<div className="mb-3">
@@ -91,7 +122,7 @@ function SaveArchivePreview({
className={`platform-remap-surface relative shrink-0 overflow-hidden rounded-[1.35rem] border border-white/12 bg-black/18 shadow-[var(--platform-desktop-hover-shadow)] ${className}`}
>
{entry.coverImageSrc ? (
<img
<ResolvedAssetBackdrop
src={entry.coverImageSrc}
alt=""
className="absolute inset-0 h-full w-full object-cover"
@@ -139,14 +170,14 @@ function WorldCard({
className={`platform-surface platform-interactive-card relative flex h-[15rem] w-[15.25rem] shrink-0 flex-col overflow-hidden px-3.5 py-3.5 text-left ${className ?? ''}`}
>
{coverImage ? (
<img
<ResolvedAssetBackdrop
src={coverImage}
alt={entry.worldName}
className="absolute inset-0 h-full w-full object-cover opacity-40"
/>
) : null}
{leadPortrait ? (
<img
<ResolvedAssetImage
src={leadPortrait}
alt=""
aria-hidden="true"
@@ -223,14 +254,14 @@ function CreationLibraryCard({
className="platform-surface platform-interactive-card relative flex min-h-[13rem] w-full min-w-0 flex-col overflow-hidden px-3 py-3 text-left sm:min-h-[14rem] sm:px-3.5 sm:py-3.5"
>
{coverImage ? (
<img
<ResolvedAssetBackdrop
src={coverImage}
alt={entry.worldName}
className="absolute inset-0 h-full w-full object-cover opacity-38"
/>
) : null}
{leadPortrait ? (
<img
<ResolvedAssetImage
src={leadPortrait}
alt=""
aria-hidden="true"
@@ -413,7 +444,7 @@ function DesktopTrendingItem({
>
<div className="relative h-[5.5rem] w-[4.3rem] shrink-0 overflow-hidden rounded-[1rem] border border-[var(--platform-subpanel-border)] bg-[rgba(255,255,255,0.66)]">
{coverImage ? (
<img
<ResolvedAssetBackdrop
src={coverImage}
alt={entry.worldName}
className="h-full w-full object-cover"
@@ -1140,7 +1171,7 @@ export function PlatformHomeView({
className={`${HERO_SURFACE_CLASS} relative block overflow-hidden px-7 py-6 text-left`}
>
{desktopHeroCover ? (
<img
<ResolvedAssetBackdrop
src={desktopHeroCover}
alt=""
aria-hidden="true"
@@ -1188,7 +1219,7 @@ export function PlatformHomeView({
>
<div className="relative aspect-[1.35/1] overflow-hidden">
{coverImage ? (
<img
<ResolvedAssetBackdrop
src={coverImage}
alt=""
aria-hidden="true"