fix editor file handling

This commit is contained in:
Philipinho
2024-06-22 03:33:54 +01:00
parent 2aec5a3fe7
commit df1840cf67
12 changed files with 71 additions and 75 deletions

View File

@ -6,9 +6,9 @@ import { MediaUploadOptions, UploadFn } from "../media-utils";
const uploadKey = new PluginKey("image-upload");
export const ImageUploadPlugin = ({
placeHolderClass,
placeholderClass,
}: {
placeHolderClass: string;
placeholderClass: string;
}) =>
new Plugin({
key: uploadKey,
@ -27,7 +27,7 @@ export const ImageUploadPlugin = ({
const placeholder = document.createElement("div");
placeholder.setAttribute("class", "img-placeholder");
const image = document.createElement("img");
image.setAttribute("class", placeHolderClass);
image.setAttribute("class", placeholderClass);
image.src = src;
placeholder.appendChild(image);
const deco = Decoration.widget(pos + 1, placeholder, {

View File

@ -141,7 +141,7 @@ export const TiptapImage = Image.extend<ImageOptions>({
addProseMirrorPlugins() {
return [
ImageUploadPlugin({
placeHolderClass: "image-upload",
placeholderClass: "image-upload",
}),
];
},

View File

@ -7,44 +7,6 @@ export type UploadFn = (
pageId: string,
) => void;
export const handleMediaPaste = (
view: EditorView,
event: ClipboardEvent,
uploadFn: UploadFn,
pageId: string,
) => {
if (event.clipboardData?.files.length) {
event.preventDefault();
const [file] = Array.from(event.clipboardData.files);
const pos = view.state.selection.from;
if (file) uploadFn(file, view, pos, pageId);
return true;
}
return false;
};
export const handleMediaDrop = (
view: EditorView,
event: DragEvent,
moved: boolean,
uploadFn: UploadFn,
pageId: string,
) => {
if (!moved && event.dataTransfer?.files.length) {
event.preventDefault();
const [file] = Array.from(event.dataTransfer.files);
const coordinates = view.posAtCoords({
left: event.clientX,
top: event.clientY,
});
// here we deduct 1 from the pos or else the image will create an extra node
if (file) uploadFn(file, view, coordinates?.pos ?? 0 - 1, pageId);
return true;
}
return false;
};
export interface MediaUploadOptions {
validateFn?: (file: File) => void;
onUpload: (file: File, pageId: string) => Promise<any>;

View File

@ -6,9 +6,9 @@ import { MediaUploadOptions, UploadFn } from "../media-utils";
const uploadKey = new PluginKey("video-upload");
export const VideoUploadPlugin = ({
placeHolderClass,
placeholderClass,
}: {
placeHolderClass: string;
placeholderClass: string;
}) =>
new Plugin({
key: uploadKey,
@ -27,7 +27,7 @@ export const VideoUploadPlugin = ({
const placeholder = document.createElement("div");
placeholder.setAttribute("class", "video-placeholder");
const video = document.createElement("video");
video.setAttribute("class", placeHolderClass);
video.setAttribute("class", placeholderClass);
video.src = src;
placeholder.appendChild(video);
const deco = Decoration.widget(pos + 1, placeholder, {

View File

@ -28,8 +28,6 @@ declare module "@tiptap/core" {
}
}
const VIDEO_INPUT_REGEX = /!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\)/;
export const TiptapVideo = Node.create<VideoOptions>({
name: "video",
@ -123,23 +121,10 @@ export const TiptapVideo = Node.create<VideoOptions>({
return ReactNodeViewRenderer(this.options.view);
},
addInputRules() {
return [
nodeInputRule({
find: VIDEO_INPUT_REGEX,
type: this.type,
getAttributes: (match) => {
const [, , src] = match;
return { src };
},
}),
];
},
addProseMirrorPlugins() {
return [
VideoUploadPlugin({
placeHolderClass: "video-upload",
placeholderClass: "video-upload",
}),
];
},