feat: add Discord profile dropdown menu with role display and integrate with admin and form layouts via AdminShellServer.

This commit is contained in:
2026-07-03 23:02:15 +07:00 Unverified
parent 6cb28421e6
commit ac6c35598c
12 changed files with 413 additions and 83 deletions
+23 -2
View File
@@ -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>
+16 -1
View File
@@ -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 />
+3 -3
View File
@@ -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>
);
}