my_gradio / js /chatbot /shared /CopyAll.svelte
xray918's picture
Upload folder using huggingface_hub
0ad74ed verified
<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>