import { ArrowLeft, CheckCircle2, Loader2, Play, RefreshCw, Save, Tag, } from 'lucide-react'; import { useMemo } from 'react'; import type { BabyObjectMatchDraft } from '../../../packages/shared/src/contracts/edutainmentBabyObject'; import { BABY_OBJECT_MATCH_EDUTAINMENT_TAG, hasBabyObjectMatchRequiredTag, normalizeBabyObjectMatchTags, } from '../../../packages/shared/src/contracts/edutainmentBabyObject'; import { PlatformActionButton } from '../common/PlatformActionButton'; import { PlatformMediaFrame } from '../common/PlatformMediaFrame'; import { PlatformOverlayBadge } from '../common/PlatformOverlayBadge'; import { PlatformPillBadge } from '../common/PlatformPillBadge'; import { PlatformStatusMessage } from '../common/PlatformStatusMessage'; import { PlatformSubpanel } from '../common/PlatformSubpanel'; type BabyObjectMatchResultViewProps = { draft: BabyObjectMatchDraft; isBusy?: boolean; error?: string | null; onBack: () => void; onSaveDraft?: (draft: BabyObjectMatchDraft) => void; onPublish?: (draft: BabyObjectMatchDraft) => void; onStartTestRun?: (draft: BabyObjectMatchDraft) => void; onRegenerateAssets?: (draft: BabyObjectMatchDraft) => void; }; function normalizeDraftForAction(draft: BabyObjectMatchDraft) { return { ...draft, themeTags: normalizeBabyObjectMatchTags(draft.themeTags), updatedAt: new Date().toISOString(), }; } const REQUIRED_VISUAL_ASSET_KINDS = [ 'background', 'gift-box', 'basket', ] as const; export function BabyObjectMatchResultView({ draft, isBusy = false, error = null, onBack, onSaveDraft, onPublish, onStartTestRun, onRegenerateAssets, }: BabyObjectMatchResultViewProps) { const normalizedDraft = useMemo( () => normalizeDraftForAction(draft), [draft], ); const hasGeneratedAssets = normalizedDraft.itemAssets.every( (asset) => asset.generationProvider === 'vector-engine-gpt-image-2' && asset.imageSrc.startsWith('data:image/png;base64,'), ) && Boolean(normalizedDraft.visualPackage) && REQUIRED_VISUAL_ASSET_KINDS.every((kind) => normalizedDraft.visualPackage!.assets.some( (asset) => asset.assetKind === kind && asset.generationProvider === 'vector-engine-gpt-image-2' && asset.imageSrc.startsWith('data:image/png;base64,'), ), ); const publishReady = normalizedDraft.itemNames.every((itemName) => itemName.trim()) && normalizedDraft.itemAssets.every((asset) => asset.imageSrc.trim()) && hasBabyObjectMatchRequiredTag(normalizedDraft.themeTags) && hasGeneratedAssets; const isPublished = normalizedDraft.publicationStatus === 'published'; return (
返回
{isPublished ? '已发布' : '草稿'}

{normalizedDraft.workTitle}

{normalizedDraft.themeTags.map((tag) => ( } > {tag} ))}
{normalizedDraft.itemAssets.map((asset) => ( 占位图 ) : null } />
{asset.itemName}
))}
{error ? ( {error} ) : null} {!hasGeneratedAssets ? ( 当前作品仍是占位资源,请重新生成素材后再试玩或发布。 ) : null}
onSaveDraft?.(normalizedDraft)} tone="secondary" > 保存草稿 onRegenerateAssets?.(normalizedDraft)} tone="secondary" > {isBusy ? ( ) : ( )} 重新生成资源 onStartTestRun?.(normalizedDraft)} tone="secondary" > 试玩 onPublish?.(normalizedDraft)} > {isBusy ? ( ) : ( )} 发布
); } export default BabyObjectMatchResultView;