import { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import ReactQuill from "react-quill"; import "react-quill/dist/quill.snow.css"; import DOMPurify from "dompurify"; const apiBase = import.meta.env.VITE_API_URL; type NewsItem = { id: number; title: string; description: string; image_url: string; team: string; created_at: string; }; const NewsManager = () => { const [news, setNews] = useState([]); const [showForm, setShowForm] = useState(false); const [editMode, setEditMode] = useState(false); const [currentId, setCurrentId] = useState(null); const [newTitle, setNewTitle] = useState(""); const [newDescription, setNewDescription] = useState(""); const [newImageUrl, setNewImageUrl] = useState(""); const [newTeam, setNewTeam] = useState(""); const [uploading, setUploading] = useState(false); const [showDeleteModal, setShowDeleteModal] = useState(false); const [deleteId, setDeleteId] = useState(null); useEffect(() => { loadNews(); }, []); const loadNews = async () => { try { const res = await fetch(`${apiBase}/api/news`); const data = await res.json(); setNews(data); } catch (err) { console.error("Fehler beim Laden der News:", err); } }; const handleCreateOrUpdateNews = async () => { const method = editMode ? "PUT" : "POST"; const url = editMode ? `${apiBase}/api/news/${currentId}` : `${apiBase}/api/news`; try { const res = await fetch(url, { method, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: newTitle, description: DOMPurify.sanitize(newDescription), image_url: newImageUrl, team: newTeam, }), }); if (res.ok) { await loadNews(); setShowForm(false); setEditMode(false); resetForm(); } else { console.error("Fehler beim Speichern der News"); } } catch (err) { console.error("Fehler beim Speichern der News:", err); } }; const handleEdit = (item: NewsItem) => { setNewTitle(item.title); setNewDescription(item.description); setNewImageUrl(item.image_url); setNewTeam(item.team); setCurrentId(item.id); setEditMode(true); setShowForm(true); }; const confirmDelete = (id: number) => { setDeleteId(id); setShowDeleteModal(true); }; const handleDelete = async () => { if (!deleteId) return; try { const res = await fetch(`${apiBase}/api/news/${deleteId}`, { method: "DELETE", }); if (res.ok) { await loadNews(); } else { console.error("Fehler beim Löschen der News"); } } catch (err) { console.error("Fehler beim Löschen der News:", err); } finally { setShowDeleteModal(false); setDeleteId(null); } }; const resetForm = () => { setNewTitle(""); setNewDescription(""); setNewImageUrl(""); setNewTeam(""); setCurrentId(null); }; const handleImageUpload = async (file: File) => { const formData = new FormData(); formData.append("image", file); setUploading(true); try { const res = await fetch(`${apiBase}/api/upload-news-image`, { method: "POST", body: formData, }); if (!res.ok) throw new Error("Fehler beim Bild-Upload"); const data = await res.json(); setNewImageUrl(data.imageUrl); } catch (err) { console.error("Bild-Upload fehlgeschlagen:", err); } finally { setUploading(false); } }; return (

News verwalten

{showForm && (

{editMode ? "News bearbeiten" : "Neue News anlegen"}

setNewTitle(e.target.value)} /> {/* Upload */} { const file = e.target.files?.[0]; if (file) handleImageUpload(file); }} /> {uploading &&

Bild wird hochgeladen...

} {newImageUrl && ( Vorschau )} setNewTeam(e.target.value)} />
)} {showDeleteModal && (

News wirklich löschen?

)}
{news.map((item) => ( {item.title} {item.image_url && ( {item.title} )}

Erstellt am{" "} {new Date(item.created_at).toLocaleDateString("de-DE")}

))}
); }; export default NewsManager;