|
<script lang="ts"> |
|
import { onDestroy } from "svelte"; |
|
import { Copy, Check } from "@gradio/icons"; |
|
import type { NormalisedMessage } from "../types"; |
|
import { IconButton } from "@gradio/atoms"; |
|
|
|
let copied = false; |
|
export let value: NormalisedMessage[] | null; |
|
|
|
let timer: NodeJS.Timeout; |
|
|
|
function copy_feedback(): void { |
|
copied = true; |
|
if (timer) clearTimeout(timer); |
|
timer = setTimeout(() => { |
|
copied = false; |
|
}, 1000); |
|
} |
|
|
|
const copy_conversation = (): void => { |
|
if (value) { |
|
const conversation_value = value |
|
.map((message) => { |
|
if (message.type === "text") { |
|
return `${message.role}: ${message.content}`; |
|
} |
|
return `${message.role}: ${message.content.value.url}`; |
|
}) |
|
.join("\n\n"); |
|
|
|
navigator.clipboard.writeText(conversation_value).catch((err) => { |
|
console.error("Failed to copy conversation: ", err); |
|
}); |
|
} |
|
}; |
|
|
|
async function handle_copy(): Promise<void> { |
|
if ("clipboard" in navigator) { |
|
copy_conversation(); |
|
copy_feedback(); |
|
} |
|
} |
|
|
|
onDestroy(() => { |
|
if (timer) clearTimeout(timer); |
|
}); |
|
</script> |
|
|
|
<IconButton |
|
Icon={copied ? Check : Copy} |
|
on:click={handle_copy} |
|
label={copied ? "Copied conversation" : "Copy conversation"} |
|
></IconButton> |
|
|