mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-11 01:08:57 +08:00
fix: resolve clipboard.writeText failure under HTTP protocol (#12936)
This commit is contained in:
parent
8dd1873e76
commit
71fa14f791
@ -10,6 +10,7 @@ import {
|
|||||||
import { Tab } from '@headlessui/react'
|
import { Tab } from '@headlessui/react'
|
||||||
import { Tag } from './tag'
|
import { Tag } from './tag'
|
||||||
import classNames from '@/utils/classnames'
|
import classNames from '@/utils/classnames'
|
||||||
|
import { writeTextToClipboard } from '@/utils/clipboard'
|
||||||
|
|
||||||
const languageNames = {
|
const languageNames = {
|
||||||
js: 'JavaScript',
|
js: 'JavaScript',
|
||||||
@ -71,7 +72,7 @@ function CopyButton({ code }: { code: string }) {
|
|||||||
: 'bg-white/5 hover:bg-white/7.5 dark:bg-white/2.5 dark:hover:bg-white/5',
|
: 'bg-white/5 hover:bg-white/7.5 dark:bg-white/2.5 dark:hover:bg-white/5',
|
||||||
)}
|
)}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
window.navigator.clipboard.writeText(code).then(() => {
|
writeTextToClipboard(code).then(() => {
|
||||||
setCopyCount(count => count + 1)
|
setCopyCount(count => count + 1)
|
||||||
})
|
})
|
||||||
}}
|
}}
|
||||||
|
35
web/utils/clipboard.ts
Normal file
35
web/utils/clipboard.ts
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
export async function writeTextToClipboard(text: string): Promise<void> {
|
||||||
|
if (navigator.clipboard && navigator.clipboard.writeText)
|
||||||
|
return navigator.clipboard.writeText(text)
|
||||||
|
|
||||||
|
return fallbackCopyTextToClipboard(text)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fallbackCopyTextToClipboard(text: string): Promise<void> {
|
||||||
|
const textArea = document.createElement('textarea')
|
||||||
|
textArea.value = text
|
||||||
|
textArea.style.position = 'fixed' // Avoid scrolling to bottom
|
||||||
|
document.body.appendChild(textArea)
|
||||||
|
textArea.focus()
|
||||||
|
textArea.select()
|
||||||
|
try {
|
||||||
|
const successful = document.execCommand('copy')
|
||||||
|
if (successful)
|
||||||
|
return Promise.resolve()
|
||||||
|
|
||||||
|
return Promise.reject(new Error('document.execCommand failed'))
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
return Promise.reject(convertAnyToError(err))
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
document.body.removeChild(textArea)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertAnyToError(err: any): Error {
|
||||||
|
if (err instanceof Error)
|
||||||
|
return err
|
||||||
|
|
||||||
|
return new Error(`Caught: ${String(err)}`)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user