tldraw/state/clipboard.ts

49 lines
1.2 KiB
TypeScript
Raw Normal View History

2021-06-18 10:14:23 +00:00
import { Data, Shape } from 'types'
import state from './state'
class Clipboard {
current: string
fallback = false
copy = (shapes: Shape[], onComplete?: () => void) => {
this.current = JSON.stringify({ id: 'tldr', shapes })
navigator.permissions.query({ name: 'clipboard-write' }).then((result) => {
if (result.state == 'granted' || result.state == 'prompt') {
navigator.clipboard.writeText(this.current).then(onComplete, () => {
console.warn('Error, could not copy to clipboard. Fallback?')
this.fallback = true
})
} else {
this.fallback = true
}
})
}
paste = () => {
navigator.clipboard
.readText()
.then(this.sendPastedTextToState, this.sendPastedTextToState)
}
sendPastedTextToState(text = this.current) {
if (text === undefined) return
try {
const clipboardData = JSON.parse(text)
state.send('PASTED_SHAPES_FROM_CLIPBOARD', {
shapes: clipboardData.shapes,
})
} catch (e) {
// The text wasn't valid JSON, or it wasn't ours, so paste it as a text object
state.send('PASTED_TEXT_FROM_CLIPBOARD', { text })
}
}
clear = () => {
this.current = undefined
}
}
export default new Clipboard()