fix
This commit is contained in:
parent
5543dca652
commit
18bdc192f0
@ -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);
|
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();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
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">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user