'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import { trpc } from '@/lib/trpc-client' import { getTrpcErrorMessage } from '@/lib/trpc-error' import Link from 'next/link' import dynamic from 'next/dynamic' import { AIGenerator } from '@/components/ai-generator' const MDEditor = dynamic(() => import('@uiw/react-md-editor'), { ssr: false }) const KATEGORIEN = [ { value: 'Wichtig', label: 'Wichtig' }, { value: 'Pruefung', label: 'Prüfung' }, { value: 'Foerderung', label: 'Förderung' }, { value: 'Veranstaltung', label: 'Veranstaltung' }, { value: 'Allgemein', label: 'Allgemein' }, ] export default function NewsNeuPage() { const router = useRouter() const [title, setTitle] = useState('') const DEFAULT_BODY = '## Inhalt\n\nHier können Sie Ihren Beitrag verfassen.' const [body, setBody] = useState(DEFAULT_BODY) const [kategorie, setKategorie] = useState('Allgemein') const [uploading, setUploading] = useState(false) const [attachments, setAttachments] = useState< Array<{ name: string; storagePath: string; sizeBytes: number; url: string }> >([]) const createMutation = trpc.news.create.useMutation({ onSuccess: () => router.push('/dashboard/news'), }) function handleSubmit(publishNow: boolean) { if (!title.trim() || !body.trim()) return createMutation.mutate({ title, body, kategorie: kategorie as never, publishedAt: publishNow ? new Date().toISOString() : null, attachments: attachments.map((a) => ({ name: a.name, storagePath: a.storagePath, sizeBytes: a.sizeBytes, mimeType: 'application/pdf', // fallback/default; the API handles it })), }) } async function handleFileUpload(e: React.ChangeEvent) { const file = e.target.files?.[0] if (!file) return setUploading(true) const formData = new FormData() formData.append('file', file) try { const res = await fetch('/api/upload', { method: 'POST', body: formData }) const data = await res.json() setAttachments((prev) => [...prev, data]) } catch { alert('Upload fehlgeschlagen') } finally { setUploading(false) } } return (
← Zurück

Beitrag erstellen

setTitle(e.target.value)} placeholder="Aussagekräftiger Titel..." className="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-brand-500" />
setBody(v ?? '')} height={400} preview="live" />
{/* Attachments */}
{attachments.length > 0 && (
    {attachments.map((a, i) => (
  • 📄 {a.name} ({Math.round(a.sizeBytes / 1024)} KB)
  • ))}
)}
{createMutation.error && (

{getTrpcErrorMessage(createMutation.error)}

)}
{ // Replace placeholder if untouched, otherwise append setBody(body === DEFAULT_BODY ? generated : body + '\n\n' + generated) }} />
) }