-
Notifications
You must be signed in to change notification settings - Fork 24
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
searching for permissions before request
- Loading branch information
Showing
4 changed files
with
105 additions
and
60 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
import { useEffect, ReactNode } from "react"; | ||
import Button from "components/Button"; | ||
|
||
const CAPTURE_OPTIONS = { | ||
audio: false, | ||
video: { facingMode: "environment" }, | ||
}; | ||
|
||
interface useWebcamPermissionsRequestProps { | ||
videoRef: React.RefObject<HTMLVideoElement>; | ||
setCamMessage: React.Dispatch<React.SetStateAction<ReactNode>>; | ||
onPermissionGranted: () => void; | ||
} | ||
|
||
const checkWebcamPermissions = async () => { | ||
const devices = await navigator.mediaDevices.enumerateDevices(); | ||
|
||
const permissions = devices | ||
.filter(({ kind }) => kind === "videoinput") | ||
.filter(({ label }) => label !== ""); | ||
|
||
return permissions.length > 0; | ||
}; | ||
|
||
export const requestWebcam = ({ | ||
videoRef, | ||
setCamMessage, | ||
onPermissionGranted, | ||
}: useWebcamPermissionsRequestProps) => { | ||
const video = videoRef.current; | ||
|
||
if (!video?.srcObject) { | ||
setCamMessage("Grant camera permissions to be able to scan QR codes."); | ||
|
||
navigator.mediaDevices | ||
.getUserMedia(CAPTURE_OPTIONS) | ||
.then((stream) => { | ||
if (!video?.srcObject) { | ||
video.srcObject = stream; | ||
video.setAttribute("playsinline", "true"); // required to tell iOS safari we don't want fullscreen | ||
video.play(); | ||
|
||
setCamMessage(""); | ||
onPermissionGranted(); | ||
} | ||
}) | ||
.catch((err) => { | ||
if (!video?.srcObject && err instanceof DOMException) { | ||
setCamMessage( | ||
"We couldn't access your camera. Check if your camera is being used by another app and if you gave us permission to use it." | ||
); | ||
} | ||
}); | ||
} | ||
}; | ||
|
||
const useWebcam = ({ | ||
videoRef, | ||
setCamMessage, | ||
onPermissionGranted, | ||
}: useWebcamPermissionsRequestProps) => { | ||
useEffect(() => { | ||
checkWebcamPermissions() | ||
.then((arePermissionsGranted) => { | ||
if (!arePermissionsGranted) { | ||
setCamMessage( | ||
<Button | ||
title="Click me to open QRScanner!" | ||
onClick={() => | ||
requestWebcam({ videoRef, setCamMessage, onPermissionGranted }) | ||
} | ||
/> | ||
); | ||
} else { | ||
requestWebcam({ videoRef, setCamMessage, onPermissionGranted }); | ||
} | ||
}) | ||
.catch(() => { | ||
requestWebcam({ videoRef, setCamMessage, onPermissionGranted }); | ||
}); | ||
|
||
const video = videoRef.current; | ||
|
||
return () => { | ||
if (video && video.srcObject) { | ||
(video.srcObject as MediaStream).getTracks().forEach((track) => { | ||
track.stop(); | ||
}); | ||
} | ||
}; | ||
}, []); | ||
}; | ||
|
||
export default useWebcam; |
54 changes: 0 additions & 54 deletions
54
components/QRScanner/BarebonesQRScanner/useWebcamPermissions.ts
This file was deleted.
Oops, something went wrong.