'use client' import React, { useRef, useState, useCallback, ChangeEvent, DragEvent } from 'react'; import { IconImageFile } 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 (

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

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

Размер: 150x150 - 4000x4000 пикселей, форматы: JPG, PNG, GIF, BMP (WEBP НЕ поддерживается)

{error && (

❌ {error}

)} {selectedFile && (

Файл: {selectedFile.name}

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

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

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

Предпросмотр загруженного изображения setError('Не удалось загрузить превью изображения')} />
)}
); }