Как установить лимит на размер изображения в редакторе Quil?

Как установить ограничение на загрузку файлов до 5 МБ? <br/> <br/> <pre><code class="typescript">'use client'

import React, { useState, forwardRef } from 'react';
import ReactQuill, { ReactQuillProps } from 'react-quill';
import 'react-quill/dist/quill.snow.css';
import './quil-editor.scss';
import cn from 'clsx';
import { Label } from '../label';
import { Sources } from 'quill';
import { convertLengthLeft } from './convert-length-left';

interface IQuilEditorProps extends ReactQuillProps {
	label?: string;
	maxLength?: number;
	error?: boolean;
	helperText?: string;
	setIsError?: (isError: boolean) => void;
	required?: boolean;
	divProps?: React.HTMLAttributes<HTMLDivElement>;
}

const QuilEditor = forwardRef<ReactQuill, IQuilEditorProps>(
	(
		{
			label,
			required,
			helperText,
			error,
			className,
			onChange,
			divProps,
			...props
		},
		ref
	) => {
		const [editorText, setEditorText] = useState('');
		const [isFocused, setIsFocused] = useState(false);
		const [isError, setIsError] = useState(error || false); // Устанавливаем начальное состояние ошибки
		const [lengthError, setLengthError] = useState('');
		const lengthLeft = props.maxLength
			? convertLengthLeft(props.maxLength, editorText)
			: undefined;

		const handleChange = (
			html: string,
			delta: any,
			source: Sources,
			editor: ReactQuill.UnprivilegedEditor
		) => {
			setEditorText(editor.getText().trimStart());
			let errorMsg = '';

			if (props.maxLength && editorText.length > props.maxLength) {
				errorMsg = `Максимальная длина: ${props.maxLength} символов.`;
			}

			if (errorMsg) {
				setLengthError(errorMsg);
				setIsError(true);
			} else {
				setLen
  • 13 октября 2024 г. 4:12
Ответы на вопрос 2
Для установки лимита на размер изображений и ограничения на загрузку файлов до 5 МБ в редакторе Quill, прежде всего нужно определить, как вы обрабатываете загрузку изображений. В Quill по умолчанию нет встроенной поддержки загрузки изображений, поэтому, если вы используете загрузку файлов через пользовательскую логику, вам нужно будет добавить проверку размера файла в процессе обработки.

Вот как это можно сделать:

1. **Проверка размера изображения**: Вам нужно будет использовать обработчик загрузки изображений. Обычно это делается с помощью `modules` Quill, которые позволяют вам настроить поведение редактора. Например, вы можете использовать модуль для загрузки изображений и добавлять проверку размера файла.

2. **Пример кода**, который добавляет обработку изображений и проверяет их размер:

```typescript
'use client';

import React, { useState, forwardRef } from 'react';
import ReactQuill, { ReactQuillProps } from 'react-quill';
import 'react-quill/dist/quill.snow.css';
import './quil-editor.scss';
import cn from 'clsx';
import { Label } from '../label';
import { Sources } from 'quill';
import { convertLengthLeft } from './convert-length-left';

interface IQuilEditorProps extends ReactQuillProps {
  label?: string;
  maxLength?: number;
  error?: boolean;
  helperText?: string;
  setIsError?: (isError: boolean) => void;
  required?: boolean;
  divProps?: React.HTMLAttributes<HTMLDivElement>;
}

const QuilEditor = forwardRef<ReactQuill, IQuilEditorProps>(
  (
    {
      label,
      required,
      helperText,
      error,
      className,
      onChange,
      divProps,
      ...props
    },
    ref
  ) => {
    const [editorText, setEditorText] = useState('');
    const [isFocused, setIsFocused] = useState(false);
    const [isError, setIsError] = useState(error || false);
    const [lengthError, setLengthError] = useState('');
    const lengthLeft = props.maxLength
      ? convertLengthLeft(props.maxLength, editorText)
      : undefined;

    const handleChange = (html: string, delta: any, source: Sources, editor: ReactQuill.UnprivilegedEditor) => {
      setEditorText(editor.getText().trimStart());
      let errorMsg = '';

      if (props.maxLength && editorText.length > props.maxLength) {
        errorMsg = `Максимальная длина: ${props.maxLength} символов.`;
      }

      if (errorMsg) {
        setLengthError(errorMsg);
        setIsError(true);
      } else {
        setLengthError('');
        setIsError(false);
      }

      if (onChange) {
        onChange(html, delta, source, editor);
      }
    };

    const handleImageUpload = async (file: File) => {
      if (file.size > 5 * 1024 * 1024) { // 5 MB в байтах
        alert('Пожалуйста, загрузите изображение размером до 5 МБ.');
        return;
      }

      const formData = new FormData();
      formData.append('file', file);

      // Здесь нужно добавить вашу логику для загрузки файла
      // Например, отправка на ваш сервер

      const imageUrl = await uploadImage(formData); // Примерная функция для загрузки
      const quill = ref.current.getEditor();
      const range = quill.getSelection(true);
      quill.insertEmbed(range.index, 'image', imageUrl);
    };

    const uploadImage = (formData: FormData) => {
      // Здесь добавьте логику для обработки загрузки изображения
      return Promise.resolve("URL_изображения"); // Возврат URL загруженного изображения
    };

    return (
      <div className={cn('quil-editor-container', className)} {...divProps}>
        {label && <Label required={required}>{label}</Label>}
        <ReactQuill
          ref={ref}
          value={editorText}
          onChange={handleChange}
          modules={{
            toolbar: {
              container: [
                ['bold', 'italic', 'underline'],
                [{ 'list': 'ordered'}, {'list': 'bullet'}],
                ['link', 'image', 'clean'],
              ],
              handlers: {
                image: () => {
                  const input = document.createElement('input');
                  input.setAttribute('type', 'file');
                  input.setAttribute('accept', 'image/*');
                  input.onchange = async (e: any) => {
                    const file = e
Вы можете либо переопределить handler для image и в нём определять размер и показывать ошибку (или, если всё ок, передавать обработку дальше базовому функционалу, как в примере); либо проверять размер на бэкенде при сабмите формы. А правильное решение - сделать и то, и другое.
Похожие вопросы