diff --git a/src/components/PostEditor/PostTextarea/ClipboardAndDropHandler.ts b/src/components/PostEditor/PostTextarea/ClipboardAndDropHandler.ts index 5fc4a4fb..79de33c4 100644 --- a/src/components/PostEditor/PostTextarea/ClipboardAndDropHandler.ts +++ b/src/components/PostEditor/PostTextarea/ClipboardAndDropHandler.ts @@ -49,12 +49,12 @@ export const ClipboardAndDropHandler = Extension.create item.type.includes('image') || item.type.includes('video') ) - if (!mediaFile) return false + if (!mediaFiles.length) return false - uploadFile(view, mediaFile, options) + uploadFile(view, mediaFiles, options) return true } @@ -70,7 +70,7 @@ export const ClipboardAndDropHandler = Extension.create { - options.onUploadSuccess?.(file, result) - const urlNode = view.state.schema.text(result.url) + mediaUpload + .upload(file) + .then((result) => { + options.onUploadSuccess?.(file, result) + const urlNode = view.state.schema.text(result.url) - const tr = view.state.tr - let didReplace = false + const tr = view.state.tr + let didReplace = false - view.state.doc.descendants((node, pos) => { - if (node.isText && node.text && node.text.includes(placeholder) && !didReplace) { - const startPos = node.text.indexOf(placeholder) - const from = pos + startPos - const to = from + placeholder.length - tr.replaceWith(from, to, urlNode) - didReplace = true - return false + view.state.doc.descendants((node, pos) => { + if (node.isText && node.text && node.text.includes(placeholder) && !didReplace) { + const startPos = node.text.indexOf(placeholder) + const from = pos + startPos + const to = from + placeholder.length + tr.replaceWith(from, to, urlNode) + didReplace = true + return false + } + return true + }) + + if (didReplace) { + view.dispatch(tr) + } else { + const endPos = view.state.doc.content.size + + const paragraphNode = view.state.schema.nodes.paragraph.create( + null, + view.state.schema.text(result.url) + ) + + const insertTr = view.state.tr.insert(endPos, paragraphNode) + const newPos = endPos + 1 + result.url.length + insertTr.setSelection(TextSelection.near(insertTr.doc.resolve(newPos))) + view.dispatch(insertTr) } - return true }) + .catch((error) => { + console.error('Upload failed:', error) + options.onUploadError?.(file, error) - if (didReplace) { - view.dispatch(tr) - } else { - const endPos = view.state.doc.content.size + const tr = view.state.tr + let didReplace = false - const paragraphNode = view.state.schema.nodes.paragraph.create( - null, - view.state.schema.text(result.url) - ) + view.state.doc.descendants((node, pos) => { + if (node.isText && node.text && node.text.includes(placeholder) && !didReplace) { + const startPos = node.text.indexOf(placeholder) + const from = pos + startPos + const to = from + placeholder.length + const errorNode = view.state.schema.text(`[Error uploading "${name}"]`) + tr.replaceWith(from, to, errorNode) + didReplace = true + return false + } + return true + }) - const insertTr = view.state.tr.insert(endPos, paragraphNode) - const newPos = endPos + 1 + result.url.length - insertTr.setSelection(TextSelection.near(insertTr.doc.resolve(newPos))) - view.dispatch(insertTr) - } - }) - .catch((error) => { - console.error('Upload failed:', error) - options.onUploadError?.(file, error) - - const tr = view.state.tr - let didReplace = false - - view.state.doc.descendants((node, pos) => { - if (node.isText && node.text && node.text.includes(placeholder) && !didReplace) { - const startPos = node.text.indexOf(placeholder) - const from = pos + startPos - const to = from + placeholder.length - const errorNode = view.state.schema.text(`[Error uploading "${name}"]`) - tr.replaceWith(from, to, errorNode) - didReplace = true - return false + if (didReplace) { + view.dispatch(tr) } - return true + + throw error }) - - if (didReplace) { - view.dispatch(tr) - } - - throw error - }) + } } diff --git a/src/components/PostEditor/Uploader.tsx b/src/components/PostEditor/Uploader.tsx index b580da13..4a731306 100644 --- a/src/components/PostEditor/Uploader.tsx +++ b/src/components/PostEditor/Uploader.tsx @@ -53,6 +53,7 @@ export default function Uploader({ style={{ display: 'none' }} onChange={handleFileChange} accept={accept} + multiple /> )