aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/components/Sidebar/Sidebar.tsx
diff options
context:
space:
mode:
authorWolfboy248 <georgejvindkarlsen@gmail.com>2025-08-21 10:33:27 +0200
committerWolfboy248 <georgejvindkarlsen@gmail.com>2025-08-21 10:33:27 +0200
commitda1fd74f9387149b2b94d62853587a8afdb74ddd (patch)
tree57f13021890b6d27848a3379d0869790fd1d7c97 /frontend/src/components/Sidebar/Sidebar.tsx
parentorganised pages, started work on theme (diff)
downloadlphub-da1fd74f9387149b2b94d62853587a8afdb74ddd.tar.gz
lphub-da1fd74f9387149b2b94d62853587a8afdb74ddd.tar.bz2
lphub-da1fd74f9387149b2b94d62853587a8afdb74ddd.zip
Reorganised Maplist and Sidebar
Diffstat (limited to 'frontend/src/components/Sidebar/Sidebar.tsx')
-rw-r--r--frontend/src/components/Sidebar/Sidebar.tsx101
1 files changed, 101 insertions, 0 deletions
diff --git a/frontend/src/components/Sidebar/Sidebar.tsx b/frontend/src/components/Sidebar/Sidebar.tsx
new file mode 100644
index 0000000..2dafa2b
--- /dev/null
+++ b/frontend/src/components/Sidebar/Sidebar.tsx
@@ -0,0 +1,101 @@
1import React, { useCallback, useRef } from "react";
2import { Link, useLocation } from "react-router-dom";
3import { UserProfile } from "@customTypes/Profile";
4
5import Header from "./Header";
6import Footer from "./Footer";
7import Content from "./Content";
8
9interface SidebarProps {
10 setToken: React.Dispatch<React.SetStateAction<string | undefined>>;
11 profile?: UserProfile;
12 setProfile: React.Dispatch<React.SetStateAction<UserProfile | undefined>>;
13 onUploadRun: () => void;
14}
15
16const Sidebar: React.FC<SidebarProps> = ({
17 setToken,
18 profile,
19 setProfile,
20 onUploadRun,
21}) => {
22 // const [isSidebarLocked, setIsSidebarLocked] = React.useState<boolean>(false);
23 const [isSidebarOpen, setSidebarOpen] = React.useState<boolean>(false);
24 const [selectedButtonIndex, setSelectedButtonIndex] = React.useState<number>(1);
25
26 const location = useLocation();
27 const path = location.pathname;
28
29 const sidebarRef = useRef<HTMLDivElement>(null);
30 const sidebarButtonRefs = useRef<(HTMLButtonElement | null)[]>([]);
31
32 // const _handle_sidebar_toggle = useCallback(() => {
33 // if (!sidebarRef.current) return;
34
35 // if (isSidebarOpen) {
36 // setSidebarOpen(false);
37 // } else {
38 // setSidebarOpen(true);
39 // searchbarRef.current?.focus();
40 // }
41 // }, [isSidebarOpen]);
42
43 const handle_sidebar_click = useCallback(
44 (clicked_sidebar_idx: number) => {
45 setSelectedButtonIndex(clicked_sidebar_idx);
46 if (isSidebarOpen) {
47 setSidebarOpen(false);
48 }
49 },
50 [isSidebarOpen]
51 );
52
53 React.useEffect(() => {
54 if (path === "/") {
55 setSelectedButtonIndex(1);
56 } else if (path.includes("games")) {
57 setSelectedButtonIndex(2);
58 } else if (path.includes("rankings")) {
59 setSelectedButtonIndex(3);
60 } else if (path.includes("profile")) {
61 setSelectedButtonIndex(4);
62 } else if (path.includes("rules")) {
63 setSelectedButtonIndex(5);
64 } else if (path.includes("about")) {
65 setSelectedButtonIndex(6);
66 }
67 }, [path]);
68
69 const getButtonClasses = (buttonIndex: number) => {
70 const baseClasses = "flex items-center gap-3 w-full text-left bg-inherit cursor-pointer border-none rounded-[2000px] py-3 px-3 transition-all duration-300 hover:bg-panel";
71 const selectedClasses = selectedButtonIndex === buttonIndex ? "bg-primary text-background" : "bg-transparent text-foreground";
72
73 return `${baseClasses} ${selectedClasses}`;
74 };
75
76 return (
77 <div className={`w-80 not-md:w-full text-white bg-block flex flex-col not-md:flex-row
78 }`}>
79
80 {/* Header */}
81 <Header />
82
83 <div className="flex h-full w-full">
84 <div className="flex flex-col">
85 {/* Sidebar Content */}
86 <Content profile={profile} isSidebarOpen={isSidebarOpen} sidebarButtonRefs={sidebarButtonRefs} getButtonClasses={getButtonClasses} handle_sidebar_click={handle_sidebar_click} />
87
88 {/* Bottom Section */}
89 <Footer profile={profile} onUploadRun={onUploadRun} setToken={setToken} setProfile={setProfile} sidebarButtonRefs={sidebarButtonRefs} getButtonClasses={getButtonClasses} handle_sidebar_click={handle_sidebar_click} />
90 </div>
91
92 <div className="w-20">
93
94 </div>
95
96 </div>
97 </div>
98 );
99};
100
101export default Sidebar;