diff --git a/components/layout/MemberSidebar.tsx b/components/layout/MemberSidebar.tsx index 6e43ef1..7c4e4f3 100644 --- a/components/layout/MemberSidebar.tsx +++ b/components/layout/MemberSidebar.tsx @@ -1,6 +1,6 @@ /** * @file components/layout/MemberSidebar.tsx - * @description Member sidebar component displaying server members with desktop sliding panel and mobile drawer functionality. + * @description Sidebar component fetching and displaying the server member list with responsive overlay support. */ "use client"; @@ -11,15 +11,15 @@ import { useActiveServer } from "@/lib/context/ServerContext"; import { MemberList } from "@/components/members/MemberList"; import { X, Loader2 } from "lucide-react"; import { clsx } from "clsx"; -import { User } from "@/db/schema"; +import type { User } from "@/db/schema"; -/** Properties for the MemberHeader component. */ +/** Props for the MemberHeader component. */ interface MemberHeaderProps { title: string; onClose: () => void; } -/** Renders the header section of the member sidebar with a title and close button. */ +/** Header element for the member sidebar with title and close button. */ function MemberHeader({ title, onClose }: MemberHeaderProps) { return (
@@ -38,7 +38,7 @@ function MemberHeader({ title, onClose }: MemberHeaderProps) { ); } -/** Displays the list of members for the active server in a responsive sidebar or drawer layout. */ +/** Collapsible sidebar component displaying members of the currently active server. */ export function MemberSidebar() { const { isMembersOpen, closeMembers } = useSidebarStore(); const { activeServer } = useActiveServer(); @@ -85,7 +85,14 @@ export function MemberSidebar() { useEffect(() => { function handleClickOutside(event: MouseEvent) { const target = event.target as HTMLElement; - if (target.closest('button[title*="Mitgliederliste"]')) return; + + if ( + target.closest('button[title*="Mitgliederliste"]') || + target.closest('[role="dialog"]') || + target.closest(".user-profile-popover") + ) { + return; + } if ( isMembersOpen && @@ -102,7 +109,7 @@ export function MemberSidebar() { return () => document.removeEventListener("mousedown", handleClickOutside); }, [isMembersOpen, closeMembers]); - /** Renders either a loading spinner or the populated member list depending on state. */ + /** Renders loading indicator or the member list depending on state. */ const renderContent = () => { if (isLoading && members.length === 0) { return ( @@ -116,17 +123,23 @@ export function MemberSidebar() { return ( <> - {/* Desktop View */} + {isMembersOpen && ( +
+ )} + - - {/* Mobile Backdrop & Drawer */} - {isMembersOpen && ( -
- )} - -
- -
{renderContent()}
-
); }