useDropImageOrText.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { computed, onMounted, onUnmounted, Ref } from 'vue'
  2. import { useStore } from '@/store'
  3. import { getImageDataURL } from '@/utils/image'
  4. import useCreateElement from '@/hooks/useCreateElement'
  5. export default (elementRef: Ref<HTMLElement | undefined>) => {
  6. const store = useStore()
  7. const disableHotkeys = computed(() => store.state.disableHotkeys)
  8. const { createImageElement, createTextElement } = useCreateElement()
  9. const handleDrop = (e: DragEvent) => {
  10. if(!e.dataTransfer) return
  11. const dataTransferItem = e.dataTransfer.items[0]
  12. if(dataTransferItem.kind === 'file' && dataTransferItem.type.indexOf('image') !== -1) {
  13. const imageFile = dataTransferItem.getAsFile()
  14. if(imageFile) {
  15. getImageDataURL(imageFile).then(dataURL => createImageElement(dataURL))
  16. }
  17. }
  18. else if(dataTransferItem.kind === 'string' && dataTransferItem.type === 'text/plain') {
  19. dataTransferItem.getAsString(text => {
  20. if(disableHotkeys.value) return
  21. createTextElement({
  22. left: 0,
  23. top: 0,
  24. width: 600,
  25. height: 50,
  26. }, text)
  27. })
  28. }
  29. }
  30. onMounted(() => {
  31. elementRef.value && elementRef.value.addEventListener('drop', handleDrop)
  32. document.ondragleave = e => e.preventDefault()
  33. document.ondrop = e => e.preventDefault()
  34. document.ondragenter = e => e.preventDefault()
  35. document.ondragover = e => e.preventDefault()
  36. })
  37. onUnmounted(() => {
  38. elementRef.value && elementRef.value.removeEventListener('drop', handleDrop)
  39. document.ondragleave = null
  40. document.ondrop = null
  41. document.ondragenter = null
  42. document.ondragover = null
  43. })
  44. }