Add camera selector to checkin page

Allow the camera to be selected so tablets can use the
rear camera as well as the front camera.
This commit is contained in:
Joel Addison 2023-03-14 09:29:39 +11:00
parent 420974154a
commit e83dafef90

View file

@ -21,6 +21,11 @@
<div class="col-6"> <div class="col-6">
<p><strong id="note"></strong></p> <p><strong id="note"></strong></p>
<video id="preview"" autoplay style=" height: 400px;"></video> <video id="preview"" autoplay style=" height: 400px;"></video>
<p>Select camera:</p>
<ul id="camera-list" class="list-group">
<li class="list-group-item active" aria-current="true">No camera found</li>
</ul>
</div> </div>
<div class="col-6"> <div class="col-6">
@ -43,6 +48,9 @@
<script type="text/javascript"> <script type="text/javascript">
let scanner = new Instascan.Scanner({ video: document.getElementById('preview') }); let scanner = new Instascan.Scanner({ video: document.getElementById('preview') });
let activeCameraId = null;
let availableCameras = [];
scanner.addListener('scan', function (content) { scanner.addListener('scan', function (content) {
// This should ensure we start with the lca base domain. However, I don't have the time for this // This should ensure we start with the lca base domain. However, I don't have the time for this
// considering we have quite a few domains right now. // considering we have quite a few domains right now.
@ -57,9 +65,57 @@
} }
}); });
function startCamera(cameras) { scanner.start(cameras[0]); } function startCamera(cameras) {
// Update available cameras.
availableCameras = cameras;
// Display the cameras on the page.
let cameraList = document.getElementById('camera-list');
cameraList.innerHTML = "";
for (let i = 0; i < cameras.length; ++i) {
let camera = cameras[i];
let cameraItem = document.createElement('li');
cameraItem.textContent = formatCameraName(camera.name);
cameraItem.setAttribute('data-cameraId', camera.id);
let classNames = "list-group-item";
if (i == 0) {
classNames = classNames + " active";
}
cameraItem.className = classNames;
cameraItem.addEventListener("click", (event) => {
selectCamera(cameraItem);
let activeCameras = cameraList.getElementsByClassName("active");
for (let j = 0; j < activeCameras.length; ++j) {
let newClassNames = activeCameras[j].className.replace(" active", "");
activeCameras[j].className = newClassNames;
}
cameraItem.className = cameraItem.className + " active";
});
cameraList.appendChild(cameraItem);
}
scanner.start(cameras[0]);
}
function errorCamera(error) { console.error(e); } function errorCamera(error) { console.error(e); }
function formatCameraName(name) {
return name || '(unknown)';
}
function selectCamera(cameraItem) {
let cameraId = cameraItem.dataset.cameraId;
let camera = availableCameras[cameraId];
scanner.start(camera);
}
Instascan.Camera.getCameras().then(startCamera).catch(errorCamera); Instascan.Camera.getCameras().then(startCamera).catch(errorCamera);
</script> </script>