"use client"; import { useCallback, useEffect, useState, useTransition } from "react"; import { usePathname } from "next/navigation"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarInput, } from "@/components/ui/sidebar"; import { ScrollArea } from "@/components/ui/scroll-area"; import { ArrowLeft, ClipboardList, ChevronRight, Eye, FilePenLine, LayoutDashboard, Settings, Search, } from "lucide-react"; import { ThemeToggle } from "@/components/theme-toggle"; import { DropdownMenuAvatar, type DiscordMemberProfile, } from "@/components/dropdown-menu-avatar"; import { GuardedLink } from "@/components/guarded-link"; import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { getResponseNavigation } from "@/app/admin/form/actions"; type ResponseNavigationData = Awaited>; export function FormAdminSidebar({ formId, formTitle, isOpen, userName, userImage, profile, responseCount, }: { formId: string; formTitle: string; isOpen: boolean; userName?: string; userImage?: string; profile?: DiscordMemberProfile | null; responseCount: number; }) { const pathname = usePathname(); const [responsesOpen, setResponsesOpen] = useState( pathname.startsWith(`/admin/form/${formId}/result/`), ); const [responseQuery, setResponseQuery] = useState(""); const [responseData, setResponseData] = useState(null); const [responseError, setResponseError] = useState(null); const [isLoadingResponses, startResponseTransition] = useTransition(); const loadResponses = useCallback((page: number, query = responseQuery) => { startResponseTransition(async () => { try { setResponseError(null); setResponseData(await getResponseNavigation(formId, page, query)); } catch { setResponseError("Could not load responses."); } }); }, [formId, responseQuery]); useEffect(() => { if (responsesOpen && responseCount > 0 && !responseData) { loadResponses(1, ""); } }, [loadResponses, responsesOpen, responseCount, responseData]); const currentSection = pathname.startsWith(`/admin/form/${formId}/result`) ? "Responses" : pathname.startsWith(`/admin/form/${formId}/extra`) ? "Settings" : pathname.startsWith(`/admin/form/${formId}/preview`) ? "Preview" : "Editor"; const items = [ { href: `/admin/form/${formId}`, label: "Editor", icon: LayoutDashboard, active: pathname === `/admin/form/${formId}`, }, { href: `/admin/form/${formId}/result`, label: "Responses", icon: ClipboardList, active: pathname.startsWith(`/admin/form/${formId}/result`), }, { href: `/admin/form/${formId}/extra`, label: "Settings", icon: Settings, active: pathname.startsWith(`/admin/form/${formId}/extra`), }, { href: `/admin/form/${formId}/preview`, label: "Preview", icon: Eye, active: pathname.startsWith(`/admin/form/${formId}/preview`), }, ]; return (
{formTitle} {isOpen ? "Open" : "Closed"}
{currentSection}
All forms
Workspace {items.map(({ href, label, icon: Icon, active }) => ( {label} {label === "Responses" && responseCount > 0 && ( {responseCount} )} {label === "Responses" && responseCount > 0 && ( setResponsesOpen((open) => !open)} aria-label={`${responsesOpen ? "Collapse" : "Expand"} responses`} aria-expanded={responsesOpen} > )} {label === "Responses" && responsesOpen && responseCount > 0 && (
{ event.preventDefault(); loadResponses(1); }} > setResponseQuery(event.target.value)} placeholder="Search responses" aria-label="Search response navigation" /> {responseData?.items.map((response) => { const responseHref = `/admin/form/${formId}/result/${response.id}`; return ( {response.queueNumber}. {response.displayName} ); })} {isLoadingResponses && !responseData && ( Loading responses… )} {responseError && ( {responseError} )} {responseData && responseData.pageCount > 1 && (
{responseData.page} / {responseData.pageCount}
)}
)}
))}
{(userName || profile) && ( )}
); }