'use client'; import React, { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { ArrowLeft, Save, X } from 'lucide-react'; import Link from 'next/link'; import TextEditor from '@/app/admin/components/TextEditor'; import ImageUpload from '@/app/admin/components/ImageUpload'; interface UiCategory { id: string; name: string } export default function CreateNewsPage() { const router = useRouter(); const [loading, setLoading] = useState(false); const [formData, setFormData] = useState({ title: '', slug: '', summary: '', content: '', category: 'company', imageUrl: '', featured: false, published: true, publishedAt: new Date().toISOString().slice(0, 16), tags: [] as string[] }); const [tagInput, setTagInput] = useState(''); const [categories, setCategories] = useState([ { id: 'company', name: 'Новости компании' }, { id: 'promotions', name: 'Акции' }, { id: 'other', name: 'Другое' } ]); useEffect(() => { (async () => { try { const res = await fetch('/api/categories', { cache: 'no-store' }); const data = await res.json(); if (res.ok && data?.data?.length) { setCategories(data.data.map((c: any) => ({ id: c.slug, name: c.name }))); // если выбранная категория отсутствует — выставим первую setFormData(prev => ({ ...prev, category: data.data[0]?.slug || prev.category })); } } catch {} })(); }, []); const generateSlug = (title: string) => { return title .toLowerCase() .replace(/[^a-z0-9а-я]/g, '-') .replace(/-+/g, '-') .replace(/^-|-$/g, ''); }; const handleTitleChange = (title: string) => { setFormData(prev => ({ ...prev, title, slug: generateSlug(title) })); }; 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 handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); try { const response = await fetch('/api/news', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...formData, publishedAt: new Date(formData.publishedAt).toISOString() }) }); const data = await response.json(); if (data.success) { router.push('/admin/news'); } else { console.error('Error creating news:', data.error); alert('Ошибка при создании новости'); } } catch (error) { console.error('Error creating news:', error); alert('Ошибка при создании новости'); } finally { setLoading(false); } }; const handleSaveAsDraft = async () => { const draftData = { ...formData, published: false }; setFormData(draftData); // Сохраняем как черновик try { const response = await fetch('/api/news', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...draftData, publishedAt: new Date(draftData.publishedAt).toISOString() }) }); const data = await response.json(); if (data.success) { router.push('/admin/news'); } } catch (error) { console.error('Error saving draft:', error); } }; return (
{/* Header */}

Создать новость

Заполните форму для создания новой новости

{/* Main Content */}
{/* Title */}
handleTitleChange(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="Введите заголовок новости" required />
{/* Slug */}
setFormData(prev => ({ ...prev, slug: e.target.value }))} className="w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="url-novosti" required />

URL будет: /news/{formData.slug}

{/* Summary */}