import { useEffect, useRef, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { api, fmtDate, imgUrl, personName } from '../api.js'; import StatusBadge from '../components/StatusBadge.jsx'; export default function Projects() { const [projects, setProjects] = useState(null); const [error, setError] = useState(null); const dialog = useRef(null); useEffect(() => { api('GET', '/api/projects').then(setProjects).catch((e) => setError(e.message)); }, []); return ( <>

P42 Projekte

Übersicht aller laufenden und abgeschlossenen Projekte.

{error &&

{error}

} {!projects && !error &&

Lade Projekte …

} {projects?.length === 0 && (
Noch keine Projekte. Leg mit „+ Neues Projekt“ das erste an.
)} {projects?.length > 0 && (
{projects.map((p) => (
{p.cover ? :
}

{p.title}

{p.description &&

{p.description}

}
Von {personName(p.createdBy)} ✎ {personName(p.updatedBy)} · {fmtDate(p.updatedAt)}
))}
)} ); } function NewProjectDialog({ ref }) { const navigate = useNavigate(); const [title, setTitle] = useState(''); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); async function submit(e) { e.preventDefault(); setBusy(true); setError(null); try { const project = await api('POST', '/api/projects', { title }); navigate(`/projekte/${project.id}?bearbeiten`); } catch (err) { setError(err.message); setBusy(false); } } return ( { setTitle(''); setError(null); }}>

Neues Projekt

Beschreibung, Bilder und Text schreibst du danach direkt im Artikel.

{error &&

{error}

}
); }