From 5f475fb7a79db715ed82c636fee6e8149fe13932 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Wed, 24 Jan 2024 00:37:54 +0000 Subject: [PATCH] Finalized the Speaking exam generation --- src/pages/(generation)/SpeakingGeneration.tsx | 73 +++++++++++++++---- .../{[endpoint].ts => [...endpoint].ts} | 4 +- 2 files changed, 60 insertions(+), 17 deletions(-) rename src/pages/api/exam/[module]/generate/{[endpoint].ts => [...endpoint].ts} (94%) diff --git a/src/pages/(generation)/SpeakingGeneration.tsx b/src/pages/(generation)/SpeakingGeneration.tsx index b8d41069..2323381b 100644 --- a/src/pages/(generation)/SpeakingGeneration.tsx +++ b/src/pages/(generation)/SpeakingGeneration.tsx @@ -1,5 +1,5 @@ import Input from "@/components/Low/Input"; -import {Exercise, SpeakingExam} from "@/interfaces/exam"; +import {Exercise, InteractiveSpeakingExercise, SpeakingExam, SpeakingExercise} from "@/interfaces/exam"; import useExamStore from "@/stores/examStore"; import {getExamById} from "@/utils/exams"; import {playSound} from "@/utils/sound"; @@ -11,6 +11,7 @@ import {useRouter} from "next/router"; import {useEffect, useState} from "react"; import {BsArrowRepeat, BsCheck} from "react-icons/bs"; import {toast} from "react-toastify"; +import {v4} from "uuid"; const PartTab = ({part, index, setPart}: {part?: SpeakingPart; index: number; setPart: (part?: SpeakingPart) => void}) => { const [isLoading, setIsLoading] = useState(false); @@ -32,6 +33,25 @@ const PartTab = ({part, index, setPart}: {part?: SpeakingPart; index: number; se .finally(() => setIsLoading(false)); }; + const generateVideo = () => { + if (!part) return toast.error("Please generate the first part before generating the video!"); + toast.info("This will take quite a while, please do not leave this page or close the tab/window."); + + setIsLoading(true); + axios + .post(`/api/exam/speaking/generate/speaking/generate_${index === 3 ? "interactive" : "speaking"}_video`, part) + .then((result) => { + playSound(typeof result.data === "string" ? "error" : "check"); + if (typeof result.data === "string") return toast.error("Something went wrong, please try to generate the video again."); + setPart({...part, result: result.data}); + }) + .catch((e) => { + toast.error("Something went wrong!"); + console.log(e); + }) + .finally(() => setIsLoading(false)); + }; + return (
@@ -53,6 +73,24 @@ const PartTab = ({part, index, setPart}: {part?: SpeakingPart; index: number; se "Generate" )} +
{isLoading && (
@@ -83,6 +121,7 @@ const PartTab = ({part, index, setPart}: {part?: SpeakingPart; index: number; se ))}
)} + {part.result && Video Generated: ✅} )}
@@ -94,6 +133,7 @@ interface SpeakingPart { question?: string; questions?: string[]; topic: string; + result?: SpeakingExercise | InteractiveSpeakingExercise; } const SpeakingGeneration = () => { @@ -115,19 +155,21 @@ const SpeakingGeneration = () => { const setSelectedModules = useExamStore((state) => state.setSelectedModules); const submitExam = () => { - if (!part1 && !part2 && !part3) return toast.error("Please generate at least one task!"); + if (!part1?.result && !part2?.result && !part3?.result) return toast.error("Please generate at least one task!"); setIsLoading(true); + const exam: SpeakingExam = { + id: v4(), + isDiagnostic: false, + exercises: [part1?.result, part2?.result, part3?.result].filter((x) => !!x) as (SpeakingExercise | InteractiveSpeakingExercise)[], + minTimer, + variant: minTimer >= 14 ? "full" : "partial", + module: "speaking", + }; + axios - .post(`/api/exam/speaking/generate/speaking`, { - exercises: [ - {...part1, type: "1"}, - {...part2, type: "2"}, - {...part3, type: "3"}, - ].filter((x) => !!x), - minTimer, - }) + .post(`/api/exam/speaking`, exam) .then((result) => { playSound("sent"); console.log(`Generated Exam ID: ${result.data.id}`); @@ -137,10 +179,11 @@ const SpeakingGeneration = () => { setPart1(undefined); setPart2(undefined); setPart3(undefined); + setMinTimer(14); }) .catch((error) => { console.log(error); - toast.error("Something went wrong!"); + toast.error("Something went wrong while generating, please try again later."); }) .finally(() => setIsLoading(false)); }; @@ -185,7 +228,7 @@ const SpeakingGeneration = () => { selected ? "bg-white shadow" : "text-blue-100 hover:bg-white/[0.12] hover:text-ielts-speaking", ) }> - Task 1 {part1 && } + Exercise 1 {part1 && part1.result && } @@ -196,7 +239,7 @@ const SpeakingGeneration = () => { selected ? "bg-white shadow" : "text-blue-100 hover:bg-white/[0.12] hover:text-ielts-speaking", ) }> - Task 2 {part2 && } + Exercise 2 {part2 && part2.result && } @@ -207,7 +250,7 @@ const SpeakingGeneration = () => { selected ? "bg-white shadow" : "text-blue-100 hover:bg-white/[0.12] hover:text-ielts-speaking", ) }> - Task 3 {part3 && } + Interactive {part3 && part3.result && } @@ -234,7 +277,7 @@ const SpeakingGeneration = () => { )}