import React, { useCallback } 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(true); const location = useLocation(); const path = location.pathname; const _handle_sidebar_hide = useCallback(() => { var 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); } }, [isSidebarOpen, profile]); const handle_sidebar_click = useCallback( (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"); }, [isSidebarOpen, _handle_sidebar_hide] ); const _handle_sidebar_lock = () => { if (!isSidebarLocked) { _handle_sidebar_hide(); setIsSidebarLocked(true); setTimeout(() => setIsSidebarLocked(false), 300); } }; const _handle_search_change = async (q: string) => { const searchResponse = await API.get_search(q); setSearchData(searchResponse); }; 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, handle_sidebar_click]); return ( ); }; export default Sidebar;