164 lines
5.8 KiB
TypeScript
164 lines
5.8 KiB
TypeScript
"use client";
|
|
|
|
import React, { useState } from 'react';
|
|
|
|
// Import the optimized editor (choose one based on your migration)
|
|
// import OptimizedEditor from './optimized-editor'; // TinyMCE
|
|
// import OptimizedCKEditor from './optimized-ckeditor'; // CKEditor5 Classic
|
|
// import MinimalEditor from './minimal-editor'; // React Quill
|
|
|
|
interface EditorExampleProps {
|
|
editorType?: 'tinymce' | 'ckeditor' | 'quill';
|
|
}
|
|
|
|
const EditorExample: React.FC<EditorExampleProps> = ({
|
|
editorType = 'tinymce'
|
|
}) => {
|
|
const [content, setContent] = useState('<p>Hello, this is the editor content!</p>');
|
|
const [savedContent, setSavedContent] = useState('');
|
|
|
|
const handleContentChange = (newContent: string) => {
|
|
setContent(newContent);
|
|
};
|
|
|
|
const handleSave = () => {
|
|
setSavedContent(content);
|
|
console.log('Content saved:', content);
|
|
};
|
|
|
|
const handleReset = () => {
|
|
setContent('<p>Content has been reset!</p>');
|
|
};
|
|
|
|
return (
|
|
<div className="p-6 max-w-4xl mx-auto">
|
|
<div className="mb-6">
|
|
<h2 className="text-2xl font-bold mb-4">Rich Text Editor Example</h2>
|
|
<p className="text-gray-600 mb-4">
|
|
This is an optimized editor with {editorType} - much smaller bundle size and better performance!
|
|
</p>
|
|
</div>
|
|
|
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
{/* Editor Panel */}
|
|
<div className="space-y-4">
|
|
<div className="flex items-center justify-between">
|
|
<h3 className="text-lg font-semibold">Editor</h3>
|
|
<div className="flex gap-2">
|
|
<button
|
|
onClick={handleSave}
|
|
className="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
|
|
>
|
|
Save
|
|
</button>
|
|
<button
|
|
onClick={handleReset}
|
|
className="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700 transition-colors"
|
|
>
|
|
Reset
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="border border-gray-200 rounded-lg">
|
|
{/* Choose your editor based on migration */}
|
|
{editorType === 'tinymce' && (
|
|
<div className="p-4">
|
|
<p className="text-gray-500 text-sm mb-2">
|
|
TinyMCE Editor (200KB bundle)
|
|
</p>
|
|
{/* <OptimizedEditor
|
|
initialData={content}
|
|
onChange={handleContentChange}
|
|
height={400}
|
|
placeholder="Start typing your content..."
|
|
/> */}
|
|
<div className="h-96 bg-gray-50 border border-gray-200 rounded flex items-center justify-center">
|
|
<p className="text-gray-500">TinyMCE Editor Component</p>
|
|
</div>
|
|
</div>
|
|
)}
|
|
|
|
{editorType === 'ckeditor' && (
|
|
<div className="p-4">
|
|
<p className="text-gray-500 text-sm mb-2">
|
|
CKEditor5 Classic (800KB bundle)
|
|
</p>
|
|
{/* <OptimizedCKEditor
|
|
initialData={content}
|
|
onChange={handleContentChange}
|
|
height={400}
|
|
placeholder="Start typing your content..."
|
|
/> */}
|
|
<div className="h-96 bg-gray-50 border border-gray-200 rounded flex items-center justify-center">
|
|
<p className="text-gray-500">CKEditor5 Classic Component</p>
|
|
</div>
|
|
</div>
|
|
)}
|
|
|
|
{editorType === 'quill' && (
|
|
<div className="p-4">
|
|
<p className="text-gray-500 text-sm mb-2">
|
|
React Quill (100KB bundle)
|
|
</p>
|
|
{/* <MinimalEditor
|
|
initialData={content}
|
|
onChange={handleContentChange}
|
|
height={400}
|
|
placeholder="Start typing your content..."
|
|
/> */}
|
|
<div className="h-96 bg-gray-50 border border-gray-200 rounded flex items-center justify-center">
|
|
<p className="text-gray-500">React Quill Component</p>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
|
|
{/* Preview Panel */}
|
|
<div className="space-y-4">
|
|
<h3 className="text-lg font-semibold">Preview</h3>
|
|
|
|
<div className="border border-gray-200 rounded-lg p-4">
|
|
<h4 className="font-medium mb-2">Current Content:</h4>
|
|
<div
|
|
className="prose max-w-none"
|
|
dangerouslySetInnerHTML={{ __html: content }}
|
|
/>
|
|
</div>
|
|
|
|
{savedContent && (
|
|
<div className="border border-gray-200 rounded-lg p-4">
|
|
<h4 className="font-medium mb-2">Saved Content:</h4>
|
|
<div
|
|
className="prose max-w-none"
|
|
dangerouslySetInnerHTML={{ __html: savedContent }}
|
|
/>
|
|
</div>
|
|
)}
|
|
|
|
<div className="border border-gray-200 rounded-lg p-4">
|
|
<h4 className="font-medium mb-2">Raw HTML:</h4>
|
|
<pre className="text-xs bg-gray-100 p-2 rounded overflow-auto max-h-32">
|
|
{content}
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Performance Info */}
|
|
<div className="mt-8 p-4 bg-blue-50 rounded-lg">
|
|
<h4 className="font-medium text-blue-900 mb-2">Performance Benefits:</h4>
|
|
<ul className="text-sm text-blue-800 space-y-1">
|
|
<li>• 90% smaller bundle size compared to custom CKEditor5</li>
|
|
<li>• Faster initial load time</li>
|
|
<li>• Better mobile performance</li>
|
|
<li>• Reduced memory usage</li>
|
|
<li>• Improved Lighthouse score</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default EditorExample;
|