'use client'; import { useEffect, useRef, useState } from 'react'; import Webcam from 'react-webcam'; import { Button, message } from 'antd'; import { loadFaceApi } from '@/utils/loadFaceApi'; export default function CameraFaceComponent({ onCapture }) { const webcamRef = useRef(null); const canvasRef = useRef(null); const [eyesDetected, setEyesDetected] = useState(false); const [imageSrc, setImageSrc] = useState(null); const [messageApi, contextHolder] = message.useMessage(); const intervalRef = useRef(null); useEffect(() => { initFaceDetection(); return () => { if (intervalRef.current) clearInterval(intervalRef.current); }; }, []); const initFaceDetection = async () => { const faceapi = await loadFaceApi(); intervalRef.current = setInterval(async () => { if ( webcamRef.current && webcamRef.current.video && webcamRef.current.video.readyState === 4 ) { const video = webcamRef.current.video; const canvas = canvasRef.current; const ctx = canvas.getContext('2d'); const displaySize = { width: video.videoWidth, height: video.videoHeight, }; canvas.width = displaySize.width; canvas.height = displaySize.height; const detections = await faceapi .detectAllFaces( video, new faceapi.TinyFaceDetectorOptions({ inputSize: 416, scoreThreshold: 0.5, }) ) .withFaceLandmarks(); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.save(); ctx.scale(-1, 1); ctx.translate(-canvas.width, 0); faceapi.draw.drawDetections(canvas, faceapi.resizeResults(detections, displaySize)); // faceapi.draw.drawFaceLandmarks(canvas, faceapi.resizeResults(detections, displaySize)); ctx.restore(); let isEyesVisible = false; if (detections.length > 0) { const landmarks = detections[0].landmarks; const leftEye = landmarks.getLeftEye(); const rightEye = landmarks.getRightEye(); // ✅ Satu mata pun cukup isEyesVisible = leftEye.length > 0 || rightEye.length > 0; } setEyesDetected(isEyesVisible); } else { setEyesDetected(false); } }, 400); }; const capture = () => { const screenshot = webcamRef.current.getScreenshot(); setImageSrc(screenshot); onCapture(screenshot); }; const reset = () => { setImageSrc(null); onCapture(null); }; return (
{contextHolder} {!imageSrc ? ( <>
{eyesDetected ? ( Wajah terdeteksi ✅ ) : ( Arahkan wajah agar terlihat ❌ )}
) : ( <> Foto )}
); }