import { useEffect, useState } from "react"; import { ArrowDown, ArrowUp, Edit2, Plus, Save, Trash2 } from "lucide-react"; import type { DownloadPublication } from "../../types"; import { adminApi } from "../../api/adminApi"; import ImagePicker from "../ImagePicker"; import PublicationFilePicker from "./PublicationFilePicker"; interface DownloadsManagerProps { downloads: DownloadPublication[]; title: string; subtitle: string; loading: boolean; onSave: (downloads: DownloadPublication[], title: string, subtitle: string) => Promise; onError: (message: string) => void; } const emptyForm = (): Partial => ({ title: "", description: "", imageUrl: "", pdfUrl: "", epubUrl: "", publishedAt: "" }); async function deleteUnreferencedFiles(urls: Array) { await Promise.all(urls.filter(Boolean).map(async (url) => { const name = url!.split("/").pop(); if (name) await adminApi.deletePublication(name).catch(() => undefined); })); } export default function DownloadsManager({ downloads, title, subtitle, loading, onSave, onError }: DownloadsManagerProps) { const [sectionTitle, setSectionTitle] = useState(title); const [sectionSubtitle, setSectionSubtitle] = useState(subtitle); const [editingId, setEditingId] = useState(null); const [form, setForm] = useState>(emptyForm()); useEffect(() => setSectionTitle(title), [title]); useEffect(() => setSectionSubtitle(subtitle), [subtitle]); const persist = async (nextDownloads: DownloadPublication[]) => { try { await onSave(nextDownloads, sectionTitle, sectionSubtitle); } catch (error) { onError(error instanceof Error ? error.message : "Die Downloads konnten nicht gespeichert werden."); throw error; } }; const saveEntry = async () => { if (!form.title?.trim()) { onError("Bitte einen Titel für den Download eintragen."); return; } if (!form.pdfUrl && !form.epubUrl) { onError("Bitte mindestens eine PDF- oder ePUB-Datei hochladen."); return; } const previous = editingId && editingId !== "new" ? downloads.find((item) => item.id === editingId) : undefined; const entry: DownloadPublication = { id: editingId === "new" ? `download_${Date.now()}` : editingId!, title: form.title.trim(), description: form.description || "", imageUrl: form.imageUrl || "", pdfUrl: form.pdfUrl || "", epubUrl: form.epubUrl || "", publishedAt: form.publishedAt || "", }; const next = editingId === "new" ? [entry, ...downloads] : downloads.map((item) => item.id === editingId ? entry : item); await persist(next); await deleteUnreferencedFiles([ previous?.pdfUrl && previous.pdfUrl !== entry.pdfUrl ? previous.pdfUrl : undefined, previous?.epubUrl && previous.epubUrl !== entry.epubUrl ? previous.epubUrl : undefined, ]); setEditingId(null); setForm(emptyForm()); }; const remove = async (entry: DownloadPublication) => { if (!confirm(`„${entry.title}“ wirklich löschen?`)) return; await persist(downloads.filter((item) => item.id !== entry.id)); await deleteUnreferencedFiles([entry.pdfUrl, entry.epubUrl]); }; const move = async (index: number, direction: -1 | 1) => { const target = index + direction; if (target < 0 || target >= downloads.length) return; const next = [...downloads]; [next[index], next[target]] = [next[target], next[index]]; await persist(next); }; if (editingId) { return (

{editingId === "new" ? "Neuen Download anlegen" : "Download bearbeiten"}

setForm({ ...form, title: event.target.value })} className="w-full rounded-xl border border-slate-800 bg-slate-950 px-3 py-2 text-white" />