Gateprep / frontend /src /hooks /useAntiCheat.js
banu4prasad's picture
frontend and DB code refactor
a17d02d
Raw
History Blame Contribute Delete
2.8 kB
import { useEffect } from 'react'
import toast from 'react-hot-toast'
import { testAPI } from '../api/api'
export default function useAntiCheat({
attemptRef,
doSubmitRef,
fsViolRef,
isPreview,
loadedRef,
setFsViolations,
setShowFsWarning,
setTabViolations,
tabViolRef,
testIdRef,
}) {
useEffect(() => {
const handleFsChange = () => {
if (document.fullscreenElement || !loadedRef.current) return
const next = fsViolRef.current + 1
fsViolRef.current = next
setFsViolations(next)
if (next >= 3) {
toast.error('3 fullscreen violations - auto submitting!')
doSubmitRef.current(true)
return
}
setShowFsWarning(true)
if (!isPreview) {
testAPI.updateViolations(testIdRef.current, attemptRef.current?.id, {
fullscreen_violations: next,
}).catch(() => {})
}
}
document.addEventListener('fullscreenchange', handleFsChange)
return () => document.removeEventListener('fullscreenchange', handleFsChange)
}, [attemptRef, doSubmitRef, fsViolRef, isPreview, loadedRef, setFsViolations, setShowFsWarning, testIdRef])
useEffect(() => {
const handleVisibility = () => {
if (!document.hidden || !loadedRef.current) return
const next = tabViolRef.current + 1
tabViolRef.current = next
setTabViolations(next)
if (next >= 3) {
toast.error('3 tab violations - auto submitting!')
doSubmitRef.current(true)
return
}
toast(`Tab switch detected! Warning ${next}/3`, { duration: 3000 })
if (!isPreview) {
testAPI.updateViolations(testIdRef.current, attemptRef.current?.id, {
tab_violations: next,
}).catch(() => {})
}
}
document.addEventListener('visibilitychange', handleVisibility)
return () => document.removeEventListener('visibilitychange', handleVisibility)
}, [attemptRef, doSubmitRef, isPreview, loadedRef, setTabViolations, tabViolRef, testIdRef])
useEffect(() => {
const prevent = event => event.preventDefault()
const preventKeys = event => {
if (event.ctrlKey && ['c', 'v', 'a', 'u'].includes(event.key.toLowerCase())) {
event.preventDefault()
}
}
document.addEventListener('contextmenu', prevent)
document.addEventListener('copy', prevent)
document.addEventListener('cut', prevent)
document.addEventListener('paste', prevent)
document.addEventListener('keydown', preventKeys)
return () => {
document.removeEventListener('contextmenu', prevent)
document.removeEventListener('copy', prevent)
document.removeEventListener('cut', prevent)
document.removeEventListener('paste', prevent)
document.removeEventListener('keydown', preventKeys)
}
}, [])
}