Admin done
This commit is contained in:
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user