diff --git a/webapp/public/person1.jpg b/webapp/public/person1.jpg
new file mode 100644
index 0000000..f7ca7f0
Binary files /dev/null and b/webapp/public/person1.jpg differ
diff --git a/webapp/public/person2.jpg b/webapp/public/person2.jpg
new file mode 100644
index 0000000..232d128
Binary files /dev/null and b/webapp/public/person2.jpg differ
diff --git a/webapp/public/person3.jpg b/webapp/public/person3.jpg
new file mode 100644
index 0000000..6e69fc7
Binary files /dev/null and b/webapp/public/person3.jpg differ
diff --git a/webapp/public/person4.jpg b/webapp/public/person4.jpg
new file mode 100644
index 0000000..0843092
Binary files /dev/null and b/webapp/public/person4.jpg differ
diff --git a/webapp/public/person5.jpg b/webapp/public/person5.jpg
new file mode 100644
index 0000000..b9b46ae
Binary files /dev/null and b/webapp/public/person5.jpg differ
diff --git a/webapp/public/person6.jpg b/webapp/public/person6.jpg
new file mode 100644
index 0000000..6c60143
Binary files /dev/null and b/webapp/public/person6.jpg differ
diff --git a/webapp/src/App.js b/webapp/src/App.js
index 5f2c4fd..dd6ec5b 100644
--- a/webapp/src/App.js
+++ b/webapp/src/App.js
@@ -2,6 +2,9 @@ import React,{ useEffect } from 'react';
import QuestionView from './components/questionView/QuestionView';
import GameMenu from './components/GameMenu/GameMenu';
import Navbar from './components/fragments/NavBar';
+import Footer from './components/fragments/Footer';
+import About from './components/fragments/About';
+
import ErrorPage from './components/fragments/ErrorPage';
import Home from './components/Home/Home';
import Login from './components/loginAndRegistration/Login';
@@ -28,7 +31,8 @@ function App() {
-
+
+
} />
: } />
@@ -40,10 +44,14 @@ function App() {
: } />
: }/>
: } />
+ } />
} />
+
+
+
);
}
diff --git a/webapp/src/components/fragments/About.js b/webapp/src/components/fragments/About.js
new file mode 100644
index 0000000..90ecc14
--- /dev/null
+++ b/webapp/src/components/fragments/About.js
@@ -0,0 +1,26 @@
+import React from 'react';
+import { useTranslation } from "react-i18next";
+import '../../custom.css';
+
+function About() {
+ const t = useTranslation("global").t;
+
+ const imageNames = ["person1.jpg", "person2.jpg", "person3.jpg", "person4.jpg", "person5.jpg", "person6.jpg"];
+
+ return (
+
+
{t("about.hello")}
+
{t("about.team")}
+
+ {imageNames.map((imageName, index) => (
+ -
+
+ {t(`about.name${index + 1}`)}
+
+ ))}
+
+
+ );
+}
+
+export default About;
diff --git a/webapp/src/components/fragments/About.test.js b/webapp/src/components/fragments/About.test.js
new file mode 100644
index 0000000..b576680
--- /dev/null
+++ b/webapp/src/components/fragments/About.test.js
@@ -0,0 +1,31 @@
+import React from 'react';
+import { render, screen } from '@testing-library/react';
+import { BrowserRouter as Router } from 'react-router-dom';
+import About from './About';
+
+
+// Mocking useTranslation hook
+jest.mock('react-i18next', () => ({
+ useTranslation: () => ({ t: key => key }),
+ }));
+
+ describe('About', () => {
+ test('renders about page', () => {
+ render(
+
+
+
+ );
+
+ expect(screen.getByText('about.hello')).toBeInTheDocument();
+
+ expect(screen.getByText('about.name1')).toBeInTheDocument();
+ expect(screen.getByText('about.name2')).toBeInTheDocument();
+ expect(screen.getByText('about.name3')).toBeInTheDocument();
+ expect(screen.getByText('about.name4')).toBeInTheDocument();
+ expect(screen.getByText('about.name5')).toBeInTheDocument();
+ expect(screen.getByText('about.name6')).toBeInTheDocument();
+
+
+ });
+ });
diff --git a/webapp/src/components/fragments/BackButtonToGameMenu.test.js b/webapp/src/components/fragments/BackButtonToGameMenu.test.js
index 586cf69..88926bb 100644
--- a/webapp/src/components/fragments/BackButtonToGameMenu.test.js
+++ b/webapp/src/components/fragments/BackButtonToGameMenu.test.js
@@ -18,7 +18,7 @@ global.i18en = i18en;
describe('BackButtonToGameMenu component', () => {
it('renders option to go back to the game menu', () => {
- render();
+ render();
const text = screen.getByText((content, element) => {
const regex = new RegExp(i18en.t("gameMenu.back"));
return regex.test(content);
diff --git a/webapp/src/components/fragments/Footer.js b/webapp/src/components/fragments/Footer.js
new file mode 100644
index 0000000..3643cbe
--- /dev/null
+++ b/webapp/src/components/fragments/Footer.js
@@ -0,0 +1,29 @@
+import React from 'react';
+import '../../custom.css';
+import { Link } from 'react-router-dom';
+import { useTranslation } from "react-i18next";
+
+function Footer() {
+ const [t] = useTranslation("global");
+
+ return (
+
+ );
+}
+
+export default Footer;
diff --git a/webapp/src/components/fragments/Footer.test.js b/webapp/src/components/fragments/Footer.test.js
new file mode 100644
index 0000000..3e448be
--- /dev/null
+++ b/webapp/src/components/fragments/Footer.test.js
@@ -0,0 +1,34 @@
+import { render , screen } from '@testing-library/react';
+import { initReactI18next } from 'react-i18next';
+import i18en from 'i18next';
+
+import App from '../../App'
+
+i18en.use(initReactI18next).init({
+ resources: {},
+ lng: 'en',
+ interpolation:{
+ escapeValue: false,
+ }
+});
+global.i18en = i18en;
+
+describe('Footer fragment', () => {
+
+
+
+ test('Footer renders correctly', async () => {
+ render(
+
+ );
+ expect(screen.getByText('footer.about')).toBeInTheDocument();
+ expect(screen.getByText('footer.API')).toBeInTheDocument();
+ expect(screen.getByText('footer.ARC')).toBeInTheDocument();
+
+
+
+
+
+ });
+});
+
diff --git a/webapp/src/custom.css b/webapp/src/custom.css
index f6660f9..c9d36a8 100644
--- a/webapp/src/custom.css
+++ b/webapp/src/custom.css
@@ -20,7 +20,23 @@
overflow: hidden;
height: 100vh;
}
+/* About.css */
+.person-list {
+ list-style: none;
+ padding: 0;
+}
+
+.person-item {
+ display: flex;
+ align-items: center;
+ margin-bottom: 10px;
+}
+.person-image {
+ width: 50px;
+ height: auto;
+ margin-right: 10px;
+}
/*---------------------------Navbar---------------------------*/
@@ -36,6 +52,31 @@
left: 0;
top: 0;
}
+
+.footer-container {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ background-color: #000;
+ color: white;
+ width: 100vw;
+ padding: 5px;
+ box-sizing: border-box;
+ position: fixed;
+ height: 30px;
+}
+
+
+
+.about, .API, .ARC{
+ color: white;
+}
+
+
+
.left-nav{
display:flex;
align-items: left;
@@ -104,7 +145,8 @@
.form {
display: flex;
flex-direction: column;
- gap: 20px;
+ gap: 10px;
+ padding-top: 0;
padding-left: 2em;
padding-right: 2em;
padding-bottom: 0.4em;
@@ -116,7 +158,7 @@
.card {
background-image: linear-gradient(163deg, #00ff75 0%, #3700ff 100%);
- border-radius: 22px;
+ border-radius: 15px;
transition: all 0.3s;
}
@@ -139,7 +181,7 @@
display: flex;
flex-direction: row;
align-items: center;
- margin-bottom: 20px;
+ margin-bottom: 10px;
}
.input-box p {
diff --git a/webapp/src/translations/en/global.json b/webapp/src/translations/en/global.json
index 495adbe..0eb924b 100644
--- a/webapp/src/translations/en/global.json
+++ b/webapp/src/translations/en/global.json
@@ -129,7 +129,22 @@
"error":{
"error":"Error",
"sorry":"We're sorry, this page does not exist. Don't be angry, I'm just a little cat."
- }
+ },
+ "footer":{
+ "about": "About us",
+ "API": "API-Doc",
+ "ARC": "Arc42-Doc"
+ },
+ "about":{
+ "hello": "Hello there!",
+ "team": "We're the awesome bunch from en01b! We hope you like our game.",
+ "name1": "Mario Junquera Rojas",
+ "name2": "Lucia Ruiz Núñez",
+ "name3": "Daniel Sinne Argüelles",
+ "name4": "Jorge Cano Martínez",
+ "name5": "Ahmet Erdem Yabaci",
+ "name6": "Laura Gómez Menéndez"
+ }
}
diff --git a/webapp/src/translations/es/global.json b/webapp/src/translations/es/global.json
index 7073daa..b51b19a 100644
--- a/webapp/src/translations/es/global.json
+++ b/webapp/src/translations/es/global.json
@@ -130,7 +130,23 @@
"num_games":"Juegos Competitivos",
"search":"Buscar",
"enter_username":"Inserta usuario..."
- }
+ },
+ "footer":{
+ "about": "Sobre nosotros",
+ "API": "API-Doc",
+ "ARC": "Arc42-Doc"
+ },
+
+ "about":{
+ "hello": "¡Hola!",
+ "team": "¡Somos el increíble grupo en01b! Esperamos que les guste nuestro juego.",
+ "name1": "Mario Junquera Rojas",
+ "name2": "Lucía Ruiz Núñez",
+ "name3": "Daniel Sinne Argüelles",
+ "name4": "Jorge Cano Martínez",
+ "name5": "Ahmet Erdem Yabacı",
+ "name6": "Laura Gómez Menéndez"
+}
}
\ No newline at end of file
diff --git a/webapp/src/translations/tk/global.json b/webapp/src/translations/tk/global.json
index 528dec3..3ebebcb 100644
--- a/webapp/src/translations/tk/global.json
+++ b/webapp/src/translations/tk/global.json
@@ -128,5 +128,20 @@
"error":{
"error":"Hata",
"sorry":"Üzgünüz, bu sayfa mevcut değil. Kızma, ben sadece küçük bir kediğim."
- }
+ },
+ "footer":{
+ "about": "Hakkımızda",
+ "API": "API Belgeleri",
+ "ARC": "Arc42 Belgeleri"
+},
+ "about":{
+ "hello": "Merhaba!",
+ "team": "Biz, en01b'den harika bir ekipiz! Oyunumuzu beğenmenizi umuyoruz.",
+ "name1": "Mario Junquera Rojas",
+ "name2": "Lucía Ruiz Núñez",
+ "name3": "Daniel Sinne Argüelles",
+ "name4": "Jorge Cano Martínez",
+ "name5": "Ahmet Erdem Yabacı",
+ "name6": "Laura Gómez Menéndez"
+}
}
\ No newline at end of file