import { useEffect, useState, useCallback } from "react"; import { Navigate } from "react-router-dom"; import Button from "../components/button"; import FileList from "./files"; import ReportList from "./reports"; import { Blossom } from "../upload/blossom"; import useLogin from "../hooks/login"; import usePublisher from "../hooks/publisher"; import { Nip96FileList } from "../upload/nip96"; import { AdminSelf, Route96, Report } from "../upload/admin"; export default function Admin() { const [self, setSelf] = useState(); const [error, setError] = useState(); const [adminListedFiles, setAdminListedFiles] = useState(); const [reports, setReports] = useState(); const [reportPages, setReportPages] = useState(); const [reportPage, setReportPage] = useState(0); const [adminListedPage, setAdminListedPage] = useState(0); const [mimeFilter, setMimeFilter] = useState(); const [loading, setLoading] = useState(true); const login = useLogin(); const pub = usePublisher(); const url = import.meta.env.VITE_API_URL || `${location.protocol}//${location.host}`; const listAllUploads = useCallback( async (n: number) => { if (!pub) return; try { setError(undefined); const uploader = new Route96(url, pub); const result = await uploader.listFiles(n, 50, mimeFilter); setAdminListedFiles(result); } catch (e) { if (e instanceof Error) { setError(e.message.length > 0 ? e.message : "Upload failed"); } else if (typeof e === "string") { setError(e); } else { setError("List files failed"); } } }, [pub, url, mimeFilter], ); const listReports = useCallback( async (n: number) => { if (!pub) return; try { setError(undefined); const route96 = new Route96(url, pub); const result = await route96.listReports(n, 10); setReports(result.files); setReportPages(Math.ceil(result.total / result.count)); } catch (e) { if (e instanceof Error) { setError(e.message.length > 0 ? e.message : "List reports failed"); } else if (typeof e === "string") { setError(e); } else { setError("List reports failed"); } } }, [pub, url], ); async function acknowledgeReport(reportId: number) { if (!pub) return; try { setError(undefined); const route96 = new Route96(url, pub); await route96.acknowledgeReport(reportId); await listReports(reportPage); } catch (e) { if (e instanceof Error) { setError( e.message.length > 0 ? e.message : "Acknowledge report failed", ); } else if (typeof e === "string") { setError(e); } else { setError("Acknowledge report failed"); } } } async function deleteFile(id: string) { if (!pub) return; try { setError(undefined); const uploader = new Blossom(url, pub); await uploader.delete(id); } catch (e) { if (e instanceof Error) { setError(e.message.length > 0 ? e.message : "Upload failed"); } else if (typeof e === "string") { setError(e); } else { setError("List files failed"); } } } useEffect(() => { if (pub && !self) { const r96 = new Route96(url, pub); r96 .getSelf() .then((v) => { setSelf(v.data); setLoading(false); }) .catch(() => { setLoading(false); }); } }, [pub, self, url]); useEffect(() => { if (pub && self?.is_admin) { listAllUploads(adminListedPage); } }, [adminListedPage, pub, self?.is_admin, listAllUploads]); useEffect(() => { if (pub && self?.is_admin) { listReports(reportPage); } }, [reportPage, pub, self?.is_admin, listReports]); if (loading) { return (
Loading...
); } if (!login) { return (

Authentication Required

Please log in to access the admin panel.

); } if (!self?.is_admin) { return ; } return (

Admin Panel

{error && (
{error}
)}

File Management

Reports Management

{adminListedFiles && (

All Files

setAdminListedPage(x)} onDelete={async (x) => { await deleteFile(x); await listAllUploads(adminListedPage); }} />
)} {reports && (

Reports

setReportPage(x)} onAcknowledge={acknowledgeReport} onDeleteFile={async (fileId) => { await deleteFile(fileId); await listReports(reportPage); }} />
)}
); }