/** * Schnellansicht einer Übung aus dem Katalog (ohne die Planungsseite zu verlassen). */ import React, { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import api from '../utils/api' import { sanitizeTrainerHtml } from '../utils/htmlUtils' function HtmlBlock({ html, className = '' }) { if (!html || !String(html).trim()) return null const safe = sanitizeTrainerHtml(html) return (
) } function TagMini({ exercise }) { const parts = [] ;(exercise.focus_areas || []).slice(0, 5).forEach((f) => { parts.push(f.name) }) if (parts.length === 0) return null return (
{parts.map((p, i) => ( {p} ))}
) } export default function ExercisePeekModal({ open, exerciseId, variantId, onClose, titleFallback, }) { const [loading, setLoading] = useState(false) const [err, setErr] = useState(null) const [exercise, setExercise] = useState(null) const variant = variantId != null && variantId !== '' && exercise?.variants?.length ? exercise.variants.find((v) => String(v.id) === String(variantId)) || null : null useEffect(() => { if (!open) { setExercise(null) setErr(null) return } if (!exerciseId) { setErr('Keine Übung gewählt') return } let cancelled = false ;(async () => { setLoading(true) setErr(null) try { const data = await api.getExercise(exerciseId) if (!cancelled) setExercise(data) } catch (e) { if (!cancelled) setErr(e.message || 'Laden fehlgeschlagen') } finally { if (!cancelled) setLoading(false) } })() return () => { cancelled = true } }, [open, exerciseId, variantId]) if (!open) return null return (
e.target === e.currentTarget && onClose()}>
e.stopPropagation()} >

{loading ? '…' : exercise?.title || titleFallback || `Übung #${exerciseId}`}

{loading && (

Laden…

)} {!loading && err &&

{err}

} {!loading && exercise && ( <> {variant ? (
Variante
{variant.variant_name || `Variante #${variant.id}`}
{variant.description ? (
) : null} {variant.execution_changes ? (

Durchführung (Variante)

) : null}
) : null} {exercise.summary && (
)} {(exercise.goal || exercise.preparation || exercise.execution || exercise.trainer_notes) && (
)} {exercise.goal && ( <>

Ziel

)} {exercise.preparation && ( <>

Vorbereitung

)} {exercise.execution && ( <>

Ablauf

)} {exercise.trainer_notes && ( <>

Trainer-Hinweise

)} )}
{exerciseId && (
Vollständige Übungsseite öffnen
)}
) }