/** * Modal: Embed-URL als exercise_media anlegen und §11-Platzhalter einfügen. */ import React, { useEffect, useState } from 'react' import api from '../utils/api' import { INLINE_MEDIA_SIZES, DEFAULT_INLINE_MEDIA_SIZE, sanitizeInlineMediaSize, } from '../constants/inlineExerciseMedia' import { sanitizeInlineMediaCaption } from '../utils/inlineMediaCaption' /** * @param {{ * open: boolean, * onClose: () => void, * exerciseId: number, * onMediaListChanged: () => Promise, * onInserted: (exerciseMediaId: number, displaySize: string, caption?: string) => void, * }} props */ export default function ExerciseInlineEmbedModal({ open, onClose, exerciseId, onMediaListChanged, onInserted, }) { const [url, setUrl] = useState('') const [title, setTitle] = useState('') const [displaySize, setDisplaySize] = useState(DEFAULT_INLINE_MEDIA_SIZE) const [busy, setBusy] = useState(false) useEffect(() => { if (!open) return setUrl('') setTitle('') setDisplaySize(DEFAULT_INLINE_MEDIA_SIZE) }, [open]) const submit = async () => { const u = url.trim() if (!u) { alert('Bitte eine Embed-URL eingeben (https://…).') return } const size = sanitizeInlineMediaSize(displaySize) const fd = new FormData() fd.append('embed_url', u) fd.append('media_type', 'video') fd.append('title', title.trim()) fd.append('description', '') fd.append('context', 'ablauf') fd.append('is_primary', 'false') setBusy(true) try { const row = await api.uploadExerciseMedia(exerciseId, fd) const mid = row?.id if (mid == null) { throw new Error('Antwort ohne exercise_media-ID') } await onMediaListChanged() const cap = sanitizeInlineMediaCaption( title.trim() || u.replace(/^https?:\/\//i, '').slice(0, 96), ) onInserted(Number(mid), size, cap) onClose() } catch (e) { alert(e.message || String(e)) } finally { setBusy(false) } } if (!open) return null return (
e.target === e.currentTarget && !busy && onClose()}>
e.stopPropagation()} >

Embed im Textfeld

setUrl(e.target.value)} disabled={busy} /> setTitle(e.target.value)} disabled={busy} />
) }