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.4em 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 = "310px" e.style.padding = "0.4em 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.4em 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.4em 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 _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;