From 1f0e5f4a08b157280a503094b97c7954f8630fed Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Wed, 29 Nov 2023 17:19:47 +0000 Subject: [PATCH] Added the ability to generate Listening exams as well --- package.json | 2 + public/audio/check.mp3 | Bin 0 -> 86411 bytes .../(generation)/ListeningGeneration.tsx | 141 +++++++++++++++--- .../api/exam/[module]/generate/[endpoint].ts | 34 ++++- src/utils/sound.ts | 9 ++ yarn.lock | 10 ++ 6 files changed, 171 insertions(+), 25 deletions(-) create mode 100644 public/audio/check.mp3 create mode 100644 src/utils/sound.ts diff --git a/package.json b/package.json index 0b92e7ff..b8266c65 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "formidable": "^3.5.0", "formidable-serverless": "^1.1.1", "framer-motion": "^9.0.2", + "howler": "^2.2.4", "iron-session": "^6.3.1", "lodash": "^4.17.21", "moment": "^2.29.4", @@ -73,6 +74,7 @@ }, "devDependencies": { "@types/formidable": "^3.4.0", + "@types/howler": "^2.2.11", "@types/lodash": "^4.14.191", "@types/nodemailer": "^6.4.11", "@types/nodemailer-express-handlebars": "^4.0.3", diff --git a/public/audio/check.mp3 b/public/audio/check.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..dde3b8afa9dbd09cbff1d89fab7d1bd26fc3cf5f GIT binary patch literal 86411 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 z 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 setPart(result.data)) + .get(`/api/exam/listening/generate/listening_section_${index}${topic || types ? `?${url.toString()}` : ""}`) + .then((result) => { + checkSound(); + setPart(result.data); + }) .catch((error) => { console.log(error); toast.error("Something went wrong!"); @@ -67,16 +74,44 @@ const PartTab = ({part, types, index, setPart}: {part?: ListeningPart; types: st ))} + {typeof part.text === "string" && {part.text.replaceAll("\n\n", " ")}} + {typeof part.text !== "string" && ( +
+ {part.text.conversation.map((x, index) => ( + + {x.name}: + {x.text.replaceAll("\n\n", " ")} + + ))} +
+ )} )} ); }; +interface ListeningPart { + exercises: Exercise[]; + text: + | { + conversation: { + gender: string; + name: string; + text: string; + voice: string; + }[]; + } + | string; +} + const ListeningGeneration = () => { const [part1, setPart1] = useState(); const [part2, setPart2] = useState(); const [part3, setPart3] = useState(); + const [part4, setPart4] = useState(); + const [isLoading, setIsLoading] = useState(false); + const [resultingExam, setResultingExam] = useState(); const [types, setTypes] = useState([]); const availableTypes = [ @@ -86,8 +121,47 @@ const ListeningGeneration = () => { {type: "writeBlanks", label: "Write the Blanks"}, ]; + const router = useRouter(); + + const setExams = useExamStore((state) => state.setExams); + const setSelectedModules = useExamStore((state) => state.setSelectedModules); + const toggleType = (type: string) => setTypes((prev) => (prev.includes(type) ? [...prev.filter((x) => x !== type)] : [...prev, type])); + const submitExam = () => { + if (!part1 || !part2 || !part3 || !part4) return toast.error("Please generate all for sections!"); + + setIsLoading(true); + + axios + .post(`/api/exam/listening/generate/listening`, {parts: [part1, part2, part3, part4]}) + .then((result) => { + checkSound(); + setResultingExam(result.data); + }) + .catch((error) => { + console.log(error); + toast.error("Something went wrong!"); + }) + .finally(() => setIsLoading(false)); + }; + + const loadExam = async (examId: string) => { + const exam = await getExamById("listening", examId.trim()); + if (!exam) { + toast.error("Unknown Exam ID! Please make sure you selected the right module and entered the right exam ID", { + toastId: "invalid-exam-id", + }); + + return; + } + + setExams([exam]); + setSelectedModules(["listening"]); + + router.push("/exercises"); + }; + return ( <>
@@ -121,7 +195,7 @@ const ListeningGeneration = () => { selected ? "bg-white shadow" : "text-blue-100 hover:bg-white/[0.12] hover:text-ielts-listening", ) }> - Passage 1 + Section 1 @@ -132,7 +206,7 @@ const ListeningGeneration = () => { selected ? "bg-white shadow" : "text-blue-100 hover:bg-white/[0.12] hover:text-ielts-listening", ) }> - Passage 2 + Section 2 @@ -143,7 +217,18 @@ const ListeningGeneration = () => { selected ? "bg-white shadow" : "text-blue-100 hover:bg-white/[0.12] hover:text-ielts-listening", ) }> - Passage 3 + Section 3 + + + clsx( + "w-full rounded-lg py-2.5 text-sm font-medium leading-5 text-ielts-listening/70", + "ring-white ring-opacity-60 ring-offset-2 ring-offset-ielts-listening focus:outline-none focus:ring-2", + "transition duration-300 ease-in-out", + selected ? "bg-white shadow" : "text-blue-100 hover:bg-white/[0.12] hover:text-ielts-listening", + ) + }> + Section 4 @@ -151,22 +236,44 @@ const ListeningGeneration = () => { {part: part1, setPart: setPart1}, {part: part2, setPart: setPart2}, {part: part3, setPart: setPart3}, + {part: part4, setPart: setPart4}, ].map(({part, setPart}, index) => ( ))} - +
+ {resultingExam && ( + + )} + +
); }; diff --git a/src/pages/api/exam/[module]/generate/[endpoint].ts b/src/pages/api/exam/[module]/generate/[endpoint].ts index 1a6b4118..a84a3933 100644 --- a/src/pages/api/exam/[module]/generate/[endpoint].ts +++ b/src/pages/api/exam/[module]/generate/[endpoint].ts @@ -15,15 +15,15 @@ const db = getFirestore(app); export default withIronSessionApiRoute(handler, sessionOptions); async function handler(req: NextApiRequest, res: NextApiResponse) { - if (!req.session.user) { - res.status(401).json({ok: false}); - return; - } + if (req.method === "GET") return get(req, res); + if (req.method === "POST") return post(req, res); - if (req.session.user.type !== "developer") { - res.status(403).json({ok: false}); - return; - } + return res.status(404).json({ok: false}); +} + +async function get(req: NextApiRequest, res: NextApiResponse) { + if (!req.session.user) return res.status(401).json({ok: false}); + if (req.session.user.type !== "developer") return res.status(403).json({ok: false}); const {endpoint, topic, exercises} = req.query as {module: Module; endpoint: string; topic?: string; exercises?: string[]}; const url = `${process.env.BACKEND_URL}/${endpoint}`; @@ -34,3 +34,21 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { res.status(200).json(result.data); } + +async function post(req: NextApiRequest, res: NextApiResponse) { + if (!req.session.user) return res.status(401).json({ok: false}); + if (req.session.user.type !== "developer") return res.status(403).json({ok: false}); + + const {endpoint, topic, exercises} = req.query as {module: Module; endpoint: string; topic?: string; exercises?: string[]}; + const url = `${process.env.BACKEND_URL}/${endpoint}`; + + const result = await axios.post( + `${url}${topic && exercises ? `?topic=${topic.toLowerCase()}&exercises=${exercises.join("&exercises=")}` : ""}`, + req.body, + { + headers: {Authorization: `Bearer ${process.env.BACKEND_JWT}`}, + }, + ); + + res.status(200).json(result.data); +} diff --git a/src/utils/sound.ts b/src/utils/sound.ts new file mode 100644 index 00000000..dcaae082 --- /dev/null +++ b/src/utils/sound.ts @@ -0,0 +1,9 @@ +import {Howl, Howler} from "howler"; + +export const checkSound = () => { + const sound = new Howl({ + src: ["audio/check.mp3"], + }); + + sound.play(); +}; diff --git a/yarn.lock b/yarn.lock index 4d9d4192..6b4aa13c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1144,6 +1144,11 @@ "@types/minimatch" "^5.1.2" "@types/node" "*" +"@types/howler@^2.2.11": + version "2.2.11" + resolved "https://registry.yarnpkg.com/@types/howler/-/howler-2.2.11.tgz#a75c4ab5666aee5fcfbd5de15d35dbaaa3d3f070" + integrity sha512-7aBoUL6RbSIrqKnpEgfa1wSNUBK06mn08siP2QI0zYk7MXfEJAaORc4tohamQYqCqVESoDyRWSdQn2BOKWj2Qw== + "@types/http-assert@*": version "1.5.3" resolved "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz" @@ -3149,6 +3154,11 @@ hoist-non-react-statics@^3.3.1: dependencies: react-is "^16.7.0" +howler@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/howler/-/howler-2.2.4.tgz#bd3df4a4f68a0118a51e4bd84a2bfc2e93e6e5a1" + integrity sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w== + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz"