/** * 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 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) )}
{(m.asset_lifecycle_state || 'active') === 'active' && !m.asset_legal_hold_active && ( )}
) })}
{reportTarget && ( setReportTarget(null)} /> )} {preview && (
setPreview(null)} onKeyDown={(e) => e.key === 'Escape' && setPreview(null)} >
e.stopPropagation()} >

Vorschau

{preview.embed_url ? (

{preview.embed_url}

) : preview.mime_type?.startsWith('video/') || preview.media_type === 'video' ? (
)}
) }