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;