import React, { useEffect, useState, useRef } from "react"; import { SidebarIcon } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { useAuth } from "../../context/AuthContext"; import { useSidebar } from "../../context/SidebarContext"; import { ToggleButton } from "../Input/Button"; import { getCategoryThumbnail } from "../../utils/thumbnailUtils"; interface Streamer { user_id: number; username: string; } interface Category { category_id: number; category_name: string; } interface SideBarProps { extraClasses?: string; } const Sidebar: React.FC = ({ extraClasses = "" }) => { const { showSideBar, setShowSideBar } = useSidebar(); const navigate = useNavigate(); const { username, isLoggedIn } = useAuth(); const [followedStreamers, setFollowedStreamers] = useState([]); const [followedCategories, setFollowedCategories] = useState([]); const [justToggled, setJustToggled] = useState(false); const sidebarId = useRef(Math.floor(Math.random() * 1000000)); // Fetch followed streamers & categories useEffect(() => { if (!isLoggedIn) return; const fetchFollowData = async () => { try { const response = await fetch("/api/user/following"); if (!response.ok) throw new Error("Failed to fetch followed content"); const data = await response.json(); setFollowedStreamers(data.streams); setFollowedCategories(data.categories); } catch (error) { console.error("Error fetching followed content:", error); } }; fetchFollowData(); }, [isLoggedIn]); const handleSideBar = () => { setShowSideBar(!showSideBar); setJustToggled(true); setTimeout(() => setJustToggled(false), 200); }; // Keyboard shortcut to toggle sidebar useEffect(() => { const handleKeyPress = (e: KeyboardEvent) => { if (e.key === "s" && document.activeElement == document.body && isLoggedIn) handleSideBar(); }; document.addEventListener("keydown", handleKeyPress); return () => { document.removeEventListener("keydown", handleKeyPress); }; }, [showSideBar, setShowSideBar, isLoggedIn]); return ( <> handleSideBar()} extraClasses={`absolute group text-[1rem] top-[9vh] ${ showSideBar ? "left-[16vw] duration-[0.5s]" : "left-[20px] duration-[1s]" } ease-in-out cursor-pointer z-[50]`} toggled={showSideBar} > {!showSideBar && !justToggled && ( Press S )}
{/* Profile Info */}
{ e.currentTarget.src = "/images/pfps/default.png"; e.currentTarget.onerror = null; }} alt="profile picture" className="w-[3em] h-[3em] rounded-full border-[0.15em] border-purple-500 cursor-pointer" onClick={() => navigate(`/user/${username}`)} />
Logged in as
(e.currentTarget.style.boxShadow = "var(--follow-shadow)")} onMouseLeave={(e) => (e.currentTarget.style.boxShadow = "none")} >

Following

Streamers

{followedStreamers.map((streamer) => ( ))}

Categories

{/* Followed Categories */}
{followedCategories.map((category) => { return (
(window.location.href = `/category/${category.category_name}`)} > {category.category_name}
{category.category_name}
); })}
); }; export default Sidebar;