"use client" import * as React from "react" import Link from "next/link" import { usePathname } from "next/navigation" import { useMedia } from "react-use" import { useAtom } from "jotai" import { SearchIcon } from "lucide-react" import { Logo } from "@/components/custom/logo" import { Button } from "@/components/ui/button" import { cn } from "@/lib/utils" import { isCollapseAtom } from "@/store/sidebar" import { LinkSection } from "./partial/link-section" import { PageSection } from "./partial/page-section" import { TopicSection } from "./partial/topic-section" import { ProfileSection } from "./partial/profile-section" import { useAccountOrGuest } from "@/lib/providers/jazz-provider" interface SidebarContextType { isCollapsed: boolean setIsCollapsed: React.Dispatch> } const SidebarContext = React.createContext({ isCollapsed: false, setIsCollapsed: () => {} }) const useSidebarCollapse = (isTablet: boolean): [boolean, React.Dispatch>] => { const [isCollapsed, setIsCollapsed] = useAtom(isCollapseAtom) const pathname = usePathname() React.useEffect(() => { if (isTablet) setIsCollapsed(true) }, [pathname, setIsCollapsed, isTablet]) React.useEffect(() => { setIsCollapsed(isTablet) }, [isTablet, setIsCollapsed]) return [isCollapsed, setIsCollapsed] } interface SidebarItemProps { label: string url: string icon?: React.ReactNode onClick?: () => void children?: React.ReactNode } const SidebarItem: React.FC = React.memo(({ label, url, icon, onClick, children }) => { const pathname = usePathname() const isActive = pathname === url return (
{icon && ( {icon} )} {label} {children}
) }) SidebarItem.displayName = "SidebarItem" const LogoAndSearch: React.FC = React.memo(() => { const pathname = usePathname() return (
{pathname === "/search" ? ( ) : ( )}
) }) LogoAndSearch.displayName = "LogoAndSearch" const SidebarContent: React.FC = React.memo(() => { const { me } = useAccountOrGuest() const pathname = usePathname() return ( <> ) }) SidebarContent.displayName = "SidebarContent" const Sidebar: React.FC = () => { const isTablet = useMedia("(max-width: 1024px)") const [isCollapsed, setIsCollapsed] = useSidebarCollapse(isTablet) const sidebarClasses = cn( "h-full overflow-hidden transition-all duration-300 ease-in-out", isCollapsed ? "w-0" : "w-auto min-w-56" ) const sidebarInnerClasses = cn( "h-full w-56 min-w-56 transition-transform duration-300 ease-in-out", isCollapsed ? "-translate-x-full" : "translate-x-0" ) const contextValue = React.useMemo(() => ({ isCollapsed, setIsCollapsed }), [isCollapsed, setIsCollapsed]) if (isTablet) { return ( <>
setIsCollapsed(true)} />
) } return (
) } Sidebar.displayName = "Sidebar" export { Sidebar, SidebarItem, SidebarContext }