mirror of
https://github.com/handsomezhuzhu/2fa-tool.git
synced 2026-02-20 11:43:19 +00:00
fix: resolve camera and dialog issues
Add autoPlay and muted to video, improve startCamera, and stop camera on dialog close. #VERCEL_SKIP Co-authored-by: Simon <85533298+handsomezhuzhu@users.noreply.github.com>
This commit is contained in:
30
app/page.tsx
30
app/page.tsx
@@ -315,13 +315,27 @@ export default function TwoFactorAuth() {
|
|||||||
video: { facingMode: "environment" },
|
video: { facingMode: "environment" },
|
||||||
})
|
})
|
||||||
streamRef.current = stream
|
streamRef.current = stream
|
||||||
|
|
||||||
if (videoRef.current) {
|
if (videoRef.current) {
|
||||||
videoRef.current.srcObject = stream
|
videoRef.current.srcObject = stream
|
||||||
videoRef.current.play()
|
// Wait for video to be ready before playing
|
||||||
|
await new Promise<void>((resolve, reject) => {
|
||||||
|
const video = videoRef.current!
|
||||||
|
video.onloadedmetadata = () => {
|
||||||
|
video
|
||||||
|
.play()
|
||||||
|
.then(() => resolve())
|
||||||
|
.catch(reject)
|
||||||
|
}
|
||||||
|
video.onerror = () => reject(new Error("Video load error"))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
setIsCameraOpen(true)
|
setIsCameraOpen(true)
|
||||||
scanQRCode()
|
// Start scanning after a short delay to ensure video is rendering
|
||||||
|
setTimeout(() => scanQRCode(), 500)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
console.log("[v0] Camera error:", error)
|
||||||
toast({
|
toast({
|
||||||
title: t.cameraFailed,
|
title: t.cameraFailed,
|
||||||
description: t.cameraPermission,
|
description: t.cameraPermission,
|
||||||
@@ -561,6 +575,14 @@ export default function TwoFactorAuth() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleAddDialogChange = (open: boolean) => {
|
||||||
|
if (!open) {
|
||||||
|
// Stop camera when dialog is closed
|
||||||
|
stopCamera()
|
||||||
|
}
|
||||||
|
setIsAddDialogOpen(open)
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background flex flex-col">
|
<div className="min-h-screen bg-background flex flex-col">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
@@ -704,7 +726,7 @@ export default function TwoFactorAuth() {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<Dialog open={isAddDialogOpen} onOpenChange={setIsAddDialogOpen}>
|
<Dialog open={isAddDialogOpen} onOpenChange={handleAddDialogChange}>
|
||||||
<DialogTrigger asChild>
|
<DialogTrigger asChild>
|
||||||
<Button>
|
<Button>
|
||||||
<Plus className="h-4 w-4 mr-2" />
|
<Plus className="h-4 w-4 mr-2" />
|
||||||
@@ -839,7 +861,7 @@ export default function TwoFactorAuth() {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="relative aspect-video bg-black rounded-lg overflow-hidden">
|
<div className="relative aspect-video bg-black rounded-lg overflow-hidden">
|
||||||
<video ref={videoRef} className="w-full h-full object-cover" playsInline />
|
<video ref={videoRef} className="w-full h-full object-cover" playsInline autoPlay muted />
|
||||||
<canvas ref={canvasRef} className="hidden" />
|
<canvas ref={canvasRef} className="hidden" />
|
||||||
<div className="absolute inset-0 flex items-center justify-center pointer-events-none">
|
<div className="absolute inset-0 flex items-center justify-center pointer-events-none">
|
||||||
<div className="w-48 h-48 border-2 border-white/50 rounded-lg" />
|
<div className="w-48 h-48 border-2 border-white/50 rounded-lg" />
|
||||||
|
|||||||
Reference in New Issue
Block a user