usePasteEvent.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { computed, onMounted, onUnmounted } from 'vue'
  2. import { useStore } from 'vuex'
  3. import { State } from '@/store'
  4. import { getImageDataURL } from '@/utils/image'
  5. import usePasteTextClipboardData from '@/hooks/usePasteTextClipboardData'
  6. import useCreateElement from '@/hooks/useCreateElement'
  7. export default () => {
  8. const store = useStore<State>()
  9. const editorAreaFocus = computed(() => store.state.editorAreaFocus)
  10. const thumbnailsFocus = computed(() => store.state.thumbnailsFocus)
  11. const disableHotkeys = computed(() => store.state.disableHotkeys)
  12. const { pasteTextClipboardData } = usePasteTextClipboardData()
  13. const { createImageElement } = useCreateElement()
  14. const pasteImageFile = (imageFile: File) => {
  15. getImageDataURL(imageFile).then(dataURL => createImageElement(dataURL))
  16. }
  17. const pasteListener = (e: ClipboardEvent) => {
  18. if(!editorAreaFocus.value && !thumbnailsFocus.value) return
  19. if(disableHotkeys.value) return
  20. if(!e.clipboardData) return
  21. const clipboardDataItems = e.clipboardData.items
  22. const clipboardDataFirstItem = clipboardDataItems[0]
  23. if(!clipboardDataFirstItem) return
  24. for(const item of clipboardDataItems) {
  25. if(item.kind === 'file' && item.type.indexOf('image') !== -1) {
  26. const imageFile = item.getAsFile()
  27. if(imageFile) pasteImageFile(imageFile)
  28. return
  29. }
  30. }
  31. if(clipboardDataFirstItem.kind === 'string' && clipboardDataFirstItem.type === 'text/plain') {
  32. clipboardDataFirstItem.getAsString(text => pasteTextClipboardData(text))
  33. }
  34. }
  35. onMounted(() => {
  36. document.addEventListener('paste', pasteListener)
  37. })
  38. onUnmounted(() => {
  39. document.removeEventListener('paste', pasteListener)
  40. })
  41. }