web_ppt / frontend /src /hooks /usePasteEvent.ts
CatPtain's picture
Upload 339 files
89ce340 verified
raw
history blame
1.89 kB
import { onMounted, onUnmounted } from 'vue'
import { storeToRefs } from 'pinia'
import { useMainStore } from '@/store'
import { getImageDataURL } from '@/utils/image'
import usePasteTextClipboardData from './usePasteTextClipboardData'
import useCreateElement from './useCreateElement'
export default () => {
const { editorAreaFocus, thumbnailsFocus, disableHotkeys } = storeToRefs(useMainStore())
const { pasteTextClipboardData } = usePasteTextClipboardData()
const { createImageElement } = useCreateElement()
// 粘贴图片到幻灯片元素
const pasteImageFile = (imageFile: File) => {
getImageDataURL(imageFile).then(dataURL => createImageElement(dataURL))
}
/**
* 粘贴事件监听
* @param e ClipboardEvent
*/
const pasteListener = (e: ClipboardEvent) => {
if (!editorAreaFocus.value && !thumbnailsFocus.value) return
if (disableHotkeys.value) return
if (!e.clipboardData) return
const clipboardDataItems = e.clipboardData.items
const clipboardDataFirstItem = clipboardDataItems[0]
if (!clipboardDataFirstItem) return
// 如果剪贴板内有图片,优先尝试读取图片
let isImage = false
for (const item of clipboardDataItems) {
if (item.kind === 'file' && item.type.indexOf('image') !== -1) {
const imageFile = item.getAsFile()
if (imageFile) pasteImageFile(imageFile)
isImage = true
}
}
if (isImage) return
// 如果剪贴板内没有图片,但有文字内容,尝试解析文字内容
if (clipboardDataFirstItem.kind === 'string' && clipboardDataFirstItem.type === 'text/plain') {
clipboardDataFirstItem.getAsString(text => pasteTextClipboardData(text))
}
}
onMounted(() => {
document.addEventListener('paste', pasteListener)
})
onUnmounted(() => {
document.removeEventListener('paste', pasteListener)
})
}