From 27fc028bad1919d0522593a4ada0641d221d3b38 Mon Sep 17 00:00:00 2001 From: WalkeU Date: Wed, 15 Oct 2025 19:08:31 +0200 Subject: [PATCH] navbarban jol le vannak kezelve a redirect es letre lett hozva egy hook amivel automatikusan berakja a usernamet es ha meg nem akkor redirectel --- .../src/components/Landingpage/PlayMenu.jsx | 77 +++++++++++++++---- .../src/components/Navbar/Navbar.jsx | 38 ++++++--- .../src/hooks/useRequireAuth.jsx | 43 +++++++++++ .../src/pages/Landing/Home.jsx | 18 ++--- .../src/pages/Report/Reports.jsx | 8 +- 5 files changed, 140 insertions(+), 44 deletions(-) create mode 100644 SerpentRace_Frontend/src/hooks/useRequireAuth.jsx diff --git a/SerpentRace_Frontend/src/components/Landingpage/PlayMenu.jsx b/SerpentRace_Frontend/src/components/Landingpage/PlayMenu.jsx index 81e65632..afa9473f 100644 --- a/SerpentRace_Frontend/src/components/Landingpage/PlayMenu.jsx +++ b/SerpentRace_Frontend/src/components/Landingpage/PlayMenu.jsx @@ -8,6 +8,9 @@ const PlayMenu = ({ onJoinGame, onCreateGame, user }) => { const [joinCode, setJoinCode] = useState("") const [error, setError] = useState("") + // gyors username kiolvasás (ha a parent objektum user={ { name: ... } } küldi) + const username = user?.name ?? null + const handleJoin = () => { if (!joinCode.trim()) { setError("Add meg a játék kódját!") @@ -21,9 +24,19 @@ const PlayMenu = ({ onJoinGame, onCreateGame, user }) => { onCreateGame() } + // egyszerű segéd az inicialishez + const initials = username + ? username + .split(" ") + .map((s) => s[0]) + .join("") + .slice(0, 2) + .toUpperCase() + : "" + return (
{
{ displayOverlayContent={false} />
+ {/* Jobb oldali panel */} -
-
+
+
+
+
+ {username ? ( +
+ {/* opcionális kis info ikon helye, ha később kell */} +
+ {initials} +
+
+ {" "} + + {username} + +
+
+ ) : ( +
Nincs bejelentkezve
+ )} +
+ {/* opcionális kis info ikon helye, ha később kell */} +
+
-

Csatlakozás játékhoz

-
+

Csatlakozás játékhoz

+
{ width="w-full" />
- {error &&
{error}
} + {error &&
{error}
}
- {user && ( -
-

Új játék létrehozása

- -
- )} + +
+ {username && ( +
+

Új játék létrehozása

+ +
+ )} +
diff --git a/SerpentRace_Frontend/src/components/Navbar/Navbar.jsx b/SerpentRace_Frontend/src/components/Navbar/Navbar.jsx index d0926eac..4fd5c9b9 100644 --- a/SerpentRace_Frontend/src/components/Navbar/Navbar.jsx +++ b/SerpentRace_Frontend/src/components/Navbar/Navbar.jsx @@ -32,15 +32,23 @@ const Navbar = () => { {/* Desktop Menu */}
- - Home - - - Decks - - - Stats - + {isLoggedIn ? ( + <> + + Home + + + Decks + + + Stats + + + ) : ( + + Home + + )} About @@ -103,9 +111,15 @@ const Navbar = () => { {/* Mobile Menu */} {menuOpen && (
- - Home - + {isLoggedIn ? ( + + Home + + ) : ( + + Home + + )} Leaderboard diff --git a/SerpentRace_Frontend/src/hooks/useRequireAuth.jsx b/SerpentRace_Frontend/src/hooks/useRequireAuth.jsx new file mode 100644 index 00000000..09f5f912 --- /dev/null +++ b/SerpentRace_Frontend/src/hooks/useRequireAuth.jsx @@ -0,0 +1,43 @@ +import { useState, useEffect } from "react" +import { useNavigate } from "react-router-dom" + +export function requireAuthSync({ key = "username", redirectTo = "/login", replace = true } = {}) { + const value = localStorage.getItem(key) + if (!value) { + if (replace) window.location.replace(redirectTo) + else window.location.assign(redirectTo) + return false + } + return true +} + +// Default hook: ad vissza egy [value, setValue] párt, szinkronizálja localStorage-t és átirányít, ha nincs érték +export default function useRequireAuth({ key = "username", redirectTo = "/login" } = {}) { + const navigate = useNavigate() + const [value, setValue] = useState(() => { + try { + return localStorage.getItem(key) + } catch { + return null + } + }) + + // Ha nincs érték, átirányítjuk (komponens mount-oláskor) + useEffect(() => { + if (!value) { + navigate(redirectTo) + } + }, [navigate, value, redirectTo]) + + // Szinkronizáljuk a localStorage-t amikor a state változik + useEffect(() => { + try { + if (value == null) localStorage.removeItem(key) + else localStorage.setItem(key, value) + } catch { + // fail silently + } + }, [key, value]) + + return [value, setValue] +} diff --git a/SerpentRace_Frontend/src/pages/Landing/Home.jsx b/SerpentRace_Frontend/src/pages/Landing/Home.jsx index 1bf2c2fe..e999d64e 100644 --- a/SerpentRace_Frontend/src/pages/Landing/Home.jsx +++ b/SerpentRace_Frontend/src/pages/Landing/Home.jsx @@ -1,19 +1,16 @@ // src/pages/Home/Home.jsx // Régi PlayMenu-s oldal, "Home" néven -import { useState, useEffect } from "react" -import { useNavigate } from "react-router-dom" +import { useEffect } from "react" +import useRequireAuth from "../../hooks/useRequireAuth" import Navbar from "../../components/Navbar/Navbar" import Footer from "../../components/Footer/Footer.jsx" import Background from "../../assets/backgrounds/Background.jsx" import PlayMenu from "../../components/Landingpage/PlayMenu.jsx" export default function Home() { - const navigate = useNavigate() - const user = localStorage.getItem("username") - - // Logoljuk ki a user-t minden renderkor - console.log("Home user:", user) + // a hook inicializálja a user-t a localStorage-ból és visszaadja a state-et + settert + const [user, setUser] = useRequireAuth() // Dummy callbackok és user példa const handleJoinGame = (code) => { @@ -24,12 +21,7 @@ export default function Home() { } const userObj = { name: user } - // Ha nincs bejelentkezett felhasználó a localStorage-ben, átirányítjuk a /login oldalra - useEffect(() => { - if (!user) { - navigate("/login") - } - }, [navigate, user]) + // ha szükséges a user módosítása máshol: setUser("újnév") automatikusan menti localStorage-be return (
diff --git a/SerpentRace_Frontend/src/pages/Report/Reports.jsx b/SerpentRace_Frontend/src/pages/Report/Reports.jsx index 2340ae51..f79b055e 100644 --- a/SerpentRace_Frontend/src/pages/Report/Reports.jsx +++ b/SerpentRace_Frontend/src/pages/Report/Reports.jsx @@ -4,8 +4,11 @@ import Navbar from "../../components/Navbar/Navbar.jsx" import Footer from "../../components/Footer/Footer.jsx" import Background from "../../assets/backgrounds/Background.jsx" import { getUserStats } from "../../api/userApi.js" +import useRequireAuth from "../../hooks/useRequireAuth.jsx" export default function Reports() { + const [username] = useRequireAuth({ key: "username", redirectTo: "/login" }) + return (
{/* Háttér */} @@ -24,9 +27,8 @@ export default function Reports() { {/* Fejléc */}

Játék Riportok

-

- Áttekintés a legutóbbi játékokról és statisztikákról -

+

Áttekintés a legutóbbi játékokról és statisztikákról

+ {username &&

Bejelentkezett: {username}

}
{/* Statisztikai kártyák */}