From 3f5f6d4a7b65f22eba16a0caf0047cd23ad89e72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Sun, 21 Apr 2024 20:30:07 +0200 Subject: [PATCH 1/9] Game Report --- questionservice/question-service.js | 35 ++- webapp/package-lock.json | 365 +++++++++++++----------- webapp/package.json | 7 +- webapp/src/components/ImgGameReport.jsx | 67 +++++ webapp/src/components/Question.jsx | 74 +++-- 5 files changed, 344 insertions(+), 204 deletions(-) create mode 100644 webapp/src/components/ImgGameReport.jsx diff --git a/questionservice/question-service.js b/questionservice/question-service.js index 512809c..d93d585 100644 --- a/questionservice/question-service.js +++ b/questionservice/question-service.js @@ -212,26 +212,33 @@ app.get('/imgs/foods/question', async (req, res) => { app.post('/imgs/answer', async (req, res) => { try { const obj = req.body; - - if (obj.question == answerToQuestionMap.get(obj.answer)) { - await axios.post(userServiceUrl + '/addpoints', - { username: obj.username, category: obj.category, correct: "true" }); - res.status(200).json({ - correct: "true", - }) + if (obj.answer !== "TimeOut1234;") { + if (obj.question == answerToQuestionMap.get(obj.answer)) { + await axios.post(userServiceUrl + '/addpoints', + { username: obj.username, category: obj.category, correct: "true" }); + res.status(200).json({ + correct: "true", + }) + } else { + await axios.post(userServiceUrl + '/addpoints', + { username: obj.username, category: obj.category, correct: "false" }); + res.status(200).json({ + correct: "false", + correctImg: `${[...answerToQuestionMap].find(([key, val]) => val == obj.question)[0]}` + }) + } } else { - await axios.post(userServiceUrl + '/addpoints', - { username: obj.username, category: obj.category, correct: "false" }); res.status(200).json({ correct: "false", - associate: `${imgToAssociatedMap.get(obj.answer)}` + correctImg: `${[...answerToQuestionMap].find(([key, val]) => val == obj.question)[0]}` }) } - } catch (e) { //SIEMPRE RODEAR CON TRY CATCH - res.status(500).json({ error: e.message }) - } -}); + } catch (e) { //SIEMPRE RODEAR CON TRY CATCH + console.error(e) + res.status(500).json({ error: e.message }) + } + }); const server = app.listen(port, () => { console.log(`Questions service listening on http://localhost:${port}`); diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 3a036d1..337894f 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -5,11 +5,13 @@ "requires": true, "packages": { "": { + "name": "webapp", "version": "0.1.0", "dependencies": { - "@emotion/react": "^11.11.3", - "@emotion/styled": "^11.11.0", - "@mui/material": "^5.15.3", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "^5.15.15", + "@mui/material": "^5.15.15", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.5.2", @@ -1972,9 +1974,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", - "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2379,9 +2381,9 @@ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -2392,9 +2394,9 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -2415,9 +2417,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", @@ -2432,14 +2434,14 @@ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1" }, @@ -2570,28 +2572,28 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", "dependencies": { - "@floating-ui/core": "^1.5.3", + "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.5.tgz", - "integrity": "sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", "dependencies": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.6.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -4527,16 +4529,16 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.30", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.30.tgz", - "integrity": "sha512-dc38W4W3K42atE9nSaOeoJ7/x9wGIfawdwC/UmMxMLlZ1iSsITQ8dQJaTATCbn98YvYPINK/EH541YA5enQIPQ==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", + "clsx": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { @@ -4558,28 +4560,53 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.3.tgz", - "integrity": "sha512-sWeihiVyxdJjpLkp8SHkTy9kt2M/o11M60G1MzwljGL2BXdM3Ktzqv5QaQHdi00y7Y1ulvtI3GOSxP2xU8mQJw==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz", + "integrity": "sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, + "node_modules/@mui/icons-material": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.15.tgz", + "integrity": "sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@mui/material": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.3.tgz", - "integrity": "sha512-DODBBMouyq1B5f3YkEWL9vO8pGCxuEGqtfpltF6peMJzz/78tJFyLQsDas9MNLC/8AdFu2BQdkK7wox5UBPTAA==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/base": "5.0.0-beta.30", - "@mui/core-downloads-tracker": "^5.15.3", - "@mui/system": "^5.15.3", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.15.tgz", + "integrity": "sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.15", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", - "clsx": "^2.0.0", - "csstype": "^3.1.2", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.2.0", "react-transition-group": "^4.4.5" @@ -4616,12 +4643,12 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/private-theming": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.3.tgz", - "integrity": "sha512-Q79MhVMmywC1l5bMsMZq5PsIudr1MNPJnx9/EqdMP0vpz5iNvFpnLmxsD7d8/hqTWgFAljI+LH3jX8MxlZH9Gw==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/utils": "^5.15.3", + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", "prop-types": "^15.8.1" }, "engines": { @@ -4642,13 +4669,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.3.tgz", - "integrity": "sha512-+d5XZCTeemOO/vBfWGEeHgTm8fjU1Psdgm+xAw+uegycO2EnoA/EfGSaG5UwZ6g3b66y48Mkxi35AggShMr88w==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", "dependencies": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -4673,17 +4700,17 @@ } }, "node_modules/@mui/system": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.3.tgz", - "integrity": "sha512-ewVU4eRgo4VfNMGpO61cKlfWmH7l9s6rA8EknRzuMX3DbSLfmtW2WJJg6qPwragvpPIir0Pp/AdWVSDhyNy5Tw==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/private-theming": "^5.15.3", - "@mui/styled-engine": "^5.15.3", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", - "clsx": "^2.0.0", - "csstype": "^3.1.2", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -4712,9 +4739,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.12", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.12.tgz", - "integrity": "sha512-3kaHiNm9khCAo0pVe0RenketDSFoZGAlVZ4zDjB/QNZV0XiCj+sh1zkX0VVhQPgYJDlBEzAag+MHJ1tU3vf0Zw==", + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -4725,11 +4752,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.3.tgz", - "integrity": "sha512-mT3LiSt9tZWCdx1pl7q4Q5tNo6gdZbvJel286ZHGuj6LQQXjWNAh8qiF9d+LogvNUI+D7eLkTnj605d1zoazfg==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", "dependencies": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -29372,9 +29399,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "@babel/runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", - "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -29610,9 +29637,9 @@ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "requires": { "@emotion/memoize": "^0.8.1" } @@ -29623,9 +29650,9 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -29638,9 +29665,9 @@ } }, "@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "requires": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", @@ -29655,14 +29682,14 @@ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1" } @@ -29751,28 +29778,28 @@ "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==" }, "@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "requires": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", "requires": { - "@floating-ui/core": "^1.5.3", + "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, "@floating-ui/react-dom": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.5.tgz", - "integrity": "sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", "requires": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.6.1" } }, "@floating-ui/utils": { @@ -31262,38 +31289,46 @@ } }, "@mui/base": { - "version": "5.0.0-beta.30", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.30.tgz", - "integrity": "sha512-dc38W4W3K42atE9nSaOeoJ7/x9wGIfawdwC/UmMxMLlZ1iSsITQ8dQJaTATCbn98YvYPINK/EH541YA5enQIPQ==", - "requires": { - "@babel/runtime": "^7.23.6", - "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "requires": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", + "clsx": "^2.1.0", "prop-types": "^15.8.1" } }, "@mui/core-downloads-tracker": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.3.tgz", - "integrity": "sha512-sWeihiVyxdJjpLkp8SHkTy9kt2M/o11M60G1MzwljGL2BXdM3Ktzqv5QaQHdi00y7Y1ulvtI3GOSxP2xU8mQJw==" + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz", + "integrity": "sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==" + }, + "@mui/icons-material": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.15.tgz", + "integrity": "sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==", + "requires": { + "@babel/runtime": "^7.23.9" + } }, "@mui/material": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.3.tgz", - "integrity": "sha512-DODBBMouyq1B5f3YkEWL9vO8pGCxuEGqtfpltF6peMJzz/78tJFyLQsDas9MNLC/8AdFu2BQdkK7wox5UBPTAA==", - "requires": { - "@babel/runtime": "^7.23.6", - "@mui/base": "5.0.0-beta.30", - "@mui/core-downloads-tracker": "^5.15.3", - "@mui/system": "^5.15.3", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.15.tgz", + "integrity": "sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.15", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", - "clsx": "^2.0.0", - "csstype": "^3.1.2", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.2.0", "react-transition-group": "^4.4.5" @@ -31307,53 +31342,53 @@ } }, "@mui/private-theming": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.3.tgz", - "integrity": "sha512-Q79MhVMmywC1l5bMsMZq5PsIudr1MNPJnx9/EqdMP0vpz5iNvFpnLmxsD7d8/hqTWgFAljI+LH3jX8MxlZH9Gw==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", "requires": { - "@babel/runtime": "^7.23.6", - "@mui/utils": "^5.15.3", + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", "prop-types": "^15.8.1" } }, "@mui/styled-engine": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.3.tgz", - "integrity": "sha512-+d5XZCTeemOO/vBfWGEeHgTm8fjU1Psdgm+xAw+uegycO2EnoA/EfGSaG5UwZ6g3b66y48Mkxi35AggShMr88w==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", "requires": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", + "csstype": "^3.1.3", "prop-types": "^15.8.1" } }, "@mui/system": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.3.tgz", - "integrity": "sha512-ewVU4eRgo4VfNMGpO61cKlfWmH7l9s6rA8EknRzuMX3DbSLfmtW2WJJg6qPwragvpPIir0Pp/AdWVSDhyNy5Tw==", - "requires": { - "@babel/runtime": "^7.23.6", - "@mui/private-theming": "^5.15.3", - "@mui/styled-engine": "^5.15.3", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", - "clsx": "^2.0.0", - "csstype": "^3.1.2", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" } }, "@mui/types": { - "version": "7.2.12", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.12.tgz", - "integrity": "sha512-3kaHiNm9khCAo0pVe0RenketDSFoZGAlVZ4zDjB/QNZV0XiCj+sh1zkX0VVhQPgYJDlBEzAag+MHJ1tU3vf0Zw==", + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", "requires": {} }, "@mui/utils": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.3.tgz", - "integrity": "sha512-mT3LiSt9tZWCdx1pl7q4Q5tNo6gdZbvJel286ZHGuj6LQQXjWNAh8qiF9d+LogvNUI+D7eLkTnj605d1zoazfg==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", "requires": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" diff --git a/webapp/package.json b/webapp/package.json index a4f0d2d..be7abce 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -3,9 +3,10 @@ "version": "0.1.0", "private": true, "dependencies": { - "@emotion/react": "^11.11.3", - "@emotion/styled": "^11.11.0", - "@mui/material": "^5.15.3", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "^5.15.15", + "@mui/material": "^5.15.15", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.5.2", diff --git a/webapp/src/components/ImgGameReport.jsx b/webapp/src/components/ImgGameReport.jsx new file mode 100644 index 0000000..b3a78ed --- /dev/null +++ b/webapp/src/components/ImgGameReport.jsx @@ -0,0 +1,67 @@ +import React, { useEffect } from "react"; +import CheckIcon from '@mui/icons-material/Check'; +import ClearIcon from '@mui/icons-material/Clear'; +import { useNavigate } from "react-router-dom"; +const ImgGameReport = (props) => { + const answers = props.answers; + const navigate = useNavigate(); + const loadRankings = () => { + navigate("/rankings"); + } + return ( +
+
+
+
+

Game Over!

+

+ You answered {props.score} {props.score === 1 ? "question" : "questions"} correctly +

+ + +
+
+
+
+ + + {answers.map((answer) => { + return ( +
+
+ Card Preview +
+
+
{answer.question}
+
+ You answered the question {answer.correct === "true" ? "correctly" : "wrongly"} + {answer.correct === "true" ? : } +
+
+
+ ); + })} +
+
+ ); +} + +export default ImgGameReport; \ No newline at end of file diff --git a/webapp/src/components/Question.jsx b/webapp/src/components/Question.jsx index 55d93fa..87d5bcd 100644 --- a/webapp/src/components/Question.jsx +++ b/webapp/src/components/Question.jsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from "react"; import axios from "axios"; import useAuthUser from "react-auth-kit/hooks/useAuthUser"; +import ImgGameReport from "./ImgGameReport"; const Question = (props) => { const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; @@ -14,23 +15,33 @@ const Question = (props) => { const questionsPerGame = 10; const imagesPerQuestion = 4; + //Game Report + const [finished, setFinished] = useState(false); + const [answers, setAnswers] = useState([]); + + + useEffect(() => { fetchQuestions(); }, []); useEffect(() => { const interval = setInterval(() => { - if(renderedImages==imagesPerQuestion){ + if (renderedImages == imagesPerQuestion) { setCounter((prevCounter) => prevCounter + 0.4); - } + } }, 40); return () => clearInterval(interval); }, [renderedImages]); useEffect(() => { + async function answ() { + await answerQuestion("TimeOut1234;", questions[currentQuestion].question); + } + if (counter >= 100 && !loading) { - answerQuestion("",questions[currentQuestion]); + answ(); } }, [counter]); @@ -39,7 +50,7 @@ const Question = (props) => { try { setRenderedImages(0) let auxQuestions = [] - for(let i=0;i { try { setLoading(true); setRenderedImages(0) - if(currentQuestion>=questionsPerGame-1){ - fetchQuestions() - setCurrentQuestion(0) - setCounter(0); - return - } - - const result = await axios.post(`${apiEndpoint}/${props.type}/answer`, - { answer: answer, question:question, username: auth.username, category: props.category }, - { headers: {'Content-Type': 'application/json'}}); + - if ( result.data.correct === "true" ) { - setScore(score +1); + const result = await axios.post(`${apiEndpoint}/${props.type}/answer`, + { answer: answer, question: question, username: auth.username, category: props.category }, + { headers: { 'Content-Type': 'application/json' } }); + + if (result.data.correct === "true") { + setScore(score + 1); + setAnswers(answers.concat( {question:question,correct:result.data.correct,associate:answer})); + }else{ + setAnswers(answers.concat( {question:question,correct:result.data.correct,associate:result.data.correctImg})); + } + + if (currentQuestion >= questionsPerGame - 1) { + //Infinte Game + // fetchQuestions() + // setCurrentQuestion(0) + // setCounter(0); + setFinished(true); + setLoading(false); + return } - setCurrentQuestion((question)=>question+1) + setCurrentQuestion((question) => question + 1) setCounter(0); setLoading(false) } catch (error) { - console.log(error); + //console.log(error); } } - + const restartGame = async () => { + setLoading(true); + setScore(0); + setAnswers([]); + setCurrentQuestion(0); + setCounter(0); + setFinished(false); + await fetchQuestions(); + setLoading(false); + } + return ( + finished ? :
Score: {score} @@ -89,7 +119,7 @@ const Question = (props) => {
- ) : ( + ) : ( <>

{questions[currentQuestion].question}

@@ -100,8 +130,8 @@ const Question = (props) => { {questions[currentQuestion].images.map(image => ( ))}
From 12b8385ca3233cc2a92840fd8c4a65deafc81bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:21:44 +0200 Subject: [PATCH 2/9] responsive navbar --- webapp/src/components/Navbar.jsx | 42 +++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/webapp/src/components/Navbar.jsx b/webapp/src/components/Navbar.jsx index 9726c12..8c92c81 100644 --- a/webapp/src/components/Navbar.jsx +++ b/webapp/src/components/Navbar.jsx @@ -12,22 +12,36 @@ function Navbar() { } return ( -
-
- WIQ -
-
- + ) } From 5c0ced926a8f8fde290df97a5a15bdfda5db2b78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:21:56 +0200 Subject: [PATCH 3/9] temporal icons --- webapp/public/WIQProvFondo.png | Bin 0 -> 10639 bytes webapp/public/WIQProvSin.png | Bin 0 -> 5681 bytes webapp/public/favicon.ico | Bin 3870 -> 10639 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 webapp/public/WIQProvFondo.png create mode 100644 webapp/public/WIQProvSin.png diff --git a/webapp/public/WIQProvFondo.png b/webapp/public/WIQProvFondo.png new file mode 100644 index 0000000000000000000000000000000000000000..ead6e8606416c37dd568402df384265b2c83535b GIT binary patch literal 10639 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 jI~%vPmcmIwf8WvL1Y6Y&248LU6_ literal 0 HcmV?d00001 diff --git a/webapp/public/WIQProvSin.png b/webapp/public/WIQProvSin.png new file mode 100644 index 0000000000000000000000000000000000000000..0aed625dcb61e702c584e5b25ce965dbff0c2053 GIT binary patch literal 5681 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 XuUJ{Dmo%_!00000NkvXXu0mjfYZW8i literal 0 HcmV?d00001 diff --git a/webapp/public/favicon.ico b/webapp/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..ead6e8606416c37dd568402df384265b2c83535b 100644 GIT binary patch literal 10639 zcmXv!by!s0)2O6KcT0CENP{#>OLt02=TeI<-5rur(p^h;mvqC@4U2UD*7y0oKkjqy zbMBnEGjpcy%!H{b%VNAGeT#sAfB}$`QiI3^!H^X(c!mophcg51YhX z5ub;FK@cS_kAbfLa|ZB(3`*oE_ZRRlakL^fjs+$+T0}&AYwSguDX@auF8^Npv#8or z^P#5SdTH|wNb^dlP=$5%YLWxdV#_VHqZnlVYEgj0-VX5vu(aULB*<0;OX0!`%1wdykPJIf(o5sgY z%-g86M6Kj3iA5o-aagX8XT{px@MW}Zt_1Wftjf;wZ=Z)>){tXvFUSz^nxHn~DZX|0 zF00@ag*M!0@~b4t&m6bg;y1pLxJ|vc`mZshHz&4U0tb<@-z~+f3`#pF2FTtv?Zo^v zfSrGk@v~SpjEV53zc0SKHWuCnb7sq13=PoLp=3>?Iy{Z38Ve+EgBz_Nxc5jE&#$7@ zDy77DW3I-AkQ_1f{sO%0#-pRJ7BFvvd5Yh)B$7!$s4Ab8@m47H4YoHtSOu^leIlO?g10|>DiiH+Dt^8 zoM}T07%a@`O?ppk&6jza*CIqd9^!m20Q%c-wzjvrxV}N&0okM9)?D$4iqc>9%Ua*- z;`lnux`GE2>s4BytQu+@jfVoJ2C+ekptJ-JO&0Eyq1S0o7*t)s^~;j}m6}I{e_D*K z;&}ynGg%U{1*ceUxrb{C=SnJd8gM+?FDQ=}o;?@p%{heo`PtyNJp z%$%_(%rxw$i#ML0zMZ?lFpZhqHYfWFXO2M8o#}`>Zf-GNOW;;Kt znD4WL2p^wmW!`;P7|7UgDLaFs!E3DuA@X;i2oiPe2aiHd8r}(&i$y*?Gie8%trQET zAfEL$=ySLUjo#tH%|p1p|P1v%r5yF1@0 zhpr)YMGy+jmA&j{=~jI`uzghuKuKL`ISsxr96gL6YIB3XexRZPQBtPgNgQ7PDfqtZ z#rL>vHoxgJnVZ4}tTr2%nnyX!%xpPB{FUzCmsHrZGoP_BRnr%4R08b_rzpSo7vnMR zlqa1G(Tf&2Wpy%mX!z5RBT{A%?738OPmn_hr+q=JG1bE5f;S zgy*MuBY(=s=IyTyyu|NavW;?~eFU>6V-J4nSten#+|d+VMJO6r2lTmLkQkV?IhGOX zNBBM~jis|K$3Q&&x9o{ps)87mFQ*V=LQMM6bq2(LD}%_hysmj`j&cadgdv_AgT?5& zwwDOD-#&G^UTDYa`3q-U;#fq}kHtUK_ugsC&rDCBM8fB&V$Ka&ilwAaWp_*ZbCF2*;kKHqlK&Z*Is4_fz8qE`ezORR?GvWlDOY*>HgUwogsDo&IOW zNX?%JfZi?B{ZL1Bm;dXJ>c2up?C`p0+6qHEeT7<+&;}D~N ze4CR7oJd_M89>l`@B!UhmyL-AMP%`072>ysZl*!{q6u6YpN^NCG-G~3%zf~mMgBo8|tFx)YVdN2<|s#jRZ8JPrd2n>WIgk+-HFZ+_% zCYQ55>=ak7V}$r^MEr3y@wDM|7rJatvc#pfK^F`7=pgIqw24I(Eq$yb7f@l6m9h0k zA;Ga@YyB;?W|K+!2Vo}qSfO~fL4X?UxI&oFwKonXUcD~5Q=&7Ms7|?nk0@EfFBMZr zGx-Kz&TOb9AJJGm&Y2B~;b3zCG}6a`wW1OudAWa=gA$tciz}F3^GAwCa#nq(jFpGj z{eD7CR-yjQHJ9mTL3KGRqY)R$!xkAx8=GTSTdzTQXI&@c7YB_3P2pQ_$j z%tkqyO7D_+l_9FlR0bE!D6rM;)^!9h&P8MNtLM|Gvsdy~!n;0M#d2(I&pP(bZ1Mc= zAR-uRSc%VckC_?6LZ`vkam8V`eCe<`PxtsB+xxRVMj!Tdzz8MN39Zip^MlRbE2p&r zTDeM_?ib-({1wmjysz_Q3mrs{&tWY?6+}s_<4q)=?3R*m-TR|ju-iRHIv7BikeJE- z%sN_ynX5x(A8fPL!&^*Ox~_0-n-JX!Ki7{3SGhIr%gXUb89+78_@knPg6gI#=eHnS z3&-Z`6Kj3q*$So(C@ny%GN+B&@9&~jRXA5*=fKB zOy;&6Pi|y^U_WEZOKXQH7QEa{3r`(5;CabRh#Q8QnO231o|qFwM&(d{Jx^Fq^hqx- zC+`}4Esk)DyR65V4U_NL!X5u#ch!tWOi4WoAuIBix!0 z)mD%-U%>esi}m15PY+V=whe!mpddE%G|86YZ1Haw1S1S>NHe!PV&O}M; zEP7I70haB-3DnAxleWo0s##_=H^O$KbRpio7Hqu0e$|4$jy^z;t%H5*1Na^$6fLs& z%SEr1+d-#AuGTn(|sGjzNo{|j*K%=X+ z>B7~jgZ%a*`RDIcZqbS&+M66j8H9b$)9F--kN1Awo?x4gk5-Y;sL&5HIhQq;*OhCS z{f0DdXU>;N*cDnN5Agx4xy_gT1R~DghXl{GGN^9F_xLLYlOPFd%4EF}6O$HW%#E^> zMZcWSL6m!9v%Y(wKUFhja2~CP9qNq0@$N>SD(r>nrTy%_FrF60!8ajl8VkI?u5o&3 zzBxc-qls>`Q-8J2Mt%d_o=O&l(@DKBTHx)PN>%})YKXNve^#sbP1fx|*S1t;h@2>XOieZLiM4TWb)6vA4 zZ>dmOSBgY0n=f@jg&c#EnyQJajHmfY)5zjD1L~h>CO=|-aX3ifk zw5Jr<^IB|1w+NM^;X4ak(Bkqi6ddju>q(^)MaunhP(W)BXB9GTSs9I=o#O#@7A$2js+DSGjH1cc&P@Iv>Pxsgh_@qCnhl^lm}--x7R6Ga$FR9g;^xf~=><`lLZNw@ z8)c4zJ_cGNz#}K)Qz+dgaO$m4{n3`T+EGX+zi2#kapkUvvn&Pll%7QZwbsx4n!a7| zx}SeBKJZ9sQB(Hp{`iX(w5OBbXaUq}*R{MtU5dgtHtHJrTHa+O@`I5Q7_tQ%4m8vO zlv8zIZ>4)3g1}Zb8(&ro-m|<3fqScYreAcp8Y*I^YaRyN&I9nc@%fR>l+_K-Z9+(# zhZ_n4Q}tJCrGxBZ-2JH>Dbx2jvg9g1t1dpN*~|~MlGSu7K8f2$ zV7DI3p}6>RzT6u2Og0Es5Kr&8EWICoN@pSidXp8y)8*RjGeK}=kX30F`VqsX>;#@* z(xbpXF_Qd4#54}c(nnT8-v}8pjQzkGHNVxe*GvAl z#Ws|A&aDkDXO~Uja84XlJ*h7*FE# z{TF3&6_JfXi15Q8tv<0>hz)?_6_Q^>=!QLvwfL%=+XUB4ZlwUOm8i>k<%xKp$Kjfu zztYivM!Re4@{uE4dh=+aX?F)_Qqmy`lJG#>P>%$Mf;#~hfj=wLP^axk+J+~K6I%`ko7;OnFJJ`SV@=dI5^ch^f4y z!6i@1H1heT>jqpgQ+p=Ge*6emL^Wz8|IHx3$#DW_Gti3{F0HsMzm_~istgu19neeyC@~;T)UV>wJEsJ}Kh^!8w#5F3*ZcqVgTx@XlFIj;C!z_B zp5G?T{KoO&ptt&Jn=Q~doyzJ+xL{jy@RZJpYMVF=U zik2z5@K_vck*Qcjj=>CQGCG4opA8GhDu7e-NUEWR86|a(!A9|Saa75A_CECA=a_)a z!KSYgNy&CX#^j7Dlo`Z_3Ymf!bvrA?>39Cfh5muf*g8lU-(TB)!KS`VX2;^Y_nW2! zb}lps4u)Hm!_~Uu;xsWxj)b{bB(#>J&1N^T)SkD~F{~8wAC{4=o8QMv7Zb2Zm(maN+{sG&)*mCH-?HB#k4rC%Lf6^`e1{BB z=&F3@(jos~_vd@uI%a9HN8Q!feOivwJfY~mEr!&ZLIPm*kKD+^$BZnQ@~30Wc_y*_1}_ydPs zY8`4-@@P?ZY1s?KX&sw0u#fU$8-<^wa9GR9GQ2iwESOrnt|IKrE6+VQ=Xp&mRyp>A zi=`KGc_NgSZCUHw2tign?4{VDBbfh1jvkd`sKY%MZb256JzuAok=hqha&)p~1c(vc z4U1;K+MSDMRX2u9+ve?66qmfURYKL#Tqfh!$Z+D6wSJ85-pm70X6~K3P0G} z$}{04)Jc}0qz}xGq@-INHX$o+ZqJaD1YQZ0m2>maP2qV!afE%QFiH4l3}8T_{+4Pq zgEtJWU$G1FJr*OrMb0l(c05v#8l_}CNugk_@s&dYByNan3qqP)E8>!}4xK0Sd=3n7 zw4BniV&5oWCB-rjQs(R2QA;XwfksO?D|zpqc$Cnjza{;H#qqFpIRNvOReasbQQIPD z4OMI#GsG>;QEc3UENKlWrPdGIDC@8XE71^dd0wg_(N1?SuhFM)@Qet#)R#x6i!|6nV#$F=3QX-v%vc16xh zW<6GltuSLBZOO}Y2^oQ3_lut*smu@O3QcbjKtO?X*Je2#jDCfPQP=r}Dfz!YNE{(X z$5XYRy8mQ&XeG^VW&Lbp`+N4AT781|X3au=*2KgEBwg+$a02bx6jNyb$FtY*txc`S z4ZI8+=g)_c>?Ln`ZLm-q6xu$1N_Hc}>Wj=!9LuL`62aAndY5)xvQJQ@RL+Hi{aaxu+jJ7x1GSyq`A{I-eCMim zG|o5aRt;^G1FTS6Mc29NQe~g}=C5y&a*?1IpnT^k*Bj1=)(ii2ZE5{Jna$At(Kpq~ zr8AS085oN{uxxom#I8qBoX0-@eTX00uG^H#_0HDOvZiILk71(sGoHu;no*>F%;LTH z?C!&k4*z-K0cYSdrR8B0Jf@;s?NOT85olq8zRC2!E)9gbj0Jb!wTm$bp6URRV{u)E5gS7jB*YhARe+*q5N2(!$5+py?p2r zTVt7m`Tnk+mvx{yTV!|~8)sT^M4Y`MZIy&yV5{thmUcG$e|-N8t`8g`m41>ks~)om zo()J(CAjwGLZ@vp&D-0lTFFdtNSwpN#-Fa;N(XY1{H+g-<)5P?s`rbnhMfu%(#o?C z`$7tat55d~O|)sdzo&x-@Z5ToYlV=*9c_yv+rF)u(ebuA9poFGR|J>4%Z^vGy`{CR zSl^LHGa3a6f4F|ggEN<0Eqe~9qd{D)2R+3@pjE#La`t?ieVnVsBaBIR^nTDf#a5kt zczD@ilKOTxxuku|R^L9LE|`ep*abf(srhBEwk&&O4#s7|b}KOT436lqCmNwuXBdC? zNa8u0hBmcgO=Ki=riAuw*FL%vtUuQ#T9nmKf{s-()S<*jj@S~5oSE-hU|-)0N14dz z)5s04baEfu_vC>K>w~3 zImBW$C()DgldXJ)zHxNY0N=xg%~<1sK{089PDeCAQgez?j4SN& z#7?9ucKy@J_#*S+L}E5|CYWeS-(m~HuV?9GE=DE7Jp>h8dC>q#dYzTjxSE1OFhJ09 zJ+-W*-~hz=wD1GZkGApWRfY3lvt$z(%kMP@OsNxBmh4ac%b18#qh)?$d2;I$eba36 zwdmTKiPgrxI<>-FTfPt$4w4vc`&BPWJK9bnzgf>4$2lYK<-@9zN*A_Nw6n8^szpZy zhx&pR(v!8T_H*;eUkl0ZA8~9m@=)8A%^D~*qT0p)f@AQKJ-<$@dP!3bVs}G_9eXM> zl`quzH(Nb*5opyeSklPn$!lsrmH;mTDqaE?$W}Aicq2$Sc~$vwqbCSxA4ms;k5U4pq z!pnr%-_8lTo)upF1VK_-HU=iV(VdxujBr%E4-<%efq()Cc%e?<}ndwq&NZ%lzPU&?HDko!BGzpN)S zIm&Jo6+S|L&8v9tA!vIHkP;~!f_kEYFzBA#O2WJWXpCfz0H}ZHNz|@Tj-E0Flc>F* zcu5GElJ~zFj{y1S!QkBosD71*dY@(fG@Z<|J; z)S@$!NO4fc-fg3Zm5N!n5Re3&tnav+Qz)ZsF@G?Md&5A#O8_?bYD0;8+A76f>^_r( zLVxY|#eY!)mYd-DtLFNXMPohh5&C+;38Sn%@JC2^5vofZy*ikSPxn?W0vRj(Fv^kKsWnOl z%8JW&$-p8CwAO5@-lHUNGMu+^v?b0oEY)oUjlq=kZNH^i9g3?S+4}vmy7-+*?|+uz z2pS8za}p=k^{m1dhM4Sd-+>F_zDyRR#4l;3Tej&p2n$!&A|r&p=ZJ?&*AtV-6z^qjkJA@@S>&L5q*Y8 zqYZGfmeanwx}kr)9KP9&sm?j`CC>ES75R$ejhVgO2+pG@k(rk&K-g`)J05r+S{$g@ z7G=FUpb4K3;QcoXVC{W%k~*jd20A>yUC(xEte8Xk-28QE#Irxj?F8Qdo^eqO;|nu& z37PJEx!mth!hOmTiSiE*>`jQWhB>koihXBJ#lBe1+HzpP)liGLBGCb#@LP~9x*(lJ zCZQxXangHdPA2_nSZc5>uVJ;1c`86p&t8O9JPq_xuZ6bK*E3x&7aH_6R}dHN5egR} zg-$GdQ@t!0cI2*Q%`qGGz<7f^sW;zLYwU3CxN>n{W|su*!th6pX0|aAd?a1vvNuaecA7e-W?~E&riUW`^|VgVey~1)hPrm-!`#@AvK(5 zNO*jp+eiX&zgi8sm-x-$gKaFNj`;H50AK7L)^&zr_KULVgjMqdXhV~Wp(*wUs zL{3P9v-ht6T;qzaO@PXFKWk5tsy9x~f1^vyzNE-xe=tK(Oy^$PY4hMz*c2=#ErjkB z1qmR9KR>Up1OKp`YW?*7Zzty=KjqKoWiO@YY*wsXN1kZMHUd2TLGnUqmozJu^rBBB zpxWj&JZSQh8fAD8KAB>Ru}(P8EF=m1Ko-W`qub;3eZJds=ESbO-r54Gy{*!?Oz{*& zUT?XRn7Y^jaGk~*Ckpe&BQg&ME4*4AW0|I{DhOTf4sa36VCrW^W*5=gu0Lb)88^Tm zCkKc<7cUHN`9DPMjfaiS@b_V&=>osL3w8$xa}#*3--mRg@Y_^ z6K+3hA;##x3i~znuXp`eXlo*Uq910AW!wQ!?{79DI~!oJST(0-?g|JO3Z}o>#vk?B z)J*kQ&mO7>G3z@1Yh#s-ui){sr@TR`u2fkGdR{F_5ZTsjnW%BxH!F;JRPPXCumJe@Mlo+f_7B*U2SzX4+ zF;AI|A{$l!wf;uD@EYV6PxK30IKQv{hNf>xc4MSGCJ^iT!Y-!XcJVc)?`_x>yetrc z7esDPYcJ9EAvz55mz1STlC4|5)sWUU==bGxmLJ_T-c%A=t1ca+(<+r}4 zhhSVo->3*}>?$BCxDJ5)H3(NcIm7T55XISnssoP|zuTDzAOzR&RIzi~H6;uW)O7CF zgsAHkIbC^wDqyo_i%xT`cgMvKZ=;$eY1qvoQS07j0Hw1{bH3rOf-eFjVZTmoBc_Qb zhyuE^`M&Aq+@uE*XXn1X9Ld4M}xwPda#?@~OuQm8# z8H4vfs&Z?;or0{Q7ec9{9xlFgp0o~F31ji{I);xQtAA(jSDVXZh?G*W>Vd*N3Gwdh zQ)#E_uON!nx_u0tc3+X=S*4P>Rb=wp0~o$Gp6YSW>@^QME@E~Voe{q3BfPI4s|y0; zs@#3i9$SE}xx-~KxI0k)xGCBdwrTBPs`g42srhz3QjAY&?iptmDVzcT4q>xA z9YG>EjEf2X+9k>1?QMW9!leC@I}!qjJYT$7QlK`3#YSXNYD;0UH1V1BBJf|8 z*`irA=k{Snqf)v|P6y<|6S&$8o9|&!B8)GGq{`aHtqWb$|8P;lryVlN(JVC(FN-`S zj-jbgY9bLVHKDs-nlFUOFK~r74e#^QdpH@uVyPe- zJ2}Pv)CY@5{4+f;+eE>t!FFSo`nH^r&`R_Le(dPGE0b9ULRDD znI7TYsDM49ipY!=Jbuij#ccy@8+_qy=Qg%(Qunv^9?p1#q;GX(%knj0zc#(y&IizS z6ryu=9$%L?t0%es&ew&dt@IJSZGP$=uP+=A;$%Pvqgb5m<=cz;DckWB#oHG)uH-s} zKGOGhi)tc!C3w5Ky6`AyywX1G!z96NwJh;=O&Qct#-zmQZXbHjV$YhiE9+`iHMnJV;pLho%;4=urjIN8zj!`wgBqbO*&8TZ8_hB{# zIrbygduBUszzYJ0eq)LmM&V`pw`RXfSlWav*jWd_^uw-XnGsLf+k~R2@)jo-w`=T& zvk%E(_Mg;U(5XfV3D!N;m9SjCs#lJeYVVq1F%bFkH^D3t&{w~&6z~HMg&?$fHBYWJM6S8!&S0j#D721L+29O=V03Bz^I z#046Sa0D8_{+_QPvdn5H#pY&f4pYqMR*aN4+PQSKj5*bNKN+rL^E3#6?`cZQ8v70t jI~%vPmcmIwf8WvL1Y6Y&248LU6_ literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ From 839b946addb4955d7b142d8f6d0f347ad823a527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:22:16 +0200 Subject: [PATCH 4/9] squads inital --- webapp/src/components/Squads.jsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 webapp/src/components/Squads.jsx diff --git a/webapp/src/components/Squads.jsx b/webapp/src/components/Squads.jsx new file mode 100644 index 0000000..119e713 --- /dev/null +++ b/webapp/src/components/Squads.jsx @@ -0,0 +1,12 @@ +import React from 'react'; + +function Squads() { + return ( +
+

Squads

+

Coming soon...

+
+ ); +} + +export default Squads; \ No newline at end of file From 9641f3d688a0ce5692ce80c9a603e3d5c5a2c7b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:22:25 +0200 Subject: [PATCH 5/9] squads initial --- webapp/src/App.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp/src/App.jsx b/webapp/src/App.jsx index 80e81ba..fdc7ba8 100644 --- a/webapp/src/App.jsx +++ b/webapp/src/App.jsx @@ -6,6 +6,7 @@ import Login from './components/Login'; import RankingsLayout from './components/ranking/RankingLayout'; import Game from './components/Game'; import MainPage from './components/MainPage'; +import Squads from './components/Squads'; function App() { // const isAuthenticated = useIsAuthenticated() // True if user has logged in @@ -23,6 +24,7 @@ function App() { } /> } /> } /> + } /> ) From 552c007cc855fc634fa71aa4a8421a2d57d16561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:23:29 +0200 Subject: [PATCH 6/9] responsive authetication --- webapp/src/components/AddUser.jsx | 107 ++++++++++++------------ webapp/src/components/ImgGameReport.jsx | 2 +- webapp/src/components/Login.jsx | 89 ++++++++++---------- 3 files changed, 100 insertions(+), 98 deletions(-) diff --git a/webapp/src/components/AddUser.jsx b/webapp/src/components/AddUser.jsx index a464500..ce2759f 100644 --- a/webapp/src/components/AddUser.jsx +++ b/webapp/src/components/AddUser.jsx @@ -17,7 +17,7 @@ const AddUser = () => { const addUser = async () => { try { - if(password!==cpassword){ + if (password !== cpassword) { setError("Passwords do not match"); return; } @@ -25,10 +25,10 @@ const AddUser = () => { setOpenSnackbar(true); navigate('/login'); } catch (error) { - if(error.response===undefined){ + if (error.response === undefined) { setError("There was a problem..."); } - else{ + else { setError(error.response.data.error); } } @@ -39,57 +39,58 @@ const AddUser = () => { }; return ( - - - Register - - setUsername(e.target.value)} - /> - setEmail(e.target.value)} - /> - setPassword(e.target.value)} - /> - setcPassword(e.target.value)} - /> - - - Already have an account? Log in here. - + +
+
+
+
+ Logo +
+

WIQ

+ +
+
Sign up for an account on WIQ.
+
+
+ +
+ setUsername(e.target.value)} class="pl-12 mb-2 bg-gray-50 text-gray-600 border focus:border-transparent border-gray-300 sm:text-sm rounded-lg ring ring-transparent focus:ring-1 focus:outline-none focus:ring-gray-400 block w-full p-2.5 rounded-l-lg py-3 px-4" placeholder="Username" /> +
+
+
+ +
+ setEmail(e.target.value)} class="pl-12 mb-2 bg-gray-50 text-gray-600 border focus:border-transparent border-gray-300 sm:text-sm rounded-lg ring ring-transparent focus:ring-1 focus:outline-none focus:ring-gray-400 block w-full p-2.5 rounded-l-lg py-3 px-4" placeholder="name@example.com" /> +
+
+
+ +
+ setPassword(e.target.value)} placeholder="••••••••••" class="pl-12 mb-2 bg-gray-50 text-gray-600 border focus:border-transparent border-gray-300 sm:text-sm rounded-lg ring ring-transparent focus:ring-1 focus:outline-none focus:ring-gray-400 block w-full p-2.5 rounded-l-lg py-3 px-4" autocomplete="new-password" /> +
+
+
+ +
+ setcPassword(e.target.value)} placeholder="••••••••••" class="pl-12 mb-2 bg-gray-50 text-gray-600 border focus:border-transparent border-gray-300 sm:text-sm rounded-lg ring ring-transparent focus:ring-1 focus:outline-none focus:ring-gray-400 block w-full p-2.5 rounded-l-lg py-3 px-4" autocomplete="new-password" /> +
+
+ +
Already have an account? Login + +
+
+
+ - {error && ( - setError('')} message={`Error: ${error}`} /> - )} - + { + error && ( + setError('')} message={`Error: ${error}`} /> + ) + } +
+ //
+ ); }; diff --git a/webapp/src/components/ImgGameReport.jsx b/webapp/src/components/ImgGameReport.jsx index b3a78ed..b18c968 100644 --- a/webapp/src/components/ImgGameReport.jsx +++ b/webapp/src/components/ImgGameReport.jsx @@ -9,7 +9,7 @@ const ImgGameReport = (props) => { navigate("/rankings"); } return ( -
+
diff --git a/webapp/src/components/Login.jsx b/webapp/src/components/Login.jsx index d1d7132..52c6900 100644 --- a/webapp/src/components/Login.jsx +++ b/webapp/src/components/Login.jsx @@ -18,7 +18,7 @@ const Login = () => { const loginUser = async () => { try { const response = await axios.post(`${apiEndpoint}/login`, { username, password }).then((res) => { - + if (res.status === 200) { if (signIn({ auth: { @@ -33,22 +33,23 @@ const Login = () => { } })) { // Only if you are using refreshToken feature // Redirect or do-something - navigate('/'); + // navigate('/'); + window.location.href = '/'; } else { //Throw error throw new Error('Error while signing in'); } - } + } }); setOpenSnackbar(true); } catch (error) { - if(error.response===undefined){ + if (error.response === undefined) { setError("Error: There was a problem..."); } - else{ + else { setError(error.response.data.error); } @@ -60,46 +61,46 @@ const Login = () => { }; return ( - -
- - Login - - setUsername(e.target.value)} - /> - setPassword(e.target.value)} - /> - - - - - Don't have an account? Register here. - - - - - - {error && ( - setError('')} message={`Error: ${error}`} /> - )} -
+ +
+
+
+
+ Logo +
+

WIQ

+ +
+
Acces to WIQ with your account.
+
+
+ +
+ setUsername(e.target.value)} class="pl-12 mb-2 bg-gray-50 text-gray-600 border focus:border-transparent border-gray-300 sm:text-sm rounded-lg ring ring-transparent focus:ring-1 focus:outline-none focus:ring-gray-400 block w-full p-2.5 rounded-l-lg py-3 px-4" placeholder="Username" /> +
+
+ +
+ +
+ setPassword(e.target.value)} placeholder="••••••••••" class="pl-12 mb-2 bg-gray-50 text-gray-600 border focus:border-transparent border-gray-300 sm:text-sm rounded-lg ring ring-transparent focus:ring-1 focus:outline-none focus:ring-gray-400 block w-full p-2.5 rounded-l-lg py-3 px-4" autocomplete="new-password" /> +
+
+ + +
Are you new around here? Sign Up + +
+
+
+ + + + {error && ( + setError('')} message={`Error: ${error}`} /> + )} +
-
); }; From 20cec5aa2ea58fbc1433871dbb88eb9797ca3779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:28:37 +0200 Subject: [PATCH 7/9] auth hotfix --- webapp/src/components/AddUser.jsx | 3 ++- webapp/src/components/Login.jsx | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/webapp/src/components/AddUser.jsx b/webapp/src/components/AddUser.jsx index ce2759f..e8b2a28 100644 --- a/webapp/src/components/AddUser.jsx +++ b/webapp/src/components/AddUser.jsx @@ -1,7 +1,7 @@ // src/components/AddUser.js import React, { useState } from 'react'; import axios from 'axios'; -import { Container, Typography, TextField, Button, Snackbar } from '@mui/material'; +import { Snackbar } from '@mui/material'; import { Link } from 'react-router-dom'; import { useNavigate } from 'react-router-dom'; const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; @@ -24,6 +24,7 @@ const AddUser = () => { await axios.post(`${apiEndpoint}/adduser`, { username, email, password }); setOpenSnackbar(true); navigate('/login'); + } catch (error) { if (error.response === undefined) { setError("There was a problem..."); diff --git a/webapp/src/components/Login.jsx b/webapp/src/components/Login.jsx index 52c6900..da04949 100644 --- a/webapp/src/components/Login.jsx +++ b/webapp/src/components/Login.jsx @@ -1,23 +1,23 @@ // src/components/Login.js import React, { useState } from 'react'; import axios from 'axios'; -import { Container, Typography, TextField, Button, Snackbar } from '@mui/material'; +import { Snackbar } from '@mui/material'; import useSignIn from 'react-auth-kit/hooks/useSignIn'; -import { useNavigate } from 'react-router-dom'; +// import { useNavigate } from 'react-router-dom'; import { Link } from 'react-router-dom'; const Login = () => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const signIn = useSignIn(); - const navigate = useNavigate(); + // const navigate = useNavigate(); const [openSnackbar, setOpenSnackbar] = useState(false); const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; const loginUser = async () => { try { - const response = await axios.post(`${apiEndpoint}/login`, { username, password }).then((res) => { + await axios.post(`${apiEndpoint}/login`, { username, password }).then((res) => { if (res.status === 200) { if (signIn({ From 33469372e790ec64fcd33ef6be79a0499e86e854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:41:16 +0200 Subject: [PATCH 8/9] warnings ignored ;) --- webapp/.eslintignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 webapp/.eslintignore diff --git a/webapp/.eslintignore b/webapp/.eslintignore new file mode 100644 index 0000000..51d191e --- /dev/null +++ b/webapp/.eslintignore @@ -0,0 +1,3 @@ +build/ +src/ +*.js \ No newline at end of file From 2ba391324251f46b50971837bf64298620b044f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= <77900120+andrrsin@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:41:32 +0200 Subject: [PATCH 9/9] small patches --- webapp/src/components/Question.jsx | 4 ++-- webapp/src/components/ranking/RankingLayout.jsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/src/components/Question.jsx b/webapp/src/components/Question.jsx index 87d5bcd..6d143cb 100644 --- a/webapp/src/components/Question.jsx +++ b/webapp/src/components/Question.jsx @@ -27,7 +27,7 @@ const Question = (props) => { useEffect(() => { const interval = setInterval(() => { - if (renderedImages == imagesPerQuestion) { + if (renderedImages === imagesPerQuestion) { setCounter((prevCounter) => prevCounter + 0.4); } }, 40); @@ -129,7 +129,7 @@ const Question = (props) => {
{questions[currentQuestion].images.map(image => ( diff --git a/webapp/src/components/ranking/RankingLayout.jsx b/webapp/src/components/ranking/RankingLayout.jsx index 666b88e..50ffece 100644 --- a/webapp/src/components/ranking/RankingLayout.jsx +++ b/webapp/src/components/ranking/RankingLayout.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState } from "react"; import RankingsTable from "./RankingTable"; const RankingsLayout = () => {