diff --git a/src/app/components/upload-section-file.tsx b/src/app/components/upload-section-file.tsx index 234c62b..baadda0 100644 --- a/src/app/components/upload-section-file.tsx +++ b/src/app/components/upload-section-file.tsx @@ -340,7 +340,7 @@ export default function UploadSectionFile({ fileType, allowedExtensions, maxFile {fileType === "image" && (

- {t('image-resolution')}: 100x100 - 10000x10000 + {t('image-resolution')}: 100x100 - 10000x10000 {t('pixels')}

)}

diff --git a/src/app/ui/marking-page/upload-section-image.tsx b/src/app/ui/marking-page/upload-section-image.tsx deleted file mode 100644 index fba6005..0000000 --- a/src/app/ui/marking-page/upload-section-image.tsx +++ /dev/null @@ -1,278 +0,0 @@ -'use client' - -import React, { useRef, useState, useCallback, ChangeEvent, DragEvent } from 'react'; -import {IconShieldAdd} from '@/app/ui/icons/icons'; - -interface SelectedFile { - file: File; - preview: string; - name: string; - size: string; - dimensions?: { - width: number; - height: number; - }; -} - -type SupportedFormat = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/bmp'; -type FileExtension = 'jpg' | 'jpeg' | 'png' | 'gif' | 'bmp'; - -export default function UploadSectionImage() { - const fileInputRef = useRef(null); - const [isDragging, setIsDragging] = useState(false); - const [selectedFile, setSelectedFile] = useState(null); - const [error, setError] = useState(null); - - const SUPPORTED_FORMATS: SupportedFormat[] = [ - 'image/jpeg', - 'image/png', - 'image/gif', - 'image/bmp' - ]; - - const ALLOWED_EXTENSIONS: FileExtension[] = ['jpg', 'jpeg', 'png', 'gif', 'bmp']; - - - const validateFile = (file: File): { isValid: boolean; errorMessage?: string } => { - if (!SUPPORTED_FORMATS.includes(file.type as SupportedFormat)) { - const extension = file.name.split('.').pop()?.toLowerCase(); - if (!extension || !ALLOWED_EXTENSIONS.includes(extension as FileExtension)) { - return { - isValid: false, - errorMessage: 'Неподдерживаемый формат файла.' - }; - } - } - - const MAX_SIZE = 10 * 1024 * 1024; - if (file.size > MAX_SIZE) { - return { - isValid: false, - errorMessage: 'Файл слишком большой. Максимальный размер: 10MB' - }; - } - - return { isValid: true }; - }; - - const getImageDimensions = (file: File): Promise<{ width: number; height: number }> => { - return new Promise((resolve, reject) => { - const img = new Image(); - const objectUrl = URL.createObjectURL(file); - - img.onload = () => { - const dimensions = { - width: img.width, - height: img.height - }; - URL.revokeObjectURL(objectUrl); - resolve(dimensions); - }; - - img.onerror = () => { - URL.revokeObjectURL(objectUrl); - reject(new Error('Не удалось загрузить изображение')); - }; - - img.src = objectUrl; - }); - }; - - const handleFileSelect = useCallback(async (file: File | null): Promise => { - if (!file) { - setError(null); - return; - } - - setError(null); - - const validation = validateFile(file); - if (!validation.isValid) { - setError(validation.errorMessage || 'Неизвестная ошибка валидации'); - return; - } - - try { - const dimensions = await getImageDimensions(file); - - if (dimensions.width < 150 || dimensions.height < 150 || - dimensions.width > 4000 || dimensions.height > 4000) { - setError(`Размер изображения: ${dimensions.width}x${dimensions.height}. Допустимый диапазон: 150x150 - 4000x4000 пикселей.`); - return; - } - - const objectUrl = URL.createObjectURL(file); - - setSelectedFile({ - file, - preview: objectUrl, - name: file.name, - size: `${(file.size / 1024 / 1024).toFixed(2)} MB`, - dimensions - }); - - console.log('Файл обработан:', { - name: file.name, - type: file.type, - size: file.size, - dimensions - }); - - } catch (err) { - setError(err instanceof Error ? err.message : 'Ошибка при обработке файла'); - } - }, []); - - const handleFileInputChange = (event: ChangeEvent): void => { - const file = event.target.files?.[0] || null; - handleFileSelect(file); - - if (fileInputRef.current) { - fileInputRef.current.value = ''; - } - }; - - const handleButtonClick = (): void => { - if (fileInputRef.current) { - fileInputRef.current.click(); - } - }; - - const handleDragOver = (event: DragEvent): void => { - event.preventDefault(); - setIsDragging(true); - }; - - const handleDragLeave = (): void => { - setIsDragging(false); - }; - - const handleDrop = (event: DragEvent): void => { - event.preventDefault(); - setIsDragging(false); - - const file = event.dataTransfer.files[0]; - handleFileSelect(file); - }; - - const handleClearFile = (): void => { - if (selectedFile) { - URL.revokeObjectURL(selectedFile.preview); - } - setSelectedFile(null); - setError(null); - }; - - React.useEffect(() => { - return () => { - if (selectedFile) { - URL.revokeObjectURL(selectedFile.preview); - } - }; - }, [selectedFile]); - - return ( -

-

Загрузить изображение для защиты

- -
- -

Перетащите изображения сюда

-

или

- - - - -

- Разрешение изображение: 100x100 - 10000x10000 пикселей -

-

- Размер файла: до 20 МБ -

-

- Формат файла: JPG, PNG, GIF, BMP (WEBP НЕ поддерживается) -

- - {error && ( -
-

❌ {error}

-
- )} - - {selectedFile && ( -
-
-

- Файл: {selectedFile.name} -

-

- Размер: {selectedFile.size} -

-

- Стоимость защиты: 0 -

-

- Текущий баланс: 0 -

-
- - Предпросмотр загруженного изображения setError('Не удалось загрузить превью изображения')} - /> - -
- - -
-
- )} -
-
- ); -} \ No newline at end of file