diff --git a/apps/admin-ui/src/app/dashboard/page.tsx b/apps/admin-ui/src/app/dashboard/page.tsx index b8a1afc..dff00bb 100644 --- a/apps/admin-ui/src/app/dashboard/page.tsx +++ b/apps/admin-ui/src/app/dashboard/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { Nav, useAuth } from "@/components/Nav"; interface Dashboard { @@ -11,6 +11,11 @@ interface Dashboard { movies: number; series: number; episodes: number; + availableMovies?: number; + availableSeries?: number; + mediaFiles?: number; + availableFiles?: number; + scannedFiles?: number; activeStreams: number; currentBandwidth: string; } @@ -38,8 +43,9 @@ export default function DashboardPage() { useAuth(); const [data, setData] = useState(null); const [error, setError] = useState(""); + const [dedupeMsg, setDedupeMsg] = useState(""); - useEffect(() => { + const load = useCallback(() => { fetch("/api/v1/admin/dashboard", { credentials: "include" }) .then(async (r) => { const json = await r.json(); @@ -54,6 +60,34 @@ export default function DashboardPage() { }); }, []); + useEffect(() => { + load(); + }, [load]); + + async function dedupe() { + if ( + !confirm( + "Duplicaten samenvoegen? Titels met dezelfde naam worden samengevoegd (TMDB-versie wint)." + ) + ) { + return; + } + setDedupeMsg("Bezig…"); + const res = await fetch("/api/v1/admin/library/dedupe", { + method: "POST", + credentials: "include", + }); + const json = await res.json(); + if (!res.ok) { + setDedupeMsg(json.error?.message ?? "Mislukt"); + return; + } + setDedupeMsg( + `Klaar: ${json.moviesMerged} film-duplicaten, ${json.seriesMerged} serie-duplicaten, ${json.emptied} lege records opgeruimd.` + ); + load(); + } + return ( <>