收口创作流程统一总计划并修复等待页窄屏裁切

This commit is contained in:
2026-05-31 05:57:34 +00:00
parent 551d436919
commit c193a352df
53 changed files with 2192 additions and 161 deletions

View File

@@ -3138,6 +3138,38 @@ function LazyPanelFallback({ label }: { label: string }) {
);
}
function CreationResultRecoveryPanel({
title,
message,
actionLabel,
onAction,
}: {
title: string;
message: string;
actionLabel: string;
onAction: () => void;
}) {
return (
<div className="flex h-full min-h-0 items-center justify-center px-3 py-6">
<div className="platform-subpanel w-full max-w-sm rounded-[1.5rem] p-5 text-center">
<div className="text-base font-black text-[var(--platform-text-strong)]">
{title}
</div>
<div className="mt-2 text-sm leading-6 text-[var(--platform-text-base)]">
{message}
</div>
<button
type="button"
onClick={onAction}
className="platform-button platform-button--primary mt-4 min-h-11 justify-center px-4 py-3 text-sm"
>
{actionLabel}
</button>
</div>
</div>
);
}
function mergePuzzleServiceRuntimeState(
currentRun: PuzzleRunSnapshot,
serviceRun: PuzzleRunSnapshot,
@@ -12930,15 +12962,26 @@ export function PlatformEntryFlowShellImpl({
}
if (path.startsWith('/creation/jump-hop')) {
if (!sessionId) {
return;
}
let session: JumpHopSessionSnapshotResponse | null = null;
let work: JumpHopWorkProfileResponse | null = null;
try {
const { session } = await jumpHopClient.getSession(sessionId);
let work: JumpHopWorkProfileResponse | null = null;
if (profileId) {
work = (await jumpHopClient.getWorkDetail(profileId)).item;
}
} catch {
work = null;
}
try {
if (sessionId) {
session = (await jumpHopClient.getSession(sessionId)).session;
}
} catch {
session = null;
}
if (!session && !work) {
return;
}
try {
setJumpHopSession(session);
setJumpHopWork(work);
writeCreationUrlState(
@@ -12948,7 +12991,7 @@ export function PlatformEntryFlowShellImpl({
setSelectionStage(
path.includes('/generating')
? 'jump-hop-generating'
: session.draft
: session?.draft || work
? 'jump-hop-result'
: 'jump-hop-workspace',
);
@@ -15689,7 +15732,7 @@ export function PlatformEntryFlowShellImpl({
initial={{ opacity: 0, y: 12 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -12 }}
className="flex h-full min-h-0 flex-col"
className="flex h-full min-h-0 flex-col overflow-y-auto overflow-x-hidden"
>
<Suspense
fallback={
@@ -15711,6 +15754,8 @@ export function PlatformEntryFlowShellImpl({
void executeMatch3DAction(payload);
}}
initialFormPayload={match3dFormDraftPayload}
title={null}
unifiedChrome
onCreateFromForm={(payload) => {
runProtectedAction(() => {
void createMatch3DDraftFromForm(payload);
@@ -16411,36 +16456,55 @@ export function PlatformEntryFlowShellImpl({
</motion.div>
)}
{selectionStage === 'jump-hop-result' && jumpHopSession?.draft && (
<motion.div
key="jump-hop-result"
initial={{ opacity: 0, y: 12 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -12 }}
className="flex h-full min-h-0 flex-col"
>
<Suspense
fallback={<LazyPanelFallback label="正在加载跳一跳结果..." />}
>
<JumpHopResultView
profile={jumpHopWork ?? jumpHopSession.draft}
error={jumpHopError}
onBack={leaveJumpHopFlow}
onEdit={() => {
setSelectionStage('jump-hop-workspace');
}}
onStartTestRun={startJumpHopTestRunFromProfile}
onPublish={publishJumpHopDraft}
onRegenerateCharacter={() => {
void regenerateJumpHopAsset('regenerate-character');
}}
onRegenerateTiles={() => {
void regenerateJumpHopAsset('regenerate-tiles');
}}
/>
</Suspense>
</motion.div>
)}
{selectionStage === 'jump-hop-result' &&
(() => {
const activeJumpHopResultProfile =
jumpHopWork ?? jumpHopSession?.draft ?? null;
return (
<motion.div
key="jump-hop-result"
initial={{ opacity: 0, y: 12 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -12 }}
className="flex h-full min-h-0 flex-col"
>
{activeJumpHopResultProfile ? (
<Suspense
fallback={
<LazyPanelFallback label="正在加载跳一跳结果..." />
}
>
<JumpHopResultView
profile={activeJumpHopResultProfile}
error={jumpHopError}
onBack={leaveJumpHopFlow}
onEdit={() => {
setSelectionStage('jump-hop-workspace');
}}
onStartTestRun={startJumpHopTestRunFromProfile}
onPublish={publishJumpHopDraft}
onRegenerateCharacter={() => {
void regenerateJumpHopAsset('regenerate-character');
}}
onRegenerateTiles={() => {
void regenerateJumpHopAsset('regenerate-tiles');
}}
/>
</Suspense>
) : (
<CreationResultRecoveryPanel
title="跳一跳草稿未恢复"
message="当前链接缺少可恢复的跳一跳草稿信息。"
actionLabel="返回创作"
onAction={() => {
setSelectionStage('jump-hop-workspace');
}}
/>
)}
</motion.div>
);
})()}
{selectionStage === 'jump-hop-runtime' && (
<motion.div
@@ -16476,7 +16540,7 @@ export function PlatformEntryFlowShellImpl({
initial={{ opacity: 0, y: 12 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -12 }}
className="flex h-full min-h-0 flex-col"
className="flex h-full min-h-0 flex-col overflow-y-auto overflow-x-hidden"
>
<Suspense
fallback={<LazyPanelFallback label="正在加载敲木鱼创作..." />}
@@ -16631,7 +16695,7 @@ export function PlatformEntryFlowShellImpl({
initial={{ opacity: 0, y: 12 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -12 }}
className="flex h-full min-h-0 flex-col"
className="flex h-full min-h-0 flex-col overflow-y-auto overflow-x-hidden"
>
<Suspense
fallback={<LazyPanelFallback label="正在加载拼图创作..." />}
@@ -16654,6 +16718,8 @@ export function PlatformEntryFlowShellImpl({
executePuzzleWorkspaceAction(payload);
}}
initialFormPayload={puzzleFormDraftPayload}
title={null}
unifiedChrome
onCreateFromForm={(payload) => {
void createPuzzleDraftFromForm(payload);
}}