import {useEffect, useState} from "react"; import {useRouter} from "next/router"; import axios from "axios"; import {Tab} from "@headlessui/react"; import {AiOutlineFileSearch} from "react-icons/ai"; import {MdOutlinePlaylistAddCheckCircle, MdOutlineSelfImprovement} from "react-icons/md"; import {BsChatLeftDots} from "react-icons/bs"; import Button from "@/components/Low/Button"; import clsx from "clsx"; import Exercise from "@/training/Exercise"; import TrainingScore from "@/training/TrainingScore"; import {ITrainingContent, ITrainingTip} from "@/training/TrainingInterfaces"; import {Stat, User} from "@/interfaces/user"; import Head from "next/head"; import Layout from "@/components/High/Layout"; import {ToastContainer} from "react-toastify"; import {withIronSessionSsr} from "iron-session/next"; import {shouldRedirectHome} from "@/utils/navigation.disabled"; import {sessionOptions} from "@/lib/session"; import qs from "qs"; import StatsGridItem from "@/components/Medium/StatGridItem"; import useExamStore from "@/stores/examStore"; import {usePDFDownload} from "@/hooks/usePDFDownload"; import useAssignments from "@/hooks/useAssignments"; import useUsers from "@/hooks/useUsers"; import Dropdown from "@/components/Dropdown"; import InfiniteCarousel from "@/components/InfiniteCarousel"; import {LuExternalLink} from "react-icons/lu"; import {uniqBy} from "lodash"; import {getExamById} from "@/utils/exams"; import {convertToUserSolutions} from "@/utils/stats"; import {sortByModule} from "@/utils/moduleUtils"; export const getServerSideProps = withIronSessionSsr(({req, res}) => { const user = req.session.user; if (!user || !user.isVerified) { return { redirect: { destination: "/login", permanent: false, }, }; } if (shouldRedirectHome(user)) { return { redirect: { destination: "/", permanent: false, }, }; } return { props: {user: req.session.user}, }; }, sessionOptions); const TrainingContent: React.FC<{user: User}> = ({user}) => { // Record stuff const setExams = useExamStore((state) => state.setExams); const setShowSolutions = useExamStore((state) => state.setShowSolutions); const setUserSolutions = useExamStore((state) => state.setUserSolutions); const setSelectedModules = useExamStore((state) => state.setSelectedModules); const setInactivity = useExamStore((state) => state.setInactivity); const setTimeSpent = useExamStore((state) => state.setTimeSpent); const renderPdfIcon = usePDFDownload("stats"); const [trainingContent, setTrainingContent] = useState(null); const [loading, setLoading] = useState(true); const [trainingTips, setTrainingTips] = useState([]); const [currentTipIndex, setCurrentTipIndex] = useState(0); const {assignments} = useAssignments({}); const {users} = useUsers(); const router = useRouter(); const {id} = router.query; useEffect(() => { const fetchTrainingContent = async () => { if (!id || typeof id !== "string") return; try { setLoading(true); const response = await axios.get(`/api/training/${id}`); const trainingContent = response.data; const withExamsStats = { ...trainingContent, exams: await Promise.all( trainingContent.exams.map(async (exam) => { const stats = await Promise.all( exam.stat_ids.map(async (statId) => { const statResponse = await axios.get(`/api/stats/${statId}`); return statResponse.data; }), ); return {...exam, stats}; }), ), }; const tips = await axios.get("/api/training/walkthrough", { params: {ids: trainingContent.tip_ids}, paramsSerializer: (params) => qs.stringify(params, {arrayFormat: "repeat"}), }); setTrainingTips(tips.data); setTrainingContent(withExamsStats); } catch (error) { router.push("/training"); } finally { setLoading(false); } }; fetchTrainingContent(); }, [id, router]); const handleNext = () => { setCurrentTipIndex((prevIndex) => prevIndex + 1); }; const handlePrevious = () => { setCurrentTipIndex((prevIndex) => prevIndex - 1); }; const goToExam = (examNumber: number) => { const stats = trainingContent?.exams[examNumber].stats!; const examPromises = uniqBy(stats, "exam").map((stat) => { return getExamById(stat.module, stat.exam); }); const {timeSpent, inactivity} = stats[0]; Promise.all(examPromises).then((exams) => { if (exams.every((x) => !!x)) { if (!!timeSpent) setTimeSpent(timeSpent); if (!!inactivity) setInactivity(inactivity); setUserSolutions(convertToUserSolutions(stats)); setShowSolutions(true); setExams(exams.map((x) => x!).sort(sortByModule)); setSelectedModules( exams .map((x) => x!) .sort(sortByModule) .map((x) => x!.module), ); router.push("/exercises"); } }); }; return ( <> Training | EnCoach {loading ? (
) : ( trainingContent && (
{trainingContent.exams.length} Exams Selected
} overlayFunc={goToExam} overlayClassName="bottom-6 right-5 cursor-pointer"> {trainingContent.exams.map((exam, examIndex) => ( ))}

General Evaluation

Performance Breakdown by Exam:

    {trainingContent.exams.flatMap((exam, index) => (
  • Exam {index + 1}
    {exam.score}%

    {exam.performance_comment}

  • ))}

Identified Weak Areas

{trainingContent.weak_areas.map((x, index) => ( clsx( "text-[#53B2F9] pb-2 border-b-2", "focus:outline-none", selected ? "border-[#1B78BE]" : "border-[#1B78BE0F]", ) }> {x.area} ))}
{trainingContent.weak_areas.map((x, index) => (

{x.comment}

))}

Subjects that Need Improvement

Detailed Breakdown

    {trainingContent.exams.map((exam, index) => (
  • Exam {index + 1}
} open={index == 0}> {exam.detailed_summary} ))}
) )}
); }; export default TrainingContent;