Files
erika/app/admin/form/[id]/layout.tsx
T

68 lines
2.0 KiB
TypeScript

import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar";
import { FormAdminSidebar } from "./sidebar-client";
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 { count, eq } from "drizzle-orm";
import { notFound } from "next/navigation";
import { isFormAcceptingSubmissions } from "@/lib/form/form-availability";
export const metadata: Metadata = {
title: "Admin Form",
}
export default async function AdminFormLayout(
props: {
children: React.ReactNode;
params: Promise<{ id: string }>;
}
) {
const params = await props.params;
const [session, form, [{ responseCount }]] = await Promise.all([
getServerSession(authOptions),
db.query.forms.findFirst({
where: (record, { eq }) => eq(record.id, params.id),
}),
db
.select({ responseCount: count() })
.from(submissions)
.where(eq(submissions.formId, params.id)),
]);
if (!form) {
notFound();
}
let profile = null;
const discordId = getSessionDiscordId(session);
if (discordId) {
profile = await getDiscordMemberProfile(discordId);
}
return (
<SidebarProvider>
<div className="flex min-h-svh w-full bg-background text-foreground">
<FormAdminSidebar
formId={params.id}
formTitle={form.title}
responseCount={responseCount}
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 className="w-full">{props.children}</main>
</div>
</div>
</SidebarProvider>
);
}