From 0fa1fecc59a917062cd333ae8774ae8bb65e338d Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 17 Feb 2026 14:36:25 +0800 Subject: [PATCH] fix: isolate detail mode chat surface --- components/canvas/CanvasChatPanel.tsx | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index c7b838a0f..5bcba07ca 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -582,6 +582,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF brandTone: "", bannedWords: "", }); + const [detailModeMessageStartIndex, setDetailModeMessageStartIndex] = useState(0); const canvasId = useMemo(() => toRawCanvasChatId(chatId), [chatId]); const [activeChatId, setActiveChatId] = useState(chatId); const [chatSessions, setChatSessions] = useState([]); @@ -591,6 +592,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF const videoSlotInputRefs = useRef>([]); const detailSlotInputRefs = useRef>([]); const textareaRef = useRef(null); + const detailModeSwitchRef = useRef(false); const hiddenPromptRef = useRef(null); const autoContextRef = useRef(null); const pendingLaunchRef = useRef(null); @@ -2791,6 +2793,18 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF return tagKeys.has(`image|${att.url}`); })); }, []); + + useEffect(() => { + if (isDetailGenerationMode && !detailModeSwitchRef.current) { + setDetailModeMessageStartIndex(messages.length); + } + detailModeSwitchRef.current = isDetailGenerationMode; + }, [isDetailGenerationMode, messages.length]); + + const visibleMessages = useMemo( + () => (isDetailGenerationMode ? messages.slice(detailModeMessageStartIndex) : messages), + [detailModeMessageStartIndex, isDetailGenerationMode, messages] + ); const isLoading = status === 'streaming' || status === 'submitted'; const isSubmitting = isLoading || isDetailGenerating; @@ -2817,8 +2831,8 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF currentVideoImageLimit.max > 0 && videoFrameSlots.length === 0 ); - const lastUserIndexForMarkers = messages.findLastIndex(m => m.role === "user"); - const messagesAfterLastUser = lastUserIndexForMarkers >= 0 ? messages.slice(lastUserIndexForMarkers + 1) : messages; + const lastUserIndexForMarkers = visibleMessages.findLastIndex(m => m.role === "user"); + const messagesAfterLastUser = lastUserIndexForMarkers >= 0 ? visibleMessages.slice(lastUserIndexForMarkers + 1) : visibleMessages; const hasGenerationStart = messagesAfterLastUser.some(msg => msg.role === "assistant" && msg.parts?.some( (part: any) => part.type === "text" && part.text?.includes("") @@ -2989,11 +3003,11 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
- {messages.length === 0 && ( + {!isDetailGenerationMode && visibleMessages.length === 0 && (
{/* Greeting */}
@@ -3030,7 +3044,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
)} - {messages.map((message) => { + {visibleMessages.map((message) => { // 🆕 清理消息中的内部标记并检查是否有实际内容 const rawParts = message.parts || []; const cleanedParts = rawParts.map((part: any) => { @@ -3299,7 +3313,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF