import React, { useState, useEffect } from 'react' import { Link } from 'react-router-dom' import api from '../utils/api' const PAGE_SIZE = 100 function ExercisesListPage() { const [exercises, setExercises] = useState([]) const [focusAreas, setFocusAreas] = useState([]) const [loading, setLoading] = useState(true) const [loadingMore, setLoadingMore] = useState(false) const [offset, setOffset] = useState(0) const [hasMore, setHasMore] = useState(false) const [filters, setFilters] = useState({ focus_area: '', visibility: '', status: '', }) useEffect(() => { let cancelled = false const run = async () => { setLoading(true) setOffset(0) try { const [batch, focusAreasData] = await Promise.all([ api.listExercises({ ...filters, limit: PAGE_SIZE, offset: 0 }), api.listFocusAreas(), ]) if (cancelled) return setExercises(batch) setFocusAreas(focusAreasData) setHasMore(batch.length === PAGE_SIZE) setOffset(batch.length) } catch (err) { if (!cancelled) { console.error('Failed to load data:', err) alert('Fehler beim Laden: ' + err.message) } } finally { if (!cancelled) setLoading(false) } } run() return () => { cancelled = true } }, [filters]) const loadMore = async () => { if (loadingMore || !hasMore) return setLoadingMore(true) try { const batch = await api.listExercises({ ...filters, limit: PAGE_SIZE, offset }) setExercises((prev) => [...prev, ...batch]) setHasMore(batch.length === PAGE_SIZE) setOffset((o) => o + batch.length) } catch (err) { alert('Fehler: ' + err.message) } finally { setLoadingMore(false) } } const handleDelete = async (exercise) => { if (!confirm(`Übung "${exercise.title}" wirklich löschen?`)) return try { await api.deleteExercise(exercise.id) setExercises((prev) => prev.filter((e) => e.id !== exercise.id)) } catch (err) { alert('Fehler beim Löschen: ' + err.message) } } if (loading) { return (

Laden...

) } return (

Übungen

+ Neu
{exercises.length === 0 ? (

Keine Übungen gefunden.

) : ( <>

{exercises.length} angezeigt {hasMore ? ' · es gibt weitere Einträge' : ''}

{exercises.map((exercise) => (

{exercise.title}

{exercise.focus_area && ( {exercise.focus_area} )} {exercise.visibility} {exercise.status}
{exercise.summary && (

{exercise.summary.length > 160 ? `${exercise.summary.slice(0, 160)}…` : exercise.summary}

)}
Ansehen Bearbeiten
))}
{hasMore && (
)} )}
) } export default ExercisesListPage