aboutsummaryrefslogtreecommitdiff
path: root/frontend/src
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src')
-rw-r--r--frontend/src/App.tsx5
-rw-r--r--frontend/src/pages/About.tsx4
-rw-r--r--frontend/src/pages/Games.tsx12
-rw-r--r--frontend/src/pages/Homepage.tsx6
-rw-r--r--frontend/src/pages/Maplist.tsx48
-rw-r--r--frontend/src/pages/Maps.tsx37
-rw-r--r--frontend/src/pages/Profile.tsx5
-rw-r--r--frontend/src/pages/Rankings.tsx30
-rw-r--r--frontend/src/pages/Rules.tsx4
-rw-r--r--frontend/src/pages/User.tsx5
10 files changed, 101 insertions, 55 deletions
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index a02779b..bdd3adc 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -1,5 +1,6 @@
1import React from 'react'; 1import React from 'react';
2import { Routes, Route } from "react-router-dom"; 2import { Routes, Route } from "react-router-dom";
3import { Helmet } from "react-helmet";
3 4
4import { UserProfile } from '@customTypes/Profile'; 5import { UserProfile } from '@customTypes/Profile';
5import Sidebar from './components/Sidebar'; 6import Sidebar from './components/Sidebar';
@@ -68,6 +69,10 @@ const App: React.FC = () => {
68 69
69 return ( 70 return (
70 <> 71 <>
72 <Helmet>
73 <title>LPHUB</title>
74 <meta name="description" content="Least Portals Hub" />
75 </Helmet>
71 <UploadRunDialog token={token} open={uploadRunDialog} onClose={(updateProfile) => { 76 <UploadRunDialog token={token} open={uploadRunDialog} onClose={(updateProfile) => {
72 setUploadRunDialog(false); 77 setUploadRunDialog(false);
73 if (updateProfile) { 78 if (updateProfile) {
diff --git a/frontend/src/pages/About.tsx b/frontend/src/pages/About.tsx
index ded3461..a8b7826 100644
--- a/frontend/src/pages/About.tsx
+++ b/frontend/src/pages/About.tsx
@@ -1,5 +1,6 @@
1import React from 'react'; 1import React from 'react';
2import ReactMarkdown from 'react-markdown'; 2import ReactMarkdown from 'react-markdown';
3import { Helmet } from 'react-helmet';
3 4
4import '@css/About.css'; 5import '@css/About.css';
5 6
@@ -28,6 +29,9 @@ const About: React.FC = () => {
28 29
29 return ( 30 return (
30 <div id="about"> 31 <div id="about">
32 <Helmet>
33 <title>LPHUB | About</title>
34 </Helmet>
31 <ReactMarkdown>{aboutText}</ReactMarkdown> 35 <ReactMarkdown>{aboutText}</ReactMarkdown>
32 </div> 36 </div>
33 ); 37 );
diff --git a/frontend/src/pages/Games.tsx b/frontend/src/pages/Games.tsx
index 15105c9..15cc891 100644
--- a/frontend/src/pages/Games.tsx
+++ b/frontend/src/pages/Games.tsx
@@ -1,4 +1,5 @@
1import React from 'react'; 1import React from 'react';
2import { Helmet } from 'react-helmet';
2 3
3import GameEntry from '@components/GameEntry'; 4import GameEntry from '@components/GameEntry';
4import { Game } from '@customTypes/Game'; 5import { Game } from '@customTypes/Game';
@@ -11,10 +12,10 @@ interface GamesProps {
11const Games: React.FC<GamesProps> = ({ games }) => { 12const Games: React.FC<GamesProps> = ({ games }) => {
12 13
13 const _page_load = () => { 14 const _page_load = () => {
14 const loaders = document.querySelectorAll(".loader"); 15 const loaders = document.querySelectorAll(".loader");
15 loaders.forEach((loader) => { 16 loaders.forEach((loader) => {
16 (loader as HTMLElement).style.display = "none"; 17 (loader as HTMLElement).style.display = "none";
17 }); 18 });
18 } 19 }
19 20
20 React.useEffect(() => { 21 React.useEffect(() => {
@@ -26,6 +27,9 @@ const Games: React.FC<GamesProps> = ({ games }) => {
26 27
27 return ( 28 return (
28 <div className='games-page'> 29 <div className='games-page'>
30 <Helmet>
31 <title>LPHUB | Games</title>
32 </Helmet>
29 <section> 33 <section>
30 <div className='games-page-content'> 34 <div className='games-page-content'>
31 <div className='games-page-item-content'> 35 <div className='games-page-item-content'>
diff --git a/frontend/src/pages/Homepage.tsx b/frontend/src/pages/Homepage.tsx
index 68562b6..4f46af5 100644
--- a/frontend/src/pages/Homepage.tsx
+++ b/frontend/src/pages/Homepage.tsx
@@ -1,11 +1,15 @@
1import React from 'react'; 1import React from 'react';
2import { Helmet } from 'react-helmet';
2 3
3const Homepage: React.FC = () => { 4const Homepage: React.FC = () => {
4 5
5 return ( 6 return (
6 <main> 7 <main>
8 <Helmet>
9 <title>LPHUB | Homepage</title>
10 </Helmet>
7 <section> 11 <section>
8 <p/> 12 <p />
9 <h1>Welcome to Least Portals Hub!</h1> 13 <h1>Welcome to Least Portals Hub!</h1>
10 <p>At the moment, LPHUB is in beta state. This means that the site has only the core functionalities enabled for providing both collaborative information and competitive leaderboards.</p> 14 <p>At the moment, LPHUB is in beta state. This means that the site has only the core functionalities enabled for providing both collaborative information and competitive leaderboards.</p>
11 <p>The website should feel intuitive to navigate around. For any type of feedback, reach us at LPHUB Discord server.</p> 15 <p>The website should feel intuitive to navigate around. For any type of feedback, reach us at LPHUB Discord server.</p>
diff --git a/frontend/src/pages/Maplist.tsx b/frontend/src/pages/Maplist.tsx
index 8fc52b0..04938cf 100644
--- a/frontend/src/pages/Maplist.tsx
+++ b/frontend/src/pages/Maplist.tsx
@@ -1,5 +1,6 @@
1import React, { useEffect } from "react"; 1import React, { useEffect } from "react";
2import { Link, useLocation, useNavigate, useParams } from "react-router-dom"; 2import { Link, useLocation, useNavigate, useParams } from "react-router-dom";
3import { Helmet } from "react-helmet";
3 4
4import "@css/Maplist.css"; 5import "@css/Maplist.css";
5import { API } from "@api/Api"; 6import { API } from "@api/Api";
@@ -25,9 +26,9 @@ const Maplist: React.FC = () => {
25 const navigate = useNavigate(); 26 const navigate = useNavigate();
26 27
27 function _update_currently_selected(catNum2: number) { 28 function _update_currently_selected(catNum2: number) {
28 setCurrentlySelected(catNum2); 29 setCurrentlySelected(catNum2);
29 navigate("/games/" + game?.id + "?cat=" + catNum2); 30 navigate("/games/" + game?.id + "?cat=" + catNum2);
30 setHasClicked(true); 31 setHasClicked(true);
31 } 32 }
32 33
33 const _fetch_chapters = async (chapter_id: string) => { 34 const _fetch_chapters = async (chapter_id: string) => {
@@ -52,12 +53,12 @@ const Maplist: React.FC = () => {
52 // location query params 53 // location query params
53 const queryParams = new URLSearchParams(location.search); 54 const queryParams = new URLSearchParams(location.search);
54 if (queryParams.get("chapter")) { 55 if (queryParams.get("chapter")) {
55 let cat = parseFloat(queryParams.get("chapter") || ""); 56 let cat = parseFloat(queryParams.get("chapter") || "");
56 if (gameId == 2) { 57 if (gameId == 2) {
57 cat += 10; 58 cat += 10;
58 } 59 }
59 _fetch_chapters(cat.toString()); 60 _fetch_chapters(cat.toString());
60 } 61 }
61 62
62 const _fetch_game = async () => { 63 const _fetch_game = async () => {
63 const games = await API.get_games(); 64 const games = await API.get_games();
@@ -68,7 +69,7 @@ const Maplist: React.FC = () => {
68 setLoad(false); 69 setLoad(false);
69 } 70 }
70 }; 71 };
71 72
72 const _fetch_game_chapters = async () => { 73 const _fetch_game_chapters = async () => {
73 const games_chapters = await API.get_games_chapters(gameId.toString()); 74 const games_chapters = await API.get_games_chapters(gameId.toString());
74 setGameChapters(games_chapters); 75 setGameChapters(games_chapters);
@@ -81,7 +82,7 @@ const Maplist: React.FC = () => {
81 }, []); 82 }, []);
82 83
83 useEffect(() => { 84 useEffect(() => {
84 const queryParams = new URLSearchParams(location.search); 85 const queryParams = new URLSearchParams(location.search);
85 if (gameChapters != undefined && !queryParams.get("chapter")) { 86 if (gameChapters != undefined && !queryParams.get("chapter")) {
86 _fetch_chapters(gameChapters!.chapters[0].id.toString()); 87 _fetch_chapters(gameChapters!.chapters[0].id.toString());
87 } 88 }
@@ -91,6 +92,9 @@ const Maplist: React.FC = () => {
91 92
92 return ( 93 return (
93 <main> 94 <main>
95 <Helmet>
96 <title>LPHUB | Maplist</title>
97 </Helmet>
94 <section style={{ marginTop: "20px" }}> 98 <section style={{ marginTop: "20px" }}>
95 <Link to="/games"> 99 <Link to="/games">
96 <button className="nav-button" style={{ borderRadius: "20px" }}> 100 <button className="nav-button" style={{ borderRadius: "20px" }}>
@@ -121,7 +125,7 @@ const Maplist: React.FC = () => {
121 </div> 125 </div>
122 <div className="game-header-categories"> 126 <div className="game-header-categories">
123 {game?.category_portals.map((cat, index) => ( 127 {game?.category_portals.map((cat, index) => (
124 <button key={index} className={currentlySelected == cat.category.id || cat.category.id - 1 == catNum && !hasClicked ? "game-cat-button selected" : "game-cat-button"} onClick={() => {setCatNum(cat.category.id - 1); _update_currently_selected(cat.category.id)}}> 128 <button key={index} className={currentlySelected == cat.category.id || cat.category.id - 1 == catNum && !hasClicked ? "game-cat-button selected" : "game-cat-button"} onClick={() => { setCatNum(cat.category.id - 1); _update_currently_selected(cat.category.id) }}>
125 <span>{cat.category.name}</span> 129 <span>{cat.category.name}</span>
126 </button> 130 </button>
127 ))} 131 ))}
@@ -132,26 +136,26 @@ const Maplist: React.FC = () => {
132 <div> 136 <div>
133 <section className="chapter-select-container"> 137 <section className="chapter-select-container">
134 <div> 138 <div>
135 <span style={{fontSize: "18px", transform: "translateY(5px)", display: "block", marginTop: "10px"}}>{curChapter?.chapter.name.split(" - ")[0]}</span> 139 <span style={{ fontSize: "18px", transform: "translateY(5px)", display: "block", marginTop: "10px" }}>{curChapter?.chapter.name.split(" - ")[0]}</span>
136 </div> 140 </div>
137 <div onClick={_handle_dropdown_click} className="dropdown"> 141 <div onClick={_handle_dropdown_click} className="dropdown">
138 <span>{curChapter?.chapter.name.split(" - ")[1]}</span> 142 <span>{curChapter?.chapter.name.split(" - ")[1]}</span>
139 <i className="triangle"></i> 143 <i className="triangle"></i>
140 </div> 144 </div>
141 <div className="dropdown-elements" style={{display: dropdownActive}}> 145 <div className="dropdown-elements" style={{ display: dropdownActive }}>
142 {gameChapters?.chapters.map((chapter, i) => { 146 {gameChapters?.chapters.map((chapter, i) => {
143 return <div className="dropdown-element" onClick={() => {_fetch_chapters(chapter.id.toString()); _handle_dropdown_click()}}>{chapter.name}</div> 147 return <div className="dropdown-element" onClick={() => { _fetch_chapters(chapter.id.toString()); _handle_dropdown_click() }}>{chapter.name}</div>
144 }) 148 })
145 149
146 } 150 }
147 </div> 151 </div>
148 </section> 152 </section>
149 <section className="maplist"> 153 <section className="maplist">
150 {curChapter?.maps.map((map, i) => { 154 {curChapter?.maps.map((map, i) => {
151 return <div className="maplist-entry"> 155 return <div className="maplist-entry">
152 <Link to={`/maps/${map.id}`}> 156 <Link to={`/maps/${map.id}`}>
153 <span>{map.name}</span> 157 <span>{map.name}</span>
154 <div className="map-entry-image" style={{backgroundImage: `url(${map.image})`}}> 158 <div className="map-entry-image" style={{ backgroundImage: `url(${map.image})` }}>
155 <div className="blur map"> 159 <div className="blur map">
156 <span>{map.is_disabled ? map.category_portals[0].portal_count : map.category_portals.find( 160 <span>{map.is_disabled ? map.category_portals[0].portal_count : map.category_portals.find(
157 (obj) => obj.category.id === catNum + 1 161 (obj) => obj.category.id === catNum + 1
@@ -169,9 +173,9 @@ const Maplist: React.FC = () => {
169 <div className="difficulty-point"></div> 173 <div className="difficulty-point"></div>
170 </div> 174 </div>
171 </div> 175 </div>
172 </Link> 176 </Link>
173 </div> 177 </div>
174 })} 178 })}
175 </section> 179 </section>
176 </div> 180 </div>
177 </section> 181 </section>
diff --git a/frontend/src/pages/Maps.tsx b/frontend/src/pages/Maps.tsx
index f73e8d2..fb13563 100644
--- a/frontend/src/pages/Maps.tsx
+++ b/frontend/src/pages/Maps.tsx
@@ -1,5 +1,6 @@
1import React from 'react'; 1import React from 'react';
2import { Link, useLocation } from 'react-router-dom'; 2import { Link, useLocation } from 'react-router-dom';
3import { Helmet } from 'react-helmet';
3 4
4import { PortalIcon, FlagIcon, ChatIcon } from '@images/Images'; 5import { PortalIcon, FlagIcon, ChatIcon } from '@images/Images';
5import Summary from '@components/Summary'; 6import Summary from '@components/Summary';
@@ -53,26 +54,32 @@ const Maps: React.FC<MapProps> = ({ token, isModerator }) => {
53 if (!mapSummaryData) { 54 if (!mapSummaryData) {
54 // loading placeholder 55 // loading placeholder
55 return ( 56 return (
56 <main> 57 <>
57 <section id='section1' className='summary1'> 58 <main>
58 <div> 59 <section id='section1' className='summary1'>
59 <Link to="/games"><button className='nav-button' style={{ borderRadius: "20px 20px 20px 20px" }}><i className='triangle'></i><span>Games List</span></button></Link> 60 <div>
60 </div> 61 <Link to="/games"><button className='nav-button' style={{ borderRadius: "20px 20px 20px 20px" }}><i className='triangle'></i><span>Games List</span></button></Link>
61 </section> 62 </div>
62 63 </section>
63 <section id='section2' className='summary1'> 64
64 <button className='nav-button'><img src={PortalIcon} alt="" /><span>Summary</span></button> 65 <section id='section2' className='summary1'>
65 <button className='nav-button'><img src={FlagIcon} alt="" /><span>Leaderboards</span></button> 66 <button className='nav-button'><img src={PortalIcon} alt="" /><span>Summary</span></button>
66 <button className='nav-button'><img src={ChatIcon} alt="" /><span>Discussions</span></button> 67 <button className='nav-button'><img src={FlagIcon} alt="" /><span>Leaderboards</span></button>
67 </section> 68 <button className='nav-button'><img src={ChatIcon} alt="" /><span>Discussions</span></button>
68 69 </section>
69 <section id='section6' className='summary2' /> 70
70 </main> 71 <section id='section6' className='summary2' />
72 </main>
73 </>
71 ); 74 );
72 } 75 }
73 76
74 return ( 77 return (
75 <> 78 <>
79 <Helmet>
80 <title>LPHUB | {mapSummaryData.map.map_name}</title>
81 <meta name="description" content={mapSummaryData.map.map_name} />
82 </Helmet>
76 {isModerator && <ModMenu token={token} data={mapSummaryData} selectedRun={selectedRun} mapID={mapID} />} 83 {isModerator && <ModMenu token={token} data={mapSummaryData} selectedRun={selectedRun} mapID={mapID} />}
77 84
78 <div id='background-image'> 85 <div id='background-image'>
diff --git a/frontend/src/pages/Profile.tsx b/frontend/src/pages/Profile.tsx
index 63b3c13..48233bf 100644
--- a/frontend/src/pages/Profile.tsx
+++ b/frontend/src/pages/Profile.tsx
@@ -1,5 +1,6 @@
1import React from 'react'; 1import React from 'react';
2import { Link, useNavigate } from 'react-router-dom'; 2import { Link, useNavigate } from 'react-router-dom';
3import { Helmet } from 'react-helmet';
3 4
4import { SteamIcon, TwitchIcon, YouTubeIcon, PortalIcon, FlagIcon, StatisticsIcon, SortIcon, ThreedotIcon, DownloadIcon, HistoryIcon, DeleteIcon } from '@images/Images'; 5import { SteamIcon, TwitchIcon, YouTubeIcon, PortalIcon, FlagIcon, StatisticsIcon, SortIcon, ThreedotIcon, DownloadIcon, HistoryIcon, DeleteIcon } from '@images/Images';
5import { UserProfile } from '@customTypes/Profile'; 6import { UserProfile } from '@customTypes/Profile';
@@ -109,6 +110,10 @@ const Profile: React.FC<ProfileProps> = ({ profile, token, gameData, onDeleteRec
109 110
110 return ( 111 return (
111 <div> 112 <div>
113 <Helmet>
114 <title>LPHUB | {profile.user_name}</title>
115 <meta name="description" content={profile.user_name} />
116 </Helmet>
112 {MessageDialogComponent} 117 {MessageDialogComponent}
113 {MessageDialogLoadComponent} 118 {MessageDialogLoadComponent}
114 {ConfirmDialogComponent} 119 {ConfirmDialogComponent}
diff --git a/frontend/src/pages/Rankings.tsx b/frontend/src/pages/Rankings.tsx
index cdb87a8..71aa427 100644
--- a/frontend/src/pages/Rankings.tsx
+++ b/frontend/src/pages/Rankings.tsx
@@ -1,4 +1,5 @@
1import React, { useEffect } from "react"; 1import React, { useEffect } from "react";
2import { Helmet } from "react-helmet";
2 3
3import RankingEntry from "@components/RankingEntry"; 4import RankingEntry from "@components/RankingEntry";
4import { Ranking, SteamRanking, RankingType, SteamRankingType } from "@customTypes/Ranking"; 5import { Ranking, SteamRanking, RankingType, SteamRankingType } from "@customTypes/Ranking";
@@ -13,9 +14,9 @@ const Rankings: React.FC = () => {
13 official, 14 official,
14 unofficial 15 unofficial
15 } 16 }
16 const [currentRankingType, setCurrentRankingType] = React.useState<LeaderboardTypes>(LeaderboardTypes.official); 17 const [currentRankingType, setCurrentRankingType] = React.useState<LeaderboardTypes>(LeaderboardTypes.official);
17 18
18 const [leaderboardLoad, setLeaderboardLoad] = React.useState<boolean>(false); 19 const [leaderboardLoad, setLeaderboardLoad] = React.useState<boolean>(false);
19 20
20 enum RankingCategories { 21 enum RankingCategories {
21 rankings_overall, 22 rankings_overall,
@@ -26,7 +27,7 @@ const Rankings: React.FC = () => {
26 const [load, setLoad] = React.useState<boolean>(false); 27 const [load, setLoad] = React.useState<boolean>(false);
27 28
28 const _fetch_rankings = async () => { 29 const _fetch_rankings = async () => {
29 setLeaderboardLoad(false); 30 setLeaderboardLoad(false);
30 const rankings = await API.get_official_rankings(); 31 const rankings = await API.get_official_rankings();
31 setLeaderboardData(rankings); 32 setLeaderboardData(rankings);
32 if (currentLeaderboardType == RankingCategories.rankings_singleplayer) { 33 if (currentLeaderboardType == RankingCategories.rankings_singleplayer) {
@@ -37,12 +38,12 @@ const Rankings: React.FC = () => {
37 setCurrentLeaderboard(rankings.rankings_overall) 38 setCurrentLeaderboard(rankings.rankings_overall)
38 } 39 }
39 setLoad(true); 40 setLoad(true);
40 setLeaderboardLoad(true); 41 setLeaderboardLoad(true);
41 } 42 }
42 43
43 const __dev_fetch_unofficial_rankings = async () => { 44 const __dev_fetch_unofficial_rankings = async () => {
44 try { 45 try {
45 setLeaderboardLoad(false); 46 setLeaderboardLoad(false);
46 const rankings = await API.get_unofficial_rankings(); 47 const rankings = await API.get_unofficial_rankings();
47 setLeaderboardData(rankings); 48 setLeaderboardData(rankings);
48 if (currentLeaderboardType == RankingCategories.rankings_singleplayer) { 49 if (currentLeaderboardType == RankingCategories.rankings_singleplayer) {
@@ -53,7 +54,7 @@ const Rankings: React.FC = () => {
53 } else { 54 } else {
54 setCurrentLeaderboard(rankings.rankings_overall) 55 setCurrentLeaderboard(rankings.rankings_overall)
55 } 56 }
56 setLeaderboardLoad(true); 57 setLeaderboardLoad(true);
57 } catch (e) { 58 } catch (e) {
58 console.log(e) 59 console.log(e)
59 } 60 }
@@ -88,12 +89,15 @@ const Rankings: React.FC = () => {
88 89
89 return ( 90 return (
90 <main> 91 <main>
92 <Helmet>
93 <title>LPHUB | Rankings</title>
94 </Helmet>
91 <section className="nav-container nav-1"> 95 <section className="nav-container nav-1">
92 <div> 96 <div>
93 <button onClick={() => {_fetch_rankings(); setCurrentRankingType(LeaderboardTypes.official)}} className={`nav-1-btn ${currentRankingType == LeaderboardTypes.official ? "selected" : ""}`}> 97 <button onClick={() => { _fetch_rankings(); setCurrentRankingType(LeaderboardTypes.official) }} className={`nav-1-btn ${currentRankingType == LeaderboardTypes.official ? "selected" : ""}`}>
94 <span>Official (LPHUB)</span> 98 <span>Official (LPHUB)</span>
95 </button> 99 </button>
96 <button onClick={() => {__dev_fetch_unofficial_rankings(); setCurrentRankingType(LeaderboardTypes.unofficial)}} className={`nav-1-btn ${currentRankingType == LeaderboardTypes.unofficial ? "selected" : ""}`}> 100 <button onClick={() => { __dev_fetch_unofficial_rankings(); setCurrentRankingType(LeaderboardTypes.unofficial) }} className={`nav-1-btn ${currentRankingType == LeaderboardTypes.unofficial ? "selected" : ""}`}>
97 <span>Unofficial (Steam)</span> 101 <span>Unofficial (Steam)</span>
98 </button> 102 </button>
99 </div> 103 </div>
@@ -128,11 +132,11 @@ const Rankings: React.FC = () => {
128 }) 132 })
129 } 133 }
130 134
131 {leaderboardLoad ? null : 135 {leaderboardLoad ? null :
132 <div style={{display: "flex", justifyContent: "center", margin: "30px 0px"}}> 136 <div style={{ display: "flex", justifyContent: "center", margin: "30px 0px" }}>
133 <span className="loader"></span> 137 <span className="loader"></span>
134 </div> 138 </div>
135 } 139 }
136 </div> 140 </div>
137 </section> 141 </section>
138 : null} 142 : null}
diff --git a/frontend/src/pages/Rules.tsx b/frontend/src/pages/Rules.tsx
index b5625ce..9f57b7e 100644
--- a/frontend/src/pages/Rules.tsx
+++ b/frontend/src/pages/Rules.tsx
@@ -1,5 +1,6 @@
1import React from 'react'; 1import React from 'react';
2import ReactMarkdown from 'react-markdown'; 2import ReactMarkdown from 'react-markdown';
3import { Helmet } from 'react-helmet';
3 4
4import '@css/Rules.css'; 5import '@css/Rules.css';
5 6
@@ -29,6 +30,9 @@ const Rules: React.FC = () => {
29 30
30 return ( 31 return (
31 <main> 32 <main>
33 <Helmet>
34 <title>LPHUB | Rules</title>
35 </Helmet>
32 <ReactMarkdown>{rulesText}</ReactMarkdown> 36 <ReactMarkdown>{rulesText}</ReactMarkdown>
33 </main> 37 </main>
34 ); 38 );
diff --git a/frontend/src/pages/User.tsx b/frontend/src/pages/User.tsx
index 938dbd5..d43c0c6 100644
--- a/frontend/src/pages/User.tsx
+++ b/frontend/src/pages/User.tsx
@@ -1,5 +1,6 @@
1import React from 'react'; 1import React from 'react';
2import { Link, useLocation, useNavigate } from 'react-router-dom'; 2import { Link, useLocation, useNavigate } from 'react-router-dom';
3import { Helmet } from 'react-helmet';
3 4
4import { SteamIcon, TwitchIcon, YouTubeIcon, PortalIcon, FlagIcon, StatisticsIcon, SortIcon, ThreedotIcon, DownloadIcon, HistoryIcon } from '@images/Images'; 5import { SteamIcon, TwitchIcon, YouTubeIcon, PortalIcon, FlagIcon, StatisticsIcon, SortIcon, ThreedotIcon, DownloadIcon, HistoryIcon } from '@images/Images';
5import { UserProfile } from '@customTypes/Profile'; 6import { UserProfile } from '@customTypes/Profile';
@@ -92,6 +93,10 @@ const User: React.FC<UserProps> = ({ token, profile, gameData }) => {
92 93
93 return ( 94 return (
94 <main> 95 <main>
96 <Helmet>
97 <title>LPHUB | {user.user_name}</title>
98 <meta name="description" content={user.user_name} />
99 </Helmet>
95 {MessageDialogComponent} 100 {MessageDialogComponent}
96 <section id='section1' className='profile'> 101 <section id='section1' className='profile'>
97 <div> 102 <div>