/** * @file components/layout/MemberDrawer.tsx * @description Responsive drawer and sidebar component that manages the visibility, mobile overlay, click-outside dismissal, and rendering of the member list. */ "use client"; import { useEffect, useRef } from "react"; import { useSidebarStore } from "@/lib/stores/useSidebarStore"; import { MemberSidebar } from "@/components/sidebar/MemberSidebar"; import { X } from "lucide-react"; import { clsx } from "clsx"; /** * Renders the desktop sidebar panel and mobile drawer for displaying channel members, handling state triggers and click-outside closing logic. * * @returns {JSX.Element} The rendered member drawer component for desktop and mobile views. */ export function MemberDrawer() { const { isMembersOpen, closeMembers } = useSidebarStore(); const desktopSidebarRef = useRef(null); useEffect(() => { /** * Handles mouse click events outside of the desktop sidebar to close it. * * @param {MouseEvent} event - The native DOM mouse event. */ function handleClickOutside(event: MouseEvent) { const target = event.target as HTMLElement; if (target.closest('button[title*="Mitgliederliste"]')) return; if ( isMembersOpen && desktopSidebarRef.current && !desktopSidebarRef.current.contains(target) ) { closeMembers(); } } if (isMembersOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => document.removeEventListener("mousedown", handleClickOutside); }, [isMembersOpen, closeMembers]); /** * Internal header component for the member drawer containing title labeling and close action button. * * @param {Object} props - The component props. * @param {string} props.title - The tooltip title for the close button. * @returns {JSX.Element} The header element. */ const Header = ({ title }: { title: string }) => (
Members
); return ( <> {/* Desktop View */} {/* Mobile Backdrop & Drawer */} {isMembersOpen && (
)}
); }