Исправлена проблема, когда после сабмита формы не загружался список статей.
This commit is contained in:
parent
be59f4418a
commit
ae5e789f1b
BIN
public/images/cover-placeholder.webp
Normal file
BIN
public/images/cover-placeholder.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 141 KiB |
@ -10,8 +10,8 @@ import { GalleryImage, CategoryTitles, CityTitles, CategoryIds, CityIds, Article
|
|||||||
import { Pencil, Trash2, ChevronLeft, ChevronRight, ImagePlus, X } from 'lucide-react';
|
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() {
|
export function AdminPage() {
|
||||||
const [articleId, setArticleId] = useState('');
|
const [articleId, setArticleId] = useState('');
|
||||||
@ -26,6 +26,7 @@ export function AdminPage() {
|
|||||||
const [editingId, setEditingId] = useState<string | null>(null);
|
const [editingId, setEditingId] = useState<string | null>(null);
|
||||||
const [showDeleteModal, setShowDeleteModal] = useState<string | null>(null);
|
const [showDeleteModal, setShowDeleteModal] = useState<string | null>(null);
|
||||||
const [articles, setArticles] = useState<Article[]>([]);
|
const [articles, setArticles] = useState<Article[]>([]);
|
||||||
|
const [refreshArticles, setRefreshArticles] = useState(0);
|
||||||
const [totalPages, setTotalPages] = useState(1);
|
const [totalPages, setTotalPages] = useState(1);
|
||||||
const [currentPage, setCurrentPage] = useState(1);
|
const [currentPage, setCurrentPage] = useState(1);
|
||||||
const [filterCategoryId, setFilterCategoryId] = useState(0);
|
const [filterCategoryId, setFilterCategoryId] = useState(0);
|
||||||
@ -33,6 +34,7 @@ export function AdminPage() {
|
|||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
const [content, setContent] = useState('');
|
const [content, setContent] = useState('');
|
||||||
|
|
||||||
|
|
||||||
// Загрузка статей
|
// Загрузка статей
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchArticles = async () => {
|
const fetchArticles = async () => {
|
||||||
@ -53,7 +55,7 @@ export function AdminPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
fetchArticles();
|
fetchArticles();
|
||||||
}, [currentPage, filterCategoryId, filterCityId]);
|
}, [currentPage, filterCategoryId, filterCityId, refreshArticles]);
|
||||||
|
|
||||||
const handlePageChange = (page: number) => {
|
const handlePageChange = (page: number) => {
|
||||||
setCurrentPage(page);
|
setCurrentPage(page);
|
||||||
@ -89,6 +91,8 @@ export function AdminPage() {
|
|||||||
...prev,
|
...prev,
|
||||||
articles: prev.filter(article => article.id !== id),
|
articles: prev.filter(article => article.id !== id),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
setRefreshArticles(prev => prev + 1);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
setError('Не удалось удалить статью');
|
setError('Не удалось удалить статью');
|
||||||
console.error(error);
|
console.error(error);
|
||||||
@ -112,6 +116,7 @@ export function AdminPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (editingId) {
|
if (editingId) {
|
||||||
|
// Редактирование существующей статьи
|
||||||
try {
|
try {
|
||||||
const response = await axios.put(`/api/articles/${editingId}`, articleData, {
|
const response = await axios.put(`/api/articles/${editingId}`, articleData, {
|
||||||
headers: {
|
headers: {
|
||||||
@ -119,12 +124,7 @@ export function AdminPage() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
setArticles(prev => ({
|
setArticles(prev => prev.map(article => article.id === editingId ? response.data : article));
|
||||||
...prev,
|
|
||||||
articles: prev.map(article =>
|
|
||||||
article.id === editingId ? response.data : article
|
|
||||||
),
|
|
||||||
}));
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
setError('Не удалось обновить статью');
|
setError('Не удалось обновить статью');
|
||||||
console.error(error);
|
console.error(error);
|
||||||
@ -134,19 +134,22 @@ export function AdminPage() {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Создание новой статьи
|
// Создание новой статьи
|
||||||
const response = await axios.post('/api/articles', articleData, {
|
try {
|
||||||
headers: {
|
const response = await axios.post('/api/articles', articleData, {
|
||||||
Authorization: `Bearer ${localStorage.getItem('token')}`,
|
headers: {
|
||||||
},
|
Authorization: `Bearer ${localStorage.getItem('token')}`,
|
||||||
});
|
},
|
||||||
setArticles(prev => ({
|
});
|
||||||
...prev,
|
|
||||||
articles: [...prev, response.data],
|
|
||||||
}));
|
|
||||||
|
|
||||||
console.log('Создание новой статьи:', articleData);
|
setArticles(prev => [...prev, response.data]);
|
||||||
|
} catch (error) {
|
||||||
|
setError('Не удалось создать статью');
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setRefreshArticles(prev => prev + 1);
|
||||||
|
|
||||||
// Очистка формы статьи
|
// Очистка формы статьи
|
||||||
setArticleId('');
|
setArticleId('');
|
||||||
setTitle('');
|
setTitle('');
|
||||||
@ -157,6 +160,8 @@ export function AdminPage() {
|
|||||||
setReadTime(5);
|
setReadTime(5);
|
||||||
setGallery([]);
|
setGallery([]);
|
||||||
setContent(''); // Очищаем содержимое редактора
|
setContent(''); // Очищаем содержимое редактора
|
||||||
|
|
||||||
|
setEditingId(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleGalleryImageUpload = (imageUrl: string) => {
|
const handleGalleryImageUpload = (imageUrl: string) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user