feat: add Discord profile dropdown menu with role display and integrate with admin and form layouts via AdminShellServer.
This commit is contained in:
@@ -38,6 +38,7 @@ import Image from 'next/image';
|
||||
import { RichTextEditor } from "@/components/rich-text-editor";
|
||||
import { FormattedText } from "@/components/formatted-text";
|
||||
import { ThemeToggle } from "@/components/theme-toggle";
|
||||
import { DropdownMenuAvatar, DiscordMemberProfile } from "@/components/dropdown-menu-avatar";
|
||||
|
||||
interface Question {
|
||||
id: string;
|
||||
@@ -609,7 +610,17 @@ function AnswerPreview({ question }: { question: Question }) {
|
||||
);
|
||||
}
|
||||
|
||||
export function AdminSidebar({ formId }: { formId: string }) {
|
||||
export function AdminSidebar({
|
||||
formId,
|
||||
userName,
|
||||
userImage,
|
||||
profile,
|
||||
}: {
|
||||
formId: string;
|
||||
userName?: string;
|
||||
userImage?: string;
|
||||
profile?: DiscordMemberProfile | null;
|
||||
}) {
|
||||
const pathname = usePathname();
|
||||
|
||||
return (
|
||||
@@ -618,7 +629,17 @@ export function AdminSidebar({ formId }: { formId: string }) {
|
||||
<span className="font-bold tracking-wider text-primary text-sm uppercase">
|
||||
Form Admin
|
||||
</span>
|
||||
<ThemeToggle />
|
||||
<div className="flex items-center gap-1">
|
||||
{(userName || profile) && (
|
||||
<DropdownMenuAvatar
|
||||
userName={userName || ""}
|
||||
userImage={userImage || ""}
|
||||
profile={profile || null}
|
||||
showName={false}
|
||||
/>
|
||||
)}
|
||||
<ThemeToggle />
|
||||
</div>
|
||||
</SidebarHeader>
|
||||
|
||||
<SidebarContent>
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar";
|
||||
import { AdminSidebar } from "./client";
|
||||
import { Metadata } from "next";
|
||||
import { getServerSession } from "next-auth";
|
||||
import { authOptions } from "@/app/api/auth/[...nextauth]/route";
|
||||
import { getDiscordMemberProfile } from "@/app/actions/discord";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: {
|
||||
@@ -16,11 +19,23 @@ export default async function AdminFormLayout(
|
||||
}
|
||||
) {
|
||||
const params = await props.params;
|
||||
const session = await getServerSession(authOptions);
|
||||
|
||||
let profile = null;
|
||||
const discordId = (session?.user as any)?.discordId;
|
||||
if (discordId) {
|
||||
profile = await getDiscordMemberProfile(discordId);
|
||||
}
|
||||
|
||||
return (
|
||||
<SidebarProvider>
|
||||
<div className="flex w-full bg-background text-foreground">
|
||||
<AdminSidebar formId={params.id} />
|
||||
<AdminSidebar
|
||||
formId={params.id}
|
||||
userName={session?.user?.name || ""}
|
||||
userImage={session?.user?.image || ""}
|
||||
profile={profile}
|
||||
/>
|
||||
<div className="flex-1 overflow-hidden">
|
||||
<div className="md:hidden p-2">
|
||||
<SidebarTrigger />
|
||||
|
||||
@@ -13,7 +13,7 @@ import { Badge } from "@/components/ui/badge";
|
||||
import { Plus } from "lucide-react";
|
||||
import { redirect } from "next/navigation";
|
||||
import { DeleteFormButton } from "@/components/delete-buttons";
|
||||
import { AdminShell } from "@/components/admin-shell";
|
||||
import { AdminShellServer } from "@/components/admin-shell-server";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
@@ -23,7 +23,7 @@ export default async function AdminFormsPage() {
|
||||
});
|
||||
|
||||
return (
|
||||
<AdminShell>
|
||||
<AdminShellServer>
|
||||
<div className="space-y-6 p-4 md:p-6 pb-12 w-full">
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
@@ -100,6 +100,6 @@ export default async function AdminFormsPage() {
|
||||
</Table>
|
||||
</div>
|
||||
</div>
|
||||
</AdminShell>
|
||||
</AdminShellServer>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user