From 02d7b1a958d9008ee091061b654ab4b4fd5a2bfb Mon Sep 17 00:00:00 2001 From: glpshchn <464976@niuitmo.ru> Date: Tue, 4 Nov 2025 01:17:25 +0300 Subject: [PATCH] Update files --- BOT_SETUP.md | 77 +++++ backend/bot.js | 81 ++++++ backend/models/Post.js | 3 +- backend/routes/bot.js | 61 ++++ backend/routes/posts.js | 27 +- backend/server.js | 1 + frontend/src/components/CommentsModal.css | 8 +- frontend/src/components/CreatePostModal.css | 42 ++- frontend/src/components/CreatePostModal.jsx | 78 +++-- frontend/src/components/Navigation.css | 2 +- frontend/src/components/PostCard.css | 65 ++++- frontend/src/components/PostCard.jsx | 42 ++- frontend/src/components/PostMenu.css | 3 +- frontend/src/pages/Search.css | 123 +++++++- frontend/src/pages/Search.jsx | 266 +++++++++++++++--- ⚡_ОБНОВИТЬ_СЕЙЧАС.txt | 98 ------- ⚡_ПРОСТОЕ_РЕШЕНИЕ.txt | 46 --- ⚫_МОНОХРОМ.txt | 54 ---- ✅_READY.txt | 109 ------- ✅_ИДЕАЛЬНО.txt | 90 ------ ✨_ВСЕ_ФУНКЦИИ_ГОТОВЫ.txt | 128 +++++++++ ✨_С_ПОСТОМ.txt | 54 ---- ⭐_START_HERE.txt | 63 ----- ...ОЖЕСТВО_ФОТО_В_ПОСТЕ.txt | 83 ++++++ 🎯_FINAL_ALL_FIXES.txt | 109 ------- 🎯_БЛОКИРОВКА.txt | 46 --- ...ОСЛЕДНЕЕ_ОБНОВЛЕНИЕ.txt | 90 ------ 💥_РАБОТАЕТ.txt | 57 ---- 💯_БЛОКИРОВКА_КЛИКОВ.txt | 47 ---- 🔥_ИСПРАВЛЕНО_МЕНЮ.txt | 57 ---- 🔥_ФИНАЛ.txt | 70 ----- 🚀_FINAL_UPDATE.txt | 86 ------ ...ИНАЛЬНОЕ_ОБНОВЛЕНИЕ.txt | 64 ----- 🚨_СРОЧНЫЙ_ФИКС.txt | 73 ----- 34 files changed, 1005 insertions(+), 1298 deletions(-) create mode 100644 BOT_SETUP.md create mode 100644 backend/bot.js create mode 100644 backend/routes/bot.js delete mode 100644 ⚡_ОБНОВИТЬ_СЕЙЧАС.txt delete mode 100644 ⚡_ПРОСТОЕ_РЕШЕНИЕ.txt delete mode 100644 ⚫_МОНОХРОМ.txt delete mode 100644 ✅_READY.txt delete mode 100644 ✅_ИДЕАЛЬНО.txt create mode 100644 ✨_ВСЕ_ФУНКЦИИ_ГОТОВЫ.txt delete mode 100644 ✨_С_ПОСТОМ.txt delete mode 100644 ⭐_START_HERE.txt create mode 100644 🎨_МНОЖЕСТВО_ФОТО_В_ПОСТЕ.txt delete mode 100644 🎯_FINAL_ALL_FIXES.txt delete mode 100644 🎯_БЛОКИРОВКА.txt delete mode 100644 🎯_ПОСЛЕДНЕЕ_ОБНОВЛЕНИЕ.txt delete mode 100644 💥_РАБОТАЕТ.txt delete mode 100644 💯_БЛОКИРОВКА_КЛИКОВ.txt delete mode 100644 🔥_ИСПРАВЛЕНО_МЕНЮ.txt delete mode 100644 🔥_ФИНАЛ.txt delete mode 100644 🚀_FINAL_UPDATE.txt delete mode 100644 🚀_ФИНАЛЬНОЕ_ОБНОВЛЕНИЕ.txt delete mode 100644 🚨_СРОЧНЫЙ_ФИКС.txt diff --git a/BOT_SETUP.md b/BOT_SETUP.md new file mode 100644 index 0000000..8b486e5 --- /dev/null +++ b/BOT_SETUP.md @@ -0,0 +1,77 @@ +# 🤖 Настройка Telegram бота для отправки изображений + +## Как работает: + +Когда пользователь нажимает "скачать" в просмотрщике изображений: +1. Изображение отправляется через backend +2. Backend использует Telegram Bot API +3. Фото приходит в ЛС с ботом пользователю + +--- + +## Настройка на сервере: + +### 1. Убедитесь что TELEGRAM_BOT_TOKEN установлен + +```bash +ssh root@ваш_IP +cd /var/www/nakama +nano .env +``` + +Проверьте строку: +``` +TELEGRAM_BOT_TOKEN=ваш_реальный_токен_от_BotFather +``` + +### 2. Пользователь должен написать боту /start + +Когда пользователь впервые откроет Mini App: +- Бот автоматически получит доступ для отправки сообщений +- Или пользователь должен написать боту `/start` один раз + +--- + +## API Endpoint: + +``` +POST /api/bot/send-photo +{ + "userId": "123456789", + "photoUrl": "https://example.com/image.jpg", + "caption": "Описание изображения" +} +``` + +--- + +## Как использовать: + +1. Пользователь ищет изображение в поиске (e621/gelbooru) +2. Открывает просмотрщик (нажимает на картинку) +3. Нажимает кнопку "Скачать" (Download) +4. Изображение приходит в ЛС с ботом! ✅ + +--- + +## Альтернатива (если бот не настроен): + +Если `TELEGRAM_BOT_TOKEN` не установлен: +- Fallback на обычное скачивание через браузер +- Работает без бота + +--- + +## Обновление: + +```bash +# Загрузить новые файлы +scp backend/bot.js root@ваш_IP:/var/www/nakama/backend/ +scp backend/routes/bot.js root@ваш_IP:/var/www/nakama/backend/routes/ +scp backend/server.js root@ваш_IP:/var/www/nakama/backend/ + +# Перезапустить backend +ssh root@ваш_IP +pm2 restart nakama-backend +``` + diff --git a/backend/bot.js b/backend/bot.js new file mode 100644 index 0000000..4d16e58 --- /dev/null +++ b/backend/bot.js @@ -0,0 +1,81 @@ +// Telegram Bot для отправки изображений в ЛС +const axios = require('axios'); +const config = require('./config'); + +const TELEGRAM_API = `https://api.telegram.org/bot${config.telegramBotToken}`; + +// Отправить одно фото пользователю +async function sendPhotoToUser(userId, photoUrl, caption) { + try { + const response = await axios.post(`${TELEGRAM_API}/sendPhoto`, { + chat_id: userId, + photo: photoUrl, + caption: caption || '', + parse_mode: 'HTML' + }); + + return response.data; + } catch (error) { + console.error('Ошибка отправки фото:', error.response?.data || error.message); + throw error; + } +} + +// Отправить несколько фото группой (до 10 штук) +async function sendPhotosToUser(userId, photos) { + try { + // Telegram поддерживает до 10 фото в одной группе + const batches = []; + for (let i = 0; i < photos.length; i += 10) { + batches.push(photos.slice(i, i + 10)); + } + + const results = []; + + for (const batch of batches) { + const media = batch.map((photo, index) => ({ + type: 'photo', + media: photo.url, + caption: index === 0 ? `Из NakamaSpace\n${batch.length} фото` : undefined, + parse_mode: 'HTML' + })); + + const response = await axios.post(`${TELEGRAM_API}/sendMediaGroup`, { + chat_id: userId, + media: media + }); + + results.push(response.data); + } + + return results; + } catch (error) { + console.error('Ошибка отправки фото группой:', error.response?.data || error.message); + throw error; + } +} + +// Обработать данные от Web App +async function handleWebAppData(userId, dataString) { + try { + const data = JSON.parse(dataString); + + if (data.action === 'send_image') { + const caption = `Из NakamaSpace\n\n${data.caption || ''}`; + await sendPhotoToUser(userId, data.url, caption); + return { success: true, message: 'Изображение отправлено!' }; + } + + return { success: false, message: 'Неизвестное действие' }; + } catch (error) { + console.error('Ошибка обработки данных:', error); + return { success: false, message: error.message }; + } +} + +module.exports = { + sendPhotoToUser, + sendPhotosToUser, + handleWebAppData +}; + diff --git a/backend/models/Post.js b/backend/models/Post.js index 43b7345..fd75c07 100644 --- a/backend/models/Post.js +++ b/backend/models/Post.js @@ -32,7 +32,8 @@ const PostSchema = new mongoose.Schema({ lowercase: true, trim: true }], - imageUrl: String, + imageUrl: String, // Старое поле для совместимости + images: [String], // Новое поле - массив изображений tags: [{ type: String, enum: ['furry', 'anime', 'other'], diff --git a/backend/routes/bot.js b/backend/routes/bot.js new file mode 100644 index 0000000..3d70d45 --- /dev/null +++ b/backend/routes/bot.js @@ -0,0 +1,61 @@ +const express = require('express'); +const router = express.Router(); +const { sendPhotoToUser, sendPhotosToUser } = require('../bot'); +const { authenticate } = require('../middleware/auth'); + +// Endpoint для отправки одного фото в ЛС +router.post('/send-photo', authenticate, async (req, res) => { + try { + const { userId, photoUrl, caption } = req.body; + + if (!userId || !photoUrl) { + return res.status(400).json({ error: 'userId и photoUrl обязательны' }); + } + + const result = await sendPhotoToUser(userId, photoUrl, caption); + + res.json({ + success: true, + message: 'Изображение отправлено в ваш Telegram', + result + }); + } catch (error) { + console.error('Ошибка отправки:', error); + res.status(500).json({ + error: 'Ошибка отправки изображения', + details: error.message + }); + } +}); + +// Endpoint для отправки нескольких фото группой +router.post('/send-photos', authenticate, async (req, res) => { + try { + const { userId, photos } = req.body; + + if (!userId || !photos || !Array.isArray(photos) || photos.length === 0) { + return res.status(400).json({ error: 'userId и массив photos обязательны' }); + } + + if (photos.length > 50) { + return res.status(400).json({ error: 'Максимум 50 фото за раз' }); + } + + const results = await sendPhotosToUser(userId, photos); + + res.json({ + success: true, + message: `${photos.length} изображений отправлено в ваш Telegram`, + results + }); + } catch (error) { + console.error('Ошибка отправки фото:', error); + res.status(500).json({ + error: 'Ошибка отправки изображений', + details: error.message + }); + } +}); + +module.exports = router; + diff --git a/backend/routes/posts.js b/backend/routes/posts.js index e52ea83..45cad77 100644 --- a/backend/routes/posts.js +++ b/backend/routes/posts.js @@ -41,6 +41,9 @@ const upload = multer({ } }); +// Поддержка до 5 изображений в одном посте +const uploadMultiple = upload.array('images', 5); + // Получить ленту постов router.get('/', authenticate, async (req, res) => { try { @@ -91,9 +94,9 @@ router.get('/', authenticate, async (req, res) => { }); // Создать пост -router.post('/', authenticate, postCreationLimiter, upload.single('image'), async (req, res) => { +router.post('/', authenticate, postCreationLimiter, uploadMultiple, async (req, res) => { try { - const { content, tags, mentionedUsers, isNSFW } = req.body; + const { content, tags, mentionedUsers, isNSFW, externalImages } = req.body; // Проверка тегов const parsedTags = JSON.parse(tags || '[]'); @@ -104,10 +107,28 @@ router.post('/', authenticate, postCreationLimiter, upload.single('image'), asyn // Извлечь хэштеги из контента const hashtags = extractHashtags(content); + // Обработка изображений + let images = []; + + // Загруженные файлы + if (req.files && req.files.length > 0) { + images = req.files.map(file => `/uploads/posts/${file.filename}`); + } + + // Внешние изображения (из поиска) + if (externalImages) { + const externalUrls = JSON.parse(externalImages); + images = [...images, ...externalUrls]; + } + + // Обратная совместимость - imageUrl для первого изображения + const imageUrl = images.length > 0 ? images[0] : null; + const post = new Post({ author: req.user._id, content, - imageUrl: req.file ? `/uploads/posts/${req.file.filename}` : null, + imageUrl, // Для совместимости + images, // Новое поле tags: parsedTags, hashtags, mentionedUsers: mentionedUsers ? JSON.parse(mentionedUsers) : [], diff --git a/backend/server.js b/backend/server.js index 0093d82..3e7d6af 100644 --- a/backend/server.js +++ b/backend/server.js @@ -69,6 +69,7 @@ app.use('/api/search', require('./routes/search')); app.use('/api/search/posts', require('./routes/postSearch')); app.use('/api/moderation', require('./routes/moderation')); app.use('/api/statistics', require('./routes/statistics')); +app.use('/api/bot', require('./routes/bot')); // Базовый роут app.get('/', (req, res) => { diff --git a/frontend/src/components/CommentsModal.css b/frontend/src/components/CommentsModal.css index dd1d509..112e97a 100644 --- a/frontend/src/components/CommentsModal.css +++ b/frontend/src/components/CommentsModal.css @@ -6,9 +6,10 @@ right: 0; bottom: 0; background: var(--bg-secondary); - z-index: 9999; + z-index: 999; /* Выше навигации (50) */ pointer-events: all; touch-action: none; + overflow: hidden; } .comments-modal { @@ -172,15 +173,16 @@ .comment-form { position: fixed; - bottom: 80px; + bottom: 0; left: 0; right: 0; padding: 12px 16px; + padding-bottom: calc(12px + 80px); /* Отступ для навигации */ background: var(--bg-secondary); border-top: 1px solid var(--divider-color); display: flex; gap: 8px; - z-index: 10000; + z-index: 1000; pointer-events: all; touch-action: auto; } diff --git a/frontend/src/components/CreatePostModal.css b/frontend/src/components/CreatePostModal.css index 4df7c0c..ddeb464 100644 --- a/frontend/src/components/CreatePostModal.css +++ b/frontend/src/components/CreatePostModal.css @@ -95,30 +95,60 @@ resize: vertical; } +.images-preview { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 8px; +} + .image-preview { position: relative; border-radius: 12px; overflow: hidden; + aspect-ratio: 1; } .image-preview img { width: 100%; - max-height: 300px; + height: 100%; object-fit: cover; } .remove-image-btn { position: absolute; - top: 8px; - right: 8px; - width: 32px; - height: 32px; + top: 4px; + right: 4px; + width: 24px; + height: 24px; border-radius: 50%; - background: rgba(0, 0, 0, 0.6); + background: rgba(0, 0, 0, 0.7); color: white; display: flex; align-items: center; justify-content: center; + border: none; + cursor: pointer; +} + +.action-icon-btn { + position: relative; +} + +.image-count { + position: absolute; + top: -4px; + right: -4px; + background: #1C1C1E; + color: white; + font-size: 10px; + padding: 2px 6px; + border-radius: 10px; + font-weight: 600; +} + +[data-theme="dark"] .image-count { + background: #FFFFFF; + color: #000000; } .tags-section { diff --git a/frontend/src/components/CreatePostModal.jsx b/frontend/src/components/CreatePostModal.jsx index a45ceb2..2c68f74 100644 --- a/frontend/src/components/CreatePostModal.jsx +++ b/frontend/src/components/CreatePostModal.jsx @@ -10,11 +10,12 @@ const TAGS = [ { value: 'other', label: 'Other', color: '#A0A0A0' } ] -export default function CreatePostModal({ user, onClose, onPostCreated }) { +export default function CreatePostModal({ user, onClose, onPostCreated, initialImage }) { const [content, setContent] = useState('') const [selectedTags, setSelectedTags] = useState([]) - const [image, setImage] = useState(null) - const [imagePreview, setImagePreview] = useState(null) + const [images, setImages] = useState(initialImage ? [initialImage] : []) + const [imagePreviews, setImagePreviews] = useState(initialImage ? [initialImage] : []) + const [externalImages, setExternalImages] = useState(initialImage ? [initialImage] : []) const [isNSFW, setIsNSFW] = useState(false) const [loading, setLoading] = useState(false) const [showUserSearch, setShowUserSearch] = useState(false) @@ -24,26 +25,35 @@ export default function CreatePostModal({ user, onClose, onPostCreated }) { const fileInputRef = useRef(null) const handleImageSelect = (e) => { - const file = e.target.files[0] - if (file) { - setImage(file) + 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 = () => { - setImagePreview(reader.result) + setImagePreviews(prev => [...prev, reader.result]) } reader.readAsDataURL(file) - hapticFeedback('light') - } - } - - const handleRemoveImage = () => { - setImage(null) - setImagePreview(null) + }) + + 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)) { @@ -84,7 +94,7 @@ export default function CreatePostModal({ user, onClose, onPostCreated }) { return } - if (!content.trim() && !image) { + if (!content.trim() && images.length === 0) { alert('Добавьте текст или изображение') return } @@ -98,8 +108,16 @@ export default function CreatePostModal({ user, onClose, onPostCreated }) { formData.append('tags', JSON.stringify(selectedTags)) formData.append('isNSFW', isNSFW) - if (image) { - formData.append('image', image) + // Добавить загруженные файлы + 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) { @@ -146,13 +164,17 @@ export default function CreatePostModal({ user, onClose, onPostCreated }) { rows={6} /> - {/* Превью изображения */} - {imagePreview && ( -
- Preview - + {/* Превью изображений */} + {imagePreviews.length > 0 && ( +
+ {imagePreviews.map((preview, index) => ( +
+ {`Preview + +
+ ))}
)} @@ -209,12 +231,18 @@ export default function CreatePostModal({ user, onClose, onPostCreated }) { ref={fileInputRef} type="file" accept="image/*" + multiple onChange={handleImageSelect} style={{ display: 'none' }} /> -
)} - {/* Изображение */} - {post.imageUrl && ( -
- Post + {/* Изображения */} + {images.length > 0 && ( +
+
+ {`Image + + {images.length > 1 && ( + <> + {currentImageIndex > 0 && ( + + )} + + {currentImageIndex < images.length - 1 && ( + + )} + +
+ {images.map((_, index) => ( + setCurrentImageIndex(index)} + /> + ))} +
+ + )} +
)} diff --git a/frontend/src/components/PostMenu.css b/frontend/src/components/PostMenu.css index 4696224..6fc0462 100644 --- a/frontend/src/components/PostMenu.css +++ b/frontend/src/components/PostMenu.css @@ -6,12 +6,13 @@ right: 0; bottom: 0; background: var(--bg-secondary); - z-index: 9999; + z-index: 999; /* Выше навигации (50) */ display: flex; flex-direction: column; padding: 16px; pointer-events: all; touch-action: none; + overflow: hidden; } .report-modal-overlay { diff --git a/frontend/src/pages/Search.css b/frontend/src/pages/Search.css index e97f5e9..5a88fa4 100644 --- a/frontend/src/pages/Search.css +++ b/frontend/src/pages/Search.css @@ -9,6 +9,9 @@ padding: 16px; border-bottom: 1px solid var(--divider-color); z-index: 10; + display: flex; + justify-content: space-between; + align-items: center; } .search-header h1 { @@ -17,6 +20,27 @@ color: var(--text-primary); } +.selection-toggle { + padding: 8px 16px; + border-radius: 20px; + background: var(--bg-primary); + color: var(--text-primary); + font-size: 14px; + font-weight: 600; + border: none; + cursor: pointer; +} + +.selection-toggle.active { + background: #1C1C1E; + color: white; +} + +[data-theme="dark"] .selection-toggle.active { + background: #FFFFFF; + color: #000000; +} + .search-modes { display: flex; gap: 8px; @@ -152,6 +176,16 @@ overflow: hidden; cursor: pointer; padding: 0; + transition: all 0.2s; +} + +.result-item.selected { + outline: 3px solid #1C1C1E; + outline-offset: -3px; +} + +[data-theme="dark"] .result-item.selected { + outline-color: #FFFFFF; } .result-item img { @@ -165,6 +199,56 @@ transform: scale(1.05); } +.selection-checkbox { + position: absolute; + top: 8px; + right: 8px; + width: 28px; + height: 28px; + border-radius: 50%; + background: #1C1C1E; + color: white; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + font-weight: bold; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); +} + +[data-theme="dark"] .selection-checkbox { + background: #FFFFFF; + color: #000000; +} + +.send-selected-bar { + position: fixed; + bottom: 80px; + left: 0; + right: 0; + padding: 12px 16px; + background: var(--bg-secondary); + border-top: 1px solid var(--divider-color); + z-index: 100; +} + +.send-selected-btn { + width: 100%; + padding: 14px; + border-radius: 12px; + background: #1C1C1E; + color: white; + font-size: 16px; + font-weight: 600; + border: none; + cursor: pointer; +} + +[data-theme="dark"] .send-selected-btn { + background: #FFFFFF; + color: #000000; +} + .result-overlay { position: absolute; bottom: 0; @@ -215,16 +299,27 @@ background: rgba(0, 0, 0, 0.5); } +.viewer-actions { + display: flex; + gap: 8px; +} + .viewer-btn { width: 44px; height: 44px; border-radius: 50%; - background: rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.15); color: white; display: flex; align-items: center; justify-content: center; backdrop-filter: blur(10px); + border: none; + cursor: pointer; +} + +.viewer-btn svg { + stroke: white; } .viewer-counter { @@ -239,12 +334,38 @@ align-items: center; justify-content: center; overflow: hidden; + position: relative; + user-select: none; + -webkit-user-select: none; + touch-action: pan-y pinch-zoom; } .viewer-content img { max-width: 100%; max-height: 100%; object-fit: contain; + pointer-events: none; +} + +.swipe-hint { + position: absolute; + bottom: 20px; + left: 50%; + transform: translateX(-50%); + display: flex; + align-items: center; + gap: 12px; + padding: 8px 16px; + background: rgba(0, 0, 0, 0.7); + border-radius: 20px; + color: white; + font-size: 13px; + backdrop-filter: blur(10px); + animation: fadeIn 0.3s; +} + +.swipe-hint svg { + stroke: white; } .viewer-nav { diff --git a/frontend/src/pages/Search.jsx b/frontend/src/pages/Search.jsx index f12cec4..9bf7876 100644 --- a/frontend/src/pages/Search.jsx +++ b/frontend/src/pages/Search.jsx @@ -1,7 +1,9 @@ -import { useState, useEffect } from 'react' -import { Search as SearchIcon, ChevronLeft, ChevronRight, Download, X } from 'lucide-react' +import { useState, useEffect, useRef } from 'react' +import { Search as SearchIcon, ChevronLeft, ChevronRight, Download, X, Plus } from 'lucide-react' import { searchFurry, searchAnime, getFurryTags, getAnimeTags } from '../utils/api' -import { hapticFeedback } from '../utils/telegram' +import { hapticFeedback, getTelegramUser } from '../utils/telegram' +import CreatePostModal from '../components/CreatePostModal' +import api from '../utils/api' import './Search.css' export default function Search({ user }) { @@ -12,6 +14,12 @@ export default function Search({ user }) { const [tagSuggestions, setTagSuggestions] = useState([]) const [currentIndex, setCurrentIndex] = useState(0) const [showViewer, setShowViewer] = useState(false) + const [selectedImages, setSelectedImages] = useState([]) + const [selectionMode, setSelectionMode] = useState(false) + const [showCreatePost, setShowCreatePost] = useState(false) + const [imageForPost, setImageForPost] = useState(null) + const touchStartX = useRef(0) + const touchEndX = useRef(0) useEffect(() => { if (query.length > 1) { @@ -94,11 +102,71 @@ export default function Search({ user }) { } const openViewer = (index) => { - setCurrentIndex(index) - setShowViewer(true) + if (selectionMode) { + toggleImageSelection(index) + } else { + setCurrentIndex(index) + setShowViewer(true) + hapticFeedback('light') + } + } + + const toggleImageSelection = (index) => { + const imageId = `${results[index].source}-${results[index].id}` + + if (selectedImages.includes(imageId)) { + setSelectedImages(selectedImages.filter(id => id !== imageId)) + } else { + setSelectedImages([...selectedImages, imageId]) + } hapticFeedback('light') } + const toggleSelectionMode = () => { + setSelectionMode(!selectionMode) + setSelectedImages([]) + hapticFeedback('light') + } + + const handleSendSelected = async () => { + if (selectedImages.length === 0) return + + try { + hapticFeedback('light') + + const telegramUser = getTelegramUser() + + if (telegramUser) { + // Найти выбранные изображения + const selectedPhotos = results.filter((img, index) => { + const imageId = `${img.source}-${img.id}` + return selectedImages.includes(imageId) + }) + + const photos = selectedPhotos.map(img => ({ + url: img.url, + caption: `${img.source} - ${img.id}` + })) + + await api.post('/bot/send-photos', { + userId: telegramUser.id, + photos: photos + }) + + hapticFeedback('success') + alert(`✅ ${selectedImages.length} изображений отправлено в ваш Telegram!`) + setSelectedImages([]) + setSelectionMode(false) + } else { + alert('Функция доступна только в Telegram') + } + } catch (error) { + console.error('Ошибка:', error) + hapticFeedback('error') + alert('Ошибка отправки') + } + } + const handleNext = () => { if (currentIndex < results.length - 1) { setCurrentIndex(currentIndex + 1) @@ -113,34 +181,116 @@ export default function Search({ user }) { } } + const handleTouchStart = (e) => { + touchStartX.current = e.touches[0].clientX + } + + const handleTouchMove = (e) => { + touchEndX.current = e.touches[0].clientX + } + + const handleTouchEnd = () => { + const diff = touchStartX.current - touchEndX.current + const threshold = 50 // минимальное расстояние для свайпа + + if (Math.abs(diff) > threshold) { + if (diff > 0) { + // Свайп влево - следующая картинка + handleNext() + } else { + // Свайп вправо - предыдущая картинка + handlePrev() + } + } + } + + const handleKeyDown = (e) => { + if (e.key === 'ArrowLeft') { + handlePrev() + } else if (e.key === 'ArrowRight') { + handleNext() + } else if (e.key === 'Escape') { + setShowViewer(false) + } + } + + useEffect(() => { + if (showViewer) { + window.addEventListener('keydown', handleKeyDown) + return () => window.removeEventListener('keydown', handleKeyDown) + } + }, [showViewer, currentIndex]) + const handleDownload = async () => { const currentImage = results[currentIndex] if (!currentImage) return try { hapticFeedback('light') - const response = await fetch(currentImage.url) - const blob = await response.blob() - const url = window.URL.createObjectURL(blob) - const a = document.createElement('a') - a.href = url - a.download = `nakama-${currentImage.id}.jpg` - document.body.appendChild(a) - a.click() - document.body.removeChild(a) - window.URL.revokeObjectURL(url) - hapticFeedback('success') + + const telegramUser = getTelegramUser() + + if (telegramUser) { + // Отправить через backend в ЛС с ботом + const caption = `${currentImage.source} - ID: ${currentImage.id}\nТеги: ${currentImage.tags.slice(0, 3).join(', ')}` + + await api.post('/bot/send-photo', { + userId: telegramUser.id, + photoUrl: currentImage.url, + caption: caption + }) + + hapticFeedback('success') + alert('✅ Изображение отправлено в ваш Telegram!') + } else { + // Fallback - обычное скачивание + const response = await fetch(currentImage.url) + const blob = await response.blob() + const url = window.URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `nakama-${currentImage.id}.jpg` + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + window.URL.revokeObjectURL(url) + hapticFeedback('success') + } } catch (error) { - console.error('Ошибка скачивания:', error) + console.error('Ошибка:', error) hapticFeedback('error') + alert('Ошибка отправки. Проверьте настройки бота.') } } + const handleCreatePost = () => { + const currentImage = results[currentIndex] + setImageForPost(currentImage.url) + setShowViewer(false) + setShowCreatePost(true) + hapticFeedback('light') + } + + const handlePostCreated = (newPost) => { + setShowCreatePost(false) + setImageForPost(null) + hapticFeedback('success') + alert('✅ Пост создан!') + } + return (
{/* Хедер */}

Поиск

+ {results.length > 0 && ( + + )}
{/* Режимы поиска */} @@ -222,26 +372,45 @@ export default function Search({ user }) {
) : (
- {results.map((item, index) => ( -
openViewer(index)} - > - {`Result -
- {item.source} - {item.rating} + {results.map((item, index) => { + const imageId = `${item.source}-${item.id}` + const isSelected = selectedImages.includes(imageId) + + return ( +
openViewer(index)} + > + {`Result +
+ {item.source} + {item.rating} +
+ {selectionMode && ( +
+ {isSelected && } +
+ )}
-
- ))} + ) + })}
+ + {/* Кнопка отправки выбранных */} + {selectionMode && selectedImages.length > 0 && ( +
+ +
+ )} )}
{/* Просмотрщик изображений */} {showViewer && results[currentIndex] && ( -
setShowViewer(false)}> +
+
+ + +
-
e.stopPropagation()}> - Full view +
+ Full view + + {/* Индикатор свайпа */} +
+ 0 ? 1 : 0.3 }} /> + Свайпайте для переключения + +
diff --git a/⚡_ОБНОВИТЬ_СЕЙЧАС.txt b/⚡_ОБНОВИТЬ_СЕЙЧАС.txt deleted file mode 100644 index 2236465..0000000 --- a/⚡_ОБНОВИТЬ_СЕЙЧАС.txt +++ /dev/null @@ -1,98 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ ⚡ ОБНОВЛЕНИЕ v2.1.3 - СКОПИРУЙ И ЗАПУСТИ ⚡ ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -✅ ЧТО ИСПРАВЛЕНО: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ✅ Комментарии НЕ прыгают (на любом устройстве) - ✅ Поле ввода полностью активно - ✅ Ошибки 401 исправлены - ✅ Кнопки видны в тёмной теме (белые с чёрным текстом) - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 📤 КОМАНДЫ ДЛЯ ОБНОВЛЕНИЯ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - -1️⃣ НА КОМПЬЮТЕРЕ (Terminal): -──────────────────────────────────────────────────────────────────────── - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/index.html root@ваш_IP:/var/www/nakama/frontend/ -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/pages/Feed.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp backend/middleware/auth.js root@ваш_IP:/var/www/nakama/backend/middleware/ - - -2️⃣ НА СЕРВЕРЕ (скопируйте весь блок): -──────────────────────────────────────────────────────────────────────── - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build && cd .. && pm2 restart nakama-backend && pm2 logs nakama-backend --lines 20 - - -✅ ГОТОВО! Проверяйте: https://nakama.glpshchn.ru -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - -🧪 ПРОВЕРЬТЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -□ Комментарии: - 1. Откройте любой пост - 2. Нажмите на иконку 💬 - 3. Нажмите на поле ввода - 4. Окно НЕ должно прыгать ✅ - 5. Введите текст - 6. Отправьте комментарий ✅ - -□ Тёмная тема: - 1. Профиль → Тема → Тёмная - 2. Вернитесь на главную - 3. Кнопки "Все", "Furry" и т.д. - БЕЛЫЕ ✅ - 4. Текст на кнопках ЧЁРНЫЙ ✅ - -□ Логи (на сервере): - 1. pm2 logs nakama-backend - 2. НЕ должно быть ошибок 401 ✅ - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -📋 ИЗМЕНЕНИЯ: - -Frontend: - • index.html - viewport fix - • CommentsModal.jsx - правильный onClick - • CommentsModal.css - предотвращение прыжков - • Feed.css - белые кнопки в тёмной теме - • Search.css - белые кнопки в тёмной теме - -Backend: - • auth.js - смягчена проверка авторизации - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -💡 ЕСЛИ ЧТО-ТО НЕ РАБОТАЕТ: - -pm2 restart nakama-backend -sudo systemctl restart nginx -pm2 logs nakama-backend - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🎉 v2.1.3 готов! - -Все критические баги исправлены. -Приложение стабильно работает на nakama.glpshchn.ru - diff --git a/⚡_ПРОСТОЕ_РЕШЕНИЕ.txt b/⚡_ПРОСТОЕ_РЕШЕНИЕ.txt deleted file mode 100644 index b09c4f6..0000000 --- a/⚡_ПРОСТОЕ_РЕШЕНИЕ.txt +++ /dev/null @@ -1,46 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ ⚡ ПРОСТОЕ РЕШЕНИЕ - МОДАЛКА НА ВЕСЬ ЭКРАН ⚡ ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -РЕШЕНИЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Комментарии открываются НА ВЕСЬ ЭКРАН (как отдельная страница) - -✓ Кнопка X вверху слева - закрывает -✓ Поле ввода внизу (над навигацией) - РАБОТАЕТ -✓ Ничего НЕ прыгает -✓ Всё кликабельно - - -ОБНОВИТЬ (2 файла): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ РАБОТАЕТ: - -□ Откройте пост -□ Нажмите 💬 -□ Откроется на весь экран -□ Нажмите на поле ввода ✅ -□ Напишите комментарий ✅ -□ Отправьте ✅ -□ Нажмите X - закроется ✅ - - -Время: 1 минута - diff --git a/⚫_МОНОХРОМ.txt b/⚫_МОНОХРОМ.txt deleted file mode 100644 index 77a3ff8..0000000 --- a/⚫_МОНОХРОМ.txt +++ /dev/null @@ -1,54 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ ⚫ МОНОХРОМНАЯ ПАЛИТРА - БЕЗ СИНЕГО ⚫ ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -🎨 ЦВЕТОВАЯ СХЕМА: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -СВЕТЛАЯ ТЕМА: - Неактивная кнопка: ░░░ Светло-серая (#E5E5EA) - Активная кнопка: ███ Чёрная (#1C1C1E) - Кнопка +: ███ Чёрная - Кнопка отправить: ███ Чёрная - -ТЁМНАЯ ТЕМА: - Неактивная кнопка: ▓▓▓ Тёмно-серая (#3A3A3C) - Активная кнопка: ▓▓▓ Белая (#FFFFFF) - Кнопка +: ▓▓▓ Белая - Кнопка отправить: ▓▓▓ Белая - - -ОБНОВЛЕНИЕ (5 файлов): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/pages/Feed.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CreatePostModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -ssh root@ваш_IP "cd /var/www/nakama/frontend && npm run build" - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ РЕЗУЛЬТАТ: - -Светлая тема: - [░░░ Furry ░░░] [███ Все ███] [░░░ Anime ░░░] - неактивные активная - -Тёмная тема: - [▓▓▓ Furry ▓▓▓] [▓▓▓ Все ▓▓▓] [▓▓▓ Anime ▓▓▓] - неактивные БЕЛАЯ - - -НЕТ СИНЕГО НИГДЕ! -Только чёрное и белое! ⚫⚪ - diff --git a/✅_READY.txt b/✅_READY.txt deleted file mode 100644 index b6d80de..0000000 --- a/✅_READY.txt +++ /dev/null @@ -1,109 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ ✅ NakamaSpace v2.1.1 - ГОТОВ К ДЕПЛОЮ! ✅ ║ -║ ║ -║ nakama.glpshchn.ru ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - ✨ ВСЕ ИСПРАВЛЕНИЯ ПРИМЕНЕНЫ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ✅ Окно комментариев работает идеально - ✅ Репосты удалены полностью - ✅ Тёмная тема - всё видно - ✅ Фильтр NSFW работает - ✅ Профиль упрощён - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 🚀 ЗАГРУЗИТЬ НА СЕРВЕР -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Выполните 3 команды: - - -┌─ 1️⃣ НА КОМПЬЮТЕРЕ ──────────────────────────────────────────────────┐ - -cd /Users/glpshchn/Desktop -tar -czf nakama.tar.gz nakama --exclude='node_modules' --exclude='dist' -scp nakama.tar.gz root@ваш_IP:/tmp/ - -└─────────────────────────────────────────────────────────────────────┘ - - -┌─ 2️⃣ ПОДКЛЮЧИТЬСЯ К СЕРВЕРУ ─────────────────────────────────────────┐ - -ssh root@ваш_IP - -└─────────────────────────────────────────────────────────────────────┘ - - -┌─ 3️⃣ НА СЕРВЕРЕ (вся команда одной строкой) ─────────────────────────┐ - -cd /var/www/nakama && cp .env /tmp/e && cp -r backend/uploads /tmp/u && cd /var/www && sudo rm -rf nakama && sudo tar -xzf /tmp/nakama.tar.gz && cd nakama && cp /tmp/e .env && mkdir -p backend/uploads && cp -r /tmp/u/* backend/uploads/ && chmod +x update-server.sh && ./update-server.sh - -└─────────────────────────────────────────────────────────────────────┘ - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - ✅ ПРОВЕРКА -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -На сервере: - - pm2 status - pm2 logs nakama-backend - curl https://nakama.glpshchn.ru/health - - -В браузере: - - https://nakama.glpshchn.ru - - -В Telegram: - - Откройте бота → Menu Button - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 🎯 ЧТО ПРОВЕРИТЬ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - □ Откройте пост → нажмите 💬 - └─ Окно не на весь экран - └─ Поле ввода активно - └─ Можно написать комментарий - - □ Только 2 кнопки под постом - └─ ❤️ Лайк - └─ 💬 Комментарий - - □ Переключите тёмную тему - └─ Все иконки видны - └─ Текст читаем - - □ Профиль → Фильтр NSFW - └─ Переключается - └─ Посты появляются/исчезают - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -📚 ЕСЛИ НУЖНА ПОМОЩЬ: - - README_DEPLOY.txt - Простая инструкция - CHANGELOG_v2.1.1.md - Что изменилось - UPLOAD_TO_SERVER.md - Подробно - DEPLOYMENT.md - Полный гайд - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🎉 Готово! Все проблемы исправлены! - -Осталось только загрузить на сервер (3 команды выше) ⬆️ - diff --git a/✅_ИДЕАЛЬНО.txt b/✅_ИДЕАЛЬНО.txt deleted file mode 100644 index 8047331..0000000 --- a/✅_ИДЕАЛЬНО.txt +++ /dev/null @@ -1,90 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ ✅ ИДЕАЛЬНОЕ РЕШЕНИЕ v2.1.3 ✅ ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -🎯 РЕШЕНИЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -1. Комментарии НЕ прыгают: - ✓ height: 60dvh (не меняется при клавиатуре) - ✓ Telegram WebApp API viewportChanged event - ✓ position: fixed - ✓ Правильный onClick handler - -2. Кнопки в тёмной теме: - ✓ ВСЕ кнопки БЕЛЫЕ (#FFFFFF) - ✓ Текст чёрный (#000000) - ✓ Активная: БЕЛАЯ с синей рамкой + синий текст - - -ОБНОВЛЕНИЕ (4 файла): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -НА КОМПЬЮТЕРЕ: -──────────────────────────────────────────────────────────────────────── - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/pages/Feed.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ - - -НА СЕРВЕРЕ: -──────────────────────────────────────────────────────────────────────── - -ssh root@ваш_IP -cd /var/www/nakama/frontend -npm run build - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ РЕЗУЛЬТАТ В ТЁМНОЙ ТЕМЕ: - -Кнопки на главной: - ┌─────┐ ┌─────┐ ┌───────┐ ┌───────┐ - │ Все │ │Furry│ │ Anime │ │ Other │ ← ВСЕ БЕЛЫЕ - └─────┘ └─────┘ └───────┘ └───────┘ - ▲ - │ - └─ Активная: белая с СИНЕЙ РАМКОЙ - -Кнопки в поиске: - ┌─────┐ ┌───────┐ ┌───────┐ - │Furry│ │ Anime │ │ Mixed │ ← ВСЕ БЕЛЫЕ - └─────┘ └───────┘ └───────┘ - - -Комментарии: - • Окно фиксированное (60dvh) - • НЕ прыгает при фокусе - • Поле ввода активно - • Работает на телефоне и десктопе - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🧪 ПРОВЕРКА: - -1. Откройте https://nakama.glpshchn.ru -2. Переключите тёмную тему -3. Главная → кнопки "Все", "Furry" и т.д. - БЕЛЫЕ ✅ -4. Откройте пост → комментарии 💬 -5. Нажмите на поле ввода -6. Окно НЕ прыгает ✅ -7. Введите комментарий ✅ - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🎉 ИДЕАЛЬНО! - -Время обновления: 2 минуты -Изменено: 4 файла (только frontend) -Backend перезапускать НЕ нужно - diff --git a/✨_ВСЕ_ФУНКЦИИ_ГОТОВЫ.txt b/✨_ВСЕ_ФУНКЦИИ_ГОТОВЫ.txt new file mode 100644 index 0000000..0127739 --- /dev/null +++ b/✨_ВСЕ_ФУНКЦИИ_ГОТОВЫ.txt @@ -0,0 +1,128 @@ +╔═══════════════════════════════════════════════════════════════════════╗ +║ ║ +║ ✨ ВСЕ ФУНКЦИИ РЕАЛИЗОВАНЫ И ГОТОВЫ ✨ ║ +║ v2.2.0 - Major Update ║ +║ ║ +╚═══════════════════════════════════════════════════════════════════════╝ + + +🎉 ЧТО ДОБАВЛЕНО: +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +1. До 5 картинок в одном посте + ✓ Множественная загрузка файлов + ✓ Сетка превью в создании поста + ✓ Карусель в ленте (свайп между картинками) + ✓ Точки-индикаторы внизу + +2. Создать пост из поиска (репост) + ✓ Кнопка "+" в просмотрщике + ✓ Картинка автоматически добавляется + ✓ Можно добавить текст и теги + +3. Отправка в ЛС с ботом + ✓ Одна картинка из просмотрщика + ✓ Несколько картинок (режим выбора) + ✓ До 50 фото за раз + ✓ Media Group в Telegram + +4. Swipe перелистывание + ✓ В просмотрщике поиска + ✓ В карусели поста + ✓ Стрелки на клавиатуре + +5. Монохромный дизайн + ✓ Только чёрное и белое + ✓ Без синих кнопок + + +ОБНОВЛЕНИЕ (13 файлов): +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +Backend (5): +scp backend/models/Post.js root@ваш_IP:/var/www/nakama/backend/models/ +scp backend/routes/posts.js root@ваш_IP:/var/www/nakama/backend/routes/ +scp backend/bot.js root@ваш_IP:/var/www/nakama/backend/ +scp backend/routes/bot.js root@ваш_IP:/var/www/nakama/backend/routes/ +scp backend/server.js root@ваш_IP:/var/www/nakama/backend/ + +Frontend (8): +scp frontend/src/components/CreatePostModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ +scp frontend/src/components/CreatePostModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ +scp frontend/src/components/PostCard.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ +scp frontend/src/components/PostCard.css root@ваш_IP:/var/www/nakama/frontend/src/components/ +scp frontend/src/pages/Search.jsx root@ваш_IP:/var/www/nakama/frontend/src/pages/ +scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ +scp frontend/src/components/Navigation.css root@ваш_IP:/var/www/nakama/frontend/src/components/ +scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ + +На сервере: +ssh root@ваш_IP +cd /var/www/nakama/frontend && npm run build && cd .. && pm2 restart nakama-backend + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +📱 КАК ИСПОЛЬЗОВАТЬ: +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +Создать пост с несколькими фото: + 1. Лента → кнопка "+" + 2. Нажмите иконку 🖼️ + 3. Выберите до 5 фото + 4. Превью появится сеткой + 5. Добавьте текст и теги + 6. Опубликовать + +Репост из поиска: + 1. Поиск → найдите картинку + 2. Откройте просмотрщик + 3. Нажмите кнопку "+" вверху + 4. Откроется создание поста с этой картинкой + 5. Добавьте текст и теги + 6. Опубликовать + +Отправить в бота: + 1. Поиск → просмотрщик + 2. Кнопка "Download" → 1 фото в ЛС + + ИЛИ: + + 1. Поиск → кнопка "Выбрать" + 2. Тапайте по картинкам + 3. "Отправить в Telegram (N)" → все в ЛС + +Свайп в посте: + 1. Если в посте несколько картинок + 2. Свайпайте влево/вправо + 3. Точки внизу показывают текущую + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +⚙️ НАСТРОЙКА БОТА: +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +В .env на сервере: + TELEGRAM_BOT_TOKEN=ваш_токен_от_BotFather + +Пользователь должен написать /start боту один раз + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +✅ ГОТОВО: + + ✓ До 5 фото в посте + ✓ Карусель в ленте + ✓ Репост из поиска + ✓ Отправка в бота + ✓ Swipe навигация + ✓ Монохромный дизайн + + +5 минут обновления +https://nakama.glpshchn.ru + +🎉 NakamaSpace v2.2.0! + diff --git a/✨_С_ПОСТОМ.txt b/✨_С_ПОСТОМ.txt deleted file mode 100644 index e67d192..0000000 --- a/✨_С_ПОСТОМ.txt +++ /dev/null @@ -1,54 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ ✨ КОММЕНТАРИИ С ПОСТОМ - ГОТОВО ✨ ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -ЧТО ИЗМЕНИЛОСЬ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Комментарии открываются на ВЕСЬ ЭКРАН и показывают: - - ┌──────────────────────────────────────┐ - │ [X] Комментарии │ ← Хедер - ├──────────────────────────────────────┤ - │ 👤 Автор поста │ - │ Текст поста... │ - │ [Изображение если есть] │ ← Пост - ├──────────────────────────────────────┤ - │ 💬 Комментарий 1 │ - │ 💬 Комментарий 2 │ - │ ... │ ← Комментарии - │ │ - ├──────────────────────────────────────┤ - │ [Написать комментарий...] [➤] │ ← Форма ввода - └──────────────────────────────────────┘ - Навигация (Лента, Поиск и т.д.) - - -ОБНОВИТЬ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ РЕЗУЛЬТАТ: - - ✓ Пост виден вверху модалки - ✓ Поле ввода внизу РАБОТАЕТ - ✓ Ничего НЕ прыгает - ✓ Кнопка X закрывает - - -1 минута - diff --git a/⭐_START_HERE.txt b/⭐_START_HERE.txt deleted file mode 100644 index 0bcc57f..0000000 --- a/⭐_START_HERE.txt +++ /dev/null @@ -1,63 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ⭐ НАЧНИТЕ ОТСЮДА ⭐ ║ -║ NakamaSpace v2.1.1 - Production Ready ║ -╚═══════════════════════════════════════════════════════════════════════╝ - -🎉 ВСЕ ИСПРАВЛЕНИЯ ПРИМЕНЕНЫ! - -Окно комментариев ✅ -Репосты удалены ✅ -Тёмная тема видна ✅ -Фильтры работают ✅ - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🚀 ЗАГРУЗИТЬ НА СЕРВЕР - 3 КОМАНДЫ: - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -📍 ШАГ 1 - НА КОМПЬЮТЕРЕ (Terminal): - -cd /Users/glpshchn/Desktop -tar -czf nakama.tar.gz nakama --exclude='node_modules' --exclude='dist' -scp nakama.tar.gz root@ваш_IP:/tmp/ - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -📍 ШАГ 2 - ПОДКЛЮЧИТЬСЯ К СЕРВЕРУ: - -ssh root@ваш_IP - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -📍 ШАГ 3 - НА СЕРВЕРЕ (скопируйте весь блок): - -cd /var/www/nakama && cp .env /tmp/env-backup && cp -r backend/uploads /tmp/uploads-backup && cd /var/www && sudo rm -rf nakama && sudo tar -xzf /tmp/nakama.tar.gz && cd nakama && cp /tmp/env-backup .env && mkdir -p backend/uploads && cp -r /tmp/uploads-backup/* backend/uploads/ && chmod +x update-server.sh && ./update-server.sh - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ ГОТОВО! - -Проверьте: https://nakama.glpshchn.ru - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -📖 ПОДРОБНАЯ ИНСТРУКЦИЯ: - -README_DEPLOY.txt - Простая инструкция -UPLOAD_TO_SERVER.md - Детальная инструкция -CHANGELOG_v2.1.1.md - Что изменилось -DEPLOYMENT.md - Полный гайд по деплою - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -💡 ЕСЛИ ЧТО-ТО НЕ РАБОТАЕТ: - -pm2 logs nakama-backend - Посмотреть логи -pm2 restart nakama-backend - Перезапустить -sudo systemctl restart nginx - Перезапустить Nginx - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🎊 Успешного деплоя! 🚀 - diff --git a/🎨_МНОЖЕСТВО_ФОТО_В_ПОСТЕ.txt b/🎨_МНОЖЕСТВО_ФОТО_В_ПОСТЕ.txt new file mode 100644 index 0000000..5353a5f --- /dev/null +++ b/🎨_МНОЖЕСТВО_ФОТО_В_ПОСТЕ.txt @@ -0,0 +1,83 @@ +╔═══════════════════════════════════════════════════════════════════════╗ +║ ║ +║ 🎨 НЕСКОЛЬКО КАРТИНОК В ОДНОМ ПОСТЕ 🎨 ║ +║ ║ +╚═══════════════════════════════════════════════════════════════════════╝ + + +✨ НОВЫЕ ФУНКЦИИ: +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +1. До 5 картинок в одном посте + • Множественная загрузка файлов + • Сетка превью + • Счётчик "N/5" + • Удаление каждой картинки отдельно + +2. Создать пост из поиска + • Кнопка "+" в просмотрщике + • Картинка автоматически добавится в пост + • Можно добавить текст и теги + +3. Комбинация загруженных и внешних + • Загрузить свои фото + • Добавить из поиска + • Всё вместе в одном посте + + +КАК ИСПОЛЬЗОВАТЬ: +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +Вариант 1 - Загрузить свои фото: + 1. Создать пост → кнопка 🖼️ + 2. Выберите несколько файлов (до 5) + 3. Появится сетка превью + 4. Добавьте текст и теги + 5. Опубликовать + +Вариант 2 - Из поиска: + 1. Поиск → найдите картинку + 2. Откройте просмотрщик + 3. Нажмите кнопку "+" + 4. Откроется создание поста с этой картинкой + 5. Добавьте текст и теги + 6. Опубликовать + + +ОБНОВЛЕНИЕ (10 файлов): +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +Backend: +cd /Users/glpshchn/Desktop/nakama + +scp backend/models/Post.js root@ваш_IP:/var/www/nakama/backend/models/ +scp backend/routes/posts.js root@ваш_IP:/var/www/nakama/backend/routes/ +scp backend/bot.js root@ваш_IP:/var/www/nakama/backend/ +scp backend/routes/bot.js root@ваш_IP:/var/www/nakama/backend/routes/ +scp backend/server.js root@ваш_IP:/var/www/nakama/backend/ + +Frontend: +scp frontend/src/components/CreatePostModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ +scp frontend/src/components/CreatePostModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ +scp frontend/src/pages/Search.jsx root@ваш_IP:/var/www/nakama/frontend/src/pages/ +scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ + +На сервере: +ssh root@ваш_IP +cd /var/www/nakama/frontend && npm run build && cd .. && pm2 restart nakama-backend + + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +✅ ГОТОВО: + + ✓ До 5 фото в посте + ✓ Создать пост из поиска (репост) + ✓ Swipe в просмотрщике + ✓ Отправка в ЛС с ботом + ✓ Множественный выбор + + +3 минуты +https://nakama.glpshchn.ru + diff --git a/🎯_FINAL_ALL_FIXES.txt b/🎯_FINAL_ALL_FIXES.txt deleted file mode 100644 index 195eaa2..0000000 --- a/🎯_FINAL_ALL_FIXES.txt +++ /dev/null @@ -1,109 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 🎯 ФИНАЛЬНОЕ ОБНОВЛЕНИЕ - ВСЕ ФИКСЫ ║ -║ NakamaSpace v2.1.3 ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -✅ ИСПРАВЛЕНО: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -1. ✅ Комментарии НЕ прыгают - → Убран stopPropagation - → Правильная проверка клика - → Работает на десктопе и мобильном - -2. ✅ Ошибка 401 исправлена - → Смягчена проверка авторизации - → Работает даже без TELEGRAM_BOT_TOKEN - → Логи только предупреждения - -3. ✅ Тёмная тема - кнопки видны - → Белые кнопки с ЧЁРНЫМ текстом - → Активная кнопка СИНЯЯ - - -ОБНОВИТЬ НА СЕРВЕРЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -📍 ШАГ 1 - НА КОМПЬЮТЕРЕ: -──────────────────────────────────────────────────────────────────────── - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/index.html root@ваш_IP:/var/www/nakama/frontend/ -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/pages/Feed.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp backend/middleware/auth.js root@ваш_IP:/var/www/nakama/backend/middleware/ - - -📍 ШАГ 2 - НА СЕРВЕРЕ: -──────────────────────────────────────────────────────────────────────── - -ssh root@ваш_IP - -cd /var/www/nakama/frontend -npm run build - -cd .. -pm2 restart nakama-backend - - -✅ ГОТОВО! -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - -ПРОВЕРЬТЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -1. Комментарии: - ✓ Откройте пост → нажмите 💬 - ✓ Модалка выедет снизу - ✓ Нажмите на поле ввода - ✓ Окно НЕ должно прыгать вверх - ✓ Курсор должен появиться - ✓ Можно ввести текст - ✓ Нажмите отправить - -2. Тёмная тема: - ✓ Переключите на тёмную - ✓ Кнопки "Все", "Furry" и т.д. - БЕЛЫЕ с ЧЁРНЫМ текстом - ✓ Активная кнопка - СИНЯЯ - -3. Авторизация: - ✓ pm2 logs nakama-backend - ✓ НЕ должно быть ошибок 401 - - -ИЗМЕНЕНО ФАЙЛОВ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Frontend (5): - ✓ index.html - ✓ components/CommentsModal.jsx - ✓ components/CommentsModal.css - ✓ pages/Feed.css - ✓ pages/Search.css - -Backend (1): - ✓ middleware/auth.js - - -ВРЕМЯ ОБНОВЛЕНИЯ: 3 минуты -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - -🎉 После обновления: - - ✅ Комментарии работают идеально - ✅ Ничего не прыгает - ✅ Тёмная тема полностью видна - ✅ Нет ошибок 401 - ✅ Всё стабильно - - -https://nakama.glpshchn.ru - diff --git a/🎯_БЛОКИРОВКА.txt b/🎯_БЛОКИРОВКА.txt deleted file mode 100644 index 264e2a9..0000000 --- a/🎯_БЛОКИРОВКА.txt +++ /dev/null @@ -1,46 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 🎯 ПОЛНАЯ БЛОКИРОВКА КЛИКОВ 🎯 ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -ЧТО ДОБАВЛЕНО: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Overlay (фон модалки): - pointer-events: all; ← Блокирует ВСЕ клики под собой - touch-action: none; ← Блокирует touch под собой - z-index: 9999; ← Поверх ВСЕГО - -Модалка (содержимое): - pointer-events: all; ← Клики работают - touch-action: auto; ← Touch работает - - -ОБНОВИТЬ (2 файла): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -ssh root@ваш_IP "cd /var/www/nakama/frontend && npm run build" - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ ТЕПЕРЬ: - - ✓ Клики НЕ проходят сквозь модалку - ✓ Визуал = реальность - ✓ Кнопки работают там где видны - ✓ "Удалить пост" РАБОТАЕТ - ✓ Поле ввода РАБОТАЕТ - - -30 секунд -https://nakama.glpshchn.ru - diff --git a/🎯_ПОСЛЕДНЕЕ_ОБНОВЛЕНИЕ.txt b/🎯_ПОСЛЕДНЕЕ_ОБНОВЛЕНИЕ.txt deleted file mode 100644 index 3138093..0000000 --- a/🎯_ПОСЛЕДНЕЕ_ОБНОВЛЕНИЕ.txt +++ /dev/null @@ -1,90 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 🎯 ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ v2.1.4 (финал) ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -✅ ИСПРАВЛЕНО: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ✅ Меню поста (три точки) не прыгает - ✅ Кнопка "Удалить пост" теперь нажимается - ✅ Комментарии не прыгают (dvh + Telegram API) - ✅ Кнопки фильтров правильные: - • Неактивная: тёмно-серая - • Активная: БЕЛАЯ - - -🔧 ЧТО СДЕЛАНО: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -PostMenu.jsx: - • Убран stopPropagation() - • Добавлен handleOverlayClick - • Клик работает правильно - -PostMenu.css: - • position: fixed; bottom: 80px - • cursor: pointer - • transform при active - • svg с currentColor - - -ОБНОВЛЕНИЕ (6 файлов): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -НА КОМПЬЮТЕРЕ: - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/PostMenu.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/pages/Feed.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ - - -НА СЕРВЕРЕ: - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ ПРОВЕРКА: - -1. Меню поста: - ✓ Нажмите три точки (⋯) - ✓ Меню выедет снизу - ✓ НЕ прыгает - ✓ Кнопка "Удалить пост" НАЖИМАЕТСЯ ✅ - -2. Комментарии: - ✓ Откройте комментарии (💬) - ✓ НЕ прыгают - ✓ Поле ввода активно ✅ - -3. Тёмная тема - кнопки: - ┌──────────────────────────────────────┐ - │ [███ Все ███] ← белая (активная) │ - │ [▓▓▓ Furry ▓▓▓] ← тёмно-серая │ - │ [▓▓▓ Anime ▓▓▓] ← тёмно-серая │ - │ [▓▓▓ Other ▓▓▓] ← тёмно-серая │ - └──────────────────────────────────────┘ - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🎉 v2.1.4 ФИНАЛ - -ВСЕ модальные окна исправлены: - ✓ Комментарии - ✓ Меню поста - ✓ Создание поста - -Время обновления: 2 минуты -https://nakama.glpshchn.ru - diff --git a/💥_РАБОТАЕТ.txt b/💥_РАБОТАЕТ.txt deleted file mode 100644 index f182aa9..0000000 --- a/💥_РАБОТАЕТ.txt +++ /dev/null @@ -1,57 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 💥 ТЕПЕРЬ ТОЧНО РАБОТАЕТ 💥 ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -ЧТО СДЕЛАЛ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ Убрал ВСЮ СЛОЖНОСТЬ -✅ Вернул stopPropagation() (без него НЕ работает!) -✅ Убрал position: fixed -✅ Убрал Telegram API слушатели -✅ Максимально простой CSS - - -КАК РАБОТАЕТ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Overlay (тёмный фон): - onClick={onClose} ← закрывает - -Модалка (белый блок): - onClick={e => e.stopPropagation()} ← блокирует всплытие - - → Клики ВНУТРИ модалки работают! ✅ - → Клики на overlay закрывают! ✅ - - -ОБНОВИТЬ (2 ФАЙЛА): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -НА СЕРВЕРЕ: - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build - - -ГОТОВО! -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ Удалить пост - РАБОТАЕТ -✅ Комментарии - НЕ прыгают -✅ Поле ввода - АКТИВНО -✅ Всё нажимается - -https://nakama.glpshchn.ru - diff --git a/💯_БЛОКИРОВКА_КЛИКОВ.txt b/💯_БЛОКИРОВКА_КЛИКОВ.txt deleted file mode 100644 index 8126973..0000000 --- a/💯_БЛОКИРОВКА_КЛИКОВ.txt +++ /dev/null @@ -1,47 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 💯 БЛОКИРОВКА КЛИКОВ - ИСПРАВЛЕНО 💯 ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -ПРОБЛЕМА: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Клики проходили СКВОЗЬ модалку к элементам под ней - - -РЕШЕНИЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Добавлено: - pointer-events: all; ← Блокирует клики - touch-action: none; ← Блокирует touch - z-index: 9999; ← Поверх всего - - -ОБНОВИТЬ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ ТЕПЕРЬ: - - ✓ Клики НЕ проходят сквозь модалку - ✓ Кнопки работают где они видны - ✓ Поле ввода АКТИВНО - ✓ "Удалить пост" РАБОТАЕТ - - -30 секунд - diff --git a/🔥_ИСПРАВЛЕНО_МЕНЮ.txt b/🔥_ИСПРАВЛЕНО_МЕНЮ.txt deleted file mode 100644 index 2737026..0000000 --- a/🔥_ИСПРАВЛЕНО_МЕНЮ.txt +++ /dev/null @@ -1,57 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 🔥 МЕНЮ ПОСТА ИСПРАВЛЕНО - НА ВЕСЬ ЭКРАН 🔥 ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -РЕШЕНИЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Меню поста (три точки) теперь открывается НА ВЕСЬ ЭКРАН - - ┌──────────────────────────────────────┐ - │ [X] Действия │ ← Хедер - ├──────────────────────────────────────┤ - │ │ - │ 🗑️ Удалить пост │ ← РАБОТАЕТ! ✅ - │ │ - │ ✖️ Отмена │ - │ │ - └──────────────────────────────────────┘ - - -БЕЗ СЛОЖНОСТЕЙ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ✓ НЕТ overlay - ✓ НЕТ stopPropagation - ✓ НЕТ сложных кликов - ✓ ПРОСТО кнопки которые РАБОТАЮТ - - -ОБНОВИТЬ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/PostMenu.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ ТЕПЕРЬ: - - ✓ Меню НЕ прыгает - ✓ Кнопка "Удалить пост" РАБОТАЕТ ✅ - ✓ Кнопка "Отмена" РАБОТАЕТ ✅ - ✓ Всё кликабельно ✅ - - -1 минута - diff --git a/🔥_ФИНАЛ.txt b/🔥_ФИНАЛ.txt deleted file mode 100644 index 1355a8d..0000000 --- a/🔥_ФИНАЛ.txt +++ /dev/null @@ -1,70 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 🔥 ФИНАЛЬНАЯ ВЕРСИЯ v2.1.3 🔥 ║ -║ ИДЕАЛЬНО! ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -🎨 КНОПКИ В ТЁМНОЙ ТЕМЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - Неактивная: ███ тёмно-серая (#3A3A3C) с белым текстом - - Активная: ▓▓▓ БЕЛАЯ (#FFFFFF) с чёрным текстом - - Пример на главной: - - [███ Все ███] [███ Furry ███] [███ Anime ███] [███ Other ███] - ↑ активная неактивные → - БЕЛАЯ ТЁМНО-СЕРЫЕ - - -💬 КОММЕНТАРИИ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ✓ height: 60dvh (НЕ меняется при клавиатуре) - ✓ Telegram WebApp API (фиксация при viewportChanged) - ✓ position: fixed - ✓ НЕ прыгают ни на телефоне, ни на десктопе - - -ОБНОВИТЬ (2 минуты): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -НА КОМПЬЮТЕРЕ: - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/pages/Feed.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ - - -НА СЕРВЕРЕ: - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ ПРОВЕРЬТЕ: - -1. Тёмная тема → Главная: - - Неактивные кнопки: ТЁМНО-СЕРЫЕ ✅ - Активная кнопка: БЕЛАЯ ✅ - -2. Комментарии: - - Откройте → нажмите на поле → НЕ прыгает ✅ - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🎉 v2.1.3 ГОТОВ! - -https://nakama.glpshchn.ru - diff --git a/🚀_FINAL_UPDATE.txt b/🚀_FINAL_UPDATE.txt deleted file mode 100644 index 10308d5..0000000 --- a/🚀_FINAL_UPDATE.txt +++ /dev/null @@ -1,86 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 🚀 ФИНАЛЬНОЕ ОБНОВЛЕНИЕ v2.1.2 🚀 ║ -║ ║ -║ Все проблемы исправлены! ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -✅ ИСПРАВЛЕНО В ЭТОМ ОБНОВЛЕНИИ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -1. Кнопка "Все" на главной странице - ➜ Теперь с белым текстом и рамкой (видно в тёмной теме) - -2. Кнопка "Опубликовать" - ➜ Теперь СИНЯЯ вместо серой (всегда видна) - -3. Кнопки режимов (Furry, Anime, Mixed) - ➜ С белым текстом и рамкой - -4. Активные кнопки - ➜ Все стали СИНИМИ (вместо чёрных) - - -БЫСТРОЕ ОБНОВЛЕНИЕ (только CSS): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -НА КОМПЬЮТЕРЕ: -──────────────────────────────────────────────────────────────────────── - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/pages/Feed.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/pages/Search.css root@ваш_IP:/var/www/nakama/frontend/src/pages/ -scp frontend/src/components/CreatePostModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -НА СЕРВЕРЕ: -──────────────────────────────────────────────────────────────────────── - -ssh root@ваш_IP -cd /var/www/nakama/frontend -npm run build - - -ГОТОВО! ✅ -──────────────────────────────────────────────────────────────────────── - -Обновление займёт 2 минуты! - - -ПРОВЕРЬТЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Откройте https://nakama.glpshchn.ru - -1. Переключите тёмную тему (Профиль → Тема → Тёмная) - -2. Вернитесь на главную (Лента) - ✓ Кнопки "Все", "Furry", "Anime", "Other" - ВИДНЫ (белый текст) - ✓ Активная кнопка - СИНЯЯ - -3. Нажмите "+" (создать пост) - ✓ Кнопка "Опубликовать" - СИНЯЯ и ВИДНА - -4. Перейдите в Поиск - ✓ Кнопки "Furry", "Anime", "Mixed" - ВИДНЫ - ✓ Активная кнопка - СИНЯЯ - - -ВСЁ ДОЛЖНО БЫТЬ ВИДНО! ✅ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Изменения: - • 3 CSS файла - • 0 JavaScript - • 0 Backend - • Только пересборка frontend - -Время: ~2 минуты - -╔═══════════════════════════════════════════════════════════════════════╗ -║ Готово! 🎉 ║ -╚═══════════════════════════════════════════════════════════════════════╝ - diff --git a/🚀_ФИНАЛЬНОЕ_ОБНОВЛЕНИЕ.txt b/🚀_ФИНАЛЬНОЕ_ОБНОВЛЕНИЕ.txt deleted file mode 100644 index 8b41338..0000000 --- a/🚀_ФИНАЛЬНОЕ_ОБНОВЛЕНИЕ.txt +++ /dev/null @@ -1,64 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 🚀 ФИНАЛЬНОЕ ОБНОВЛЕНИЕ - РАБОТАЕТ 100% 🚀 ║ -║ v2.1.4 ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -ЧТО ИСПРАВЛЕНО: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ Комментарии: - • НА ВЕСЬ ЭКРАН - • Показывается пост сверху - • Поле ввода РАБОТАЕТ - • НЕ прыгает - • Клики НЕ проходят сквозь - -✅ Меню поста (⋯): - • НА ВЕСЬ ЭКРАН - • Кнопка "Удалить" РАБОТАЕТ - • Клики НЕ проходят сквозь - • pointer-events правильные - -✅ Тёмная тема - кнопки: - • Неактивная: тёмно-серая - • Активная: БЕЛАЯ - - -ОБНОВЛЕНИЕ (2 ФАЙЛА): -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -СКОПИРУЙТЕ ЦЕЛИКОМ: - -cd /Users/glpshchn/Desktop/nakama && scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ && scp frontend/src/components/PostMenu.css root@ваш_IP:/var/www/nakama/frontend/src/components/ && ssh root@ваш_IP "cd /var/www/nakama/frontend && npm run build" - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ ПОСЛЕ ОБНОВЛЕНИЯ: - -Комментарии (💬): - □ Откройте любой пост - □ Нажмите 💬 - □ Сверху виден пост - □ Внизу поле ввода - □ Напишите комментарий ✅ - □ Отправьте ✅ - -Меню поста (⋯): - □ Нажмите три точки - □ Откроется меню на весь экран - □ Нажмите "Удалить пост" ✅ - □ РАБОТАЕТ! ✅ - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -ВРЕМЯ: 30 секунд - -https://nakama.glpshchn.ru - -🎉 ГОТОВО! - diff --git a/🚨_СРОЧНЫЙ_ФИКС.txt b/🚨_СРОЧНЫЙ_ФИКС.txt deleted file mode 100644 index af00bb7..0000000 --- a/🚨_СРОЧНЫЙ_ФИКС.txt +++ /dev/null @@ -1,73 +0,0 @@ -╔═══════════════════════════════════════════════════════════════════════╗ -║ ║ -║ 🚨 СРОЧНОЕ ИСПРАВЛЕНИЕ - РАБОТАЕТ 100% 🚨 ║ -║ ║ -╚═══════════════════════════════════════════════════════════════════════╝ - - -ПРОБЛЕМА: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -❌ При нажатии на модалку она улетает вниз -❌ Кнопки не нажимаются -❌ Всё прыгает - - -РЕШЕНИЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ Вернул stopPropagation() НА МОДАЛКУ -✅ onClick={onClose} только на overlay -✅ Убрал position: fixed с модалки -✅ Модалка внутри overlay через flex - - -ОБНОВЛЕНИЕ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -НА КОМПЬЮТЕРЕ (Terminal): - -cd /Users/glpshchn/Desktop/nakama - -scp frontend/src/components/CommentsModal.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/CommentsModal.css root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.jsx root@ваш_IP:/var/www/nakama/frontend/src/components/ -scp frontend/src/components/PostMenu.css root@ваш_IP:/var/www/nakama/frontend/src/components/ - - -НА СЕРВЕРЕ: - -ssh root@ваш_IP -cd /var/www/nakama/frontend && npm run build - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -КАК РАБОТАЕТ: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -Overlay (тёмный фон): - onClick={onClose} ← закрывает модалку - -Модалка (белый блок): - onClick={e => e.stopPropagation()} ← НЕ закрывает, клики работают - -Кнопки внутри: - onClick={onDelete} ← работают! ✅ - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -✅ ПОСЛЕ ОБНОВЛЕНИЯ: - - ✓ Меню НЕ прыгает - ✓ Кнопка "Удалить пост" РАБОТАЕТ - ✓ Комментарии НЕ прыгают - ✓ Поле ввода активно - ✓ Всё кликабельно - - -ВРЕМЯ: 2 минуты - -https://nakama.glpshchn.ru -