useDropImageOrText.ts 1.6 KB

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