'use client'; import React, { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { ArrowLeft, Save, Eye, Upload, X, Trash2 } from 'lucide-react'; import { NEWS_CATEGORIES, NewsFormData, NewsCategory } from '@/lib/types'; // import { getNewsById } from '@/lib/news-data'; interface EditNewsPageProps { params: Promise<{ id: string; }>; } export default function EditNewsPage({ params }: EditNewsPageProps) { const router = useRouter(); const [isSubmitting, setIsSubmitting] = useState(false); const [showPreview, setShowPreview] = useState(false); const [imagePreview, setImagePreview] = useState(''); const [isLoading, setIsLoading] = useState(true); const [newsId, setNewsId] = useState(''); const [formData, setFormData] = useState({ title: '', summary: '', content: '', category: 'company', imageUrl: '', featured: false, published: true, publishedAt: new Date().toISOString().slice(0, 16), tags: [] }); const [errors, setErrors] = useState>({}); const [tagInput, setTagInput] = useState(''); useEffect(() => { const loadNews = async () => { const resolvedParams = await params; const id = resolvedParams.id; setNewsId(id); try { const response = await fetch(`/api/news/${id}`); const data = await response.json(); if (data.success && data.data) { const news = data.data; setFormData({ title: news.title, summary: news.summary, content: news.content, category: news.category, imageUrl: news.imageUrl || '', featured: news.featured || false, published: news.published !== false, publishedAt: new Date(news.publishedAt).toISOString().slice(0, 16), tags: news.tags || [] }); if (news.imageUrl) { setImagePreview(news.imageUrl); } } } catch (error) { console.error('Error loading news:', error); } setIsLoading(false); }; loadNews(); }, [params]); const validateForm = (): boolean => { const newErrors: Partial = {}; if (!formData.title.trim()) { newErrors.title = 'Заголовок обязателен'; } if (!formData.summary.trim()) { newErrors.summary = 'Краткое описание обязательно'; } if (!formData.content.trim()) { newErrors.content = 'Содержание обязательно'; } if (formData.summary.length > 200) { newErrors.summary = 'Краткое описание не должно превышать 200 символов'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const generateSlug = (title: string): string => { return title .toLowerCase() .replace(/[а-я]/g, (char) => { const map: { [key: string]: string } = { 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sch', 'ъ': '', 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya' }; return map[char] || char; }) .replace(/[^a-z0-9]+/g, '-') .replace(/^-+|-+$/g, ''); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } setIsSubmitting(true); try { // Генерируем slug const slug = generateSlug(formData.title); // Обновляем новость через API const response = await fetch(`/api/news/${newsId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...formData, slug, publishedAt: new Date(formData.publishedAt).toISOString() }) }); const data = await response.json(); if (data.success) { router.push('/admin/news'); } else { console.error('Error updating news:', data.error); alert('Ошибка при сохранении новости'); } } catch (error) { console.error('Error updating news:', error); alert('Ошибка при сохранении новости'); } finally { setIsSubmitting(false); } }; const handleDelete = async () => { if (!confirm('Вы уверены, что хотите удалить эту новость? Это действие нельзя отменить.')) { return; } try { const response = await fetch(`/api/news/${newsId}`, { method: 'DELETE' }); const data = await response.json(); if (data.success) { router.push('/admin/news'); } else { console.error('Error deleting news:', data.error); alert('Ошибка при удалении новости'); } } catch (error) { console.error('Error deleting news:', error); alert('Ошибка при удалении новости'); } }; const handleImageUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { const reader = new FileReader(); reader.onload = (e) => { const result = e.target?.result as string; setImagePreview(result); setFormData(prev => ({ ...prev, imageUrl: result })); }; reader.readAsDataURL(file); } }; const removeImage = () => { setImagePreview(''); setFormData(prev => ({ ...prev, imageUrl: '' })); }; const handleAddTag = () => { if (tagInput.trim() && !formData.tags.includes(tagInput.trim())) { setFormData(prev => ({ ...prev, tags: [...prev.tags, tagInput.trim()] })); setTagInput(''); } }; const handleRemoveTag = (tagToRemove: string) => { setFormData(prev => ({ ...prev, tags: prev.tags.filter(tag => tag !== tagToRemove) })); }; const formatContentForPreview = (content: string) => { return content .replace(/\n/g, '
') .replace(/\*\*(.*?)\*\*/g, '$1') .replace(/\*(.*?)\*/g, '$1'); }; if (isLoading) { return (
); } return (
{/* Header */}
Назад к списку

Редактировать новость

{/* Form */}
{/* Title */}
setFormData(prev => ({ ...prev, title: e.target.value }))} className={`w-full px-3 py-2 border rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent ${ errors.title ? 'border-red-500' : 'border-gray-300' }`} placeholder="Введите заголовок новости" /> {errors.title && (

{errors.title}

)}
{/* Category */}
{/* Summary */}