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")}

+ +
+ ); +} + +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