fix(frontend): hide copy for streaming assistant turn (#3176)

This commit is contained in:
Admire
2026-05-23 23:29:16 +08:00
committed by GitHub
parent 8785658a2e
commit e7967a7fc3
3 changed files with 385 additions and 20 deletions
@@ -16,13 +16,15 @@ import {
import {
extractContentFromMessage,
extractPresentFilesFromMessage,
extractReasoningContentFromMessage,
extractTextFromMessage,
getAssistantTurnCopyData,
getAssistantTurnUsageMessages,
getMessageGroups,
getStreamingMessageLookup,
hasContent,
hasPresentFiles,
hasReasoning,
isAssistantMessageGroupStreaming,
} from "@/core/messages/utils";
import { useRehypeSplitWordsIntoSpans } from "@/core/rehype";
import type { Subtask } from "@/core/tasks";
@@ -184,27 +186,32 @@ export function MessageList({
() => buildTokenDebugSteps(messages, t),
[messages, t],
);
const streamingMessages = useMemo(
() =>
getStreamingMessageLookup(
messages,
thread.isLoading,
thread.getMessagesMetadata,
),
[messages, thread.getMessagesMetadata, thread.isLoading],
);
const renderAssistantCopyButton = useCallback((messages: Message[]) => {
const clipboardData = [...messages]
.reverse()
.filter((message) => message.type === "ai")
.map((message) => {
const content = extractContentFromMessage(message);
return content ?? extractReasoningContentFromMessage(message) ?? "";
})
.find((content) => content.length > 0);
const renderAssistantCopyButton = useCallback(
(messages: Message[], isStreaming: boolean) => {
const clipboardData = getAssistantTurnCopyData(messages, { isStreaming });
if (!clipboardData) {
return null;
}
if (!clipboardData) {
return null;
}
return (
<div className="mt-2 flex justify-start opacity-0 transition-opacity delay-200 duration-300 group-hover/assistant-turn:opacity-100">
<CopyButton clipboardData={clipboardData} />
</div>
);
}, []);
return (
<div className="mt-2 flex justify-start opacity-0 transition-opacity delay-200 duration-300 group-hover/assistant-turn:opacity-100">
<CopyButton clipboardData={clipboardData} />
</div>
);
},
[],
);
const renderTokenUsage = useCallback(
({
@@ -294,7 +301,13 @@ export function MessageList({
turnUsageMessages,
})}
{group.type === "assistant" &&
renderAssistantCopyButton(group.messages)}
renderAssistantCopyButton(
group.messages,
isAssistantMessageGroupStreaming(
group.messages,
streamingMessages,
),
)}
</div>
);
} else if (group.type === "assistant:clarification") {