Senin, 26 May 2025 :
Yang Sudah Di Kerjakan * Tampilan UI Admin di menu ekonomi * API Create, edit dan delete berita Yang Akan Dikerjakan: * API ProfilePPID * Tampilan UI Admin Di Menu Inovasi
This commit is contained in:
@@ -9,7 +9,7 @@ import TextAlign from '@tiptap/extension-text-align';
|
||||
import Superscript from '@tiptap/extension-superscript';
|
||||
import SubScript from '@tiptap/extension-subscript';
|
||||
import { Button, Stack } from '@mantine/core';
|
||||
import { useEffect } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
// const content =
|
||||
// '<h2 style="text-align: center;">Welcome to Mantine rich text editor</h2><p><code>RichTextEditor</code> component focuses on usability and is designed to be as simple as possible to bring a familiar editing experience to regular users. <code>RichTextEditor</code> is based on <a href="https://tiptap.dev/" rel="noopener noreferrer" target="_blank">Tiptap.dev</a> and supports all of its features:</p><ul><li>General text formatting: <strong>bold</strong>, <em>italic</em>, <u>underline</u>, <s>strike-through</s> </li><li>Headings (h1-h6)</li><li>Sub and super scripts (<sup><sup /></sup> and <sub><sub /></sub> tags)</li><li>Ordered and bullet lists</li><li>Text align </li><li>And all <a href="https://tiptap.dev/extensions" target="_blank" rel="noopener noreferrer">other extensions</a></li></ul>';
|
||||
@@ -18,11 +18,18 @@ import { useEffect } from 'react';
|
||||
onEditorReady,
|
||||
showSubmit = true,
|
||||
onSubmit,
|
||||
initialContent = '',
|
||||
onUpdate,
|
||||
}: {
|
||||
onEditorReady?: (editor: any | null) => void;
|
||||
onSubmit?: (val: string) => void;
|
||||
showSubmit?: boolean;
|
||||
initialContent?: string;
|
||||
onUpdate?: (content: string) => void;
|
||||
}) {
|
||||
const [mounted, setMounted] = useState(false);
|
||||
const [isReady, setIsReady] = useState(false);
|
||||
|
||||
const editor = useEditor({
|
||||
extensions: [
|
||||
StarterKit,
|
||||
@@ -33,15 +40,46 @@ import { useEffect } from 'react';
|
||||
Highlight,
|
||||
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
||||
],
|
||||
content: '',
|
||||
content: initialContent || '<p></p>',
|
||||
onUpdate: ({ editor }) => {
|
||||
if (onUpdate) {
|
||||
onUpdate(editor.getHTML());
|
||||
}
|
||||
},
|
||||
editorProps: {
|
||||
attributes: {
|
||||
class: 'prose max-w-none',
|
||||
},
|
||||
},
|
||||
onSelectionUpdate: () => {
|
||||
if (!isReady && editor) {
|
||||
setIsReady(true);
|
||||
onEditorReady?.(editor);
|
||||
}
|
||||
},
|
||||
immediatelyRender: false
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
onEditorReady?.(editor);
|
||||
}, [editor, onEditorReady] );
|
||||
if (editor) {
|
||||
// Set initial content when component mounts
|
||||
editor.commands.setContent(initialContent || '<p></p>');
|
||||
|
||||
// Mark as mounted and notify parent
|
||||
if (!mounted) {
|
||||
setMounted(true);
|
||||
onEditorReady?.(editor);
|
||||
}
|
||||
}
|
||||
|
||||
return () => {
|
||||
if (editor) {
|
||||
editor.destroy();
|
||||
}
|
||||
};
|
||||
}, [editor, initialContent, mounted, onEditorReady]);
|
||||
|
||||
if (!editor) return null;
|
||||
if (!editor) return <div>Loading editor...</div>;
|
||||
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user