Skip to content

Commit 31cbcd8

Browse files
committed
Hide assistant copy button until streaming completes
1 parent a4e170b commit 31cbcd8

5 files changed

Lines changed: 5 additions & 29 deletions

File tree

apps/web/src/components/chat/MessageCopyButton.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ export const MessageCopyButton = memo(function MessageCopyButton({
1010
size = "xs",
1111
variant = "outline",
1212
className,
13-
disabled = false,
1413
onCopy,
1514
onError,
1615
}: {
@@ -19,7 +18,6 @@ export const MessageCopyButton = memo(function MessageCopyButton({
1918
size?: "xs" | "icon-xs";
2019
variant?: "outline" | "ghost";
2120
className?: string;
22-
disabled?: boolean;
2321
onCopy?: () => void;
2422
onError?: (error: Error) => void;
2523
}) {
@@ -35,7 +33,6 @@ export const MessageCopyButton = memo(function MessageCopyButton({
3533
size={size}
3634
variant={variant}
3735
className={cn(className)}
38-
disabled={disabled}
3936
onClick={() => copyToClipboard(text, undefined)}
4037
title={buttonTitle}
4138
aria-label={buttonTitle}

apps/web/src/components/chat/MessagesTimeline.logic.test.ts

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -158,37 +158,21 @@ describe("resolveAssistantMessageCopyState", () => {
158158
streaming: false,
159159
}),
160160
).toEqual({
161-
disabled: false,
162161
text: "Ship it",
163162
visible: true,
164163
});
165164
});
166165

167-
it("keeps copy visible but disabled while an assistant message is still streaming", () => {
166+
it("hides copy while an assistant message is still streaming", () => {
168167
expect(
169168
resolveAssistantMessageCopyState({
170169
showCopyButton: true,
171170
text: "Still streaming",
172171
streaming: true,
173172
}),
174173
).toEqual({
175-
disabled: true,
176174
text: "Still streaming",
177-
visible: true,
178-
});
179-
});
180-
181-
it("keeps copy visible while a terminal assistant message is streaming before text arrives", () => {
182-
expect(
183-
resolveAssistantMessageCopyState({
184-
showCopyButton: true,
185-
text: "",
186-
streaming: true,
187-
}),
188-
).toEqual({
189-
disabled: true,
190-
text: null,
191-
visible: true,
175+
visible: false,
192176
});
193177
});
194178

@@ -200,7 +184,6 @@ describe("resolveAssistantMessageCopyState", () => {
200184
streaming: false,
201185
}),
202186
).toEqual({
203-
disabled: false,
204187
text: null,
205188
visible: false,
206189
});
@@ -214,7 +197,6 @@ describe("resolveAssistantMessageCopyState", () => {
214197
streaming: false,
215198
}),
216199
).toEqual({
217-
disabled: false,
218200
text: "Interim thought",
219201
visible: false,
220202
});

apps/web/src/components/chat/MessagesTimeline.logic.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ export function resolveAssistantMessageCopyState({
7272
const hasText = text !== null && text.trim().length > 0;
7373
return {
7474
text: hasText ? text : null,
75-
visible: showCopyButton && (hasText || streaming),
76-
disabled: streaming,
75+
visible: showCopyButton && hasText && !streaming,
7776
};
7877
}
7978

apps/web/src/components/chat/MessagesTimeline.test.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ describe("MessagesTimeline", () => {
109109
expect(markup).toContain("Work log");
110110
});
111111

112-
it("renders the assistant copy button in a disabled state while streaming", async () => {
112+
it("does not render the assistant copy button while streaming", async () => {
113113
const { MessagesTimeline } = await import("./MessagesTimeline");
114114
const markup = renderToStaticMarkup(
115115
<MessagesTimeline
@@ -154,7 +154,6 @@ describe("MessagesTimeline", () => {
154154
/>,
155155
);
156156

157-
expect(markup).toContain('aria-label="Copy assistant response"');
158-
expect(markup).toContain("disabled");
157+
expect(markup).not.toContain('aria-label="Copy assistant response"');
159158
}, 10_000);
160159
});

apps/web/src/components/chat/MessagesTimeline.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,6 @@ export const MessagesTimeline = memo(function MessagesTimeline({
537537
size="icon-xs"
538538
variant="outline"
539539
className="border-border/50 bg-background/35 text-muted-foreground/45 shadow-none hover:border-border/70 hover:bg-background/55 hover:text-muted-foreground/70"
540-
disabled={assistantCopyState.disabled}
541540
onCopy={() => {
542541
toastManager.add({
543542
type: "success",

0 commit comments

Comments
 (0)