import { defineFileDropHandler, defineFilePasteHandler, UploadTask } from '@prosekit/extensions'
function createImageUploadHandler() {
const handler = async (options) => {
const { file, view, pos } = options
// Only handle images
if (!file.type.startsWith('image/')) {
return false
}
// Create upload task
const uploadTask = new UploadTask({
file,
uploader: async ({ file }) => {
const formData = new FormData()
formData.append('image', file)
const response = await fetch('/api/upload', {
method: 'POST',
body: formData,
})
const data = await response.json()
return data.url
},
})
// Insert image with temporary URL
const tempURL = uploadTask.objectURL
const transaction = view.state.tr.insert(
pos || view.state.selection.from,
view.state.schema.nodes.image.create({ src: tempURL })
)
view.dispatch(transaction)
// Replace with final URL when upload completes
uploadTask.finished.then((finalURL) => {
replaceImageURL(view, tempURL, finalURL)
})
return true
}
return [
defineFileDropHandler(handler),
defineFilePasteHandler(handler),
]
}