import React from "react"; import { Link, useLocation } from "react-router-dom"; import { BookIcon, FlagIcon, HelpIcon, HomeIcon, LogoIcon, PortalIcon, SearchIcon, UploadIcon } from "@images/Images"; import Login from "@components/Login"; import { UserProfile } from "@customTypes/Profile"; import { Search } from "@customTypes/Search"; import { API } from "@api/Api"; import "@css/Sidebar.css"; interface SidebarProps { setToken: React.Dispatch>; profile?: UserProfile; setProfile: React.Dispatch>; onUploadRun: () => void; }; const Sidebar: React.FC = ({ setToken, profile, setProfile, onUploadRun }) => { const [searchData, setSearchData] = React.useState(undefined); const [isSidebarLocked, setIsSidebarLocked] = React.useState(false); const [isSidebarOpen, setSidebarOpen] = React.useState(false); const [isMobileMenuOpen, setIsMobileMenuOpen] = React.useState(false); const [isMobileSearchOpen, setIsMobileSearchOpen] = React.useState(false); const location = useLocation(); const path = location.pathname; const handle_sidebar_click = (clicked_sidebar_idx: number) => { const btn = document.querySelectorAll("button.sidebar-button"); if (isSidebarOpen) { setSidebarOpen(false); _handle_sidebar_hide(); } // clusterfuck btn.forEach((e, i) => { btn[i].classList.remove("sidebar-button-selected"); btn[i].classList.add("sidebar-button-deselected"); }); btn[clicked_sidebar_idx].classList.add("sidebar-button-selected"); btn[clicked_sidebar_idx].classList.remove("sidebar-button-deselected"); }; const _handle_sidebar_hide = () => { const btn = document.querySelectorAll("button.sidebar-button") as NodeListOf; const span = document.querySelectorAll("button.sidebar-button>span") as NodeListOf; const side = document.querySelector("#sidebar-list") as HTMLElement; const searchbar = document.querySelector("#searchbar") as HTMLInputElement; const uploadRunBtn = document.querySelector("#upload-run") as HTMLInputElement; const uploadRunSpan = document.querySelector("#upload-run>span") as HTMLInputElement; if (isSidebarOpen) { if (profile) { const login = document.querySelectorAll(".login>button")[1] as HTMLElement; login.style.opacity = "1"; uploadRunBtn.style.width = "310px"; uploadRunBtn.style.padding = "0 0 0 11px"; uploadRunSpan.style.opacity = "0"; setTimeout(() => { uploadRunSpan.style.opacity = "1"; }, 100); } setSidebarOpen(false); side.style.width = "320px"; btn.forEach((e, i) => { e.style.width = (window.innerWidth > 1024) ? "310px" : "265px"; e.style.padding = "0 0 0 11px"; setTimeout(() => { span[i].style.opacity = "1"; }, 100); }); side.style.zIndex = "2"; } else { if (profile) { const login = document.querySelectorAll(".login>button")[1] as HTMLElement; login.style.opacity = "0"; uploadRunBtn.style.width = "40px"; uploadRunBtn.style.padding = "0 0 0 5px"; uploadRunSpan.style.opacity = "0"; } setSidebarOpen(true); side.style.width = "40px"; searchbar.focus(); btn.forEach((e, i) => { e.style.width = "40px"; e.style.padding = "0 0 0 5px"; span[i].style.opacity = "0"; }); setTimeout(() => { side.style.zIndex = "0"; }, 300); } }; const _handle_sidebar_lock = () => { if (window.innerWidth <= 768) { setIsMobileSearchOpen(!isMobileSearchOpen); } else { if (!isSidebarLocked) { _handle_sidebar_hide(); setIsSidebarLocked(true); setTimeout(() => setIsSidebarLocked(false), 300); } } }; const _close_mobile_search = () => { setIsMobileSearchOpen(false); }; const _close_mobile_search_and_menu = () => { setIsMobileSearchOpen(false); setIsMobileMenuOpen(false); }; const _handle_search_change = async (q: string) => { const searchResponse = await API.get_search(q); setSearchData(searchResponse); }; const _toggle_mobile_menu = () => { setIsMobileMenuOpen(!isMobileMenuOpen); }; const _close_mobile_menu = () => { setIsMobileMenuOpen(false); }; React.useEffect(() => { if (path === "/") { handle_sidebar_click(1); } else if (path.includes("games")) { handle_sidebar_click(2); } else if (path.includes("rankings")) { handle_sidebar_click(3); } // else if (path.includes("news")) { handle_sidebar_click(4) } // else if (path.includes("scorelog")) { handle_sidebar_click(5) } else if (path.includes("profile")) { handle_sidebar_click(4); } else if (path.includes("rules")) { handle_sidebar_click(5); } else if (path.includes("about")) { handle_sidebar_click(6); } }, [path]); return ( <>
); }; export default Sidebar;