import { useState, useRef } from 'react' import { createPortal } from 'react-dom' import { X, Image as ImageIcon, Tag, AtSign } from 'lucide-react' import { createPost, searchUsers } from '../utils/api' import { hapticFeedback } from '../utils/telegram' import './CreatePostModal.css' const TAGS = [ { value: 'furry', label: 'Furry', color: '#FF8A33' }, { value: 'anime', label: 'Anime', color: '#4A90E2' }, { value: 'other', label: 'Other', color: '#A0A0A0' } ] export default function CreatePostModal({ user, onClose, onPostCreated, initialImage }) { const [content, setContent] = useState('') const [selectedTags, setSelectedTags] = useState([]) const [images, setImages] = useState(initialImage ? [initialImage] : []) const [imagePreviews, setImagePreviews] = useState(initialImage ? [initialImage] : []) const [externalImages, setExternalImages] = useState(initialImage ? [initialImage] : []) const [isNSFW, setIsNSFW] = useState(false) const [isHomo, setIsHomo] = useState(false) const [loading, setLoading] = useState(false) const [showUserSearch, setShowUserSearch] = useState(false) const [userSearchQuery, setUserSearchQuery] = useState('') const [searchResults, setSearchResults] = useState([]) const [mentionedUsers, setMentionedUsers] = useState([]) const fileInputRef = useRef(null) const handleImageSelect = (e) => { const files = Array.from(e.target.files) if (files.length === 0) return // Максимум 5 изображений const remainingSlots = 5 - images.length const filesToAdd = files.slice(0, remainingSlots) filesToAdd.forEach(file => { const reader = new FileReader() reader.onloadend = () => { setImagePreviews(prev => [...prev, reader.result]) } reader.readAsDataURL(file) }) setImages(prev => [...prev, ...filesToAdd]) hapticFeedback('light') if (fileInputRef.current) { fileInputRef.current.value = '' } } const handleRemoveImage = (index) => { setImages(prev => prev.filter((_, i) => i !== index)) setImagePreviews(prev => prev.filter((_, i) => i !== index)) setExternalImages(prev => prev.filter((_, i) => i !== index)) } const toggleTag = (tag) => { hapticFeedback('light') if (selectedTags.includes(tag)) { setSelectedTags(selectedTags.filter(t => t !== tag)) } else { setSelectedTags([...selectedTags, tag]) } } const handleUserSearch = async (query) => { setUserSearchQuery(query) if (query.length > 1) { try { const users = await searchUsers(query) setSearchResults(users) } catch (error) { console.error('Ошибка поиска:', error) } } else { setSearchResults([]) } } const handleMentionUser = (user) => { if (!mentionedUsers.find(u => u._id === user._id)) { setMentionedUsers([...mentionedUsers, user]) setContent(prev => prev + `@${user.username} `) } setShowUserSearch(false) setUserSearchQuery('') setSearchResults([]) hapticFeedback('light') } const handleSubmit = async () => { if (selectedTags.length === 0) { alert('Выберите хотя бы один тег') return } if (!content.trim() && images.length === 0) { alert('Добавьте текст или изображение') return } try { setLoading(true) hapticFeedback('light') const formData = new FormData() formData.append('content', content) formData.append('tags', JSON.stringify(selectedTags)) formData.append('isNSFW', isNSFW) formData.append('isHomo', isHomo) // Добавить загруженные файлы images.forEach((image, index) => { if (image instanceof File) { formData.append('images', image) } }) // Добавить внешние изображения (из поиска) if (externalImages.length > 0) { formData.append('externalImages', JSON.stringify(externalImages)) } if (mentionedUsers.length > 0) { formData.append('mentionedUsers', JSON.stringify(mentionedUsers.map(u => u._id))) } const newPost = await createPost(formData) hapticFeedback('success') onPostCreated(newPost) } catch (error) { console.error('Ошибка создания поста:', error) hapticFeedback('error') alert('Ошибка создания поста') } finally { setLoading(false) } } return createPortal(