new-personal-site/components/lib/editors/TinyMCE/index.tsx
Benjamin Toby 5587024789 Updates
2025-01-05 07:25:38 +01:00

80 lines
2.3 KiB
TypeScript

import React from "react";
import { RawEditorOptions, TinyMCE, Editor } from "./tinymce";
import { twMerge } from "tailwind-merge";
export type TinyMCEEditorProps = {
tinyMCE?: TinyMCE | null;
options?: RawEditorOptions;
editorRef?: React.MutableRefObject<Editor | null>;
setEditor?: React.Dispatch<React.SetStateAction<Editor>>;
wrapperProps?: React.DetailedHTMLProps<
React.HTMLAttributes<HTMLDivElement>,
HTMLDivElement
>;
defaultValue?: string;
};
let interval: any;
/**
* # Tiny MCE Editor Component
* @className_wrapper twui-rte-wrapper
*/
export default function TinyMCEEditor({
options,
editorRef,
setEditor,
tinyMCE,
wrapperProps,
defaultValue,
}: TinyMCEEditorProps) {
const editorComponentRef = React.useRef<HTMLDivElement>(null);
const FINAL_HEIGHT = options?.height || 500;
React.useEffect(() => {
if (!editorComponentRef.current) {
return;
}
tinyMCE?.init({
height: FINAL_HEIGHT,
menubar: false,
plugins: [
"advlist lists link image charmap print preview anchor",
"searchreplace visualblocks code fullscreen",
"insertdatetime media table paste code help wordcount",
],
toolbar:
"undo redo | blocks | bold italic | bullist numlist outdent indent | removeformat",
content_style:
"body { font-family:Helvetica,Arial,sans-serif; font-size:14px }",
init_instance_callback: (editor) => {
setEditor?.(editor as any);
if (editorRef) editorRef.current = editor as any;
if (defaultValue) editor.setContent(defaultValue);
},
base_url: "https://datasquirel.com/tinymce-public",
body_class: "twui-tinymce",
...options,
license_key: "gpl",
target: editorComponentRef.current,
});
}, [tinyMCE]);
return (
<div
{...wrapperProps}
ref={editorComponentRef}
style={{
height: FINAL_HEIGHT + "px",
...wrapperProps?.style,
}}
className={twMerge(
"bg-slate-200 dark:bg-slate-700 rounded-sm",
"twui-rte-wrapper"
)}
/>
);
}