import { useRef, useState, useEffect } from 'react'; export function useCamera() { const videoRef = useRef(null); const streamRef = useRef(null); const [cameraReady, setCameraReady] = useState(false); const startCamera = async () => { try { const stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: "user", width: { ideal: 1280 }, height: { ideal: 720 } }, audio: false }); if (videoRef.current) { videoRef.current.srcObject = stream; await videoRef.current.play().catch(() => { }); requestAnimationFrame(() => { try { const v = videoRef.current!; // Canvas will be synced separately } catch { } }); } streamRef.current = stream; setCameraReady(true); } catch (e: any) { console.error('Camera access error:', e); setCameraReady(false); throw e; } }; const stopCamera = () => { if (streamRef.current) { streamRef.current.getTracks().forEach((t) => t.stop()); streamRef.current = null; } if (videoRef.current) { videoRef.current.srcObject = null; } setCameraReady(false); }; useEffect(() => { startCamera(); return () => { stopCamera(); }; }, []); return { videoRef, cameraReady, startCamera, stopCamera, }; }