/** * Wiederverwendbares Melde-Modal (P-13). * Props: * targetType – 'media_asset' | 'exercise' * targetId – ID des Zielobjekts * targetLabel – Anzeigename für den Header (z.B. Dateiname oder Übungstitel) * onClose – Callback zum Schließen */ import React, { useState } from 'react' import { useAuth } from '../context/AuthContext' import api from '../utils/api' const REASON_OPTIONS = [ { value: '', label: '— Grund auswählen —' }, { value: 'copyright', label: 'Urheberrechtsverletzung' }, { value: 'image_rights', label: 'Bildrechtsverletzung / Recht am eigenen Bild' }, { value: 'privacy', label: 'Datenschutz / Persönlichkeitsrecht' }, { value: 'minors', label: 'Darstellung Minderjähriger' }, { value: 'illegal_content', label: 'Rechtswidriger Inhalt' }, { value: 'youth_protection', label: 'Jugendschutz' }, { value: 'offensive_content', label: 'Beleidigender / anstößiger Inhalt' }, { value: 'other', label: 'Sonstiges' }, ] export default function ReportContentModal({ targetType, targetId, targetLabel, onClose, onSuccess }) { const { user } = useAuth() const [reason, setReason] = useState('') const [description, setDescription] = useState('') const [name, setName] = useState(user?.name || '') const [email, setEmail] = useState(user?.email || '') const [confirmed, setConfirmed] = useState(false) const [saving, setSaving] = useState(false) const [error, setError] = useState(null) const [success, setSuccess] = useState(false) async function handleSubmit(e) { e.preventDefault() if (!reason) { setError('Bitte einen Meldegrund auswählen.'); return } if (description.trim().length < 10) { setError('Beschreibung muss mindestens 10 Zeichen haben.'); return } if (!name.trim()) { setError('Bitte deinen Namen eingeben.'); return } if (!email.trim()) { setError('Bitte deine E-Mail-Adresse eingeben.'); return } if (!confirmed) { setError('Bitte bestätige die Gutglaubenserklärung.'); return } setSaving(true) setError(null) try { await api.submitContentReport({ target_type: targetType, target_id: targetId, report_reason: reason, report_description: description.trim(), reporter_name: name.trim(), reporter_email: email.trim(), good_faith_confirmed: true, }) setSuccess(true) if (onSuccess) onSuccess() } catch (err) { setError(err.message || String(err)) } finally { setSaving(false) } } return (
{targetType === 'media_asset' ? 'Medium' : 'Übung'}: {targetLabel}
)} {success ? (Meldung eingegangen.
Deine Meldung wurde gespeichert und wird von unseren Moderatoren geprüft. Vielen Dank.