import { ArrowLeft, Loader2, Send } from 'lucide-react'; import { useMemo, useState } from 'react'; import type { JumpHopSessionResponse, JumpHopWorkspaceCreateRequest, } from '../../../../packages/shared/src/contracts/jumpHop'; import { jumpHopClient } from '../../../services/jump-hop/jumpHopClient'; type JumpHopCreationWorkspaceProps = { isBusy?: boolean; error?: string | null; onBack: () => void; onSubmitted: ( result: JumpHopSessionResponse, payload: JumpHopWorkspaceCreateRequest, ) => void; showBackButton?: boolean; unifiedChrome?: boolean; }; type JumpHopWorkspaceFormState = { themeText: string; }; const DEFAULT_FORM_STATE: JumpHopWorkspaceFormState = { themeText: '', }; function buildJumpHopWorkspacePayload( formState: JumpHopWorkspaceFormState, ): JumpHopWorkspaceCreateRequest { const themeText = formState.themeText.trim(); return { templateId: 'jump-hop', themeText, workTitle: `${themeText}跳一跳`, workDescription: `${themeText}主题的俯视角跳跃作品`, themeTags: [themeText, '跳一跳', '休闲'], difficulty: 'standard', stylePreset: 'minimal-blocks', characterPrompt: '内置默认 3D 角色', tilePrompt: `${themeText}主题的3D立方体主题身份方块包装图集`, endMoodPrompt: null, }; } export function JumpHopCreationWorkspace({ isBusy = false, error = null, onBack, onSubmitted, showBackButton = true, unifiedChrome = false, }: JumpHopCreationWorkspaceProps) { const [formState, setFormState] = useState(DEFAULT_FORM_STATE); const [localError, setLocalError] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const canSubmit = useMemo( () => Boolean(formState.themeText.trim()), [formState], ); const handleSubmit = async () => { if (!canSubmit || isSubmitting || isBusy) { setLocalError('请先补全输入。'); return; } setIsSubmitting(true); setLocalError(null); try { const payload = buildJumpHopWorkspacePayload(formState); const response = await jumpHopClient.createSession(payload); onSubmitted(response, payload); } catch (caughtError) { setLocalError( caughtError instanceof Error ? caughtError.message : '创建草稿失败。', ); } finally { setIsSubmitting(false); } }; return (
{showBackButton ? (
) : null}
{localError || error ? (
{localError ?? error}
) : null}
); } export default JumpHopCreationWorkspace;