MCPcopy Create free account
hub / github.com/R44VC0RP/opencode.cafe / AdminExtensionsPage

Function AdminExtensionsPage

app/admin/extensions/page.tsx:43–264  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

41type StatusFilter = "all" | "pending" | "approved" | "rejected"
42
43export default function AdminExtensionsPage() {
44 const isAdmin = useQuery(api.admin.isAdmin)
45 const [statusFilter, setStatusFilter] = useState<StatusFilter>("all")
46 const [deletingId, setDeletingId] = useState<Id<"extensions"> | null>(null)
47 const [isDeleting, setIsDeleting] = useState(false)
48
49 // Only fetch extensions after confirming user is admin
50 const extensions = useQuery(
51 api.admin.listAll,
52 isAdmin
53 ? statusFilter === "all"
54 ? {}
55 : { status: statusFilter }
56 : "skip"
57 )
58 const deleteExtension = useMutation(api.admin.deleteExtension)
59
60 if (isAdmin === false) {
61 return (
62 <div className="min-h-screen bg-[var(--color-bg)]">
63 <Header />
64 <section className="border-b border-[var(--color-border-weak)] px-[var(--padding)] py-[var(--vertical-padding)]">
65 <div className="mx-auto max-w-[67.5rem]">
66 <h1 className="text-2xl font-semibold text-[var(--color-text-strong)]">Access Denied</h1>
67 </div>
68 </section>
69 <main className="px-[var(--padding)] py-[var(--vertical-padding)]">
70 <div className="mx-auto max-w-[67.5rem]">
71 <p className="text-[var(--color-text)]">You do not have permission to access this page.</p>
72 </div>
73 </main>
74 </div>
75 )
76 }
77
78 if (isAdmin === undefined || extensions === undefined) {
79 return (
80 <div className="min-h-screen bg-[var(--color-bg)]">
81 <Header />
82 <div className="mx-auto max-w-[67.5rem] px-[var(--padding)] py-[var(--vertical-padding)]">
83 <div className="animate-pulse">
84 <div className="h-8 w-48 rounded bg-[var(--color-bg-weak)]" />
85 <div className="mt-8 flex flex-col gap-4">
86 {[...Array(5)].map((_, i) => (
87 <div key={i} className="h-24 rounded-md border border-[var(--color-border-weak)] bg-[var(--color-bg-weak)]" />
88 ))}
89 </div>
90 </div>
91 </div>
92 </div>
93 )
94 }
95
96 async function handleDelete() {
97 if (!deletingId) return
98 setIsDeleting(true)
99 try {
100 await deleteExtension({ extensionId: deletingId })

Callers

nothing calls this directly

Calls 1

getStatusBadgeFunction · 0.85

Tested by

no test coverage detected