Implement copy for non-standard browsers. Fix flaky embed copy
This commit is contained in:
parent
cf2b54ab8d
commit
033ff3e150
|
@ -4,6 +4,7 @@ import { Menu, Transition } from '@headlessui/react'
|
||||||
import { Contract } from '../../common/contract'
|
import { Contract } from '../../common/contract'
|
||||||
import { contractPath } from '../lib/firebase/contracts'
|
import { contractPath } from '../lib/firebase/contracts'
|
||||||
import { DOMAIN } from '../../common/envs/constants'
|
import { DOMAIN } from '../../common/envs/constants'
|
||||||
|
import { copyToClipboard } from '../lib/util/copy'
|
||||||
|
|
||||||
export function ShareEmbedButton(props: { contract: Contract }) {
|
export function ShareEmbedButton(props: { contract: Contract }) {
|
||||||
const { contract } = props
|
const { contract } = props
|
||||||
|
@ -14,15 +15,16 @@ export function ShareEmbedButton(props: { contract: Contract }) {
|
||||||
|
|
||||||
const embedCode = `<iframe width="560" height="405" src="${src}" title="${title}" frameborder="0"></iframe>`
|
const embedCode = `<iframe width="560" height="405" src="${src}" title="${title}" frameborder="0"></iframe>`
|
||||||
|
|
||||||
if (navigator.clipboard) navigator.clipboard.writeText(embedCode)
|
copyToClipboard(embedCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Menu as="div" className="relative z-40 flex-shrink-0" onClick={copyEmbed}>
|
<Menu
|
||||||
<Menu.Button
|
as="div"
|
||||||
className="btn btn-xs btn-outline normal-case hover:bg-white hover:text-neutral"
|
className="relative z-40 flex-shrink-0"
|
||||||
onClick={copyEmbed}
|
onMouseUp={copyEmbed}
|
||||||
>
|
>
|
||||||
|
<Menu.Button className="btn btn-xs btn-outline normal-case hover:bg-white hover:text-neutral">
|
||||||
<CodeIcon className="w-4 h-4 text-gray-500 mr-1.5" aria-hidden="true" />
|
<CodeIcon className="w-4 h-4 text-gray-500 mr-1.5" aria-hidden="true" />
|
||||||
Embed
|
Embed
|
||||||
</Menu.Button>
|
</Menu.Button>
|
||||||
|
|
38
web/lib/util/copy.ts
Normal file
38
web/lib/util/copy.ts
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
// From: https://stackoverflow.com/a/33928558/1592933
|
||||||
|
// Copies a string to the clipboard. Must be called from within an
|
||||||
|
// event handler such as click. May return false if it failed, but
|
||||||
|
// this is not always possible. Browser support for Chrome 43+,
|
||||||
|
// Firefox 42+, Safari 10+, Edge and Internet Explorer 10+.
|
||||||
|
// Internet Explorer: The clipboard feature may be disabled by
|
||||||
|
// an administrator. By default a prompt is shown the first
|
||||||
|
// time the clipboard is used (per session).
|
||||||
|
export function copyToClipboard(text: string) {
|
||||||
|
if (navigator.clipboard) {
|
||||||
|
navigator.clipboard.writeText(text)
|
||||||
|
} else if (
|
||||||
|
(window as any).clipboardData &&
|
||||||
|
(window as any).clipboardData.setData
|
||||||
|
) {
|
||||||
|
console.log('copy 2')
|
||||||
|
// Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.
|
||||||
|
return (window as any).clipboardData.setData('Text', text)
|
||||||
|
} else if (
|
||||||
|
document.queryCommandSupported &&
|
||||||
|
document.queryCommandSupported('copy')
|
||||||
|
) {
|
||||||
|
console.log('copy 3')
|
||||||
|
var textarea = document.createElement('textarea')
|
||||||
|
textarea.textContent = text
|
||||||
|
textarea.style.position = 'fixed' // Prevent scrolling to bottom of page in Microsoft Edge.
|
||||||
|
document.body.appendChild(textarea)
|
||||||
|
textarea.select()
|
||||||
|
try {
|
||||||
|
return document.execCommand('copy') // Security exception may be thrown by some browsers.
|
||||||
|
} catch (ex) {
|
||||||
|
console.warn('Copy to clipboard failed.', ex)
|
||||||
|
return prompt('Copy to clipboard: Ctrl+C, Enter', text)
|
||||||
|
} finally {
|
||||||
|
document.body.removeChild(textarea)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user