Admin done

This commit is contained in:
Dreamgineer
2025-09-24 03:59:20 -04:00 Unverified
parent 639e83eaeb
commit f4307e0090
14 changed files with 417 additions and 83 deletions
+46
View File
@@ -0,0 +1,46 @@
"use client";
import { Copy, CopyCheck, Loader2 } from "lucide-react";
import { useEffect, useState } from "react";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
export function EnkaBrowser({ uid }: { uid: string }) {
const [id, setId] = useState(uid);
const [ready, setReady] = useState(false);
useEffect(() => {
setId(uid);
setReady(false);
}, [uid]);
return (
<div className="h-full w-full relative">
{!ready && (
<Loader2 className="animate-spin absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 size-8 text-muted-foreground z-100" />
)}
<iframe
src={`https://enka.network/u/${id}`}
className={cn(
"w-full border-0 bg-card -mt-20 h-[calc(100%+5rem)]",
!ready && "grayscale blur-md brightness-50 pointer-events-none",
)}
title="Enka Network"
onLoad={() => setReady(true)}
/>
</div>
);
}
export function CopyButton({ text }: { text: string }) {
const [copied, setCopied] = useState(false);
async function copy() {
if (copied) return;
await navigator.clipboard.writeText(text);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
}
return (
<Button variant="ghost" size="icon" onClick={copy} disabled={copied}>
{copied ? <CopyCheck /> : <Copy />}
</Button>
);
}
+64
View File
@@ -0,0 +1,64 @@
import { eq } from "drizzle-orm";
import Avatar from "@/components/avatar";
import {
Card,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { db } from "@/lib/db";
import { characters, submissions } from "@/lib/db/schema";
import { CopyButton, EnkaBrowser } from "./client";
export const revalidate = 86400; // 24 hours
export async function generateStaticParams() {
return await db.select({ id: submissions.id }).from(submissions);
}
export default async function AdminSubmissionView({
params,
}: {
params: Promise<{ id: string }>;
}) {
const { id } = await params;
const [sub] = await db
.select()
.from(submissions)
.where(eq(submissions.id, id))
.limit(1);
const [char] = await db
.select()
.from(characters)
.where(eq(characters.name, sub?.char || ""))
.limit(1);
return (
<div className="p-2 h-full">
<div className="flex flex-col h-full w-full gap-2">
<div className="flex w-full justify-between gap-2">
<Card className="w-full pb-1">
<CardHeader>
<CardTitle>
{sub.queue}. {sub.name}
</CardTitle>
<CardDescription>
{sub.comment}
</CardDescription>
</CardHeader>
<CardFooter className="h-full items-end">
<div className="flex items-center">
<span className="text-gray-500">{sub.uid}</span>
<CopyButton text={sub.uid} />
</div>
</CardFooter>
</Card>
<Avatar char={char} />
</div>
<div className="border rounded-md h-full overflow-hidden">
<EnkaBrowser uid={sub?.uid || ""} />
</div>
</div>
</div>
);
}