Spaces:
Sleeping
Sleeping
File size: 2,051 Bytes
f45e448 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import React, { useMemo, useRef } from 'react';
import ReactQuill from 'react-quill';
import 'react-quill/dist/quill.snow.css';
import { api } from '@/lib/api';
interface QuillWrapperProps {
value: string;
onChange: (value: string) => void;
placeholder?: string;
}
const QuillWrapper: React.FC<QuillWrapperProps> = ({ value, onChange, placeholder }) => {
const quillRef = useRef<ReactQuill>(null);
const imageHandler = () => {
const input = document.createElement('input');
input.setAttribute('type', 'file');
input.setAttribute('accept', 'image/*');
input.click();
input.onchange = async () => {
const file = input.files ? input.files[0] : null;
if (file) {
const formData = new FormData();
formData.append('file', file);
try {
const res = await api.post('/api/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
});
if (res.url) {
const quill = quillRef.current?.getEditor();
if (quill) {
const range = quill.getSelection(true);
quill.insertEmbed(range?.index || 0, 'image', res.url);
}
} else {
alert('Upload failed: ' + (res.message || 'Unknown error'));
}
} catch (error) {
console.error('Upload error:', error);
alert('Upload failed');
}
}
};
};
const modules = useMemo(
() => ({
toolbar: {
container: [
[{ header: [1, 2, 3, false] }],
['bold', 'italic', 'underline', 'strike'],
[{ list: 'ordered' }, { list: 'bullet' }],
['link', 'image'],
['clean'],
],
handlers: {
image: imageHandler,
},
},
}),
[]
);
return (
<ReactQuill
ref={quillRef}
theme="snow"
value={value}
onChange={onChange}
modules={modules}
placeholder={placeholder}
/>
);
};
export default QuillWrapper;
|