import { useEffect, useState } from "react"; import api from "../lib/api"; import { toast } from "sonner"; import { Trash2, Star, Film, Settings as SettingsIcon, Download, RefreshCcw } from "lucide-react"; import { useNavigate, Link } from "react-router-dom"; export default function Admin() { const nav = useNavigate(); const [movies, setMovies] = useState([]); const [transcoding, setTranscoding] = useState({}); const load = async () => { const { data } = await api.get("/movies"); setMovies(data); }; useEffect(() => { load(); }, []); // Poll for transcoding status useEffect(() => { const inProgress = movies.some((m) => m.hls_status === "running" || m.hls_status === "pending"); if (!inProgress) return; const t = setInterval(load, 3000); return () => clearInterval(t); }, [movies]); const remove = async (id) => { if (!window.confirm("Remove this movie permanently?")) return; await api.delete(`/movies/${id}`); toast.success("Removed"); load(); }; const toggleFeatured = async (m) => { await api.patch(`/movies/${m.id}`, { featured: !m.featured }); load(); }; const startTranscode = async (m) => { setTranscoding({ ...transcoding, [m.id]: true }); try { await api.post(`/movies/${m.id}/transcode`); toast.success("Transcoding started — refresh in a few minutes"); load(); } catch (err) { toast.error(err.response?.data?.detail || "Could not start transcode"); } finally { setTranscoding({ ...transcoding, [m.id]: false }); } }; const hlsStatusBadge = (m) => { if (!m.hls_status) return null; const colors = { pending: "text-[#fcd34d]", running: "text-[#fcd34d]", done: "text-[#86efac]", failed: "text-[#fca5a5]", }; return HLS {m.hls_status}; }; return (
Manage your library, requests, integrations.