104 lines
3.0 KiB
TypeScript
104 lines
3.0 KiB
TypeScript
import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar";
|
|
import { FormAdminSidebar } from "@/components/form-admin-sidebar";
|
|
import { Metadata } from "next";
|
|
import { getServerSession } from "next-auth";
|
|
import { authOptions } from "@/lib/auth/auth-options";
|
|
import { getSessionDiscordId } from "@/lib/auth/auth";
|
|
import { getDiscordMemberProfile } from "@/lib/discord/discord";
|
|
import { db } from "@/db";
|
|
import { submissions } from "@/db/schema";
|
|
import { asc, eq } from "drizzle-orm";
|
|
import { notFound } from "next/navigation";
|
|
import { isFormAcceptingSubmissions } from "@/lib/form/form-availability";
|
|
|
|
export const metadata: Metadata = {
|
|
title: {
|
|
default: "Admin",
|
|
template: "%s | Erika!",
|
|
},
|
|
}
|
|
|
|
export default async function AdminFormLayout(
|
|
props: {
|
|
children: React.ReactNode;
|
|
params: Promise<{ id: string }>;
|
|
}
|
|
) {
|
|
const params = await props.params;
|
|
const [session, form] = await Promise.all([
|
|
getServerSession(authOptions),
|
|
db.query.forms.findFirst({
|
|
where: (record, { eq }) => eq(record.id, params.id),
|
|
}),
|
|
]);
|
|
|
|
if (!form) {
|
|
notFound();
|
|
}
|
|
|
|
const responseItems = await db
|
|
.select({
|
|
id: submissions.id,
|
|
userName: submissions.userName,
|
|
userDiscordId: submissions.userDiscordId,
|
|
})
|
|
.from(submissions)
|
|
.where(eq(submissions.formId, params.id))
|
|
.orderBy(asc(submissions.submittedAt), asc(submissions.id));
|
|
|
|
const responseDiscordIds = [
|
|
...new Set(
|
|
responseItems
|
|
.map((response) => response.userDiscordId)
|
|
.filter((value): value is string => Boolean(value))
|
|
),
|
|
];
|
|
const responseProfiles = Object.fromEntries(
|
|
await Promise.all(
|
|
responseDiscordIds.map(async (discordId) => [
|
|
discordId,
|
|
await getDiscordMemberProfile(discordId),
|
|
])
|
|
)
|
|
);
|
|
|
|
let profile = null;
|
|
const discordId = getSessionDiscordId(session);
|
|
if (discordId) {
|
|
profile = await getDiscordMemberProfile(discordId);
|
|
}
|
|
|
|
return (
|
|
<SidebarProvider>
|
|
<div className="flex w-full bg-background text-foreground">
|
|
<FormAdminSidebar
|
|
formId={params.id}
|
|
formTitle={form.title}
|
|
responseItems={responseItems.map((response, index) => ({
|
|
id: response.id,
|
|
displayName:
|
|
(response.userDiscordId
|
|
? responseProfiles[response.userDiscordId]?.globalName ||
|
|
responseProfiles[response.userDiscordId]?.username
|
|
: null) ||
|
|
response.userName ||
|
|
response.userDiscordId ||
|
|
"Anonymous",
|
|
queueNumber: index + 1,
|
|
}))}
|
|
isOpen={isFormAcceptingSubmissions(form)}
|
|
userName={session?.user?.name || ""}
|
|
userImage={session?.user?.image || ""}
|
|
profile={profile}
|
|
/>
|
|
<div className="min-w-0 flex-1 overflow-hidden">
|
|
<div className="md:hidden p-2">
|
|
<SidebarTrigger />
|
|
</div>
|
|
<main>{props.children}</main>
|
|
</div>
|
|
</div>
|
|
</SidebarProvider>
|
|
);
|
|
}
|