import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { toast } from "sonner"; import { MoreVertical, Plus, RotateCcw } from "lucide-react"; import { usePagesStore } from "@/stores/pagesStore"; import StatusBadge from "@/components/dashboard/StatusBadge"; import { Button } from "@/components/ui/button"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Popover, PopoverTrigger, PopoverContent, } from "@/components/ui/popover"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; export default function DashboardView() { const { pages, isLoading, fetchPages, deletePage } = usePagesStore(); const navigate = useNavigate(); const [pageToDelete, setPageToDelete] = useState(null); const [restarting, setRestarting] = useState(false); const handleRestart = async () => { setRestarting(true); try { const res = await fetch("/api/restart", { method: "POST" }); if (!res.ok) throw new Error(await res.text()); toast.success("NomadNet restarted"); } catch (e) { toast.error(`Restart failed: ${e}`); } finally { setRestarting(false); } }; useEffect(() => { fetchPages(); }, []); const handleUnpublish = async (name: string) => { try { const res = await fetch(`/api/pages/${name}`); const data = await res.json(); if (data.source) { await fetch(`/api/pages/${name}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ source: data.source, publish: false }), }); toast.success(`"${name}" unpublished`); fetchPages(); } } catch (e) { toast.error(`Failed: ${e}`); } }; const handlePublish = async (name: string) => { try { const res = await fetch(`/api/pages/${name}`); const data = await res.json(); if (data.source) { await fetch(`/api/pages/${name}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ source: data.source, publish: true }), }); toast.success(`"${name}" published`); fetchPages(); } } catch (e) { toast.error(`Failed: ${e}`); } }; const handleDelete = async () => { if (!pageToDelete) return; await deletePage(pageToDelete); toast.success(`"${pageToDelete}" deleted`); setPageToDelete(null); }; if (isLoading) return (
Loading...
); return (
{/* Header row */}

Pages

{/* Table inside bordered container */} Name Title Status Size {pages.map((p) => ( navigate(`/editor/${p.name}`)} > {p.name} {p.name === "index" && ( homepage )} {p.title ?? "—"} {p.size != null ? `${p.size} B` : "—"} e.stopPropagation()} className="p-1 text-muted-foreground hover:text-foreground transition-colors cursor-pointer" > } /> {p.published ? ( ) : ( )} ))} {pages.length === 0 && ( No pages yet. Create one to get started. )}
{/* end bordered container */} !open && setPageToDelete(null)} > Delete "{pageToDelete}"? This permanently deletes the page and its source. This cannot be undone. Cancel Delete
); }