/** * Nur Medien, die noch nicht im Fließtext eingebettet sind — ohne Doppel-Darstellung. */ import React, { useMemo, useState } from 'react' import ExerciseMediaEmbed from './ExerciseMediaEmbed' import ExerciseMediaThumbTile from './ExerciseMediaThumbTile' import MediaPreviewModal from './MediaPreviewModal' import ReportContentModal from './ReportContentModal' import { resolveExerciseMediaFileUrl } from '../utils/exerciseMediaUrl' import { collectInlineExerciseMediaIdsFromExercise } from '../utils/exerciseInlineMediaRefs' function isTrashHidden(m) { return String(m?.asset_lifecycle_state || 'active').toLowerCase() === 'trash_hidden' } export default function ExerciseAttachmentMediaStrip({ exerciseId, exercise }) { const [preview, setPreview] = useState(null) const [reportTarget, setReportTarget] = useState(null) const inlineIds = useMemo(() => collectInlineExerciseMediaIdsFromExercise(exercise), [exercise]) const orphans = useMemo(() => { const list = (exercise?.media || []).filter((m) => m && !isTrashHidden(m)) return list.filter((m) => !inlineIds.has(Number(m.id))) }, [exercise, inlineIds]) if (!orphans.length || exerciseId == null) return null return (

Angehängte Medien

Hier erscheinen nur Verknüpfungen, die noch nicht im Fließtext eingebettet sind (reine Material-Anhänge).

{orphans.map((m) => { const lc = String(m.asset_lifecycle_state || 'active').toLowerCase() const caption = (m.title || '').trim() || (m.original_filename || '').trim() || `Medium #${m.id}` return (
{caption} #{m.id} {m.embed_platform ? ` · ${m.embed_platform}` : ''} {m.media_type ? ` · ${m.media_type}` : ''} {lc === 'trash_soft' && ( Papierkorb (Stufe 1) )}
) })}
{preview && ( setPreview(null)} onReport={ (preview.asset_lifecycle_state || 'active') === 'active' && !preview.asset_legal_hold_active ? () => { setReportTarget(preview) setPreview(null) } : null } /> )} {reportTarget && ( setReportTarget(null)} /> )}
) }