import React, { useCallback, useEffect, useMemo, useState } from 'react' import api from '../utils/api' import NavStateLink from '../components/NavStateLink' import SkillProfileCompact from '../components/skills/SkillProfileCompact' import SkillProfileFullModal from '../components/skills/SkillProfileFullModal' import { useAuth } from '../context/AuthContext' import { getTenantClubDependencyKey } from '../utils/activeClub' import { buildTrainingModulesListReturnContext } from '../utils/navReturnContext' export default function TrainingModulesListPage() { const { user } = useAuth() const tenantClubDepKey = useMemo(() => getTenantClubDependencyKey(user), [user]) const modulesListReturn = useMemo(() => buildTrainingModulesListReturnContext(), []) const [rows, setRows] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [skillSummaries, setSkillSummaries] = useState({}) const [summariesLoading, setSummariesLoading] = useState(false) const [profileModal, setProfileModal] = useState(null) const load = useCallback(async () => { setLoading(true) setError('') try { const list = await api.listTrainingModules() setRows(Array.isArray(list) ? list : []) } catch (e) { setError(e.message || 'Laden fehlgeschlagen') setRows([]) } finally { setLoading(false) } }, []) useEffect(() => { load() }, [load, tenantClubDepKey]) useEffect(() => { if (!rows.length) { setSkillSummaries({}) return undefined } let cancelled = false setSummariesLoading(true) api .batchSkillProfileSummaries({ trainingModuleIds: rows.map((r) => r.id) }) .then((data) => { if (!cancelled) setSkillSummaries(data?.summaries || {}) }) .catch(() => { if (!cancelled) setSkillSummaries({}) }) .finally(() => { if (!cancelled) setSummariesLoading(false) }) return () => { cancelled = true } }, [rows, tenantClubDepKey]) async function handleDelete(id, title) { if (!confirm(`Trainingsmodul „${title || id}“ wirklich löschen?`)) return try { await api.deleteTrainingModule(id) await load() } catch (e) { alert(e.message || 'Löschen fehlgeschlagen') } } return ( <>

Trainingsmodule

Wiederverwendbare Übungsfolgen für die Trainingsplanung. Fähigkeiten werden im Vereinskontext verglichen.

Neues Modul
{error ? (

{error}

) : null} {loading ? (

Laden …

) : rows.length === 0 ? (

Noch keine Module angelegt.

) : ( )} setProfileModal(null)} artifactType={profileModal?.artifactType} artifactId={profileModal?.artifactId} title={profileModal?.title} /> ) }