import { useImperativeHandle, useRef, forwardRef, useEffect } from "react"; import { useEditor, EditorContent, Editor } from "@tiptap/react"; import { useDebouncedCallback } from "use-debounce"; // components import { EditorBubbleMenu } from "./bubble-menu"; import { TiptapExtensions } from "./extensions"; import { TiptapEditorProps } from "./props"; import { ImageResizer } from "./extensions/image-resize"; import { TableMenu } from "./table-menu"; export interface ITipTapRichTextEditor { value: string; noBorder?: boolean; borderOnFocus?: boolean; customClassName?: string; editorContentCustomClassNames?: string; onChange?: (json: any, html: string) => void; setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void; setShouldShowAlert?: (showAlert: boolean) => void; workspaceSlug: string; editable?: boolean; forwardedRef?: any; debouncedUpdatesEnabled?: boolean; } const Tiptap = (props: ITipTapRichTextEditor) => { const { onChange, debouncedUpdatesEnabled, forwardedRef, editable, setIsSubmitting, setShouldShowAlert, editorContentCustomClassNames, value, noBorder, workspaceSlug, borderOnFocus, customClassName, } = props; const editor = useEditor({ editable: editable ?? true, editorProps: TiptapEditorProps(workspaceSlug, setIsSubmitting), extensions: TiptapExtensions(workspaceSlug, setIsSubmitting), content: (typeof value === "string" && value.trim() !== "") ? value : "
", onUpdate: async ({ editor }) => { // for instant feedback loop setIsSubmitting?.("submitting"); setShouldShowAlert?.(true); if (debouncedUpdatesEnabled) { debouncedUpdates({ onChange, editor }); } else { onChange?.(editor.getJSON(), editor.getHTML()); } }, }); const editorRef: React.MutableRefObject