39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
"use client";
|
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
export default function HistoryPage() {
|
|
const [data, setData] = useState<{ downloads: { id: string }[]; failed: { source: string; media_type: string; id: string }[] } | null>(null);
|
|
|
|
useEffect(() => {
|
|
fetch("/api/history").then((r) => r.json()).then(setData).catch(() => {});
|
|
}, []);
|
|
|
|
async function redownload(source: string, media_type: string, id: string) {
|
|
await fetch("/api/downloads", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ source, media_type, id, no_db: true }),
|
|
});
|
|
alert("Re-Download queued — siehe Queue");
|
|
}
|
|
|
|
if (!data) return <p className="muted">Lädt …</p>;
|
|
return (
|
|
<div>
|
|
<h1>Verlauf</h1>
|
|
<h2>Downloads ({data.downloads.length})</h2>
|
|
<ul>{data.downloads.slice(-50).reverse().map((d) => <li key={d.id}>{d.id}</li>)}</ul>
|
|
<h2>Fehlgeschlagen ({data.failed.length})</h2>
|
|
<ul>
|
|
{data.failed.map((f) => (
|
|
<li key={`${f.source}-${f.media_type}-${f.id}`}>
|
|
{f.source} {f.media_type} {f.id}{" "}
|
|
<button onClick={() => redownload(f.source, f.media_type, f.id)} className="btn">Erneut laden</button>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
);
|
|
}
|