diff options
| author | Daniel Polito <[email protected]> | 2026-01-10 19:01:23 -0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-01-10 16:01:23 -0600 |
| commit | 50ed4c6b5de8aa0e5d0739f933f7afd2ecaa95f4 (patch) | |
| tree | e7a6e63d030e0d14eece9603e3017ba2e6bb1d9b /packages/ui/src/components/message-part.tsx | |
| parent | f882cca98a2b245b695880499dfc4101d4ed924c (diff) | |
| download | opencode-50ed4c6b5de8aa0e5d0739f933f7afd2ecaa95f4.tar.gz opencode-50ed4c6b5de8aa0e5d0739f933f7afd2ecaa95f4.zip | |
feat(deskop): Add Copy to Messages (#7658)
Diffstat (limited to 'packages/ui/src/components/message-part.tsx')
| -rw-r--r-- | packages/ui/src/components/message-part.tsx | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index d59f5cfa3..644690ed2 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -38,6 +38,8 @@ import { Markdown } from "./markdown" import { ImagePreview } from "./image-preview" import { getDirectory as _getDirectory, getFilename } from "@opencode-ai/util/path" import { checksum } from "@opencode-ai/util/encode" +import { Tooltip } from "./tooltip" +import { IconButton } from "./icon-button" import { createAutoScroll } from "../hooks" interface Diagnostic { @@ -278,6 +280,7 @@ export function AssistantMessageDisplay(props: { message: AssistantMessage; part export function UserMessageDisplay(props: { message: UserMessage; parts: PartType[] }) { const dialog = useDialog() + const [copied, setCopied] = createSignal(false) const textPart = createMemo( () => props.parts?.find((p) => p.type === "text" && !(p as TextPart).synthetic) as TextPart | undefined, @@ -307,6 +310,14 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp dialog.show(() => <ImagePreview src={url} alt={alt} />) } + const handleCopy = async () => { + const content = text() + if (!content) return + await navigator.clipboard.writeText(content) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } + return ( <div data-component="user-message"> <Show when={attachments().length > 0}> @@ -341,6 +352,11 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp <Show when={text()}> <div data-slot="user-message-text"> <HighlightedText text={text()} references={inlineFiles()} agents={agents()} /> + <div data-slot="user-message-copy-wrapper"> + <Tooltip value={copied() ? "Copied!" : "Copy"} placement="top" gutter={8}> + <IconButton icon={copied() ? "check" : "copy"} variant="secondary" onClick={handleCopy} /> + </Tooltip> + </div> </div> </Show> </div> |
