Skip to content
File

Blob: src/client/components/editor/controllers/image/insert-panel.tsx

typescript31 lines
1import type { Editor, Range } from "@tiptap/core";
2import { mountEditorRenderer } from "../menu/renderer";
3import { type ImageNodeTarget, type UploadContext, insertImagePlaceholderAtRange } from "../../lib/media-actions";
4import { ImageInsertPopover, type ImageInsertPopoverProps } from "./insert-popover";
5 
6export function insertImageFromSlashMenu(editor: Editor, range: Range, uploadContext: UploadContext) {
7 const inserted = insertImagePlaceholderAtRange(editor, range);
8 if (!inserted) return;
9 
10 queueMicrotask(() => {
11 if (editor.isDestroyed) return;
12 showImageInsertPanel(editor, { uploadContext, target: inserted.target });
13 });
14}
15 
16export function showImageInsertPanel(editor: Editor, opts: { uploadContext: UploadContext; target: ImageNodeTarget }) {
17 // Keep launcher exports separate from the React component module so Vite Fast
18 // Refresh can hot-update the popover implementation without flagging the
19 // command-style exports in this module as incompatible.
20 function cleanup() {
21 renderer.destroy();
22 }
23 
24 const renderer = mountEditorRenderer<unknown, ImageInsertPopoverProps>(editor, ImageInsertPopover, {
25 editor,
26 uploadContext: opts.uploadContext,
27 target: opts.target,
28 onClose: cleanup,
29 });
30}