/** * @file components/layout/MemberSidebar.tsx * @description Sidebar component displaying the server member list directly from activeServer context. */ "use client"; import { useEffect, useRef } from "react"; import { useSidebarStore } from "@/lib/stores/useSidebarStore"; import { useActiveServer } from "@/lib/context/ServerContext"; import { MemberList } from "@/components/members/MemberList"; import { X } from "lucide-react"; import { clsx } from "clsx"; /** Props for the MemberHeader component. */ interface MemberHeaderProps { title: string; onClose: () => void; } /** Header component for the member sidebar with close button. */ function MemberHeader({ title, onClose }: MemberHeaderProps) { return (
Members
); } /** Sidebar component displaying active server members with responsive drawer behavior. */ export function MemberSidebar() { const { isMembersOpen, closeMembers } = useSidebarStore(); const { activeServer } = useActiveServer(); const desktopSidebarRef = useRef(null); const members = activeServer?.members ?? []; /** Closes the members sidebar when clicking outside of it. */ useEffect(() => { function handleClickOutside(event: MouseEvent) { const target = event.target as HTMLElement; if (document.querySelector("[data-user-profile-popover]") !== null) { return; } if ( isMembersOpen && desktopSidebarRef.current && !desktopSidebarRef.current.contains(target) ) { closeMembers(); } } if (isMembersOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => document.removeEventListener("mousedown", handleClickOutside); }, [isMembersOpen, closeMembers]); return ( <> {isMembersOpen && (
)} ); }