"use client"; import { usePathname } from "next/navigation"; import { Bars3Icon, Cog6ToothIcon, ArrowRightStartOnRectangleIcon, MagnifyingGlassIcon, ChatBubbleOvalLeftEllipsisIcon } from "@heroicons/react/20/solid"; import Link from "next/link"; import { useEffect, useState, useRef } from "react"; import { useRouter } from "next/navigation"; import Image from "next/image"; import logo from "@assets/logo.jpg"; import NexusAuthApi from "@/lib/Nexus_Auth_API"; export default function ChatSidebar() { const pathname = usePathname(); const [isCollapsed, setIsCollapsed] = useState(true); const sidebarRef = useRef(null); const router = useRouter(); const toggleSidebar = () => { setIsCollapsed(!isCollapsed); }; const clearLocalStorage = () => { localStorage.removeItem("me"); localStorage.removeItem("s_tkn"); localStorage.removeItem("u_id"); localStorage.removeItem("a_l"); }; useEffect(() => { const handleClickOutside = (event) => { if (sidebarRef.current && !sidebarRef.current.contains(event.target)) { setIsCollapsed(true); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); const logoStyle = { width: isCollapsed ? "60px" : "150px", borderRadius: "50px", transition: "width 0.3s ease, height 0.3s ease", marginBottom: 0, marginTop: "35px", }; const sidebarStyle = { width: "180px", left: isCollapsed ? "-180px" : "0", backgroundColor: "var(--sidebar-background)", color: "var(--foreground)", padding: isCollapsed ? "15px" : "20px", position: "fixed", height: "100vh", display: "flex", flexDirection: "column", borderRight: "1px solid rgba(255, 255, 255, 0.1)", transition: "left 0.3s ease, width 0.3s ease, padding 0.3s ease", zIndex: 10, }; const navLinkStyle = { display: "flex", alignItems: "center", gap: "5px", padding: "10px 5px", transition: "all 0.3s ease", color: "var(--foreground)", fontSize: "1em", }; const activeNavLinkStyle = { backgroundColor: "var(--hover-accent)", borderRadius: "5px", animation: "fadeIn .5s ease-in-out, pulse .5s ease-in-out", }; const textStyle = { opacity: isCollapsed ? 0 : 1, transition: "opacity 0.3s ease", pointerEvents: isCollapsed ? "none" : "auto", }; const iconStyle = { width: "30px", height: "30px", flexShrink: 0, }; const toggleButtonStyle = { position: "absolute", top: "20px", right: isCollapsed ? "-50px" : "10px", width: "35px", height: "35px", backgroundColor: "var(--button-background)", color: "var(--foreground)", border: "none", borderRadius: "10px", cursor: "pointer", display: "flex", alignItems: "center", justifyContent: "center", boxShadow: "0 2px 5px rgba(0, 0, 0, 0.2)", transition: "background-color 0.3s ease, right 0.3s ease", }; const handleLogout = () => { const userID = localStorage.getItem('u_id'); const token = localStorage.getItem('s_tkn'); NexusAuthApi.logout(userID, token) .then(() => { clearLocalStorage(); router.push('/'); window.location.reload(); }) .catch((error) => { console.error("Logout failed", error); }); }; return ( <div ref={sidebarRef} className="sidebar-container" style={sidebarStyle}> <div className="logo-container" style={{ display: "flex", flexDirection: "column", alignItems: "center" }}> <Image style={logoStyle} src={logo} alt="Chat App Logo" /> <button style={toggleButtonStyle} onClick={() => toggleSidebar(!isCollapsed)} > <Bars3Icon style={{ transform: `rotate(${isCollapsed ? 0 : 90}deg)`, transition: "transform .3s", width: "20px" }} /> </button> </div> <ul className="nav-links" style={{ listStyleType: "none", marginTop: "20px", paddingLeft: "0" }}> <li> <Link href="/" legacyBehavior> <a style={{ ...navLinkStyle, ...(pathname === "/" && activeNavLinkStyle) }}> <ChatBubbleOvalLeftEllipsisIcon style={iconStyle} /> <span style={textStyle}>Chats</span> </a> </Link> </li> <li> <Link href="/search" legacyBehavior> <a style={{ ...navLinkStyle, ...(pathname === "/search" && activeNavLinkStyle) }}> <MagnifyingGlassIcon style={iconStyle} /> <span style={textStyle}>Find</span> </a> </Link> </li> <li> <Link href="/settings" legacyBehavior> <a style={{ ...navLinkStyle, ...(pathname === "/settings" && activeNavLinkStyle) }}> <Cog6ToothIcon style={iconStyle} /> <span style={textStyle}>Settings</span> </a> </Link> </li> <li> <Link href="#logout" legacyBehavior> <a style={{ ...navLinkStyle, ...(pathname === "#logout" && activeNavLinkStyle) }} onClick={handleLogout}> <ArrowRightStartOnRectangleIcon style={iconStyle} /> <span style={textStyle}>Logout</span> </a> </Link> </li> </ul> </div> ); }