import { X } from 'lucide-react'; import { type ReactNode, useState } from 'react'; import { createPortal } from 'react-dom'; import { resolveCustomWorldCoverPresentation } from '../../services/customWorldCover'; import type { CustomWorldProfile } from '../../types'; import { useAuthUi } from '../auth/AuthUiContext'; import { CustomWorldCoverArtwork } from '../CustomWorldCoverArtwork'; function SmallButton({ children, disabled = false, onClick, tone = 'default', }: { children: ReactNode; disabled?: boolean; onClick: () => void; tone?: 'default' | 'sky'; }) { return ( ); } function PublishPanelDialog({ blockers, profile, publishReady, isPublishing, onClose, onEditCover, onPublish, }: { blockers: string[]; profile: CustomWorldProfile; publishReady: boolean; isPublishing: boolean; onClose: () => void; onEditCover: () => void; onPublish: () => void; }) { const platformTheme = useAuthUi()?.platformTheme ?? 'light'; const coverPresentation = resolveCustomWorldCoverPresentation(profile); if (typeof document === 'undefined') { return null; } return createPortal(
{ if (event.target === event.currentTarget) { onClose(); } }} >
event.stopPropagation()} >
发布作品
发布前检查与封面设置
发布检查
{blockers.length > 0 ? (
{blockers.map((blocker, index) => (
阻断项 {index + 1}
{blocker}
))}
) : (
当前作品已满足发布条件。
)}
封面设置
{coverPresentation.sourceType === 'uploaded' ? '上传封面' : coverPresentation.sourceType === 'generated' ? 'AI封面' : '默认封面'}
设置封面
取消
, document.body, ); } interface RpgCreationResultActionBarProps { editActionLabel: string; enterWorldActionLabel: string; isGenerating: boolean; onContinueExpand?: () => void; onEditSetting?: () => void; onEnterWorld?: () => void; onOpenCoverEditor?: () => void; onPublishWorld?: () => Promise | void; onTestWorld?: () => void; onRegenerate?: () => void; profile: CustomWorldProfile; regenerateActionLabel: string; publishReady: boolean; publishBlockers: string[]; } export function RpgCreationResultActionBar({ editActionLabel, enterWorldActionLabel, isGenerating, onContinueExpand, onEditSetting, onEnterWorld, onOpenCoverEditor, onPublishWorld, onTestWorld, onRegenerate, profile, regenerateActionLabel, publishReady, publishBlockers, }: RpgCreationResultActionBarProps) { const [showPublishBlockersDialog, setShowPublishBlockersDialog] = useState(false); const [isPublishing, setIsPublishing] = useState(false); // 结果页只在用户点击发布动作时展示阻断项,不做吸底常驻提示。 const handleEnterWorld = () => { if (!publishReady) { setShowPublishBlockersDialog(true); return; } onEnterWorld?.(); }; const handlePublish = async () => { if (!publishReady || isPublishing || !onPublishWorld) { return; } setIsPublishing(true); try { await onPublishWorld(); setShowPublishBlockersDialog(false); } finally { setIsPublishing(false); } }; return (
{profile.generationStatus === 'key_only' ? (
当前世界处于快速预览模式,只生成了关键对象。继续补全后,系统会生成长尾场景角色与完整场景网络。
) : null}
{onEditSetting ? ( {editActionLabel} ) : null} {onRegenerate ? ( {regenerateActionLabel} ) : null} {profile.generationStatus === 'key_only' && onContinueExpand ? ( 继续补全世界 ) : null} {onTestWorld ? ( ) : null} {onPublishWorld ? ( ) : onEnterWorld ? ( ) : null}
{showPublishBlockersDialog ? ( setShowPublishBlockersDialog(false)} onEditCover={() => { setShowPublishBlockersDialog(false); onOpenCoverEditor?.(); }} onPublish={() => { void handlePublish(); }} /> ) : null}
); } export default RpgCreationResultActionBar;