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