import React, { useState, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { QuestionRenderer } from './QuestionRenderer' import { ExamNavigation } from './ExamNavigation' import { ExamTimer } from './ExamTimer' import { SecurityWarning } from './SecurityWarning' import { ExamSession, StudentAnswer } from '@/types/coordinator' import { useExamSecurity } from '@/utils/hooks/useExamSecurity' import { useStoreState } from '@/store/store' import { generateMockExam } from '@/mocks/mockExams' const ExamInterface: React.FC = () => { const { id } = useParams<{ id: string }>() const navigate = useNavigate() const userId = useStoreState((state) => state.auth.user.id) // TODO: Replace with actual API call to fetch exam by id const exam = generateMockExam().find((e) => e.id === id) if (!exam) { return (

Sınav Bulunamadı

İstenen sınav bulunamadı veya erişim yetkiniz yok.

) } const [session, setSession] = useState({ id: `session-${Date.now()}`, examId: exam.id, studentId: userId, startTime: new Date(), answers: [], status: 'in-progress', timeRemaining: exam.timeLimit * 60, }) const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0) const [securityWarning, setSecurityWarning] = useState<{ show: boolean message: string type: 'warning' | 'error' | 'info' }>({ show: false, message: '', type: 'warning' }) // Security configuration const securityConfig = { disableRightClick: true, disableCopyPaste: true, disableDevTools: true, fullScreenMode: true, preventTabSwitch: true, } useExamSecurity(securityConfig, session.status === 'in-progress') // Save exam session to backend/localStorage const saveExamSession = (sessionData: ExamSession) => { // TODO: Replace with actual API call console.log('Saving exam session:', sessionData) localStorage.setItem(`exam-session-${sessionData.examId}`, JSON.stringify(sessionData)) } // Complete exam and navigate const handleExamComplete = (sessionData: ExamSession) => { // TODO: Replace with actual API call console.log('Exam completed:', sessionData) saveExamSession(sessionData) // Navigate to results or dashboard // navigate('/admin/coordinator/exams') } // Auto-save mechanism useEffect(() => { const interval = setInterval(() => { if (session.status === 'in-progress') { saveExamSession(session) } }, 30000) // Save every 30 seconds return () => clearInterval(interval) }, [session]) const handleAnswerChange = (questionId: string, answer: string | string[]) => { setSession((prev) => { const existingAnswerIndex = prev.answers.findIndex((a) => a.questionId === questionId) const newAnswer: StudentAnswer = { questionId, answer, timeSpent: 0, // In a real app, track time spent per question } const newAnswers = existingAnswerIndex >= 0 ? prev.answers.map((a, i) => (i === existingAnswerIndex ? newAnswer : a)) : [...prev.answers, newAnswer] return { ...prev, answers: newAnswers, } }) } const handleTimeUp = () => { setSecurityWarning({ show: true, message: 'Süre doldu! Sınav otomatik olarak teslim ediliyor...', type: 'error', }) setTimeout(() => { completeExam() }, 3000) } const completeExam = () => { const completedSession: ExamSession = { ...session, endTime: new Date(), status: 'completed', } setSession(completedSession) handleExamComplete(completedSession) } const handleSubmitExam = () => { const unanswered = exam.questions.filter( (q) => !session.answers.find((a) => a.questionId === q.id && a.answer), ) if (unanswered.length > 0) { const confirmSubmit = window.confirm( `${unanswered.length} soru cevaplanmamış. Yine de sınavı teslim etmek istiyor musunuz?`, ) if (!confirmSubmit) return } completeExam() } const currentQuestion = exam.questions[currentQuestionIndex] const currentAnswer = session.answers.find((a) => a.questionId === currentQuestion?.id) const navigateQuestion = (direction: 'next' | 'prev' | number) => { if (typeof direction === 'number') { setCurrentQuestionIndex(Math.max(0, Math.min(exam.questions.length - 1, direction))) } else if (direction === 'next') { setCurrentQuestionIndex((prev) => Math.min(exam.questions.length - 1, prev + 1)) } else { setCurrentQuestionIndex((prev) => Math.max(0, prev - 1)) } } if (session.status === 'completed') { return (

Sınav Tamamlandı!

Sınavınız başarıyla teslim edildi. Sonuçlarınız değerlendirildikten sonra bilgilendirileceksiniz.

Başlama: {session.startTime.toLocaleString('tr-TR')}
Bitiş: {session.endTime?.toLocaleString('tr-TR')}
) } return (
setSecurityWarning((prev) => ({ ...prev, show: false }))} message={securityWarning.message} type={securityWarning.type} /> {/* Header */}

{exam.title}

Soru {currentQuestionIndex + 1} / {exam.questions.length}

{/* Main Content */}
{/* Question Content */}
{currentQuestion && ( )} {/* Navigation Controls */}
{currentQuestionIndex + 1} / {exam.questions.length}
{/* Navigation Sidebar */}
) } export default ExamInterface