Repository: ItsMikaRuff/FitBestie
Pull request #34: Add profile picture to sidebar and fix responsivness
Author: login: ItsMikaRuff
Created: 2025-05-18T18:47:28Z | Merged: 2025-05-18T18:47:42Z

## Summary by Sourcery

Introduce a responsive sidebar with user profile picture and role-based navigation, integrate it into the Header and Layout components, and update project dependencies.

New Features:
- Add a Sidebar component with slide-in animation, user avatar greeting, role-based navigation links, and logout functionality
- Implement a hamburger toggle button in Header to open and close the sidebar

Enhancements:
- Refactor Header to accept a toggleSidebar prop and streamline role-based button rendering
- Update Layout to include the Sidebar, adjust content padding, and enforce responsive flex layout

Build:
- Add react-icons, react-router-dom ^7.6.0, and styled-components ^6.1.18 to dependencies


Diff:
diff --git a/Client-React/app/src/App.js b/Client-React/app/src/App.js
index f3d8a27..8be5744 100644
--- a/Client-React/app/src/App.js
+++ b/Client-React/app/src/App.js
@@ -1,3 +1,5 @@
+//App.js
+
 import { ThemeProvider } from 'styled-components';
 import {theme} from './themes/theme';
 import React, { useState } from 'react';
diff --git a/Client-React/app/src/components/Header.jsx b/Client-React/app/src/components/Header.jsx
index 03d206b..c51207c 100644
--- a/Client-React/app/src/components/Header.jsx
+++ b/Client-React/app/src/components/Header.jsx
@@ -1,82 +1,75 @@
 import { useUser } from "../context/UserContext";
-import { HeaderStyle, HeaderText, 
-    HeaderButtonDiv, FooterLink, Button
- } from "./styledComponents";
+import {
+  HeaderStyle,
+  HeaderText,
+  HeaderButtonDiv,
+  FooterLink,
+  Button,
+} from "./styledComponents";
 import { Link, useNavigate } from "react-router-dom";
 import FITBESTIE_LOGO from "../Images/FITBESTIE_LOGO.jpg";
 import { FiSettings } from "react-icons/fi";
+import { FaBars } from "react-icons/fa";
 
-const Header = () => {
-    const { user, isLoggedIn, logout } = useUser();
-    const navigate = useNavigate();
+const Header = ({ toggleSidebar }) => {
+  const { user, isLoggedIn, logout } = useUser();
+  const navigate = useNavigate();
 
+  const handleLogout = () => {
+    logout();
+    navigate("/");
+  };
 
-    const handleLogout = () => {
-        logout();              // מוחק את המשתמש מהזיכרון וה־localStorage
-        navigate("/");    // מחזיר את המשתמש לדף הבית 
-    }
+  return (
+    <HeaderStyle style={{ direction: "rtl" }}>
+      <div style={{ flex: "0 0 auto", marginLeft: "20px", display: "flex", alignItems: "center", gap: "12px" }}>
+        <button
+          onClick={toggleSidebar}
+          style={{
+            background: "white",
+            border: "1px solid #ccc",
+            borderRadius: "50%",
+            width: "36px",
+            height: "36px",
+            display: "flex",
+            alignItems: "center",
+            justifyContent: "center",
+            cursor: "pointer",
+          }}
+        >
+          <FaBars />
+        </button>
+        <FooterLink href="/">
+          <img src={FITBESTIE_LOGO} alt="Logo" />
+        </FooterLink>
+      </div>
 
-    return (
-        <HeaderStyle style={{ direction: 'rtl' }}>
-            <div style={{ flex: "0 0 auto", marginLeft: "20px" }}>
-                <FooterLink href="/">
-                    <img src={FITBESTIE_LOGO} alt="Logo" />
-                </FooterLink>
-            </div>
-            <div style={{ flex: 1, display: "flex", justifyContent: "center" }}>
-                <HeaderText>
-                    ברוכה הבאה, {isLoggedIn && user?.name ? user.name : "חברה!"}
-                </HeaderText>
-            </div>
-            <HeaderButtonDiv style={{ marginRight: "20px" }}>
-                {isLoggedIn ? (
-                    <>
-                        {(user?.role?.toLowerCase() === "admin" || user?.role?.toLowerCase() === "superadmin") && (
-                            <Link to="/admin">
-                                <Button
-                                    title="הגדרות"
-                                    style={{
-                                        display: "flex",
-                                        alignItems: "center",
-                                        justifyContent: "center",
-                                        padding: 0,
-                                        minWidth: "32px",
-                                        minHeight: "32px"
-                                    }}
-                                >
-                                    <FiSettings size={22} />
-                                </Button>
-                            </Link>
-                        )}
-                        {(user?.role?.toLowerCase() === "worker" || user?.role?.toLowerCase() === "superadmin") && (
-                            <Link to="/worker">
-                                <Button>אימות ספקיות כושר</Button>
-                            </Link>
-                        )}
-                        <Link to="/profile">
-                            <Button>פרופיל</Button>
-                        </Link>
-                        {(user?.role?.toLowerCase() === "superadmin" || user?.role?.toLowerCase() === "manager") && (
-                            <Link to="/manager">
-                                <Button title="ניהול">ממשק ניהול</Button>
-                            </Link>
-                        )}
-                        <Button style={{backgroundColor:"#dc3545"}} onClick={handleLogout}>התנתק</Button>
-                    </>
-                ) : (
-                    <>
-                        <Link to="/signup">
-                            <Button>הרשמה</Button>
-                        </Link>
-                        <Link to="/login">
-                            <Button>התחבר</Button>
-                        </Link>
-                    </>
-                )}
-            </HeaderButtonDiv>
-        </HeaderStyle>
-    );
+      <div style={{ flex: 1, display: "flex", justifyContent: "center" }}>
+        <HeaderText>
+          ברוכה הבאה, {isLoggedIn && user?.name ? user.name : "חברה!"}
+        </HeaderText>
+      </div>
+
+      <HeaderButtonDiv style={{ marginRight: "20px" }}>
+        {isLoggedIn ? (
+          <>
+            {(user?.role === "admin" || user?.role === "superadmin") && (
+              <Link to="/admin">
+                <Button><FiSettings /></Button>
+              </Link>
+            )}
+            <Link to="/profile"><Button>פרופיל</Button></Link>
+            <Button style={{ backgroundColor: "#dc3545" }} onClick={handleLogout}>התנתק</Button>
+          </>
+        ) : (
+          <>
+            <Link to="/signup"><Button>הרשמה</Button></Link>
+            <Link to="/login"><Button>התחבר</Button></Link>
+          </>
+        )}
+      </HeaderButtonDiv>
+    </HeaderStyle>
+  );
 };
 
 export default Header;
-
diff --git a/Client-React/app/src/components/Layout.jsx b/Client-React/app/src/components/Layout.jsx
index 8e1c321..8db87b1 100644
--- a/Client-React/app/src/components/Layout.jsx
+++ b/Client-React/app/src/components/Layout.jsx
@@ -1,22 +1,40 @@
 import { Outlet, useLocation } from "react-router-dom";
-import HeaderComponent from "./Header"; // קומפוננטת Header שלך
-import FooterComponent from "./Footer"; // קומפוננטת Footer שלך
+import HeaderComponent from "./Header";
+import FooterComponent from "./Footer";
+import { useState } from "react";
+import Sidebar from "./SideBar";
 
 const Layout = () => {
-    const location = useLocation();
+  const location = useLocation();
+  const [isSidebarOpen, setIsSidebarOpen] = useState(false);
 
-    // דפים שבהם לא יוצג ה-Header וה-Footer
-    const hideLayout = ["/login", "/signup", "/trainer-signup"].includes(location.pathname);
+  const hideLayout = ["/login", "/signup", "/trainer-signup"].includes(location.pathname);
+  if (hideLayout) return <Outlet />;
 
-    return (
-        <>
-            {!hideLayout && <HeaderComponent />}
-            <main style={{ paddingTop: "80px", paddingBottom: "80px", minHeight: "100vh" }}>
-                <Outlet />
-            </main>
-            {!hideLayout && <FooterComponent />}
-        </>
-    );
+  const containerStyle = {
+    display: "flex",
+    flexDirection: "row-reverse",
+  };
+
+  const contentStyle = {
+    flex: 1,
+    paddingRight: isSidebarOpen ? "240px" : "0",
+    transition: "padding-right 0.3s ease",
+    minHeight: "100vh",
+  };
+
+  return (
+    <div style={containerStyle}>
+      <Sidebar isOpen={isSidebarOpen} setIsOpen={setIsSidebarOpen} />
+      <div style={contentStyle}>
+        <HeaderComponent toggleSidebar={() => setIsSidebarOpen(prev => !prev)} />
+        <main style={{ paddingTop: "80px", paddingBottom: "80px" }}>
+          <Outlet />
+        </main>
+        <FooterComponent />
+      </div>
+    </div>
+  );
 };
 
-export default Layout;
+export default Layout;
\ No newline at end of file
diff --git a/Client-React/app/src/components/SideBar.jsx b/Client-React/app/src/components/SideBar.jsx
new file mode 100644
index 0000000..ed99ce5
--- /dev/null
+++ b/Client-React/app/src/components/SideBar.jsx
@@ -0,0 +1,202 @@
+// SideBar.jsx — גרסה רספונסיבית עם תמונה וברכה בראש
+
+import styled, { keyframes } from "styled-components";
+import { NavLink, useNavigate } from "react-router-dom";
+import {
+    FaUser,
+    FaHome,
+    FaChartBar,
+    FaCog,
+    FaUsers,
+    FaSignOutAlt,
+    FaTimes,
+    FaClipboardList,
+} from "react-icons/fa";
+import { useUser } from "../context/UserContext";
+
+const slideIn = keyframes`
+  from {
+    transform: translateX(100%);
+    opacity: 0;
+  }
+  to {
+    transform: translateX(0);
+    opacity: 1;
+  }
+`;
+
+const SidebarContainer = styled.aside`
+  position: fixed;
+  top: 0;
+  left: auto;
+  right: 0;
+  
+  height: 100vh;
+  width: 240px;
+  max-width: 90vw;
+  background-color: #fff;
+  border-left: 1px solid #eee;
+  box-shadow: -4px 0 16px rgba(0, 0, 0, 0.05);
+  transform: ${({ isOpen }) => (isOpen ? "translateX(0)" : "translateX(100%)")};
+  transition: transform 0.3s ease;
+  z-index: 9999;
+  animation: ${({ isOpen }) => (isOpen ? slideIn : "none")} 0.3s ease forwards;
+  display: flex;
+  flex-direction: column;
+  overflow-y: auto;
+`;
+
+const CloseButton = styled.button`
+  background: none;
+  border: none;
+  font-size: 1.4rem;
+  color: #666;
+  align-self: flex-start;
+  margin: 16px 16px 0 auto;
+  cursor: pointer;
+
+  &:hover {
+    color: #000;
+  }
+`;
+
+const NavList = styled.nav`
+  display: flex;
+  flex-direction: column;
+  padding: 16px;
+  gap: 12px;
+`;
+
+const NavItem = styled(NavLink)`
+  display: flex;
+  align-items: center;
+  gap: 14px;
+  padding: 10px 14px;
+  border-radius: 12px;
+  text-decoration: none;
+  color: #333;
+  font-size: 0.95rem;
+  transition: background-color 0.2s;
+
+  &.active {
+    background-color: #ffe9a8;
+    font-weight: bold;
+  }
+
+  &:hover {
+    background-color: #fdf4d7;
+  }
+
+  svg {
+    font-size: 1.1rem;
+    flex-shrink: 0;
+  }
+`;
+
+const LogoutButton = styled.button`
+  margin-top: auto;
+  margin-bottom: 20px;
+  margin-inline: 16px;
+  padding: 10px 14px;
+  border: none;
+  background-color: #ffe3e3;
+  color: #c0392b;
+  border-radius: 12px;
+  font-size: 0.95rem;
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  cursor: pointer;
+
+  &:hover {
+    background-color: #ffcfcf;
+  }
+
+  svg {
+    font-size: 1.1rem;
+  }
+`;
+
+const UserGreeting = styled.div`
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  padding: 16px;
+  border-bottom: 1px solid #eee;
+
+  img {
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+    object-fit: cover;
+  }
+
+  span {
+    font-size: 0.95rem;
+    font-weight: 500;
+    color: #333;
+  }
+`;
+
+const Sidebar = ({ isOpen, setIsOpen }) => {
+    const { user, logout } = useUser();
+    const navigate = useNavigate();
+    const role = user?.role || "";
+
+    const links = user
+        ? [
+            { to: "/", icon: <FaHome />, label: "דשבורד", roles: ["user", "admin", "superAdmin"] },
+            { to: "/profile", icon: <FaUser />, label: "פרופיל", roles: ["user", "admin", "superAdmin"] },
+            { to: "/metrics", icon: <FaChartBar />, label: "מדדים", roles: ["user", "admin", "superAdmin"] },
+            { to: "/manager", icon: <FaClipboardList />, label: "ממשק מנהל", roles: ["admin", "superAdmin"] },
+            { to: "/admin", icon: <FaUsers />, label: "ניהול משתמשים", roles: ["superAdmin"] },
+            { to: "/worker", icon: <FaCog />, label: "אימות ספקי כושר", roles: ["superAdmin", "manager"] },
+        ].filter(link => link.roles.includes(role))
+        : [
+            { to: "/", icon: <FaHome />, label: "דף הבית" },
+            { to: "/signup", icon: <FaUser />, label: "הרשמה" },
+            { to: "/login", icon: <FaUser />, label: "התחברות" },
+        ];
+
+    return (
+        <SidebarContainer isOpen={isOpen}>
+            <CloseButton onClick={() => setIsOpen(false)} title="סגור תפריט">
+                <FaTimes />
+            </CloseButton>
+
+            {user && (
+                <UserGreeting>
+                    <img src={user.image || "/default-user.jpg"} alt="avatar" />
+                    <span>שלום {user.name || "משתמשת"}</span>
+                </UserGreeting>
+            )}
+
+            <NavList>
+                {links.map(link => (
+                    <NavItem
+                        key={link.to}
+                        to={link.to}
+                        onClick={() => window.innerWidth < 768 && setIsOpen(false)}
+                    >
+                        {link.icon}
+                        <span>{link.label}</span>
+                    </NavItem>
+                ))}
+            </NavList>
+
+            {user && (
+                <LogoutButton
+                    onClick={() => {
+                        logout();
+                        navigate("/login");
+                    }}
+                >
+                    <FaSignOutAlt />
+                    <span>התנתקות</span>
+                </LogoutButton>
+            )}
+        </SidebarContainer>
+    );
+};
+
+export default Sidebar;
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..2b2636c
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,281 @@
+{
+  "name": "FitBestie-3",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "react-icons": "^5.5.0",
+        "react-router-dom": "^7.6.0",
+        "styled-components": "^6.1.18"
+      }
+    },
+    "node_modules/@emotion/is-prop-valid": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
+      "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
+      "license": "MIT",
+      "dependencies": {
+        "@emotion/memoize": "^0.8.1"
+      }
+    },
+    "node_modules/@emotion/memoize": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+      "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==",
+      "license": "MIT"
+    },
+    "node_modules/@emotion/unitless": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+      "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==",
+      "license": "MIT"
+    },
+    "node_modules/@types/stylis": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
+      "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==",
+      "license": "MIT"
+    },
+    "node_modules/camelize": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
+      "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/cookie": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
+      "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/css-color-keywords": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
+      "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/css-to-react-native": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
+      "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
+      "license": "MIT",
+      "dependencies": {
+        "camelize": "^1.0.0",
+        "css-color-keywords": "^1.0.0",
+        "postcss-value-parser": "^4.0.2"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "license": "MIT"
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.11",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "license": "ISC"
+    },
+    "node_modules/postcss": {
+      "version": "8.4.49",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+      "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "license": "MIT"
+    },
+    "node_modules/react": {
+      "version": "19.1.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+      "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+      "license": "MIT",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "19.1.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+      "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "scheduler": "^0.26.0"
+      },
+      "peerDependencies": {
+        "react": "^19.1.0"
+      }
+    },
+    "node_modules/react-icons": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz",
+      "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "*"
+      }
+    },
+    "node_modules/react-router": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz",
+      "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cookie": "^1.0.1",
+        "set-cookie-parser": "^2.6.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=18",
+        "react-dom": ">=18"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-router-dom": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.0.tgz",
+      "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==",
+      "license": "MIT",
+      "dependencies": {
+        "react-router": "7.6.0"
+      },
+      "engines": {
+        "node": ">=20.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=18",
+        "react-dom": ">=18"
+      }
+    },
+    "node_modules/scheduler": {
+      "version": "0.26.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+      "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+      "license": "MIT",
+      "peer": true
+    },
+    "node_modules/set-cookie-parser": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
+      "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
+      "license": "MIT"
+    },
+    "node_modules/shallowequal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
+      "license": "MIT"
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/styled-components": {
+      "version": "6.1.18",
+      "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.18.tgz",
+      "integrity": "sha512-Mvf3gJFzZCkhjY2Y/Fx9z1m3dxbza0uI9H1CbNZm/jSHCojzJhQ0R7bByrlFJINnMzz/gPulpoFFGymNwrsMcw==",
+      "license": "MIT",
+      "dependencies": {
+        "@emotion/is-prop-valid": "1.2.2",
+        "@emotion/unitless": "0.8.1",
+        "@types/stylis": "4.2.5",
+        "css-to-react-native": "3.2.0",
+        "csstype": "3.1.3",
+        "postcss": "8.4.49",
+        "shallowequal": "1.1.0",
+        "stylis": "4.3.2",
+        "tslib": "2.6.2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/styled-components"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8.0",
+        "react-dom": ">= 16.8.0"
+      }
+    },
+    "node_modules/stylis": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
+      "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==",
+      "license": "MIT"
+    },
+    "node_modules/tslib": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+      "license": "0BSD"
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..96217af
--- /dev/null
+++ b/package.json
@@ -0,0 +1,7 @@
+{
+  "dependencies": {
+    "react-icons": "^5.5.0",
+    "react-router-dom": "^7.6.0",
+    "styled-components": "^6.1.18"
+  }
+}


Reviews:
user: login: sourcery-ai[bot]
body: Hey @ItsMikaRuff - I've reviewed your changes and they look great!

<details>
<summary>Here's what I looked at during the review</summary>

- 🟡 **General issues**: 2 issues found
- 🟢 **Testing**: all looks good
- 🟡 **Complexity**: 1 issue found
- 🟢 **Documentation**: all looks good
</details>

***

<details>
<summary>Sourcery is free for open source - if you like our reviews please consider sharing them ✨</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20got%20an%20instant%20code%20review%20from%20%40SourceryAI%2C%20and%20it%20was%20brilliant%21%20It%27s%20free%20for%20open%20source%20and%20has%20a%20free%20trial%20for%20private%20code.%20Check%20it%20out%20https%3A//sourcery.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20got%20an%20instant%20code%20review%20from%20%40SourceryAI%2C%20and%20it%20was%20brilliant%21%20It%27s%20free%20for%20open%20source%20and%20has%20a%20free%20trial%20for%20private%20code.%20Check%20it%20out%20https%3A//sourcery.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https://sourcery.ai)
- [Facebook](https://www.facebook.com/sharer/sharer.php?u=https://sourcery.ai)

</details>

<sub>
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
</sub>
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-18T18:49:27Z

Review comments:
diff_hunk: @@ -1,82 +1,75 @@
 import { useUser } from "../context/UserContext";
-import { HeaderStyle, HeaderText, 
-    HeaderButtonDiv, FooterLink, Button
- } from "./styledComponents";
+import {
+  HeaderStyle,
+  HeaderText,
+  HeaderButtonDiv,
+  FooterLink,
+  Button,
+} from "./styledComponents";
 import { Link, useNavigate } from "react-router-dom";
 import FITBESTIE_LOGO from "../Images/FITBESTIE_LOGO.jpg";
 import { FiSettings } from "react-icons/fi";
+import { FaBars } from "react-icons/fa";
 
-const Header = () => {
-    const { user, isLoggedIn, logout } = useUser();
-    const navigate = useNavigate();
+const Header = ({ toggleSidebar }) => {
+  const { user, isLoggedIn, logout } = useUser();
+  const navigate = useNavigate();
 
+  const handleLogout = () => {
+    logout();
+    navigate("/");
+  };
 
-    const handleLogout = () => {
-        logout();              // מוחק את המשתמש מהזיכרון וה־localStorage
-        navigate("/");    // מחזיר את המשתמש לדף הבית 
-    }
+  return (
+    <HeaderStyle style={{ direction: "rtl" }}>
+      <div style={{ flex: "0 0 auto", marginLeft: "20px", display: "flex", alignItems: "center", gap: "12px" }}>
+        <button
+          onClick={toggleSidebar}
+          style={{
+            background: "white",
+            border: "1px solid #ccc",
+            borderRadius: "50%",
+            width: "36px",
+            height: "36px",
+            display: "flex",
+            alignItems: "center",
+            justifyContent: "center",
+            cursor: "pointer",
+          }}
+        >
+          <FaBars />
+        </button>
+        <FooterLink href="/">
+          <img src={FITBESTIE_LOGO} alt="Logo" />
+        </FooterLink>
+      </div>
 
-    return (
-        <HeaderStyle style={{ direction: 'rtl' }}>
-            <div style={{ flex: "0 0 auto", marginLeft: "20px" }}>
-                <FooterLink href="/">
-                    <img src={FITBESTIE_LOGO} alt="Logo" />
-                </FooterLink>
-            </div>
-            <div style={{ flex: 1, display: "flex", justifyContent: "center" }}>
-                <HeaderText>
-                    ברוכה הבאה, {isLoggedIn && user?.name ? user.name : "חברה!"}
-                </HeaderText>
-            </div>
-            <HeaderButtonDiv style={{ marginRight: "20px" }}>
-                {isLoggedIn ? (
-                    <>
-                        {(user?.role?.toLowerCase() === "admin" || user?.role?.toLowerCase() === "superadmin") && (
-                            <Link to="/admin">
-                                <Button
-                                    title="הגדרות"
-                                    style={{
-                                        display: "flex",
-                                        alignItems: "center",
-                                        justifyContent: "center",
-                                        padding: 0,
-                                        minWidth: "32px",
-                                        minHeight: "32px"
-                                    }}
-                                >
-                                    <FiSettings size={22} />
-                                </Button>
-                            </Link>
-                        )}
-                        {(user?.role?.toLowerCase() === "worker" || user?.role?.toLowerCase() === "superadmin") && (
-                            <Link to="/worker">
-                                <Button>אימות ספקיות כושר</Button>
-                            </Link>
-                        )}
-                        <Link to="/profile">
-                            <Button>פרופיל</Button>
-                        </Link>
-                        {(user?.role?.toLowerCase() === "superadmin" || user?.role?.toLowerCase() === "manager") && (
-                            <Link to="/manager">
-                                <Button title="ניהול">ממשק ניהול</Button>
-                            </Link>
-                        )}
-                        <Button style={{backgroundColor:"#dc3545"}} onClick={handleLogout}>התנתק</Button>
-                    </>
-                ) : (
-                    <>
-                        <Link to="/signup">
-                            <Button>הרשמה</Button>
-                        </Link>
-                        <Link to="/login">
-                            <Button>התחבר</Button>
-                        </Link>
-                    </>
-                )}
-            </HeaderButtonDiv>
-        </HeaderStyle>
-    );
+      <div style={{ flex: 1, display: "flex", justifyContent: "center" }}>
+        <HeaderText>
+          ברוכה הבאה, {isLoggedIn && user?.name ? user.name : "חברה!"}
+        </HeaderText>
+      </div>
+
+      <HeaderButtonDiv style={{ marginRight: "20px" }}>
+        {isLoggedIn ? (
+          <>
+            {(user?.role === "admin" || user?.role === "superadmin") && (
path: Client-React/app/src/components/Header.jsx
user: login: sourcery-ai[bot]
body: **issue (bug_risk):** Normalize role checks for case-insensitive matching

Use user.role.toLowerCase() or constants/enums to ensure role comparisons aren't affected by casing.
created_at: 2025-05-18T18:49:27Z
author_association: NONE
diff_hunk: @@ -0,0 +1,202 @@
+// SideBar.jsx — גרסה רספונסיבית עם תמונה וברכה בראש
+
+import styled, { keyframes } from "styled-components";
+import { NavLink, useNavigate } from "react-router-dom";
+import {
+    FaUser,
+    FaHome,
+    FaChartBar,
+    FaCog,
+    FaUsers,
+    FaSignOutAlt,
+    FaTimes,
+    FaClipboardList,
+} from "react-icons/fa";
+import { useUser } from "../context/UserContext";
+
+const slideIn = keyframes`
+  from {
+    transform: translateX(100%);
+    opacity: 0;
+  }
+  to {
+    transform: translateX(0);
+    opacity: 1;
+  }
+`;
+
+const SidebarContainer = styled.aside`
+  position: fixed;
+  top: 0;
+  left: auto;
+  right: 0;
+  
+  height: 100vh;
+  width: 240px;
+  max-width: 90vw;
+  background-color: #fff;
+  border-left: 1px solid #eee;
+  box-shadow: -4px 0 16px rgba(0, 0, 0, 0.05);
+  transform: ${({ isOpen }) => (isOpen ? "translateX(0)" : "translateX(100%)")};
+  transition: transform 0.3s ease;
+  z-index: 9999;
+  animation: ${({ isOpen }) => (isOpen ? slideIn : "none")} 0.3s ease forwards;
+  display: flex;
+  flex-direction: column;
+  overflow-y: auto;
+`;
+
+const CloseButton = styled.button`
+  background: none;
+  border: none;
+  font-size: 1.4rem;
+  color: #666;
+  align-self: flex-start;
+  margin: 16px 16px 0 auto;
+  cursor: pointer;
+
+  &:hover {
+    color: #000;
+  }
+`;
+
+const NavList = styled.nav`
+  display: flex;
+  flex-direction: column;
+  padding: 16px;
+  gap: 12px;
+`;
+
+const NavItem = styled(NavLink)`
+  display: flex;
+  align-items: center;
+  gap: 14px;
+  padding: 10px 14px;
+  border-radius: 12px;
+  text-decoration: none;
+  color: #333;
+  font-size: 0.95rem;
+  transition: background-color 0.2s;
+
+  &.active {
+    background-color: #ffe9a8;
+    font-weight: bold;
+  }
+
+  &:hover {
+    background-color: #fdf4d7;
+  }
+
+  svg {
+    font-size: 1.1rem;
+    flex-shrink: 0;
+  }
+`;
+
+const LogoutButton = styled.button`
+  margin-top: auto;
+  margin-bottom: 20px;
+  margin-inline: 16px;
+  padding: 10px 14px;
+  border: none;
+  background-color: #ffe3e3;
+  color: #c0392b;
+  border-radius: 12px;
+  font-size: 0.95rem;
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  cursor: pointer;
+
+  &:hover {
+    background-color: #ffcfcf;
+  }
+
+  svg {
+    font-size: 1.1rem;
+  }
+`;
+
+const UserGreeting = styled.div`
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  padding: 16px;
+  border-bottom: 1px solid #eee;
+
+  img {
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+    object-fit: cover;
+  }
+
+  span {
+    font-size: 0.95rem;
+    font-weight: 500;
+    color: #333;
+  }
+`;
+
+const Sidebar = ({ isOpen, setIsOpen }) => {
+    const { user, logout } = useUser();
+    const navigate = useNavigate();
+    const role = user?.role || "";
+
+    const links = user
+        ? [
+            { to: "/", icon: <FaHome />, label: "דשבורד", roles: ["user", "admin", "superAdmin"] },
path: Client-React/app/src/components/SideBar.jsx
user: login: sourcery-ai[bot]
body: **issue (bug_risk):** Inconsistent role naming between Sidebar and Header

The Sidebar lists the role as 'superAdmin' but the Header checks for 'superadmin', so those links won’t render. Align these strings or normalize roles before filtering.
created_at: 2025-05-18T18:49:27Z
author_association: NONE
diff_hunk: @@ -1,22 +1,40 @@
 import { Outlet, useLocation } from "react-router-dom";
-import HeaderComponent from "./Header"; // קומפוננטת Header שלך
-import FooterComponent from "./Footer"; // קומפוננטת Footer שלך
+import HeaderComponent from "./Header";
+import FooterComponent from "./Footer";
+import { useState } from "react";
+import Sidebar from "./SideBar";
 
 const Layout = () => {
-    const location = useLocation();
+  const location = useLocation();
+  const [isSidebarOpen, setIsSidebarOpen] = useState(false);
 
-    // דפים שבהם לא יוצג ה-Header וה-Footer
-    const hideLayout = ["/login", "/signup", "/trainer-signup"].includes(location.pathname);
+  const hideLayout = ["/login", "/signup", "/trainer-signup"].includes(location.pathname);
+  if (hideLayout) return <Outlet />;
 
-    return (
-        <>
-            {!hideLayout && <HeaderComponent />}
-            <main style={{ paddingTop: "80px", paddingBottom: "80px", minHeight: "100vh" }}>
-                <Outlet />
-            </main>
-            {!hideLayout && <FooterComponent />}
-        </>
-    );
+  const containerStyle = {
path: Client-React/app/src/components/Layout.jsx
user: login: sourcery-ai[bot]
body: **issue (complexity):** Consider extracting inline style objects into styled components to separate styling from layout logic.

You can dramatically simplify your JSX by pulling all of your inline style-objects out into styled components (or at least out of the render), and then passing the open/closed state in as a prop. Here’s an example using styled-components – you could put these in the same file above your component or in a separate `Layout.styles.ts`:

```ts
// Layout.styles.ts
import styled from 'styled-components';

export const Container = styled.div`
  display: flex;
  flex-direction: row-reverse;
`;

export const Content = styled.div<{ isOpen: boolean }>`
  flex: 1;
  padding-right: ${({ isOpen }) => (isOpen ? "240px" : "0")};
  transition: padding-right 0.3s ease;
  min-height: 100vh;
`;

export const MainArea = styled.main`
  padding: 80px 0;
`;
```

Then your `Layout.tsx` becomes almost purely layout-logic:

```tsx
import { Outlet, useLocation } from "react-router-dom";
import { useState } from "react";
import HeaderComponent from "./Header";
import FooterComponent from "./Footer";
import Sidebar from "./SideBar";
import { Container, Content, MainArea } from "./Layout.styles";

const Layout = () => {
  const location = useLocation();
  const hideLayout = ["/login", "/signup", "/trainer-signup"].includes(location.pathname);
  const [isSidebarOpen, setIsSidebarOpen] = useState(false);

  if (hideLayout) return <Outlet />;

  return (
    <Container>
      <Sidebar isOpen={isSidebarOpen} setIsOpen={setIsSidebarOpen} />
      <Content isOpen={isSidebarOpen}>
        <HeaderComponent toggleSidebar={() => setIsSidebarOpen(prev => !prev)} />
        <MainArea>
          <Outlet />
        </MainArea>
        <FooterComponent />
      </Content>
    </Container>
  );
};

export default Layout;
```

Benefits:  
- All style definitions live in one place.  
- JSX only shows structure, not styling details.  
- Moving to a separate file keeps cognitive load low.
created_at: 2025-05-18T18:49:27Z
author_association: NONE
diff_hunk: @@ -1,22 +1,40 @@
 import { Outlet, useLocation } from "react-router-dom";
-import HeaderComponent from "./Header"; // קומפוננטת Header שלך
-import FooterComponent from "./Footer"; // קומפוננטת Footer שלך
+import HeaderComponent from "./Header";
+import FooterComponent from "./Footer";
+import { useState } from "react";
+import Sidebar from "./SideBar";
 
 const Layout = () => {
-    const location = useLocation();
+  const location = useLocation();
+  const [isSidebarOpen, setIsSidebarOpen] = useState(false);
 
-    // דפים שבהם לא יוצג ה-Header וה-Footer
-    const hideLayout = ["/login", "/signup", "/trainer-signup"].includes(location.pathname);
+  const hideLayout = ["/login", "/signup", "/trainer-signup"].includes(location.pathname);
+  if (hideLayout) return <Outlet />;
path: Client-React/app/src/components/Layout.jsx
user: login: sourcery-ai[bot]
body: **suggestion (code-quality):** Use block braces for ifs, whiles, etc. ([`use-braces`](https://docs.sourcery.ai/Reference/Rules-and-In-Line-Suggestions/JavaScript/Default-Rules/use-braces))

```suggestion
  if (hideLayout) {
```

<br/><details><summary>Explanation</summary>It is recommended to always use braces and create explicit statement blocks.

Using the allowed syntax to just write a single statement can lead to very confusing
situations, especially where subsequently a developer might add another statement
while forgetting to add the braces (meaning that this wouldn't be included in the condition).
</details>
created_at: 2025-05-18T18:49:27Z
author_association: NONE

PR comments:
user: login: vercel[bot]
created_at: 2025-05-18T18:47:29Z
body: [vc]: #mj40GUkEEppTOtscRdg+/1y79jQmZ598TsL+8alQyyU=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJmaXQtYmVzdGllIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL21pa2FzLXByb2plY3RzLTE2MTg4ODY4L2ZpdC1iZXN0aWUvMlZDU2h3UFJEdHFmZFpTREJoUnY0RDhyV3JOSiIsInByZXZpZXdVcmwiOiJmaXQtYmVzdGllLWdpdC1zaWRlYmFyLW1pa2FzLXByb2plY3RzLTE2MTg4ODY4LnZlcmNlbC5hcHAiLCJuZXh0Q29tbWl0U3RhdHVzIjoiREVQTE9ZRUQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiZml0LWJlc3RpZS1naXQtc2lkZWJhci1taWthcy1wcm9qZWN0cy0xNjE4ODg2OC52ZXJjZWwuYXBwIn0sInJvb3REaXJlY3RvcnkiOiJDbGllbnQtUmVhY3QvYXBwIn1dfQ==
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **fit-bestie** | ✅ Ready ([Inspect](https://vercel.com/mikas-projects-16188868/fit-bestie/2VCShwPRDtqfdZSDBhRv4D8rWrNJ)) | [Visit Preview](https://fit-bestie-git-sidebar-mikas-projects-16188868.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/fit-bestie-git-sidebar-mikas-projects-16188868.vercel.app?via=pr-comment-feedback-link) | May 18, 2025 6:48pm |


author_association: NONE
user: login: sourcery-ai[bot]
created_at: 2025-05-18T18:47:32Z
body: <!-- Generated by sourcery-ai[bot]: start review_guide -->

## Reviewer's Guide

This PR introduces a fully responsive sidebar (including user avatar and navigation links) toggled from the Header, refactors the Header to simplify role-based controls, and integrates the sidebar into the Layout with dynamic styling while adding required dependencies for icons and styling.

#### Sequence Diagram: Toggling the Sidebar

```mermaid
sequenceDiagram
    actor User
    participant Header
    participant Layout
    participant Sidebar

    User->>Header: Clicks Menu Icon (FaBars)
    Header->>Layout: toggleSidebar() call (prop)
    Layout->>Layout: Update isSidebarOpen state
    Layout->>Sidebar: Update isOpen prop
    alt Sidebar opens
        Layout->>Sidebar: Render with isOpen=true
        Sidebar-->>User: Display Sidebar UI
    else Sidebar closes
        Layout->>Sidebar: Render with isOpen=false
        Sidebar-->>User: Hide Sidebar UI
    end
```

#### Sequence Diagram: User Logout via Sidebar

```mermaid
sequenceDiagram
    actor User
    participant Sidebar
    participant UserContext
    participant Router

    User->>Sidebar: Clicks Logout Button
    Sidebar->>UserContext: logout() call
    UserContext-->>Sidebar: User data cleared, state updated
    Sidebar->>Router: navigate("/login") call
    Router-->>User: Display Login Page
```

### File-Level Changes

| Change | Details | Files |
| ------ | ------- | ----- |
| Added responsive Sidebar and integrated it into the layout | <ul><li>Created SideBar component with styled-components, animations, user greeting and role-based nav links</li><li>Managed isSidebarOpen state and toggle logic in Layout</li><li>Adjusted container and content styles for dynamic sidebar padding</li></ul> | `Client-React/app/src/components/SideBar.jsx`<br/>`Client-React/app/src/components/Layout.jsx` |
| Enhanced Header to support sidebar toggle and simplified controls | <ul><li>Introduced toggleSidebar prop and FaBars menu button for sidebar</li><li>Refactored handleLogout outside of return and cleaned up imports</li><li>Streamlined role-based buttons and removed redundant links</li></ul> | `Client-React/app/src/components/Header.jsx` |
| Updated project dependencies | <ul><li>Added react-icons and styled-components to package.json</li><li>Declared react-router-dom version</li></ul> | `Client-React/app/package.json` |

---

<details>
<summary>Tips and commands</summary>

#### Interacting with Sourcery

- **Trigger a new review:** Comment `@sourcery-ai review` on the pull request.
- **Continue discussions:** Reply directly to Sourcery's review comments.
- **Generate a GitHub issue from a review comment:** Ask Sourcery to create an
  issue from a review comment by replying to it. You can also reply to a
  review comment with `@sourcery-ai issue` to create an issue from it.
- **Generate a pull request title:** Write `@sourcery-ai` anywhere in the pull
  request title to generate a title at any time. You can also comment
  `@sourcery-ai title` on the pull request to (re-)generate the title at any time.
- **Generate a pull request summary:** Write `@sourcery-ai summary` anywhere in
  the pull request body to generate a PR summary at any time exactly where you
  want it. You can also comment `@sourcery-ai summary` on the pull request to
  (re-)generate the summary at any time.
- **Generate reviewer's guide:** Comment `@sourcery-ai guide` on the pull
  request to (re-)generate the reviewer's guide at any time.
- **Resolve all Sourcery comments:** Comment `@sourcery-ai resolve` on the
  pull request to resolve all Sourcery comments. Useful if you've already
  addressed all the comments and don't want to see them anymore.
- **Dismiss all Sourcery reviews:** Comment `@sourcery-ai dismiss` on the pull
  request to dismiss all existing Sourcery reviews. Especially useful if you
  want to start fresh with a new review - don't forget to comment
  `@sourcery-ai review` to trigger a new review!

#### Customizing Your Experience

Access your [dashboard](https://app.sourcery.ai) to:
- Enable or disable review features such as the Sourcery-generated pull request
  summary, the reviewer's guide, and others.
- Change the review language.
- Add, remove or edit custom review instructions.
- Adjust other review settings.

#### Getting Help

- [Contact our support team](mailto:support@sourcery.ai) for questions or feedback.
- Visit our [documentation](https://docs.sourcery.ai) for detailed guides and information.
- Keep in touch with the Sourcery team by following us on [X/Twitter](https://x.com/SourceryAI), [LinkedIn](https://www.linkedin.com/company/sourcery-ai/) or [GitHub](https://github.com/sourcery-ai).

</details>

<!-- Generated by sourcery-ai[bot]: end review_guide -->
author_association: NONE