mirror of
https://github.com/Shadowfita/docmost.git
synced 2025-11-12 07:42:34 +10:00
fix editor file handling
This commit is contained in:
@ -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, {
|
||||
|
||||
@ -141,7 +141,7 @@ export const TiptapImage = Image.extend<ImageOptions>({
|
||||
addProseMirrorPlugins() {
|
||||
return [
|
||||
ImageUploadPlugin({
|
||||
placeHolderClass: "image-upload",
|
||||
placeholderClass: "image-upload",
|
||||
}),
|
||||
];
|
||||
},
|
||||
|
||||
@ -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>;
|
||||
|
||||
@ -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, {
|
||||
|
||||
@ -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",
|
||||
}),
|
||||
];
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user