From ccd08bc0f03cb59b351c19d78ac0f937a5270368 Mon Sep 17 00:00:00 2001 From: Wolfboy248 Date: Mon, 25 Aug 2025 11:13:20 +0200 Subject: Moved breadcrum navigation into its own component --- .../BreadcrumbNav/BreadcrumbNav.module.css | 36 +++++ .../src/components/BreadcrumbNav/BreadcrumbNav.tsx | 72 ++++++++++ frontend/src/pages/Maplist/Maplist.tsx | 14 +- frontend/src/pages/Maps/Maps.tsx | 150 ++++++++------------- frontend/src/pages/Rules/Rules.tsx | 4 +- 5 files changed, 173 insertions(+), 103 deletions(-) create mode 100644 frontend/src/components/BreadcrumbNav/BreadcrumbNav.module.css create mode 100644 frontend/src/components/BreadcrumbNav/BreadcrumbNav.tsx diff --git a/frontend/src/components/BreadcrumbNav/BreadcrumbNav.module.css b/frontend/src/components/BreadcrumbNav/BreadcrumbNav.module.css new file mode 100644 index 0000000..9821972 --- /dev/null +++ b/frontend/src/components/BreadcrumbNav/BreadcrumbNav.module.css @@ -0,0 +1,36 @@ +.container { + display: flex; + margin-top: 42px; + margin-bottom: 16px; + margin-left: 48px; + gap: 2px; +} + +.crumb { + display: flex; + align-items: center; + gap: 12px; + background-color: var(--color-block); + padding: 6px 16px; + transition: all 0.1s ease; + font-size: 22px; +} + +.crumb:hover { + background-color: var(--color-panel); +} + +.crumb.first { + border-top-left-radius: 1000px; + border-bottom-left-radius: 1000px; +} + +.crumb.middle { + border-radius: 0px; +} + +.crumb.last, +.crumb.first.last { + border-top-right-radius: 1000px; + border-bottom-right-radius: 1000px; +} \ No newline at end of file diff --git a/frontend/src/components/BreadcrumbNav/BreadcrumbNav.tsx b/frontend/src/components/BreadcrumbNav/BreadcrumbNav.tsx new file mode 100644 index 0000000..7c4af15 --- /dev/null +++ b/frontend/src/components/BreadcrumbNav/BreadcrumbNav.tsx @@ -0,0 +1,72 @@ +import React from "react"; +import { Link, useLocation } from "react-router-dom"; + +import styles from "./BreadcrumbNav.module.css"; + +export interface Breadcrumb { + to: string; + label: string; +}; + +interface BreadcrumbNavProps { + chapter?: Breadcrumb; +}; + +const BreadcrumbNav: React.FC = ({ chapter }) => { + const [breadcrumbs, setBreadcrumbs] = React.useState([]); + + const path = useLocation(); + + React.useEffect(() => { + let _paths = path.pathname.split("/").filter(Boolean); + console.log(_paths); + let _breadcrumbs: Breadcrumb[] = []; + + if (_paths.length >= 2) { + _breadcrumbs.push({ + to: "/games", + label: "Games List" + }) + + // To test 3 crumbs + // _breadcrumbs.push({ + // to: "/games", + // label: "Test" + // }) + + if (_paths[0] == "maps") { + if (chapter) { + _breadcrumbs.push({ + to: chapter.to, + label: chapter.label + }); + } + } + } + + setBreadcrumbs(_breadcrumbs); + }, [path]) + + return ( + + ) +} + +export default BreadcrumbNav; diff --git a/frontend/src/pages/Maplist/Maplist.tsx b/frontend/src/pages/Maplist/Maplist.tsx index a5649db..d8acdf0 100644 --- a/frontend/src/pages/Maplist/Maplist.tsx +++ b/frontend/src/pages/Maplist/Maplist.tsx @@ -7,6 +7,7 @@ import { Game } from "@customTypes/Game.ts"; import { GameChapter, GamesChapters } from "@customTypes/Chapters.ts"; import Map from "./Components/Map"; +import BreadcrumbNav from "@components/BreadcrumbNav/BreadcrumbNav"; const Maplist: React.FC = () => { const [game, setGame] = React.useState(null); @@ -89,24 +90,17 @@ const Maplist: React.FC = () => { }, [gameChapters, location.search]); return ( -
+
LPHUB | Maplist -
- - - -
+ {load ? (
) : ( -
+

{game?.name}

diff --git a/frontend/src/pages/Maps/Maps.tsx b/frontend/src/pages/Maps/Maps.tsx index 75e3635..03de289 100644 --- a/frontend/src/pages/Maps/Maps.tsx +++ b/frontend/src/pages/Maps/Maps.tsx @@ -9,6 +9,7 @@ import Discussions from "@components/Discussions.tsx"; import ModMenu from "@components/ModMenu.tsx"; import { MapDiscussions, MapLeaderboard, MapSummary } from "@customTypes/Map.ts"; import { API } from "@api/Api.ts"; +import BreadcrumbNav from "@components/BreadcrumbNav/BreadcrumbNav.tsx"; interface MapProps { token?: string; @@ -64,37 +65,28 @@ const Maps: React.FC = ({ token, isModerator }) => { // loading placeholder return ( <> -
-
-
- - - -
-
- -
- - - -
+
+ + +
+
+ + + +
-
-
+
+
+
); } @@ -117,67 +109,43 @@ const Maps: React.FC = ({ token, isModerator }) => {
-
-
-
- - - - - - -
- - {mapSummaryData.map.map_name} - -
-
- -
- - - -
- - {navState === 0 && ( - - )} - {navState === 1 && } - {navState === 2 && ( - _fetch_map_discussions()} - /> - )} -
+
+ +
+
+ + + +
+ + {navState === 0 && ( + + )} + {navState === 1 && } + {navState === 2 && ( + _fetch_map_discussions()} + /> + )} +
+
); }; diff --git a/frontend/src/pages/Rules/Rules.tsx b/frontend/src/pages/Rules/Rules.tsx index 9c7885c..20d301c 100644 --- a/frontend/src/pages/Rules/Rules.tsx +++ b/frontend/src/pages/Rules/Rules.tsx @@ -25,12 +25,12 @@ const Rules: React.FC = () => { }, []); return ( -
+
LPHUB | Rules {rulesText} -
+ ); }; -- cgit v1.2.3