This commit is contained in:
Louis Mazin 2026-09-18 03:44:39 +02:00
parent 5543dca652
commit 18bdc192f0

View File

@ -23,9 +23,9 @@ const TimeClockPage = () => {
const [scanConflict, setScanConflict] = useState(null); const [scanConflict, setScanConflict] = useState(null);
const [conflictTime, setConflictTime] = useState(new Date().toTimeString().slice(0, 5)); const [conflictTime, setConflictTime] = useState(new Date().toTimeString().slice(0, 5));
const [error, setError] = useState(''); const [error, setError] = useState('');
const [currentTime, setCurrentTime] = useState(new Date());
const [timeEntries, setTimeEntries] = useState([]); const [timeEntries, setTimeEntries] = useState([]);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [isScannerDialogOpen, setIsScannerDialogOpen] = useState(false);
const [newEntry, setNewEntry] = useState({ const [newEntry, setNewEntry] = useState({
date: new Date().toISOString().split('T')[0], date: new Date().toISOString().split('T')[0],
end_date: new Date().toISOString().split('T')[0], end_date: new Date().toISOString().split('T')[0],
@ -38,14 +38,6 @@ const TimeClockPage = () => {
end_time: '' end_time: ''
}); });
// Update current time every second
useEffect(() => {
const timer = setInterval(() => {
setCurrentTime(new Date());
}, 1000);
return () => clearInterval(timer);
}, []);
const loadTimeEntries = async () => { const loadTimeEntries = async () => {
try { try {
@ -219,7 +211,9 @@ const TimeClockPage = () => {
useEffect(() => () => stopScanner(), []); useEffect(() => () => stopScanner(), []);
useEffect(() => { useEffect(() => {
if (!isScanning || !videoRef.current) return undefined; if (!isScannerDialogOpen || !isScanning || !videoRef.current) {
return undefined;
}
let cancelled = false; let cancelled = false;
const reader = new BrowserQRCodeReader(); const reader = new BrowserQRCodeReader();
@ -227,7 +221,12 @@ const TimeClockPage = () => {
const startReader = async () => { const startReader = async () => {
try { try {
const controls = await reader.decodeFromConstraints( const controls = await reader.decodeFromConstraints(
{ video: { facingMode: { ideal: 'environment' } }, audio: false }, {
video: {
facingMode: { ideal: 'environment' },
},
audio: false,
},
videoRef.current, videoRef.current,
(result) => { (result) => {
if (result && !cancelled) { if (result && !cancelled) {
@ -240,14 +239,19 @@ const TimeClockPage = () => {
try { try {
controls.stop(); controls.stop();
} catch (stopError) { } catch (stopError) {
console.warn('Arrêt du lecteur QR déjà effectué.', stopError); console.warn(
'Arrêt du lecteur QR déjà effectué.',
stopError,
);
} }
} else { } else {
qrControlsRef.current = controls; qrControlsRef.current = controls;
} }
} catch (scannerError) { } catch (scannerError) {
if (!cancelled) { if (!cancelled) {
setError('Impossible d’accéder à la caméra. Vérifiez les permissions et utilisez HTTPS sur le réseau.'); setError(
'Impossible d’accéder à la caméra. Vérifiez les permissions et utilisez HTTPS sur le réseau.',
);
console.error(scannerError); console.error(scannerError);
stopScanner(); stopScanner();
} }
@ -258,36 +262,40 @@ const TimeClockPage = () => {
return () => { return () => {
cancelled = true; cancelled = true;
try { try {
reader.reset(); reader.reset();
} catch (resetError) { } catch (resetError) {
console.warn('Réinitialisation du lecteur QR ignorée.', resetError); console.warn(
'Réinitialisation du lecteur QR ignorée.',
resetError,
);
} }
}; };
}, [isScanning]); }, [isScannerDialogOpen, isScanning]);
const startScanner = async () => { const startScanner = () => {
setError(''); setError('');
setScanMessage(''); setScanMessage('');
setScanConflict(null); setScanConflict(null);
if (!window.isSecureContext && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1') { if (
setError('La caméra nécessite une connexion HTTPS sur cette adresse réseau.'); !window.isSecureContext &&
window.location.hostname !== 'localhost' &&
window.location.hostname !== '192.168.1.19'
) {
setError(
'La caméra nécessite une connexion HTTPS sur cette adresse réseau.',
);
return; return;
} }
try { if (!navigator.mediaDevices?.getUserMedia) {
if (!navigator.mediaDevices?.getUserMedia) { setError('Ce navigateur ne permet pas l’accès à la caméra.');
setError('Ce navigateur ne permet pas l’accès à la caméra.'); return;
return;
}
setIsScanning(true);
} catch (scannerError) {
setError('Impossible d’accéder à la caméra. Vérifiez les permissions et utilisez HTTPS sur le réseau.');
console.error(scannerError);
stopScanner();
} }
setIsScanning(true);
}; };
const formatTime = (timeString) => { const formatTime = (timeString) => {
@ -348,14 +356,23 @@ const TimeClockPage = () => {
)} )}
{/* Dialog for QR scanner preview */} {/* Dialog for QR scanner preview */}
<Dialog> <Dialog
open={isScannerDialogOpen}
onOpenChange={(open) => {
setIsScannerDialogOpen(open);
if (!open) {
stopScanner();
}
}}
>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button <Button
onClick={startScanner} onClick={startScanner}
variant="default" variant="default"
className="mb-4" className="mb-4"
> >
{isAdmin ? "Pointer avec un QR code" : "Pointer"} {isAdmin ? 'Pointer avec un QR code' : 'Pointer'}
</Button> </Button>
</DialogTrigger> </DialogTrigger>
<DialogContent className="max-w-2xl max-h-[90vh] overflow-auto"> <DialogContent className="max-w-2xl max-h-[90vh] overflow-auto">