feat: admin list

This commit is contained in:
2024-10-04 18:00:37 +01:00
parent d7b332905b
commit 2b194ad10c
19 changed files with 395 additions and 29 deletions

View File

@ -6,21 +6,25 @@ import { Blossom } from "../upload/blossom";
import useLogin from "../hooks/login";
import usePublisher from "../hooks/publisher";
import { Nip96, Nip96FileList } from "../upload/nip96";
import { Route96 } from "../upload/admin";
export default function Upload() {
const [type, setType] = useState<"blossom" | "nip96">("nip96");
const [noCompress, setNoCompress] = useState(false);
const [toUpload, setToUpload] = useState<File>();
const [self, setSelf] = useState<{ is_admin: boolean }>();
const [error, setError] = useState<string>();
const [results, setResults] = useState<Array<object>>([]);
const [listedFiles, setListedFiles] = useState<Nip96FileList>();
const [adminListedFiles, setAdminListedFiles] = useState<Nip96FileList>();
const [listedPage, setListedPage] = useState(0);
const [adminListedPage, setAdminListedPage] = useState(0);
const login = useLogin();
const pub = usePublisher();
const url = `${location.protocol}//${location.host}`;
//const url = "https://files.v0l.io";
//const url = "http://localhost:8000";
async function doUpload() {
if (!pub) return;
if (!toUpload) return;
@ -67,10 +71,39 @@ export default function Upload() {
}
}
async function listAllUploads(n: number) {
if (!pub) return;
try {
setError(undefined);
const uploader = new Route96(url, pub);
const result = await uploader.listFiles(n, 12);
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");
}
}
}
useEffect(() => {
listUploads(listedPage);
}, [listedPage]);
useEffect(() => {
listAllUploads(adminListedPage);
}, [adminListedPage]);
useEffect(() => {
if (pub && !self) {
const r96 = new Route96(url, pub);
r96.getSelf().then((v) => setSelf(v.data));
}
}, [pub, self]);
return (
<div className="flex flex-col gap-2 bg-neutral-700 p-8 rounded-xl w-full">
<h1 className="text-lg font-bold">
@ -121,6 +154,7 @@ export default function Upload() {
<Button disabled={login === undefined} onClick={() => listUploads(0)}>
List Uploads
</Button>
{listedFiles && (
<FileList
files={listedFiles.files}
@ -129,6 +163,21 @@ export default function Upload() {
onPage={(x) => setListedPage(x)}
/>
)}
{self?.is_admin && (
<>
<h3>Admin File List:</h3>
<Button onClick={() => listAllUploads(0)}>List All Uploads</Button>
{adminListedFiles && (
<FileList
files={adminListedFiles.files}
pages={adminListedFiles.total / adminListedFiles.count}
page={adminListedFiles.page}
onPage={(x) => setAdminListedPage(x)}
/>
)}
</>
)}
{error && <b className="text-red-500">{error}</b>}
<pre className="text-xs font-monospace overflow-wrap">
{JSON.stringify(results, undefined, 2)}