diff --git a/public/images/cover-placeholder.webp b/public/images/cover-placeholder.webp new file mode 100644 index 0000000..a61aba6 Binary files /dev/null and b/public/images/cover-placeholder.webp differ diff --git a/src/pages/AdminPage.tsx b/src/pages/AdminPage.tsx index 1eaeae1..078a643 100644 --- a/src/pages/AdminPage.tsx +++ b/src/pages/AdminPage.tsx @@ -10,8 +10,8 @@ import { GalleryImage, CategoryTitles, CityTitles, CategoryIds, CityIds, Article import { Pencil, Trash2, ChevronLeft, ChevronRight, ImagePlus, X } from 'lucide-react'; -// Default cover image for new articles -const DEFAULT_COVER_IMAGE = '/images/empty-cover.png'; +// Обложка по умоланию для новых статей +const DEFAULT_COVER_IMAGE = '/images/cover-placeholder.webp'; export function AdminPage() { const [articleId, setArticleId] = useState(''); @@ -26,6 +26,7 @@ export function AdminPage() { const [editingId, setEditingId] = useState(null); const [showDeleteModal, setShowDeleteModal] = useState(null); const [articles, setArticles] = useState([]); + const [refreshArticles, setRefreshArticles] = useState(0); const [totalPages, setTotalPages] = useState(1); const [currentPage, setCurrentPage] = useState(1); const [filterCategoryId, setFilterCategoryId] = useState(0); @@ -33,6 +34,7 @@ export function AdminPage() { const [error, setError] = useState(null); const [content, setContent] = useState(''); + // Загрузка статей useEffect(() => { const fetchArticles = async () => { @@ -53,7 +55,7 @@ export function AdminPage() { }; fetchArticles(); - }, [currentPage, filterCategoryId, filterCityId]); + }, [currentPage, filterCategoryId, filterCityId, refreshArticles]); const handlePageChange = (page: number) => { setCurrentPage(page); @@ -89,6 +91,8 @@ export function AdminPage() { ...prev, articles: prev.filter(article => article.id !== id), })); + + setRefreshArticles(prev => prev + 1); } catch (error) { setError('Не удалось удалить статью'); console.error(error); @@ -112,6 +116,7 @@ export function AdminPage() { }; if (editingId) { + // Редактирование существующей статьи try { const response = await axios.put(`/api/articles/${editingId}`, articleData, { headers: { @@ -119,12 +124,7 @@ export function AdminPage() { }, }); - setArticles(prev => ({ - ...prev, - articles: prev.map(article => - article.id === editingId ? response.data : article - ), - })); + setArticles(prev => prev.map(article => article.id === editingId ? response.data : article)); } catch (error) { setError('Не удалось обновить статью'); console.error(error); @@ -134,19 +134,22 @@ export function AdminPage() { } else { // Создание новой статьи - const response = await axios.post('/api/articles', articleData, { - headers: { - Authorization: `Bearer ${localStorage.getItem('token')}`, - }, - }); - setArticles(prev => ({ - ...prev, - articles: [...prev, response.data], - })); + try { + const response = await axios.post('/api/articles', articleData, { + headers: { + Authorization: `Bearer ${localStorage.getItem('token')}`, + }, + }); - console.log('Создание новой статьи:', articleData); + setArticles(prev => [...prev, response.data]); + } catch (error) { + setError('Не удалось создать статью'); + console.error(error); + } } + setRefreshArticles(prev => prev + 1); + // Очистка формы статьи setArticleId(''); setTitle(''); @@ -157,6 +160,8 @@ export function AdminPage() { setReadTime(5); setGallery([]); setContent(''); // Очищаем содержимое редактора + + setEditingId(null); }; const handleGalleryImageUpload = (imageUrl: string) => {