From c232dd0526ad52c8f8d481b4c080e860ec44a31c Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 19 May 2026 16:17:58 +0800 Subject: [PATCH] fix: lock session intake after creation --- src/app/page.tsx | 1 + src/components/PromptPanel.tsx | 121 +++++++++++++++++++++++++++++---- src/components/Sidebar.tsx | 2 +- 3 files changed, 108 insertions(+), 16 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 08b14cf..a0688cb 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -344,6 +344,7 @@ export default function Home() {
void; onUploadProject: (opts: { mode: 'remix' | 'replicate'; @@ -35,7 +37,90 @@ function filePreview(file: File | null) { return file ? URL.createObjectURL(file) : ''; } -export default function PromptPanel({ onGenerate, onUploadProject, loading, uploadLoading }: PromptPanelProps) { +function tabFromMode(mode?: ProjectInputMode): Tab { + if (mode === 'remix') return 'remix'; + if (mode === 'replicate' || mode === 'extend') return 'replicate'; + return 'idea'; +} + +function modeLabel(mode?: ProjectInputMode) { + if (mode === 'remix') return '二创'; + if (mode === 'replicate') return '复刻'; + if (mode === 'extend') return '复制'; + return '想法'; +} + +function imageSourcesForSession(session: GenSession) { + const uploaded = session.uploadedImages?.map(image => image.url) ?? []; + return uploaded.length ? uploaded : session.refImages; +} + +function uploadedLabel(image: UploadedImage) { + if (image.role === 'subject') return '主体图'; + if (image.role === 'reference') return '参考图'; + return image.accessoryName || image.role; +} + +function LockedSessionInput({ session }: { session: GenSession }) { + const images = imageSourcesForSession(session); + return ( +
+
+
+
Locked session input
+
本会话入口已锁定 · {modeLabel(session.inputMode)}
+
+
+ 要换内容,请从左侧新建会话 +
+
+ +
+
+
Prompt
+

{session.prompt || '未填写'}

+
+
+
+
数量
+
{session.count} 张
+
+
+
创建时间
+
+ {new Date(session.createdAt).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })} +
+
+
+
+ +
+
Reference
+ {images.length ? ( +
+ {images.slice(0, 6).map((url, index) => { + const uploaded = session.uploadedImages?.find(image => image.url === url); + return ( +
+ {uploaded +
+ {uploaded ? uploadedLabel(uploaded) : `参考 ${index + 1}`} +
+
+ ); + })} +
+ ) : ( +
+ 本会话没有参考图。 +
+ )} +
+
+ ); +} + +export default function PromptPanel({ session, onGenerate, onUploadProject, loading, uploadLoading }: PromptPanelProps) { const [tab, setTab] = useState('idea'); const [prompt, setPrompt] = useState('AI 毛绒陪伴玩具,机甲头盔,胸前挂 M logo,橙白配色,圆胖体型'); const [refs, setRefs] = useState([]); @@ -86,6 +171,8 @@ export default function PromptPanel({ onGenerate, onUploadProject, loading, uplo const busy = loading || uploadLoading; const replicatePreview = filePreview(replicateFile); + const locked = Boolean(session); + const activeTab = session ? tabFromMode(session.inputMode) : tab; return (
@@ -102,8 +189,10 @@ export default function PromptPanel({ onGenerate, onUploadProject, loading, uplo ].map(([id, label]) => ( @@ -111,7 +200,9 @@ export default function PromptPanel({ onGenerate, onUploadProject, loading, uplo
- {tab === 'idea' && ( + {session ? ( + + ) : activeTab === 'idea' && ( <>