import { useState, useEffect } from 'react' import { X, Film, Loader2, FolderOpen, AlertCircle } from 'lucide-react' import { api } from '../lib/api' import { useDarkMode } from '../context/ThemeContext' // Klick auf den Titel in „Neueste Jobs" (Commander-Wunsch 24.07.): sofort // sehen, WAS da gerippt wurde — Poster, Jahr, Beschreibung — plus die // nüchternen Job-Fakten (Ziel, Ausgabepfad, Fehler). interface JobMeta { year?: number overview?: string poster_path?: string genres?: string[] runtime?: number type?: string source?: string } interface JobDetail { id: string type: string status: string device: string startTime: string endTime?: string progress: number title?: string error?: string target_dir?: string output_path?: string meta?: JobMeta | null } // TMDB liefert relative Poster-Pfade, OMDb/Jikan absolute URLs function posterUrl(meta?: JobMeta | null): string | null { const p = meta?.poster_path if (!p) return null return p.startsWith('http') ? p : `https://image.tmdb.org/t/p/w342${p}` } const STATUS_LABEL: Record = { pending: 'Wartend', processing: 'Rippen', transcoding: 'Komprimieren', canceling: 'Wird abgebrochen…', completed: 'Fertig', failed: 'Fehler', } export default function JobDetailModal({ jobId, onClose }: { jobId: string | null, onClose: () => void }) { const [detail, setDetail] = useState(null) const [laedt, setLaedt] = useState(false) const { theme } = useDarkMode() useEffect(() => { if (!jobId) { setDetail(null) return } setLaedt(true) api.get(`/jobs/${jobId}/detail`) .then(r => setDetail(r.data)) .catch(() => setDetail(null)) .finally(() => setLaedt(false)) }, [jobId]) if (!jobId) return null const meta = detail?.meta const poster = posterUrl(meta) return (
e.stopPropagation()} >

{detail?.title || 'Job-Details'}

{laedt ? (
) : !detail ? (

Job nicht gefunden.

) : (
{/* Film/Serien-Info aus der Disc-Erkennung */}
{poster ? ( {detail.title ) : (
)}

{detail.title || 'Unbekannt'} {meta?.year ? ({meta.year}) : null}

{meta?.type === 'tv' ? 'Serie' : 'Film'} {meta?.source ? ` · Quelle: ${meta.source}` : ''} {meta?.runtime ? ` · ${meta.runtime} min` : ''}

{meta?.genres && meta.genres.length > 0 && (
{meta.genres.map(g => ( {g} ))}
)} {meta?.overview ? (

{meta.overview}

) : (

Keine Metadaten zu diesem Job gespeichert — die Disc wurde ohne Erkennung gerippt.

)}
{/* Nüchterne Job-Fakten */}
Status {STATUS_LABEL[detail.status] || detail.status}{detail.progress > 0 && detail.progress < 100 ? ` · ${detail.progress} %` : ''} Laufwerk {detail.device || '—'} Gestartet {detail.startTime ? new Date(detail.startTime).toLocaleString('de-DE') : '—'} Beendet {detail.endTime ? new Date(detail.endTime).toLocaleString('de-DE') : '—'} {(detail.output_path || detail.target_dir) && ( <> Ablage {detail.output_path || detail.target_dir} )}
{detail.error && (
{detail.error}
)}
)}
) }